diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 96f85fa..2a1e418 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -1,7 +1,79 @@ +import {normalizeCweId} from '../src/utils' + describe('main', () => { it('placeholder test', () => { // This is a placeholder test to prevent Jest from failing // TODO: Add proper unit tests for the main module expect(true).toBe(true) }) + + describe('CWE ID normalization', () => { + it('should handle CWE IDs with leading zeros', () => { + // Test that 099 maps to 99 + const normalizedId = normalizeCweId('099') + expect(normalizedId).toBe('99') + }) + + it('should handle CWE IDs without leading zeros', () => { + // Test that 89 maps to 89 + const normalizedId = normalizeCweId('89') + expect(normalizedId).toBe('89') + }) + + it('should handle CWE IDs with multiple leading zeros', () => { + // Test that 020 maps to 20 + const normalizedId = normalizeCweId('020') + expect(normalizedId).toBe('20') + }) + + it('should return null for non-numeric CWE IDs', () => { + // Test that invalid CWE IDs return null + const normalizedId = normalizeCweId('abc') + expect(normalizedId).toBeNull() + }) + + it('should return null for empty strings', () => { + // Test that empty strings return null + const normalizedId = normalizeCweId('') + expect(normalizedId).toBeNull() + }) + + it('should return null for strings with only spaces', () => { + // Test that strings with only spaces return null + const normalizedId = normalizeCweId(' ') + expect(normalizedId).toBeNull() + }) + + it('should handle strings with leading/trailing spaces', () => { + // Test that strings with spaces are parsed correctly + const normalizedId = normalizeCweId(' 99 ') + expect(normalizedId).toBe('99') + }) + + it('should return null for negative numbers', () => { + // Test that negative numbers return null (CWE IDs should be positive) + const normalizedId = normalizeCweId('-99') + expect(normalizedId).toBeNull() + }) + + it('should handle strings with mixed alphanumeric characters (parseInt is lenient)', () => { + // Test that mixed alphanumeric strings are parsed leniently + // parseInt stops at first non-numeric character, so '99abc' becomes 99 + // This is acceptable for our use case as malformed tags would be rare + const normalizedId = normalizeCweId('99abc') + expect(normalizedId).toBe('99') + }) + + it('should handle zero', () => { + // Test that zero is handled correctly + const normalizedId = normalizeCweId('0') + expect(normalizedId).toBe('0') + }) + + it('should handle zero with leading zeros', () => { + // Test that zero with leading zeros is handled correctly + const normalizedId = normalizeCweId('000') + expect(normalizedId).toBe('0') + }) + }) }) diff --git a/dist/index.js b/dist/index.js index 42cb06c..e43bd13 100644 --- a/dist/index.js +++ b/dist/index.js @@ -140,9 +140,15 @@ for (const cweCategoryNode of cweCategoryNodes) { for (const tag of tags) { if (tag.startsWith(codeQlCweTagPrefix)) { const cweId = tag.replace(codeQlCweTagPrefix, ''); - if (cweIds.includes(cweId)) { + // Normalize CWE ID by converting to integer to remove leading zeros + const normalizedCweId = (0, utils_1.normalizeCweId)(cweId); + // Skip if the CWE ID is not a valid number + if (normalizedCweId === null) { + continue; + } + if (cweIds.includes(normalizedCweId)) { tags.push(securityStandardTag); - tags.push(...cweCategories[cweId]); + tags.push(...cweCategories[normalizedCweId]); return; } } @@ -203,6 +209,7 @@ var __importStar = (this && this.__importStar) || (function () { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.LogLevel = void 0; exports.log = log; +exports.normalizeCweId = normalizeCweId; /* eslint-disable no-console */ const process_1 = __nccwpck_require__(932); const core = __importStar(__nccwpck_require__(7484)); @@ -246,6 +253,18 @@ function log(message, level = LogLevel.Info) { } } } +/** + * Normalize a CWE ID by removing leading zeros + * @param cweId - The CWE ID string (e.g., "099", "020", "89") + * @returns The normalized CWE ID string (e.g., "99", "20", "89") or null if invalid + */ +function normalizeCweId(cweId) { + const parsedCweId = parseInt(cweId, 10); + if (Number.isNaN(parsedCweId) || parsedCweId < 0) { + return null; + } + return String(parsedCweId); +} //# sourceMappingURL=utils.js.map /***/ }), diff --git a/dist/index.js.map b/dist/index.js.map index 0f8b5e0..05e8669 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACt1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrnEA;AACA;AACA;AACA;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrpBA;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACr0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/IA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1uEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACj7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACroBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrRA;;;;;;;;ACAA;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACh7JA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrhEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7BA;AACA;;;;AEDA;AACA;AACA;AACA","sources":[".././lib/main.js",".././lib/utils.js",".././node_modules/@actions/core/lib/command.js",".././node_modules/@actions/core/lib/core.js",".././node_modules/@actions/core/lib/file-command.js",".././node_modules/@actions/core/lib/oidc-utils.js",".././node_modules/@actions/core/lib/path-utils.js",".././node_modules/@actions/core/lib/platform.js",".././node_modules/@actions/core/lib/summary.js",".././node_modules/@actions/core/lib/utils.js",".././node_modules/@actions/exec/lib/exec.js",".././node_modules/@actions/exec/lib/toolrunner.js",".././node_modules/@actions/http-client/lib/auth.js",".././node_modules/@actions/http-client/lib/index.js",".././node_modules/@actions/http-client/lib/proxy.js",".././node_modules/@actions/io/lib/io-util.js",".././node_modules/@actions/io/lib/io.js",".././node_modules/@xmldom/xmldom/lib/conventions.js",".././node_modules/@xmldom/xmldom/lib/dom-parser.js",".././node_modules/@xmldom/xmldom/lib/dom.js",".././node_modules/@xmldom/xmldom/lib/entities.js",".././node_modules/@xmldom/xmldom/lib/index.js",".././node_modules/@xmldom/xmldom/lib/sax.js",".././node_modules/tunnel/index.js",".././node_modules/tunnel/lib/tunnel.js",".././node_modules/undici/index.js",".././node_modules/undici/lib/agent.js",".././node_modules/undici/lib/api/abort-signal.js",".././node_modules/undici/lib/api/api-connect.js",".././node_modules/undici/lib/api/api-pipeline.js",".././node_modules/undici/lib/api/api-request.js",".././node_modules/undici/lib/api/api-stream.js",".././node_modules/undici/lib/api/api-upgrade.js",".././node_modules/undici/lib/api/index.js",".././node_modules/undici/lib/api/readable.js",".././node_modules/undici/lib/api/util.js",".././node_modules/undici/lib/balanced-pool.js",".././node_modules/undici/lib/cache/cache.js",".././node_modules/undici/lib/cache/cachestorage.js",".././node_modules/undici/lib/cache/symbols.js",".././node_modules/undici/lib/cache/util.js",".././node_modules/undici/lib/client.js",".././node_modules/undici/lib/compat/dispatcher-weakref.js",".././node_modules/undici/lib/cookies/constants.js",".././node_modules/undici/lib/cookies/index.js",".././node_modules/undici/lib/cookies/parse.js",".././node_modules/undici/lib/cookies/util.js",".././node_modules/undici/lib/core/connect.js",".././node_modules/undici/lib/core/constants.js",".././node_modules/undici/lib/core/errors.js",".././node_modules/undici/lib/core/request.js",".././node_modules/undici/lib/core/symbols.js",".././node_modules/undici/lib/core/util.js",".././node_modules/undici/lib/dispatcher-base.js",".././node_modules/undici/lib/dispatcher.js",".././node_modules/undici/lib/fetch/body.js",".././node_modules/undici/lib/fetch/constants.js",".././node_modules/undici/lib/fetch/dataURL.js",".././node_modules/undici/lib/fetch/file.js",".././node_modules/undici/lib/fetch/formdata.js",".././node_modules/undici/lib/fetch/global.js",".././node_modules/undici/lib/fetch/headers.js",".././node_modules/undici/lib/fetch/index.js",".././node_modules/undici/lib/fetch/request.js",".././node_modules/undici/lib/fetch/response.js",".././node_modules/undici/lib/fetch/symbols.js",".././node_modules/undici/lib/fetch/util.js",".././node_modules/undici/lib/fetch/webidl.js",".././node_modules/undici/lib/fileapi/encoding.js",".././node_modules/undici/lib/fileapi/filereader.js",".././node_modules/undici/lib/fileapi/progressevent.js",".././node_modules/undici/lib/fileapi/symbols.js",".././node_modules/undici/lib/fileapi/util.js",".././node_modules/undici/lib/global.js",".././node_modules/undici/lib/handler/DecoratorHandler.js",".././node_modules/undici/lib/handler/RedirectHandler.js",".././node_modules/undici/lib/handler/RetryHandler.js",".././node_modules/undici/lib/interceptor/redirectInterceptor.js",".././node_modules/undici/lib/llhttp/constants.js",".././node_modules/undici/lib/llhttp/llhttp-wasm.js",".././node_modules/undici/lib/llhttp/llhttp_simd-wasm.js",".././node_modules/undici/lib/llhttp/utils.js",".././node_modules/undici/lib/mock/mock-agent.js",".././node_modules/undici/lib/mock/mock-client.js",".././node_modules/undici/lib/mock/mock-errors.js",".././node_modules/undici/lib/mock/mock-interceptor.js",".././node_modules/undici/lib/mock/mock-pool.js",".././node_modules/undici/lib/mock/mock-symbols.js",".././node_modules/undici/lib/mock/mock-utils.js",".././node_modules/undici/lib/mock/pending-interceptors-formatter.js",".././node_modules/undici/lib/mock/pluralizer.js",".././node_modules/undici/lib/node/fixed-queue.js",".././node_modules/undici/lib/pool-base.js",".././node_modules/undici/lib/pool-stats.js",".././node_modules/undici/lib/pool.js",".././node_modules/undici/lib/proxy-agent.js",".././node_modules/undici/lib/timers.js",".././node_modules/undici/lib/websocket/connection.js",".././node_modules/undici/lib/websocket/constants.js",".././node_modules/undici/lib/websocket/events.js",".././node_modules/undici/lib/websocket/frame.js",".././node_modules/undici/lib/websocket/receiver.js",".././node_modules/undici/lib/websocket/symbols.js",".././node_modules/undici/lib/websocket/util.js",".././node_modules/undici/lib/websocket/websocket.js",".././node_modules/xpath/xpath.js","../external node-commonjs \"assert\"","../external node-commonjs \"async_hooks\"","../external node-commonjs \"buffer\"","../external node-commonjs \"child_process\"","../external node-commonjs \"console\"","../external node-commonjs \"crypto\"","../external node-commonjs \"diagnostics_channel\"","../external node-commonjs \"events\"","../external node-commonjs \"fs\"","../external node-commonjs \"http\"","../external node-commonjs \"http2\"","../external node-commonjs \"https\"","../external node-commonjs \"net\"","../external node-commonjs \"node:crypto\"","../external node-commonjs \"node:events\"","../external node-commonjs \"node:stream\"","../external node-commonjs \"node:util\"","../external node-commonjs \"os\"","../external node-commonjs \"path\"","../external node-commonjs \"perf_hooks\"","../external node-commonjs \"process\"","../external node-commonjs \"querystring\"","../external node-commonjs \"stream\"","../external node-commonjs \"stream/web\"","../external node-commonjs \"string_decoder\"","../external node-commonjs \"timers\"","../external node-commonjs \"tls\"","../external node-commonjs \"url\"","../external node-commonjs \"util\"","../external node-commonjs \"util/types\"","../external node-commonjs \"vm\"","../external node-commonjs \"worker_threads\"","../external node-commonjs \"zlib\"",".././node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js",".././node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js",".././node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js",".././node_modules/@fastify/busboy/deps/streamsearch/sbmh.js",".././node_modules/@fastify/busboy/lib/main.js",".././node_modules/@fastify/busboy/lib/types/multipart.js",".././node_modules/@fastify/busboy/lib/types/urlencoded.js",".././node_modules/@fastify/busboy/lib/utils/Decoder.js",".././node_modules/@fastify/busboy/lib/utils/basename.js",".././node_modules/@fastify/busboy/lib/utils/decodeText.js",".././node_modules/@fastify/busboy/lib/utils/getLimit.js",".././node_modules/@fastify/busboy/lib/utils/parseParams.js",".././node_modules/jsonpath-plus/dist/index-node-cjs.cjs","../webpack/bootstrap","../webpack/runtime/compat","../webpack/before-startup","../webpack/startup","../webpack/after-startup"],"sourcesContent":["\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path_1 = require(\"path\");\nconst process_1 = require(\"process\");\nconst fs_1 = require(\"fs\");\nconst core = __importStar(require(\"@actions/core\"));\nconst xmldom_1 = require(\"@xmldom/xmldom\");\nconst xpath = __importStar(require(\"xpath\"));\nconst jsonpath_plus_1 = require(\"jsonpath-plus\");\nconst utils_1 = require(\"./utils\");\nlet sarifFilePath;\nlet outputFilePath;\nlet sarifResults;\nlet cweXml;\nlet cweFilePath = (0, path_1.resolve)((0, path_1.dirname)(process.argv[1]), '..//security-standards/owasp-top10-2021.xml');\nconst cweFileXmlNs = { cwe: 'http://cwe.mitre.org/cwe-6' };\nlet cweIdXpath = '/cwe:Weakness_Catalog/cwe:Weaknesses/cwe:Weakness/@ID';\nlet categoryXpath = '/cwe:Weakness_Catalog/cwe:Categories/cwe:Category[contains(@Name, \"OWASP Top Ten 2021\")]';\nconst categoryMembersXpath = 'cwe:Relationships/cwe:Has_Member/@CWE_ID';\nconst categoryNameAttr = '@Name';\nconst categoryNameReplaceSearch = 'OWASP Top Ten 2021 Category ';\nconst codeQlCweTagPrefix = 'external/cwe/cwe-';\nlet securityStandardTag = 'owasp-top10-2021';\nconst codeQlTagsJsonPath = '$.runs[*].tool.extensions[*].rules[*].properties.tags';\n// Simple CLI argument parser for non-GitHub Actions use\nfunction parseCliArgs() {\n const args = {};\n for (let i = 2; i < process.argv.length; i++) {\n const arg = process.argv[i];\n if (arg.startsWith('--')) {\n const key = arg.substring(2);\n const value = process.argv[i + 1];\n if (value && !value.startsWith('--')) {\n args[key] = value;\n i++;\n }\n }\n }\n return args;\n}\n// Parse Actions or CLI inputs\nif (process_1.env.GITHUB_ACTIONS === 'true') {\n sarifFilePath = (0, path_1.resolve)(core.getInput('sarifFile'));\n cweFilePath = (0, path_1.resolve)(core.getInput('cweFile') || cweFilePath);\n cweIdXpath = core.getInput('cweIdXpath') || cweIdXpath;\n categoryXpath = core.getInput('cweCategoryXpath') || categoryXpath;\n securityStandardTag = core.getInput('securityStandardTag') || securityStandardTag;\n outputFilePath = (0, path_1.resolve)(core.getInput('outputFile') || sarifFilePath);\n}\nelse {\n const argv = parseCliArgs();\n if (!argv.sarifFile) {\n (0, utils_1.log)('Error: --sarifFile is required', utils_1.LogLevel.Error);\n process.exit(1);\n }\n sarifFilePath = (0, path_1.resolve)(argv.sarifFile);\n cweFilePath = (0, path_1.resolve)(argv.cweFile || cweFilePath);\n cweIdXpath = argv.cweIdXpath || cweIdXpath;\n categoryXpath = argv.cweCategoryXpath || categoryXpath;\n securityStandardTag = argv.securityStandardTag || securityStandardTag;\n outputFilePath = (0, path_1.resolve)(argv.outputFile || sarifFilePath);\n}\n(0, utils_1.log)(`Using ${sarifFilePath} for SARIF file`);\n(0, utils_1.log)(`Using ${cweFilePath} for CWE file`);\n(0, utils_1.log)(`Using ${outputFilePath} for output file`);\n// Load SARIF file\ntry {\n sarifResults = JSON.parse((0, fs_1.readFileSync)(sarifFilePath, 'utf8'));\n}\ncatch (err) {\n (0, utils_1.log)(`Unable to load SARIF file`, utils_1.LogLevel.Error);\n core.setFailed(err);\n throw err;\n}\n// Load security standard CWE XML file\ntry {\n cweXml = new xmldom_1.DOMParser().parseFromString((0, fs_1.readFileSync)(cweFilePath, 'utf8'));\n}\ncatch (err) {\n (0, utils_1.log)(`Unable to load CWE file`, utils_1.LogLevel.Error);\n core.setFailed(err);\n throw err;\n}\nconst select = xpath.useNamespaces(cweFileXmlNs);\nconst cweIds = select(cweIdXpath, cweXml).map(attribute => attribute.value);\nconst cweCategoryNodes = select(categoryXpath, cweXml);\nconst cweCategories = {};\nfor (const cweCategoryNode of cweCategoryNodes) {\n const memberCweIds = select(categoryMembersXpath, cweCategoryNode).map(attr => attr.value);\n const categoryName = select(categoryNameAttr, cweCategoryNode, true).value.replace(categoryNameReplaceSearch, '');\n for (const cweId of memberCweIds) {\n cweCategories[cweId] = [...(cweCategories[cweId] || []), categoryName];\n }\n}\n// Add tag to SARIF file\n(0, jsonpath_plus_1.JSONPath)({\n path: codeQlTagsJsonPath,\n json: sarifResults,\n callback: (tags) => {\n for (const tag of tags) {\n if (tag.startsWith(codeQlCweTagPrefix)) {\n const cweId = tag.replace(codeQlCweTagPrefix, '');\n if (cweIds.includes(cweId)) {\n tags.push(securityStandardTag);\n tags.push(...cweCategories[cweId]);\n return;\n }\n }\n }\n }\n});\n// Output SARIF file with tag added\ntry {\n (0, fs_1.writeFileSync)(outputFilePath, JSON.stringify(sarifResults));\n}\ncatch (err) {\n (0, utils_1.log)(`Unable to write SARIF file`, utils_1.LogLevel.Error);\n core.setFailed(err);\n throw err;\n}\n//# sourceMappingURL=main.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LogLevel = void 0;\nexports.log = log;\n/* eslint-disable no-console */\nconst process_1 = require(\"process\");\nconst core = __importStar(require(\"@actions/core\"));\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[\"Info\"] = \"Info\";\n LogLevel[\"Warn\"] = \"Warn\";\n LogLevel[\"Error\"] = \"Error\";\n})(LogLevel || (exports.LogLevel = LogLevel = {}));\nfunction log(message, level = LogLevel.Info) {\n if (process_1.env.GITHUB_ACTIONS === 'true') {\n switch (level) {\n case LogLevel.Info: {\n core.info(message);\n break;\n }\n case LogLevel.Warn: {\n core.warning(message);\n break;\n }\n case LogLevel.Error: {\n core.error(message);\n break;\n }\n }\n }\n else {\n switch (level) {\n case LogLevel.Info: {\n console.info(message);\n break;\n }\n case LogLevel.Warn: {\n console.warn(message);\n break;\n }\n case LogLevel.Error: {\n console.error(message);\n break;\n }\n }\n }\n}\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.issueCommand = issueCommand;\nexports.issue = issue;\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\n/**\n * Issues a command to the GitHub Actions runner\n *\n * @param command - The command name to issue\n * @param properties - Additional properties for the command (key-value pairs)\n * @param message - The message to include with the command\n * @remarks\n * This function outputs a specially formatted string to stdout that the Actions\n * runner interprets as a command. These commands can control workflow behavior,\n * set outputs, create annotations, mask values, and more.\n *\n * Command Format:\n * ::name key=value,key=value::message\n *\n * @example\n * ```typescript\n * // Issue a warning annotation\n * issueCommand('warning', {}, 'This is a warning message');\n * // Output: ::warning::This is a warning message\n *\n * // Set an environment variable\n * issueCommand('set-env', { name: 'MY_VAR' }, 'some value');\n * // Output: ::set-env name=MY_VAR::some value\n *\n * // Add a secret mask\n * issueCommand('add-mask', {}, 'secretValue123');\n * // Output: ::add-mask::secretValue123\n * ```\n *\n * @internal\n * This is an internal utility function that powers the public API functions\n * such as setSecret, warning, error, and exportVariable.\n */\nfunction issueCommand(command, properties, message) {\n const cmd = new Command(command, properties, message);\n process.stdout.write(cmd.toString() + os.EOL);\n}\nfunction issue(name, message = '') {\n issueCommand(name, {}, message);\n}\nconst CMD_STRING = '::';\nclass Command {\n constructor(command, properties, message) {\n if (!command) {\n command = 'missing.command';\n }\n this.command = command;\n this.properties = properties;\n this.message = message;\n }\n toString() {\n let cmdStr = CMD_STRING + this.command;\n if (this.properties && Object.keys(this.properties).length > 0) {\n cmdStr += ' ';\n let first = true;\n for (const key in this.properties) {\n if (this.properties.hasOwnProperty(key)) {\n const val = this.properties[key];\n if (val) {\n if (first) {\n first = false;\n }\n else {\n cmdStr += ',';\n }\n cmdStr += `${key}=${escapeProperty(val)}`;\n }\n }\n }\n }\n cmdStr += `${CMD_STRING}${escapeData(this.message)}`;\n return cmdStr;\n }\n}\nfunction escapeData(s) {\n return (0, utils_1.toCommandValue)(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A');\n}\nfunction escapeProperty(s) {\n return (0, utils_1.toCommandValue)(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n//# sourceMappingURL=command.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.platform = exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = exports.markdownSummary = exports.summary = exports.ExitCode = void 0;\nexports.exportVariable = exportVariable;\nexports.setSecret = setSecret;\nexports.addPath = addPath;\nexports.getInput = getInput;\nexports.getMultilineInput = getMultilineInput;\nexports.getBooleanInput = getBooleanInput;\nexports.setOutput = setOutput;\nexports.setCommandEcho = setCommandEcho;\nexports.setFailed = setFailed;\nexports.isDebug = isDebug;\nexports.debug = debug;\nexports.error = error;\nexports.warning = warning;\nexports.notice = notice;\nexports.info = info;\nexports.startGroup = startGroup;\nexports.endGroup = endGroup;\nexports.group = group;\nexports.saveState = saveState;\nexports.getState = getState;\nexports.getIDToken = getIDToken;\nconst command_1 = require(\"./command\");\nconst file_command_1 = require(\"./file-command\");\nconst utils_1 = require(\"./utils\");\nconst os = __importStar(require(\"os\"));\nconst path = __importStar(require(\"path\"));\nconst oidc_utils_1 = require(\"./oidc-utils\");\n/**\n * The code to exit an action\n */\nvar ExitCode;\n(function (ExitCode) {\n /**\n * A code indicating that the action was successful\n */\n ExitCode[ExitCode[\"Success\"] = 0] = \"Success\";\n /**\n * A code indicating that the action was a failure\n */\n ExitCode[ExitCode[\"Failure\"] = 1] = \"Failure\";\n})(ExitCode || (exports.ExitCode = ExitCode = {}));\n//-----------------------------------------------------------------------\n// Variables\n//-----------------------------------------------------------------------\n/**\n * Sets env variable for this action and future actions in the job\n * @param name the name of the variable to set\n * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction exportVariable(name, val) {\n const convertedVal = (0, utils_1.toCommandValue)(val);\n process.env[name] = convertedVal;\n const filePath = process.env['GITHUB_ENV'] || '';\n if (filePath) {\n return (0, file_command_1.issueFileCommand)('ENV', (0, file_command_1.prepareKeyValueMessage)(name, val));\n }\n (0, command_1.issueCommand)('set-env', { name }, convertedVal);\n}\n/**\n * Registers a secret which will get masked from logs\n *\n * @param secret - Value of the secret to be masked\n * @remarks\n * This function instructs the Actions runner to mask the specified value in any\n * logs produced during the workflow run. Once registered, the secret value will\n * be replaced with asterisks (***) whenever it appears in console output, logs,\n * or error messages.\n *\n * This is useful for protecting sensitive information such as:\n * - API keys\n * - Access tokens\n * - Authentication credentials\n * - URL parameters containing signatures (SAS tokens)\n *\n * Note that masking only affects future logs; any previous appearances of the\n * secret in logs before calling this function will remain unmasked.\n *\n * @example\n * ```typescript\n * // Register an API token as a secret\n * const apiToken = \"abc123xyz456\";\n * setSecret(apiToken);\n *\n * // Now any logs containing this value will show *** instead\n * console.log(`Using token: ${apiToken}`); // Outputs: \"Using token: ***\"\n * ```\n */\nfunction setSecret(secret) {\n (0, command_1.issueCommand)('add-mask', {}, secret);\n}\n/**\n * Prepends inputPath to the PATH (for this action and future actions)\n * @param inputPath\n */\nfunction addPath(inputPath) {\n const filePath = process.env['GITHUB_PATH'] || '';\n if (filePath) {\n (0, file_command_1.issueFileCommand)('PATH', inputPath);\n }\n else {\n (0, command_1.issueCommand)('add-path', {}, inputPath);\n }\n process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;\n}\n/**\n * Gets the value of an input.\n * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.\n * Returns an empty string if the value is not defined.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string\n */\nfunction getInput(name, options) {\n const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';\n if (options && options.required && !val) {\n throw new Error(`Input required and not supplied: ${name}`);\n }\n if (options && options.trimWhitespace === false) {\n return val;\n }\n return val.trim();\n}\n/**\n * Gets the values of an multiline input. Each value is also trimmed.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string[]\n *\n */\nfunction getMultilineInput(name, options) {\n const inputs = getInput(name, options)\n .split('\\n')\n .filter(x => x !== '');\n if (options && options.trimWhitespace === false) {\n return inputs;\n }\n return inputs.map(input => input.trim());\n}\n/**\n * Gets the input value of the boolean type in the YAML 1.2 \"core schema\" specification.\n * Support boolean input list: `true | True | TRUE | false | False | FALSE` .\n * The return value is also in boolean type.\n * ref: https://yaml.org/spec/1.2/spec.html#id2804923\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns boolean\n */\nfunction getBooleanInput(name, options) {\n const trueValue = ['true', 'True', 'TRUE'];\n const falseValue = ['false', 'False', 'FALSE'];\n const val = getInput(name, options);\n if (trueValue.includes(val))\n return true;\n if (falseValue.includes(val))\n return false;\n throw new TypeError(`Input does not meet YAML 1.2 \"Core Schema\" specification: ${name}\\n` +\n `Support boolean input list: \\`true | True | TRUE | false | False | FALSE\\``);\n}\n/**\n * Sets the value of an output.\n *\n * @param name name of the output to set\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setOutput(name, value) {\n const filePath = process.env['GITHUB_OUTPUT'] || '';\n if (filePath) {\n return (0, file_command_1.issueFileCommand)('OUTPUT', (0, file_command_1.prepareKeyValueMessage)(name, value));\n }\n process.stdout.write(os.EOL);\n (0, command_1.issueCommand)('set-output', { name }, (0, utils_1.toCommandValue)(value));\n}\n/**\n * Enables or disables the echoing of commands into stdout for the rest of the step.\n * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.\n *\n */\nfunction setCommandEcho(enabled) {\n (0, command_1.issue)('echo', enabled ? 'on' : 'off');\n}\n//-----------------------------------------------------------------------\n// Results\n//-----------------------------------------------------------------------\n/**\n * Sets the action status to failed.\n * When the action exits it will be with an exit code of 1\n * @param message add error issue message\n */\nfunction setFailed(message) {\n process.exitCode = ExitCode.Failure;\n error(message);\n}\n//-----------------------------------------------------------------------\n// Logging Commands\n//-----------------------------------------------------------------------\n/**\n * Gets whether Actions Step Debug is on or not\n */\nfunction isDebug() {\n return process.env['RUNNER_DEBUG'] === '1';\n}\n/**\n * Writes debug message to user log\n * @param message debug message\n */\nfunction debug(message) {\n (0, command_1.issueCommand)('debug', {}, message);\n}\n/**\n * Adds an error issue\n * @param message error issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction error(message, properties = {}) {\n (0, command_1.issueCommand)('error', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);\n}\n/**\n * Adds a warning issue\n * @param message warning issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction warning(message, properties = {}) {\n (0, command_1.issueCommand)('warning', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);\n}\n/**\n * Adds a notice issue\n * @param message notice issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction notice(message, properties = {}) {\n (0, command_1.issueCommand)('notice', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);\n}\n/**\n * Writes info to log with console.log.\n * @param message info message\n */\nfunction info(message) {\n process.stdout.write(message + os.EOL);\n}\n/**\n * Begin an output group.\n *\n * Output until the next `groupEnd` will be foldable in this group\n *\n * @param name The name of the output group\n */\nfunction startGroup(name) {\n (0, command_1.issue)('group', name);\n}\n/**\n * End an output group.\n */\nfunction endGroup() {\n (0, command_1.issue)('endgroup');\n}\n/**\n * Wrap an asynchronous function call in a group.\n *\n * Returns the same type as the function itself.\n *\n * @param name The name of the group\n * @param fn The function to wrap in the group\n */\nfunction group(name, fn) {\n return __awaiter(this, void 0, void 0, function* () {\n startGroup(name);\n let result;\n try {\n result = yield fn();\n }\n finally {\n endGroup();\n }\n return result;\n });\n}\n//-----------------------------------------------------------------------\n// Wrapper action state\n//-----------------------------------------------------------------------\n/**\n * Saves state for current action, the state can only be retrieved by this action's post job execution.\n *\n * @param name name of the state to store\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction saveState(name, value) {\n const filePath = process.env['GITHUB_STATE'] || '';\n if (filePath) {\n return (0, file_command_1.issueFileCommand)('STATE', (0, file_command_1.prepareKeyValueMessage)(name, value));\n }\n (0, command_1.issueCommand)('save-state', { name }, (0, utils_1.toCommandValue)(value));\n}\n/**\n * Gets the value of an state set by this action's main execution.\n *\n * @param name name of the state to get\n * @returns string\n */\nfunction getState(name) {\n return process.env[`STATE_${name}`] || '';\n}\nfunction getIDToken(aud) {\n return __awaiter(this, void 0, void 0, function* () {\n return yield oidc_utils_1.OidcClient.getIDToken(aud);\n });\n}\n/**\n * Summary exports\n */\nvar summary_1 = require(\"./summary\");\nObject.defineProperty(exports, \"summary\", { enumerable: true, get: function () { return summary_1.summary; } });\n/**\n * @deprecated use core.summary\n */\nvar summary_2 = require(\"./summary\");\nObject.defineProperty(exports, \"markdownSummary\", { enumerable: true, get: function () { return summary_2.markdownSummary; } });\n/**\n * Path exports\n */\nvar path_utils_1 = require(\"./path-utils\");\nObject.defineProperty(exports, \"toPosixPath\", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } });\nObject.defineProperty(exports, \"toWin32Path\", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } });\nObject.defineProperty(exports, \"toPlatformPath\", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } });\n/**\n * Platform utilities exports\n */\nexports.platform = __importStar(require(\"./platform\"));\n//# sourceMappingURL=core.js.map","\"use strict\";\n// For internal use, subject to change.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.issueFileCommand = issueFileCommand;\nexports.prepareKeyValueMessage = prepareKeyValueMessage;\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst crypto = __importStar(require(\"crypto\"));\nconst fs = __importStar(require(\"fs\"));\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\nfunction issueFileCommand(command, message) {\n const filePath = process.env[`GITHUB_${command}`];\n if (!filePath) {\n throw new Error(`Unable to find environment variable for file command ${command}`);\n }\n if (!fs.existsSync(filePath)) {\n throw new Error(`Missing file at path: ${filePath}`);\n }\n fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, {\n encoding: 'utf8'\n });\n}\nfunction prepareKeyValueMessage(key, value) {\n const delimiter = `ghadelimiter_${crypto.randomUUID()}`;\n const convertedValue = (0, utils_1.toCommandValue)(value);\n // These should realistically never happen, but just in case someone finds a\n // way to exploit uuid generation let's not allow keys or values that contain\n // the delimiter.\n if (key.includes(delimiter)) {\n throw new Error(`Unexpected input: name should not contain the delimiter \"${delimiter}\"`);\n }\n if (convertedValue.includes(delimiter)) {\n throw new Error(`Unexpected input: value should not contain the delimiter \"${delimiter}\"`);\n }\n return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;\n}\n//# sourceMappingURL=file-command.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OidcClient = void 0;\nconst http_client_1 = require(\"@actions/http-client\");\nconst auth_1 = require(\"@actions/http-client/lib/auth\");\nconst core_1 = require(\"./core\");\nclass OidcClient {\n static createHttpClient(allowRetry = true, maxRetry = 10) {\n const requestOptions = {\n allowRetries: allowRetry,\n maxRetries: maxRetry\n };\n return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions);\n }\n static getRequestToken() {\n const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'];\n if (!token) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable');\n }\n return token;\n }\n static getIDTokenUrl() {\n const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL'];\n if (!runtimeUrl) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable');\n }\n return runtimeUrl;\n }\n static getCall(id_token_url) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const httpclient = OidcClient.createHttpClient();\n const res = yield httpclient\n .getJson(id_token_url)\n .catch(error => {\n throw new Error(`Failed to get ID Token. \\n \n Error Code : ${error.statusCode}\\n \n Error Message: ${error.message}`);\n });\n const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;\n if (!id_token) {\n throw new Error('Response json body do not have ID Token field');\n }\n return id_token;\n });\n }\n static getIDToken(audience) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n // New ID Token is requested from action service\n let id_token_url = OidcClient.getIDTokenUrl();\n if (audience) {\n const encodedAudience = encodeURIComponent(audience);\n id_token_url = `${id_token_url}&audience=${encodedAudience}`;\n }\n (0, core_1.debug)(`ID token url is ${id_token_url}`);\n const id_token = yield OidcClient.getCall(id_token_url);\n (0, core_1.setSecret)(id_token);\n return id_token;\n }\n catch (error) {\n throw new Error(`Error message: ${error.message}`);\n }\n });\n }\n}\nexports.OidcClient = OidcClient;\n//# sourceMappingURL=oidc-utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toPosixPath = toPosixPath;\nexports.toWin32Path = toWin32Path;\nexports.toPlatformPath = toPlatformPath;\nconst path = __importStar(require(\"path\"));\n/**\n * toPosixPath converts the given path to the posix form. On Windows, \\\\ will be\n * replaced with /.\n *\n * @param pth. Path to transform.\n * @return string Posix path.\n */\nfunction toPosixPath(pth) {\n return pth.replace(/[\\\\]/g, '/');\n}\n/**\n * toWin32Path converts the given path to the win32 form. On Linux, / will be\n * replaced with \\\\.\n *\n * @param pth. Path to transform.\n * @return string Win32 path.\n */\nfunction toWin32Path(pth) {\n return pth.replace(/[/]/g, '\\\\');\n}\n/**\n * toPlatformPath converts the given path to a platform-specific path. It does\n * this by replacing instances of / and \\ with the platform-specific path\n * separator.\n *\n * @param pth The path to platformize.\n * @return string The platform-specific path.\n */\nfunction toPlatformPath(pth) {\n return pth.replace(/[/\\\\]/g, path.sep);\n}\n//# sourceMappingURL=path-utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isLinux = exports.isMacOS = exports.isWindows = exports.arch = exports.platform = void 0;\nexports.getDetails = getDetails;\nconst os_1 = __importDefault(require(\"os\"));\nconst exec = __importStar(require(\"@actions/exec\"));\nconst getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () {\n const { stdout: version } = yield exec.getExecOutput('powershell -command \"(Get-CimInstance -ClassName Win32_OperatingSystem).Version\"', undefined, {\n silent: true\n });\n const { stdout: name } = yield exec.getExecOutput('powershell -command \"(Get-CimInstance -ClassName Win32_OperatingSystem).Caption\"', undefined, {\n silent: true\n });\n return {\n name: name.trim(),\n version: version.trim()\n };\n});\nconst getMacOsInfo = () => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b, _c, _d;\n const { stdout } = yield exec.getExecOutput('sw_vers', undefined, {\n silent: true\n });\n const version = (_b = (_a = stdout.match(/ProductVersion:\\s*(.+)/)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : '';\n const name = (_d = (_c = stdout.match(/ProductName:\\s*(.+)/)) === null || _c === void 0 ? void 0 : _c[1]) !== null && _d !== void 0 ? _d : '';\n return {\n name,\n version\n };\n});\nconst getLinuxInfo = () => __awaiter(void 0, void 0, void 0, function* () {\n const { stdout } = yield exec.getExecOutput('lsb_release', ['-i', '-r', '-s'], {\n silent: true\n });\n const [name, version] = stdout.trim().split('\\n');\n return {\n name,\n version\n };\n});\nexports.platform = os_1.default.platform();\nexports.arch = os_1.default.arch();\nexports.isWindows = exports.platform === 'win32';\nexports.isMacOS = exports.platform === 'darwin';\nexports.isLinux = exports.platform === 'linux';\nfunction getDetails() {\n return __awaiter(this, void 0, void 0, function* () {\n return Object.assign(Object.assign({}, (yield (exports.isWindows\n ? getWindowsInfo()\n : exports.isMacOS\n ? getMacOsInfo()\n : getLinuxInfo()))), { platform: exports.platform,\n arch: exports.arch,\n isWindows: exports.isWindows,\n isMacOS: exports.isMacOS,\n isLinux: exports.isLinux });\n });\n}\n//# sourceMappingURL=platform.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0;\nconst os_1 = require(\"os\");\nconst fs_1 = require(\"fs\");\nconst { access, appendFile, writeFile } = fs_1.promises;\nexports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY';\nexports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary';\nclass Summary {\n constructor() {\n this._buffer = '';\n }\n /**\n * Finds the summary file path from the environment, rejects if env var is not found or file does not exist\n * Also checks r/w permissions.\n *\n * @returns step summary file path\n */\n filePath() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._filePath) {\n return this._filePath;\n }\n const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR];\n if (!pathFromEnv) {\n throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`);\n }\n try {\n yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK);\n }\n catch (_a) {\n throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`);\n }\n this._filePath = pathFromEnv;\n return this._filePath;\n });\n }\n /**\n * Wraps content in an HTML tag, adding any HTML attributes\n *\n * @param {string} tag HTML tag to wrap\n * @param {string | null} content content within the tag\n * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add\n *\n * @returns {string} content wrapped in HTML element\n */\n wrap(tag, content, attrs = {}) {\n const htmlAttrs = Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${value}\"`)\n .join('');\n if (!content) {\n return `<${tag}${htmlAttrs}>`;\n }\n return `<${tag}${htmlAttrs}>${content}`;\n }\n /**\n * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default.\n *\n * @param {SummaryWriteOptions} [options] (optional) options for write operation\n *\n * @returns {Promise} summary instance\n */\n write(options) {\n return __awaiter(this, void 0, void 0, function* () {\n const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite);\n const filePath = yield this.filePath();\n const writeFunc = overwrite ? writeFile : appendFile;\n yield writeFunc(filePath, this._buffer, { encoding: 'utf8' });\n return this.emptyBuffer();\n });\n }\n /**\n * Clears the summary buffer and wipes the summary file\n *\n * @returns {Summary} summary instance\n */\n clear() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.emptyBuffer().write({ overwrite: true });\n });\n }\n /**\n * Returns the current summary buffer as a string\n *\n * @returns {string} string of summary buffer\n */\n stringify() {\n return this._buffer;\n }\n /**\n * If the summary buffer is empty\n *\n * @returns {boolen} true if the buffer is empty\n */\n isEmptyBuffer() {\n return this._buffer.length === 0;\n }\n /**\n * Resets the summary buffer without writing to summary file\n *\n * @returns {Summary} summary instance\n */\n emptyBuffer() {\n this._buffer = '';\n return this;\n }\n /**\n * Adds raw text to the summary buffer\n *\n * @param {string} text content to add\n * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false)\n *\n * @returns {Summary} summary instance\n */\n addRaw(text, addEOL = false) {\n this._buffer += text;\n return addEOL ? this.addEOL() : this;\n }\n /**\n * Adds the operating system-specific end-of-line marker to the buffer\n *\n * @returns {Summary} summary instance\n */\n addEOL() {\n return this.addRaw(os_1.EOL);\n }\n /**\n * Adds an HTML codeblock to the summary buffer\n *\n * @param {string} code content to render within fenced code block\n * @param {string} lang (optional) language to syntax highlight code\n *\n * @returns {Summary} summary instance\n */\n addCodeBlock(code, lang) {\n const attrs = Object.assign({}, (lang && { lang }));\n const element = this.wrap('pre', this.wrap('code', code), attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML list to the summary buffer\n *\n * @param {string[]} items list of items to render\n * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false)\n *\n * @returns {Summary} summary instance\n */\n addList(items, ordered = false) {\n const tag = ordered ? 'ol' : 'ul';\n const listItems = items.map(item => this.wrap('li', item)).join('');\n const element = this.wrap(tag, listItems);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML table to the summary buffer\n *\n * @param {SummaryTableCell[]} rows table rows\n *\n * @returns {Summary} summary instance\n */\n addTable(rows) {\n const tableBody = rows\n .map(row => {\n const cells = row\n .map(cell => {\n if (typeof cell === 'string') {\n return this.wrap('td', cell);\n }\n const { header, data, colspan, rowspan } = cell;\n const tag = header ? 'th' : 'td';\n const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan }));\n return this.wrap(tag, data, attrs);\n })\n .join('');\n return this.wrap('tr', cells);\n })\n .join('');\n const element = this.wrap('table', tableBody);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds a collapsable HTML details element to the summary buffer\n *\n * @param {string} label text for the closed state\n * @param {string} content collapsable content\n *\n * @returns {Summary} summary instance\n */\n addDetails(label, content) {\n const element = this.wrap('details', this.wrap('summary', label) + content);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML image tag to the summary buffer\n *\n * @param {string} src path to the image you to embed\n * @param {string} alt text description of the image\n * @param {SummaryImageOptions} options (optional) addition image attributes\n *\n * @returns {Summary} summary instance\n */\n addImage(src, alt, options) {\n const { width, height } = options || {};\n const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height }));\n const element = this.wrap('img', null, Object.assign({ src, alt }, attrs));\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML section heading element\n *\n * @param {string} text heading text\n * @param {number | string} [level=1] (optional) the heading level, default: 1\n *\n * @returns {Summary} summary instance\n */\n addHeading(text, level) {\n const tag = `h${level}`;\n const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag)\n ? tag\n : 'h1';\n const element = this.wrap(allowedTag, text);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML thematic break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addSeparator() {\n const element = this.wrap('hr', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML line break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addBreak() {\n const element = this.wrap('br', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML blockquote to the summary buffer\n *\n * @param {string} text quote text\n * @param {string} cite (optional) citation url\n *\n * @returns {Summary} summary instance\n */\n addQuote(text, cite) {\n const attrs = Object.assign({}, (cite && { cite }));\n const element = this.wrap('blockquote', text, attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML anchor tag to the summary buffer\n *\n * @param {string} text link text/content\n * @param {string} href hyperlink\n *\n * @returns {Summary} summary instance\n */\n addLink(text, href) {\n const element = this.wrap('a', text, { href });\n return this.addRaw(element).addEOL();\n }\n}\nconst _summary = new Summary();\n/**\n * @deprecated use `core.summary`\n */\nexports.markdownSummary = _summary;\nexports.summary = _summary;\n//# sourceMappingURL=summary.js.map","\"use strict\";\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toCommandValue = toCommandValue;\nexports.toCommandProperties = toCommandProperties;\n/**\n * Sanitizes an input into a string so it can be passed into issueCommand safely\n * @param input input to sanitize into a string\n */\nfunction toCommandValue(input) {\n if (input === null || input === undefined) {\n return '';\n }\n else if (typeof input === 'string' || input instanceof String) {\n return input;\n }\n return JSON.stringify(input);\n}\n/**\n *\n * @param annotationProperties\n * @returns The command properties to send with the actual annotation command\n * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646\n */\nfunction toCommandProperties(annotationProperties) {\n if (!Object.keys(annotationProperties).length) {\n return {};\n }\n return {\n title: annotationProperties.title,\n file: annotationProperties.file,\n line: annotationProperties.startLine,\n endLine: annotationProperties.endLine,\n col: annotationProperties.startColumn,\n endColumn: annotationProperties.endColumn\n };\n}\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.exec = exec;\nexports.getExecOutput = getExecOutput;\nconst string_decoder_1 = require(\"string_decoder\");\nconst tr = __importStar(require(\"./toolrunner\"));\n/**\n * Exec a command.\n * Output will be streamed to the live console.\n * Returns promise with return code\n *\n * @param commandLine command to execute (can include additional args). Must be correctly escaped.\n * @param args optional arguments for tool. Escaping is handled by the lib.\n * @param options optional exec options. See ExecOptions\n * @returns Promise exit code\n */\nfunction exec(commandLine, args, options) {\n return __awaiter(this, void 0, void 0, function* () {\n const commandArgs = tr.argStringToArray(commandLine);\n if (commandArgs.length === 0) {\n throw new Error(`Parameter 'commandLine' cannot be null or empty.`);\n }\n // Path to tool to execute should be first arg\n const toolPath = commandArgs[0];\n args = commandArgs.slice(1).concat(args || []);\n const runner = new tr.ToolRunner(toolPath, args, options);\n return runner.exec();\n });\n}\n/**\n * Exec a command and get the output.\n * Output will be streamed to the live console.\n * Returns promise with the exit code and collected stdout and stderr\n *\n * @param commandLine command to execute (can include additional args). Must be correctly escaped.\n * @param args optional arguments for tool. Escaping is handled by the lib.\n * @param options optional exec options. See ExecOptions\n * @returns Promise exit code, stdout, and stderr\n */\nfunction getExecOutput(commandLine, args, options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n let stdout = '';\n let stderr = '';\n //Using string decoder covers the case where a mult-byte character is split\n const stdoutDecoder = new string_decoder_1.StringDecoder('utf8');\n const stderrDecoder = new string_decoder_1.StringDecoder('utf8');\n const originalStdoutListener = (_a = options === null || options === void 0 ? void 0 : options.listeners) === null || _a === void 0 ? void 0 : _a.stdout;\n const originalStdErrListener = (_b = options === null || options === void 0 ? void 0 : options.listeners) === null || _b === void 0 ? void 0 : _b.stderr;\n const stdErrListener = (data) => {\n stderr += stderrDecoder.write(data);\n if (originalStdErrListener) {\n originalStdErrListener(data);\n }\n };\n const stdOutListener = (data) => {\n stdout += stdoutDecoder.write(data);\n if (originalStdoutListener) {\n originalStdoutListener(data);\n }\n };\n const listeners = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.listeners), { stdout: stdOutListener, stderr: stdErrListener });\n const exitCode = yield exec(commandLine, args, Object.assign(Object.assign({}, options), { listeners }));\n //flush any remaining characters\n stdout += stdoutDecoder.end();\n stderr += stderrDecoder.end();\n return {\n exitCode,\n stdout,\n stderr\n };\n });\n}\n//# sourceMappingURL=exec.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ToolRunner = void 0;\nexports.argStringToArray = argStringToArray;\nconst os = __importStar(require(\"os\"));\nconst events = __importStar(require(\"events\"));\nconst child = __importStar(require(\"child_process\"));\nconst path = __importStar(require(\"path\"));\nconst io = __importStar(require(\"@actions/io\"));\nconst ioUtil = __importStar(require(\"@actions/io/lib/io-util\"));\nconst timers_1 = require(\"timers\");\n/* eslint-disable @typescript-eslint/unbound-method */\nconst IS_WINDOWS = process.platform === 'win32';\n/*\n * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way.\n */\nclass ToolRunner extends events.EventEmitter {\n constructor(toolPath, args, options) {\n super();\n if (!toolPath) {\n throw new Error(\"Parameter 'toolPath' cannot be null or empty.\");\n }\n this.toolPath = toolPath;\n this.args = args || [];\n this.options = options || {};\n }\n _debug(message) {\n if (this.options.listeners && this.options.listeners.debug) {\n this.options.listeners.debug(message);\n }\n }\n _getCommandString(options, noPrefix) {\n const toolPath = this._getSpawnFileName();\n const args = this._getSpawnArgs(options);\n let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool\n if (IS_WINDOWS) {\n // Windows + cmd file\n if (this._isCmdFile()) {\n cmd += toolPath;\n for (const a of args) {\n cmd += ` ${a}`;\n }\n }\n // Windows + verbatim\n else if (options.windowsVerbatimArguments) {\n cmd += `\"${toolPath}\"`;\n for (const a of args) {\n cmd += ` ${a}`;\n }\n }\n // Windows (regular)\n else {\n cmd += this._windowsQuoteCmdArg(toolPath);\n for (const a of args) {\n cmd += ` ${this._windowsQuoteCmdArg(a)}`;\n }\n }\n }\n else {\n // OSX/Linux - this can likely be improved with some form of quoting.\n // creating processes on Unix is fundamentally different than Windows.\n // on Unix, execvp() takes an arg array.\n cmd += toolPath;\n for (const a of args) {\n cmd += ` ${a}`;\n }\n }\n return cmd;\n }\n _processLineBuffer(data, strBuffer, onLine) {\n try {\n let s = strBuffer + data.toString();\n let n = s.indexOf(os.EOL);\n while (n > -1) {\n const line = s.substring(0, n);\n onLine(line);\n // the rest of the string ...\n s = s.substring(n + os.EOL.length);\n n = s.indexOf(os.EOL);\n }\n return s;\n }\n catch (err) {\n // streaming lines to console is best effort. Don't fail a build.\n this._debug(`error processing line. Failed with error ${err}`);\n return '';\n }\n }\n _getSpawnFileName() {\n if (IS_WINDOWS) {\n if (this._isCmdFile()) {\n return process.env['COMSPEC'] || 'cmd.exe';\n }\n }\n return this.toolPath;\n }\n _getSpawnArgs(options) {\n if (IS_WINDOWS) {\n if (this._isCmdFile()) {\n let argline = `/D /S /C \"${this._windowsQuoteCmdArg(this.toolPath)}`;\n for (const a of this.args) {\n argline += ' ';\n argline += options.windowsVerbatimArguments\n ? a\n : this._windowsQuoteCmdArg(a);\n }\n argline += '\"';\n return [argline];\n }\n }\n return this.args;\n }\n _endsWith(str, end) {\n return str.endsWith(end);\n }\n _isCmdFile() {\n const upperToolPath = this.toolPath.toUpperCase();\n return (this._endsWith(upperToolPath, '.CMD') ||\n this._endsWith(upperToolPath, '.BAT'));\n }\n _windowsQuoteCmdArg(arg) {\n // for .exe, apply the normal quoting rules that libuv applies\n if (!this._isCmdFile()) {\n return this._uvQuoteCmdArg(arg);\n }\n // otherwise apply quoting rules specific to the cmd.exe command line parser.\n // the libuv rules are generic and are not designed specifically for cmd.exe\n // command line parser.\n //\n // for a detailed description of the cmd.exe command line parser, refer to\n // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912\n // need quotes for empty arg\n if (!arg) {\n return '\"\"';\n }\n // determine whether the arg needs to be quoted\n const cmdSpecialChars = [\n ' ',\n '\\t',\n '&',\n '(',\n ')',\n '[',\n ']',\n '{',\n '}',\n '^',\n '=',\n ';',\n '!',\n \"'\",\n '+',\n ',',\n '`',\n '~',\n '|',\n '<',\n '>',\n '\"'\n ];\n let needsQuotes = false;\n for (const char of arg) {\n if (cmdSpecialChars.some(x => x === char)) {\n needsQuotes = true;\n break;\n }\n }\n // short-circuit if quotes not needed\n if (!needsQuotes) {\n return arg;\n }\n // the following quoting rules are very similar to the rules that by libuv applies.\n //\n // 1) wrap the string in quotes\n //\n // 2) double-up quotes - i.e. \" => \"\"\n //\n // this is different from the libuv quoting rules. libuv replaces \" with \\\", which unfortunately\n // doesn't work well with a cmd.exe command line.\n //\n // note, replacing \" with \"\" also works well if the arg is passed to a downstream .NET console app.\n // for example, the command line:\n // foo.exe \"myarg:\"\"my val\"\"\"\n // is parsed by a .NET console app into an arg array:\n // [ \"myarg:\\\"my val\\\"\" ]\n // which is the same end result when applying libuv quoting rules. although the actual\n // command line from libuv quoting rules would look like:\n // foo.exe \"myarg:\\\"my val\\\"\"\n //\n // 3) double-up slashes that precede a quote,\n // e.g. hello \\world => \"hello \\world\"\n // hello\\\"world => \"hello\\\\\"\"world\"\n // hello\\\\\"world => \"hello\\\\\\\\\"\"world\"\n // hello world\\ => \"hello world\\\\\"\n //\n // technically this is not required for a cmd.exe command line, or the batch argument parser.\n // the reasons for including this as a .cmd quoting rule are:\n //\n // a) this is optimized for the scenario where the argument is passed from the .cmd file to an\n // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule.\n //\n // b) it's what we've been doing previously (by deferring to node default behavior) and we\n // haven't heard any complaints about that aspect.\n //\n // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be\n // escaped when used on the command line directly - even though within a .cmd file % can be escaped\n // by using %%.\n //\n // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts\n // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing.\n //\n // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would\n // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the\n // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args\n // to an external program.\n //\n // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file.\n // % can be escaped within a .cmd file.\n let reverse = '\"';\n let quoteHit = true;\n for (let i = arg.length; i > 0; i--) {\n // walk the string in reverse\n reverse += arg[i - 1];\n if (quoteHit && arg[i - 1] === '\\\\') {\n reverse += '\\\\'; // double the slash\n }\n else if (arg[i - 1] === '\"') {\n quoteHit = true;\n reverse += '\"'; // double the quote\n }\n else {\n quoteHit = false;\n }\n }\n reverse += '\"';\n return reverse.split('').reverse().join('');\n }\n _uvQuoteCmdArg(arg) {\n // Tool runner wraps child_process.spawn() and needs to apply the same quoting as\n // Node in certain cases where the undocumented spawn option windowsVerbatimArguments\n // is used.\n //\n // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV,\n // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details),\n // pasting copyright notice from Node within this function:\n //\n // Copyright Joyent, Inc. and other Node contributors. All rights reserved.\n //\n // Permission is hereby granted, free of charge, to any person obtaining a copy\n // of this software and associated documentation files (the \"Software\"), to\n // deal in the Software without restriction, including without limitation the\n // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n // sell copies of the Software, and to permit persons to whom the Software is\n // furnished to do so, subject to the following conditions:\n //\n // The above copyright notice and this permission notice shall be included in\n // all copies or substantial portions of the Software.\n //\n // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n // IN THE SOFTWARE.\n if (!arg) {\n // Need double quotation for empty argument\n return '\"\"';\n }\n if (!arg.includes(' ') && !arg.includes('\\t') && !arg.includes('\"')) {\n // No quotation needed\n return arg;\n }\n if (!arg.includes('\"') && !arg.includes('\\\\')) {\n // No embedded double quotes or backslashes, so I can just wrap\n // quote marks around the whole thing.\n return `\"${arg}\"`;\n }\n // Expected input/output:\n // input : hello\"world\n // output: \"hello\\\"world\"\n // input : hello\"\"world\n // output: \"hello\\\"\\\"world\"\n // input : hello\\world\n // output: hello\\world\n // input : hello\\\\world\n // output: hello\\\\world\n // input : hello\\\"world\n // output: \"hello\\\\\\\"world\"\n // input : hello\\\\\"world\n // output: \"hello\\\\\\\\\\\"world\"\n // input : hello world\\\n // output: \"hello world\\\\\" - note the comment in libuv actually reads \"hello world\\\"\n // but it appears the comment is wrong, it should be \"hello world\\\\\"\n let reverse = '\"';\n let quoteHit = true;\n for (let i = arg.length; i > 0; i--) {\n // walk the string in reverse\n reverse += arg[i - 1];\n if (quoteHit && arg[i - 1] === '\\\\') {\n reverse += '\\\\';\n }\n else if (arg[i - 1] === '\"') {\n quoteHit = true;\n reverse += '\\\\';\n }\n else {\n quoteHit = false;\n }\n }\n reverse += '\"';\n return reverse.split('').reverse().join('');\n }\n _cloneExecOptions(options) {\n options = options || {};\n const result = {\n cwd: options.cwd || process.cwd(),\n env: options.env || process.env,\n silent: options.silent || false,\n windowsVerbatimArguments: options.windowsVerbatimArguments || false,\n failOnStdErr: options.failOnStdErr || false,\n ignoreReturnCode: options.ignoreReturnCode || false,\n delay: options.delay || 10000\n };\n result.outStream = options.outStream || process.stdout;\n result.errStream = options.errStream || process.stderr;\n return result;\n }\n _getSpawnOptions(options, toolPath) {\n options = options || {};\n const result = {};\n result.cwd = options.cwd;\n result.env = options.env;\n result['windowsVerbatimArguments'] =\n options.windowsVerbatimArguments || this._isCmdFile();\n if (options.windowsVerbatimArguments) {\n result.argv0 = `\"${toolPath}\"`;\n }\n return result;\n }\n /**\n * Exec a tool.\n * Output will be streamed to the live console.\n * Returns promise with return code\n *\n * @param tool path to tool to exec\n * @param options optional exec options. See ExecOptions\n * @returns number\n */\n exec() {\n return __awaiter(this, void 0, void 0, function* () {\n // root the tool path if it is unrooted and contains relative pathing\n if (!ioUtil.isRooted(this.toolPath) &&\n (this.toolPath.includes('/') ||\n (IS_WINDOWS && this.toolPath.includes('\\\\')))) {\n // prefer options.cwd if it is specified, however options.cwd may also need to be rooted\n this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath);\n }\n // if the tool is only a file name, then resolve it from the PATH\n // otherwise verify it exists (add extension on Windows if necessary)\n this.toolPath = yield io.which(this.toolPath, true);\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n this._debug(`exec tool: ${this.toolPath}`);\n this._debug('arguments:');\n for (const arg of this.args) {\n this._debug(` ${arg}`);\n }\n const optionsNonNull = this._cloneExecOptions(this.options);\n if (!optionsNonNull.silent && optionsNonNull.outStream) {\n optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL);\n }\n const state = new ExecState(optionsNonNull, this.toolPath);\n state.on('debug', (message) => {\n this._debug(message);\n });\n if (this.options.cwd && !(yield ioUtil.exists(this.options.cwd))) {\n return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`));\n }\n const fileName = this._getSpawnFileName();\n const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName));\n let stdbuffer = '';\n if (cp.stdout) {\n cp.stdout.on('data', (data) => {\n if (this.options.listeners && this.options.listeners.stdout) {\n this.options.listeners.stdout(data);\n }\n if (!optionsNonNull.silent && optionsNonNull.outStream) {\n optionsNonNull.outStream.write(data);\n }\n stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => {\n if (this.options.listeners && this.options.listeners.stdline) {\n this.options.listeners.stdline(line);\n }\n });\n });\n }\n let errbuffer = '';\n if (cp.stderr) {\n cp.stderr.on('data', (data) => {\n state.processStderr = true;\n if (this.options.listeners && this.options.listeners.stderr) {\n this.options.listeners.stderr(data);\n }\n if (!optionsNonNull.silent &&\n optionsNonNull.errStream &&\n optionsNonNull.outStream) {\n const s = optionsNonNull.failOnStdErr\n ? optionsNonNull.errStream\n : optionsNonNull.outStream;\n s.write(data);\n }\n errbuffer = this._processLineBuffer(data, errbuffer, (line) => {\n if (this.options.listeners && this.options.listeners.errline) {\n this.options.listeners.errline(line);\n }\n });\n });\n }\n cp.on('error', (err) => {\n state.processError = err.message;\n state.processExited = true;\n state.processClosed = true;\n state.CheckComplete();\n });\n cp.on('exit', (code) => {\n state.processExitCode = code;\n state.processExited = true;\n this._debug(`Exit code ${code} received from tool '${this.toolPath}'`);\n state.CheckComplete();\n });\n cp.on('close', (code) => {\n state.processExitCode = code;\n state.processExited = true;\n state.processClosed = true;\n this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);\n state.CheckComplete();\n });\n state.on('done', (error, exitCode) => {\n if (stdbuffer.length > 0) {\n this.emit('stdline', stdbuffer);\n }\n if (errbuffer.length > 0) {\n this.emit('errline', errbuffer);\n }\n cp.removeAllListeners();\n if (error) {\n reject(error);\n }\n else {\n resolve(exitCode);\n }\n });\n if (this.options.input) {\n if (!cp.stdin) {\n throw new Error('child process missing stdin');\n }\n cp.stdin.end(this.options.input);\n }\n }));\n });\n }\n}\nexports.ToolRunner = ToolRunner;\n/**\n * Convert an arg string to an array of args. Handles escaping\n *\n * @param argString string of arguments\n * @returns string[] array of arguments\n */\nfunction argStringToArray(argString) {\n const args = [];\n let inQuotes = false;\n let escaped = false;\n let arg = '';\n function append(c) {\n // we only escape double quotes.\n if (escaped && c !== '\"') {\n arg += '\\\\';\n }\n arg += c;\n escaped = false;\n }\n for (let i = 0; i < argString.length; i++) {\n const c = argString.charAt(i);\n if (c === '\"') {\n if (!escaped) {\n inQuotes = !inQuotes;\n }\n else {\n append(c);\n }\n continue;\n }\n if (c === '\\\\' && escaped) {\n append(c);\n continue;\n }\n if (c === '\\\\' && inQuotes) {\n escaped = true;\n continue;\n }\n if (c === ' ' && !inQuotes) {\n if (arg.length > 0) {\n args.push(arg);\n arg = '';\n }\n continue;\n }\n append(c);\n }\n if (arg.length > 0) {\n args.push(arg.trim());\n }\n return args;\n}\nclass ExecState extends events.EventEmitter {\n constructor(options, toolPath) {\n super();\n this.processClosed = false; // tracks whether the process has exited and stdio is closed\n this.processError = '';\n this.processExitCode = 0;\n this.processExited = false; // tracks whether the process has exited\n this.processStderr = false; // tracks whether stderr was written to\n this.delay = 10000; // 10 seconds\n this.done = false;\n this.timeout = null;\n if (!toolPath) {\n throw new Error('toolPath must not be empty');\n }\n this.options = options;\n this.toolPath = toolPath;\n if (options.delay) {\n this.delay = options.delay;\n }\n }\n CheckComplete() {\n if (this.done) {\n return;\n }\n if (this.processClosed) {\n this._setResult();\n }\n else if (this.processExited) {\n this.timeout = (0, timers_1.setTimeout)(ExecState.HandleTimeout, this.delay, this);\n }\n }\n _debug(message) {\n this.emit('debug', message);\n }\n _setResult() {\n // determine whether there is an error\n let error;\n if (this.processExited) {\n if (this.processError) {\n error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`);\n }\n else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) {\n error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`);\n }\n else if (this.processStderr && this.options.failOnStdErr) {\n error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`);\n }\n }\n // clear the timeout\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n this.done = true;\n this.emit('done', error, this.processExitCode);\n }\n static HandleTimeout(state) {\n if (state.done) {\n return;\n }\n if (!state.processClosed && state.processExited) {\n const message = `The STDIO streams did not close within ${state.delay / 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;\n state._debug(message);\n }\n state._setResult();\n }\n}\n//# sourceMappingURL=toolrunner.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0;\nclass BasicCredentialHandler {\n constructor(username, password) {\n this.username = username;\n this.password = password;\n }\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BasicCredentialHandler = BasicCredentialHandler;\nclass BearerCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Bearer ${this.token}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BearerCredentialHandler = BearerCredentialHandler;\nclass PersonalAccessTokenCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;\n//# sourceMappingURL=auth.js.map","\"use strict\";\n/* eslint-disable @typescript-eslint/no-explicit-any */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpClient = exports.HttpClientResponse = exports.HttpClientError = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0;\nexports.getProxyUrl = getProxyUrl;\nexports.isHttps = isHttps;\nconst http = __importStar(require(\"http\"));\nconst https = __importStar(require(\"https\"));\nconst pm = __importStar(require(\"./proxy\"));\nconst tunnel = __importStar(require(\"tunnel\"));\nconst undici_1 = require(\"undici\");\nvar HttpCodes;\n(function (HttpCodes) {\n HttpCodes[HttpCodes[\"OK\"] = 200] = \"OK\";\n HttpCodes[HttpCodes[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n HttpCodes[HttpCodes[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n HttpCodes[HttpCodes[\"ResourceMoved\"] = 302] = \"ResourceMoved\";\n HttpCodes[HttpCodes[\"SeeOther\"] = 303] = \"SeeOther\";\n HttpCodes[HttpCodes[\"NotModified\"] = 304] = \"NotModified\";\n HttpCodes[HttpCodes[\"UseProxy\"] = 305] = \"UseProxy\";\n HttpCodes[HttpCodes[\"SwitchProxy\"] = 306] = \"SwitchProxy\";\n HttpCodes[HttpCodes[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n HttpCodes[HttpCodes[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n HttpCodes[HttpCodes[\"BadRequest\"] = 400] = \"BadRequest\";\n HttpCodes[HttpCodes[\"Unauthorized\"] = 401] = \"Unauthorized\";\n HttpCodes[HttpCodes[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n HttpCodes[HttpCodes[\"Forbidden\"] = 403] = \"Forbidden\";\n HttpCodes[HttpCodes[\"NotFound\"] = 404] = \"NotFound\";\n HttpCodes[HttpCodes[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n HttpCodes[HttpCodes[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n HttpCodes[HttpCodes[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n HttpCodes[HttpCodes[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n HttpCodes[HttpCodes[\"Conflict\"] = 409] = \"Conflict\";\n HttpCodes[HttpCodes[\"Gone\"] = 410] = \"Gone\";\n HttpCodes[HttpCodes[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n HttpCodes[HttpCodes[\"InternalServerError\"] = 500] = \"InternalServerError\";\n HttpCodes[HttpCodes[\"NotImplemented\"] = 501] = \"NotImplemented\";\n HttpCodes[HttpCodes[\"BadGateway\"] = 502] = \"BadGateway\";\n HttpCodes[HttpCodes[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n HttpCodes[HttpCodes[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n})(HttpCodes || (exports.HttpCodes = HttpCodes = {}));\nvar Headers;\n(function (Headers) {\n Headers[\"Accept\"] = \"accept\";\n Headers[\"ContentType\"] = \"content-type\";\n})(Headers || (exports.Headers = Headers = {}));\nvar MediaTypes;\n(function (MediaTypes) {\n MediaTypes[\"ApplicationJson\"] = \"application/json\";\n})(MediaTypes || (exports.MediaTypes = MediaTypes = {}));\n/**\n * Returns the proxy URL, depending upon the supplied url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\nfunction getProxyUrl(serverUrl) {\n const proxyUrl = pm.getProxyUrl(new URL(serverUrl));\n return proxyUrl ? proxyUrl.href : '';\n}\nconst HttpRedirectCodes = [\n HttpCodes.MovedPermanently,\n HttpCodes.ResourceMoved,\n HttpCodes.SeeOther,\n HttpCodes.TemporaryRedirect,\n HttpCodes.PermanentRedirect\n];\nconst HttpResponseRetryCodes = [\n HttpCodes.BadGateway,\n HttpCodes.ServiceUnavailable,\n HttpCodes.GatewayTimeout\n];\nconst RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];\nconst ExponentialBackoffCeiling = 10;\nconst ExponentialBackoffTimeSlice = 5;\nclass HttpClientError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.name = 'HttpClientError';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, HttpClientError.prototype);\n }\n}\nexports.HttpClientError = HttpClientError;\nclass HttpClientResponse {\n constructor(message) {\n this.message = message;\n }\n readBody() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n let output = Buffer.alloc(0);\n this.message.on('data', (chunk) => {\n output = Buffer.concat([output, chunk]);\n });\n this.message.on('end', () => {\n resolve(output.toString());\n });\n }));\n });\n }\n readBodyBuffer() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n const chunks = [];\n this.message.on('data', (chunk) => {\n chunks.push(chunk);\n });\n this.message.on('end', () => {\n resolve(Buffer.concat(chunks));\n });\n }));\n });\n }\n}\nexports.HttpClientResponse = HttpClientResponse;\nfunction isHttps(requestUrl) {\n const parsedUrl = new URL(requestUrl);\n return parsedUrl.protocol === 'https:';\n}\nclass HttpClient {\n constructor(userAgent, handlers, requestOptions) {\n this._ignoreSslError = false;\n this._allowRedirects = true;\n this._allowRedirectDowngrade = false;\n this._maxRedirects = 50;\n this._allowRetries = false;\n this._maxRetries = 1;\n this._keepAlive = false;\n this._disposed = false;\n this.userAgent = this._getUserAgentWithOrchestrationId(userAgent);\n this.handlers = handlers || [];\n this.requestOptions = requestOptions;\n if (requestOptions) {\n if (requestOptions.ignoreSslError != null) {\n this._ignoreSslError = requestOptions.ignoreSslError;\n }\n this._socketTimeout = requestOptions.socketTimeout;\n if (requestOptions.allowRedirects != null) {\n this._allowRedirects = requestOptions.allowRedirects;\n }\n if (requestOptions.allowRedirectDowngrade != null) {\n this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;\n }\n if (requestOptions.maxRedirects != null) {\n this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);\n }\n if (requestOptions.keepAlive != null) {\n this._keepAlive = requestOptions.keepAlive;\n }\n if (requestOptions.allowRetries != null) {\n this._allowRetries = requestOptions.allowRetries;\n }\n if (requestOptions.maxRetries != null) {\n this._maxRetries = requestOptions.maxRetries;\n }\n }\n }\n options(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});\n });\n }\n get(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('GET', requestUrl, null, additionalHeaders || {});\n });\n }\n del(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('DELETE', requestUrl, null, additionalHeaders || {});\n });\n }\n post(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('POST', requestUrl, data, additionalHeaders || {});\n });\n }\n patch(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('PATCH', requestUrl, data, additionalHeaders || {});\n });\n }\n put(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('PUT', requestUrl, data, additionalHeaders || {});\n });\n }\n head(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('HEAD', requestUrl, null, additionalHeaders || {});\n });\n }\n sendStream(verb, requestUrl, stream, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(verb, requestUrl, stream, additionalHeaders);\n });\n }\n /**\n * Gets a typed object from an endpoint\n * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise\n */\n getJson(requestUrl_1) {\n return __awaiter(this, arguments, void 0, function* (requestUrl, additionalHeaders = {}) {\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n const res = yield this.get(requestUrl, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n postJson(requestUrl_1, obj_1) {\n return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] =\n this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson);\n const res = yield this.post(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n putJson(requestUrl_1, obj_1) {\n return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] =\n this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson);\n const res = yield this.put(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n patchJson(requestUrl_1, obj_1) {\n return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] =\n this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson);\n const res = yield this.patch(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n /**\n * Makes a raw http request.\n * All other methods such as get, post, patch, and request ultimately call this.\n * Prefer get, del, post and patch\n */\n request(verb, requestUrl, data, headers) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._disposed) {\n throw new Error('Client has already been disposed.');\n }\n const parsedUrl = new URL(requestUrl);\n let info = this._prepareRequest(verb, parsedUrl, headers);\n // Only perform retries on reads since writes may not be idempotent.\n const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb)\n ? this._maxRetries + 1\n : 1;\n let numTries = 0;\n let response;\n do {\n response = yield this.requestRaw(info, data);\n // Check if it's an authentication challenge\n if (response &&\n response.message &&\n response.message.statusCode === HttpCodes.Unauthorized) {\n let authenticationHandler;\n for (const handler of this.handlers) {\n if (handler.canHandleAuthentication(response)) {\n authenticationHandler = handler;\n break;\n }\n }\n if (authenticationHandler) {\n return authenticationHandler.handleAuthentication(this, info, data);\n }\n else {\n // We have received an unauthorized response but have no handlers to handle it.\n // Let the response return to the caller.\n return response;\n }\n }\n let redirectsRemaining = this._maxRedirects;\n while (response.message.statusCode &&\n HttpRedirectCodes.includes(response.message.statusCode) &&\n this._allowRedirects &&\n redirectsRemaining > 0) {\n const redirectUrl = response.message.headers['location'];\n if (!redirectUrl) {\n // if there's no location to redirect to, we won't\n break;\n }\n const parsedRedirectUrl = new URL(redirectUrl);\n if (parsedUrl.protocol === 'https:' &&\n parsedUrl.protocol !== parsedRedirectUrl.protocol &&\n !this._allowRedirectDowngrade) {\n throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');\n }\n // we need to finish reading the response before reassigning response\n // which will leak the open socket.\n yield response.readBody();\n // strip authorization header if redirected to a different hostname\n if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {\n for (const header in headers) {\n // header names are case insensitive\n if (header.toLowerCase() === 'authorization') {\n delete headers[header];\n }\n }\n }\n // let's make the request with the new redirectUrl\n info = this._prepareRequest(verb, parsedRedirectUrl, headers);\n response = yield this.requestRaw(info, data);\n redirectsRemaining--;\n }\n if (!response.message.statusCode ||\n !HttpResponseRetryCodes.includes(response.message.statusCode)) {\n // If not a retry code, return immediately instead of retrying\n return response;\n }\n numTries += 1;\n if (numTries < maxTries) {\n yield response.readBody();\n yield this._performExponentialBackoff(numTries);\n }\n } while (numTries < maxTries);\n return response;\n });\n }\n /**\n * Needs to be called if keepAlive is set to true in request options.\n */\n dispose() {\n if (this._agent) {\n this._agent.destroy();\n }\n this._disposed = true;\n }\n /**\n * Raw request.\n * @param info\n * @param data\n */\n requestRaw(info, data) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n function callbackForResult(err, res) {\n if (err) {\n reject(err);\n }\n else if (!res) {\n // If `err` is not passed, then `res` must be passed.\n reject(new Error('Unknown error'));\n }\n else {\n resolve(res);\n }\n }\n this.requestRawWithCallback(info, data, callbackForResult);\n });\n });\n }\n /**\n * Raw request with callback.\n * @param info\n * @param data\n * @param onResult\n */\n requestRawWithCallback(info, data, onResult) {\n if (typeof data === 'string') {\n if (!info.options.headers) {\n info.options.headers = {};\n }\n info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');\n }\n let callbackCalled = false;\n function handleResult(err, res) {\n if (!callbackCalled) {\n callbackCalled = true;\n onResult(err, res);\n }\n }\n const req = info.httpModule.request(info.options, (msg) => {\n const res = new HttpClientResponse(msg);\n handleResult(undefined, res);\n });\n let socket;\n req.on('socket', sock => {\n socket = sock;\n });\n // If we ever get disconnected, we want the socket to timeout eventually\n req.setTimeout(this._socketTimeout || 3 * 60000, () => {\n if (socket) {\n socket.end();\n }\n handleResult(new Error(`Request timeout: ${info.options.path}`));\n });\n req.on('error', function (err) {\n // err has statusCode property\n // res should have headers\n handleResult(err);\n });\n if (data && typeof data === 'string') {\n req.write(data, 'utf8');\n }\n if (data && typeof data !== 'string') {\n data.on('close', function () {\n req.end();\n });\n data.pipe(req);\n }\n else {\n req.end();\n }\n }\n /**\n * Gets an http agent. This function is useful when you need an http agent that handles\n * routing through a proxy server - depending upon the url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\n getAgent(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n return this._getAgent(parsedUrl);\n }\n getAgentDispatcher(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (!useProxy) {\n return;\n }\n return this._getProxyAgentDispatcher(parsedUrl, proxyUrl);\n }\n _prepareRequest(method, requestUrl, headers) {\n const info = {};\n info.parsedUrl = requestUrl;\n const usingSsl = info.parsedUrl.protocol === 'https:';\n info.httpModule = usingSsl ? https : http;\n const defaultPort = usingSsl ? 443 : 80;\n info.options = {};\n info.options.host = info.parsedUrl.hostname;\n info.options.port = info.parsedUrl.port\n ? parseInt(info.parsedUrl.port)\n : defaultPort;\n info.options.path =\n (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');\n info.options.method = method;\n info.options.headers = this._mergeHeaders(headers);\n if (this.userAgent != null) {\n info.options.headers['user-agent'] = this.userAgent;\n }\n info.options.agent = this._getAgent(info.parsedUrl);\n // gives handlers an opportunity to participate\n if (this.handlers) {\n for (const handler of this.handlers) {\n handler.prepareRequest(info.options);\n }\n }\n return info;\n }\n _mergeHeaders(headers) {\n if (this.requestOptions && this.requestOptions.headers) {\n return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {}));\n }\n return lowercaseKeys(headers || {});\n }\n /**\n * Gets an existing header value or returns a default.\n * Handles converting number header values to strings since HTTP headers must be strings.\n * Note: This returns string | string[] since some headers can have multiple values.\n * For headers that must always be a single string (like Content-Type), use the\n * specialized _getExistingOrDefaultContentTypeHeader method instead.\n */\n _getExistingOrDefaultHeader(additionalHeaders, header, _default) {\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n const headerValue = lowercaseKeys(this.requestOptions.headers)[header];\n if (headerValue) {\n clientHeader =\n typeof headerValue === 'number' ? headerValue.toString() : headerValue;\n }\n }\n const additionalValue = additionalHeaders[header];\n if (additionalValue !== undefined) {\n return typeof additionalValue === 'number'\n ? additionalValue.toString()\n : additionalValue;\n }\n if (clientHeader !== undefined) {\n return clientHeader;\n }\n return _default;\n }\n /**\n * Specialized version of _getExistingOrDefaultHeader for Content-Type header.\n * Always returns a single string (not an array) since Content-Type should be a single value.\n * Converts arrays to comma-separated strings and numbers to strings to ensure type safety.\n * This was split from _getExistingOrDefaultHeader to provide stricter typing for callers\n * that assign the result to places expecting a string (e.g., additionalHeaders[Headers.ContentType]).\n */\n _getExistingOrDefaultContentTypeHeader(additionalHeaders, _default) {\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n const headerValue = lowercaseKeys(this.requestOptions.headers)[Headers.ContentType];\n if (headerValue) {\n if (typeof headerValue === 'number') {\n clientHeader = String(headerValue);\n }\n else if (Array.isArray(headerValue)) {\n clientHeader = headerValue.join(', ');\n }\n else {\n clientHeader = headerValue;\n }\n }\n }\n const additionalValue = additionalHeaders[Headers.ContentType];\n // Return the first non-undefined value, converting numbers or arrays to strings if necessary\n if (additionalValue !== undefined) {\n if (typeof additionalValue === 'number') {\n return String(additionalValue);\n }\n else if (Array.isArray(additionalValue)) {\n return additionalValue.join(', ');\n }\n else {\n return additionalValue;\n }\n }\n if (clientHeader !== undefined) {\n return clientHeader;\n }\n return _default;\n }\n _getAgent(parsedUrl) {\n let agent;\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (this._keepAlive && useProxy) {\n agent = this._proxyAgent;\n }\n if (!useProxy) {\n agent = this._agent;\n }\n // if agent is already assigned use that agent.\n if (agent) {\n return agent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n let maxSockets = 100;\n if (this.requestOptions) {\n maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;\n }\n // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis.\n if (proxyUrl && proxyUrl.hostname) {\n const agentOptions = {\n maxSockets,\n keepAlive: this._keepAlive,\n proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && {\n proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`\n })), { host: proxyUrl.hostname, port: proxyUrl.port })\n };\n let tunnelAgent;\n const overHttps = proxyUrl.protocol === 'https:';\n if (usingSsl) {\n tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;\n }\n else {\n tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;\n }\n agent = tunnelAgent(agentOptions);\n this._proxyAgent = agent;\n }\n // if tunneling agent isn't assigned create a new agent\n if (!agent) {\n const options = { keepAlive: this._keepAlive, maxSockets };\n agent = usingSsl ? new https.Agent(options) : new http.Agent(options);\n this._agent = agent;\n }\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n agent.options = Object.assign(agent.options || {}, {\n rejectUnauthorized: false\n });\n }\n return agent;\n }\n _getProxyAgentDispatcher(parsedUrl, proxyUrl) {\n let proxyAgent;\n if (this._keepAlive) {\n proxyAgent = this._proxyAgentDispatcher;\n }\n // if agent is already assigned use that agent.\n if (proxyAgent) {\n return proxyAgent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && {\n token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString('base64')}`\n })));\n this._proxyAgentDispatcher = proxyAgent;\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, {\n rejectUnauthorized: false\n });\n }\n return proxyAgent;\n }\n _getUserAgentWithOrchestrationId(userAgent) {\n const baseUserAgent = userAgent || 'actions/http-client';\n const orchId = process.env['ACTIONS_ORCHESTRATION_ID'];\n if (orchId) {\n // Sanitize the orchestration ID to ensure it contains only valid characters\n // Valid characters: 0-9, a-z, _, -, .\n const sanitizedId = orchId.replace(/[^a-z0-9_.-]/gi, '_');\n return `${baseUserAgent} actions_orchestration_id/${sanitizedId}`;\n }\n return baseUserAgent;\n }\n _performExponentialBackoff(retryNumber) {\n return __awaiter(this, void 0, void 0, function* () {\n retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);\n const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);\n return new Promise(resolve => setTimeout(() => resolve(), ms));\n });\n }\n _processResponse(res, options) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n const statusCode = res.message.statusCode || 0;\n const response = {\n statusCode,\n result: null,\n headers: {}\n };\n // not found leads to null obj returned\n if (statusCode === HttpCodes.NotFound) {\n resolve(response);\n }\n // get the result from the body\n function dateTimeDeserializer(key, value) {\n if (typeof value === 'string') {\n const a = new Date(value);\n if (!isNaN(a.valueOf())) {\n return a;\n }\n }\n return value;\n }\n let obj;\n let contents;\n try {\n contents = yield res.readBody();\n if (contents && contents.length > 0) {\n if (options && options.deserializeDates) {\n obj = JSON.parse(contents, dateTimeDeserializer);\n }\n else {\n obj = JSON.parse(contents);\n }\n response.result = obj;\n }\n response.headers = res.message.headers;\n }\n catch (err) {\n // Invalid resource (contents not json); leaving result obj null\n }\n // note that 3xx redirects are handled by the http layer.\n if (statusCode > 299) {\n let msg;\n // if exception/error in body, attempt to get better error\n if (obj && obj.message) {\n msg = obj.message;\n }\n else if (contents && contents.length > 0) {\n // it may be the case that the exception is in the body message as string\n msg = contents;\n }\n else {\n msg = `Failed request: (${statusCode})`;\n }\n const err = new HttpClientError(msg, statusCode);\n err.result = response.result;\n reject(err);\n }\n else {\n resolve(response);\n }\n }));\n });\n }\n}\nexports.HttpClient = HttpClient;\nconst lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getProxyUrl = getProxyUrl;\nexports.checkBypass = checkBypass;\nfunction getProxyUrl(reqUrl) {\n const usingSsl = reqUrl.protocol === 'https:';\n if (checkBypass(reqUrl)) {\n return undefined;\n }\n const proxyVar = (() => {\n if (usingSsl) {\n return process.env['https_proxy'] || process.env['HTTPS_PROXY'];\n }\n else {\n return process.env['http_proxy'] || process.env['HTTP_PROXY'];\n }\n })();\n if (proxyVar) {\n try {\n return new DecodedURL(proxyVar);\n }\n catch (_a) {\n if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://'))\n return new DecodedURL(`http://${proxyVar}`);\n }\n }\n else {\n return undefined;\n }\n}\nfunction checkBypass(reqUrl) {\n if (!reqUrl.hostname) {\n return false;\n }\n const reqHost = reqUrl.hostname;\n if (isLoopbackAddress(reqHost)) {\n return true;\n }\n const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';\n if (!noProxy) {\n return false;\n }\n // Determine the request port\n let reqPort;\n if (reqUrl.port) {\n reqPort = Number(reqUrl.port);\n }\n else if (reqUrl.protocol === 'http:') {\n reqPort = 80;\n }\n else if (reqUrl.protocol === 'https:') {\n reqPort = 443;\n }\n // Format the request hostname and hostname with port\n const upperReqHosts = [reqUrl.hostname.toUpperCase()];\n if (typeof reqPort === 'number') {\n upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);\n }\n // Compare request host against noproxy\n for (const upperNoProxyItem of noProxy\n .split(',')\n .map(x => x.trim().toUpperCase())\n .filter(x => x)) {\n if (upperNoProxyItem === '*' ||\n upperReqHosts.some(x => x === upperNoProxyItem ||\n x.endsWith(`.${upperNoProxyItem}`) ||\n (upperNoProxyItem.startsWith('.') &&\n x.endsWith(`${upperNoProxyItem}`)))) {\n return true;\n }\n }\n return false;\n}\nfunction isLoopbackAddress(host) {\n const hostLower = host.toLowerCase();\n return (hostLower === 'localhost' ||\n hostLower.startsWith('127.') ||\n hostLower.startsWith('[::1]') ||\n hostLower.startsWith('[0:0:0:0:0:0:0:1]'));\n}\nclass DecodedURL extends URL {\n constructor(url, base) {\n super(url, base);\n this._decodedUsername = decodeURIComponent(super.username);\n this._decodedPassword = decodeURIComponent(super.password);\n }\n get username() {\n return this._decodedUsername;\n }\n get password() {\n return this._decodedPassword;\n }\n}\n//# sourceMappingURL=proxy.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar _a;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.READONLY = exports.UV_FS_O_EXLOCK = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rm = exports.rename = exports.readdir = exports.open = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = void 0;\nexports.readlink = readlink;\nexports.exists = exists;\nexports.isDirectory = isDirectory;\nexports.isRooted = isRooted;\nexports.tryGetExecutablePath = tryGetExecutablePath;\nexports.getCmdPath = getCmdPath;\nconst fs = __importStar(require(\"fs\"));\nconst path = __importStar(require(\"path\"));\n_a = fs.promises\n// export const {open} = 'fs'\n, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.open = _a.open, exports.readdir = _a.readdir, exports.rename = _a.rename, exports.rm = _a.rm, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink;\n// export const {open} = 'fs'\nexports.IS_WINDOWS = process.platform === 'win32';\n/**\n * Custom implementation of readlink to ensure Windows junctions\n * maintain trailing backslash for backward compatibility with Node.js < 24\n *\n * In Node.js 20, Windows junctions (directory symlinks) always returned paths\n * with trailing backslashes. Node.js 24 removed this behavior, which breaks\n * code that relied on this format for path operations.\n *\n * This implementation restores the Node 20 behavior by adding a trailing\n * backslash to all junction results on Windows.\n */\nfunction readlink(fsPath) {\n return __awaiter(this, void 0, void 0, function* () {\n const result = yield fs.promises.readlink(fsPath);\n // On Windows, restore Node 20 behavior: add trailing backslash to all results\n // since junctions on Windows are always directory links\n if (exports.IS_WINDOWS && !result.endsWith('\\\\')) {\n return `${result}\\\\`;\n }\n return result;\n });\n}\n// See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691\nexports.UV_FS_O_EXLOCK = 0x10000000;\nexports.READONLY = fs.constants.O_RDONLY;\nfunction exists(fsPath) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield (0, exports.stat)(fsPath);\n }\n catch (err) {\n if (err.code === 'ENOENT') {\n return false;\n }\n throw err;\n }\n return true;\n });\n}\nfunction isDirectory(fsPath_1) {\n return __awaiter(this, arguments, void 0, function* (fsPath, useStat = false) {\n const stats = useStat ? yield (0, exports.stat)(fsPath) : yield (0, exports.lstat)(fsPath);\n return stats.isDirectory();\n });\n}\n/**\n * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like:\n * \\, \\hello, \\\\hello\\share, C:, and C:\\hello (and corresponding alternate separator cases).\n */\nfunction isRooted(p) {\n p = normalizeSeparators(p);\n if (!p) {\n throw new Error('isRooted() parameter \"p\" cannot be empty');\n }\n if (exports.IS_WINDOWS) {\n return (p.startsWith('\\\\') || /^[A-Z]:/i.test(p) // e.g. \\ or \\hello or \\\\hello\n ); // e.g. C: or C:\\hello\n }\n return p.startsWith('/');\n}\n/**\n * Best effort attempt to determine whether a file exists and is executable.\n * @param filePath file path to check\n * @param extensions additional file extensions to try\n * @return if file exists and is executable, returns the file path. otherwise empty string.\n */\nfunction tryGetExecutablePath(filePath, extensions) {\n return __awaiter(this, void 0, void 0, function* () {\n let stats = undefined;\n try {\n // test file exists\n stats = yield (0, exports.stat)(filePath);\n }\n catch (err) {\n if (err.code !== 'ENOENT') {\n // eslint-disable-next-line no-console\n console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);\n }\n }\n if (stats && stats.isFile()) {\n if (exports.IS_WINDOWS) {\n // on Windows, test for valid extension\n const upperExt = path.extname(filePath).toUpperCase();\n if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) {\n return filePath;\n }\n }\n else {\n if (isUnixExecutable(stats)) {\n return filePath;\n }\n }\n }\n // try each extension\n const originalFilePath = filePath;\n for (const extension of extensions) {\n filePath = originalFilePath + extension;\n stats = undefined;\n try {\n stats = yield (0, exports.stat)(filePath);\n }\n catch (err) {\n if (err.code !== 'ENOENT') {\n // eslint-disable-next-line no-console\n console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);\n }\n }\n if (stats && stats.isFile()) {\n if (exports.IS_WINDOWS) {\n // preserve the case of the actual file (since an extension was appended)\n try {\n const directory = path.dirname(filePath);\n const upperName = path.basename(filePath).toUpperCase();\n for (const actualName of yield (0, exports.readdir)(directory)) {\n if (upperName === actualName.toUpperCase()) {\n filePath = path.join(directory, actualName);\n break;\n }\n }\n }\n catch (err) {\n // eslint-disable-next-line no-console\n console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`);\n }\n return filePath;\n }\n else {\n if (isUnixExecutable(stats)) {\n return filePath;\n }\n }\n }\n }\n return '';\n });\n}\nfunction normalizeSeparators(p) {\n p = p || '';\n if (exports.IS_WINDOWS) {\n // convert slashes on Windows\n p = p.replace(/\\//g, '\\\\');\n // remove redundant slashes\n return p.replace(/\\\\\\\\+/g, '\\\\');\n }\n // remove redundant slashes\n return p.replace(/\\/\\/+/g, '/');\n}\n// on Mac/Linux, test the execute bit\n// R W X R W X R W X\n// 256 128 64 32 16 8 4 2 1\nfunction isUnixExecutable(stats) {\n return ((stats.mode & 1) > 0 ||\n ((stats.mode & 8) > 0 &&\n process.getgid !== undefined &&\n stats.gid === process.getgid()) ||\n ((stats.mode & 64) > 0 &&\n process.getuid !== undefined &&\n stats.uid === process.getuid()));\n}\n// Get the path of cmd.exe in windows\nfunction getCmdPath() {\n var _a;\n return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`;\n}\n//# sourceMappingURL=io-util.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.cp = cp;\nexports.mv = mv;\nexports.rmRF = rmRF;\nexports.mkdirP = mkdirP;\nexports.which = which;\nexports.findInPath = findInPath;\nconst assert_1 = require(\"assert\");\nconst path = __importStar(require(\"path\"));\nconst ioUtil = __importStar(require(\"./io-util\"));\n/**\n * Copies a file or folder.\n * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js\n *\n * @param source source path\n * @param dest destination path\n * @param options optional. See CopyOptions.\n */\nfunction cp(source_1, dest_1) {\n return __awaiter(this, arguments, void 0, function* (source, dest, options = {}) {\n const { force, recursive, copySourceDirectory } = readCopyOptions(options);\n const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null;\n // Dest is an existing file, but not forcing\n if (destStat && destStat.isFile() && !force) {\n return;\n }\n // If dest is an existing directory, should copy inside.\n const newDest = destStat && destStat.isDirectory() && copySourceDirectory\n ? path.join(dest, path.basename(source))\n : dest;\n if (!(yield ioUtil.exists(source))) {\n throw new Error(`no such file or directory: ${source}`);\n }\n const sourceStat = yield ioUtil.stat(source);\n if (sourceStat.isDirectory()) {\n if (!recursive) {\n throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`);\n }\n else {\n yield cpDirRecursive(source, newDest, 0, force);\n }\n }\n else {\n if (path.relative(source, newDest) === '') {\n // a file cannot be copied to itself\n throw new Error(`'${newDest}' and '${source}' are the same file`);\n }\n yield copyFile(source, newDest, force);\n }\n });\n}\n/**\n * Moves a path.\n *\n * @param source source path\n * @param dest destination path\n * @param options optional. See MoveOptions.\n */\nfunction mv(source_1, dest_1) {\n return __awaiter(this, arguments, void 0, function* (source, dest, options = {}) {\n if (yield ioUtil.exists(dest)) {\n let destExists = true;\n if (yield ioUtil.isDirectory(dest)) {\n // If dest is directory copy src into dest\n dest = path.join(dest, path.basename(source));\n destExists = yield ioUtil.exists(dest);\n }\n if (destExists) {\n if (options.force == null || options.force) {\n yield rmRF(dest);\n }\n else {\n throw new Error('Destination already exists');\n }\n }\n }\n yield mkdirP(path.dirname(dest));\n yield ioUtil.rename(source, dest);\n });\n}\n/**\n * Remove a path recursively with force\n *\n * @param inputPath path to remove\n */\nfunction rmRF(inputPath) {\n return __awaiter(this, void 0, void 0, function* () {\n if (ioUtil.IS_WINDOWS) {\n // Check for invalid characters\n // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file\n if (/[*\"<>|]/.test(inputPath)) {\n throw new Error('File path must not contain `*`, `\"`, `<`, `>` or `|` on Windows');\n }\n }\n try {\n // note if path does not exist, error is silent\n yield ioUtil.rm(inputPath, {\n force: true,\n maxRetries: 3,\n recursive: true,\n retryDelay: 300\n });\n }\n catch (err) {\n throw new Error(`File was unable to be removed ${err}`);\n }\n });\n}\n/**\n * Make a directory. Creates the full path with folders in between\n * Will throw if it fails\n *\n * @param fsPath path to create\n * @returns Promise\n */\nfunction mkdirP(fsPath) {\n return __awaiter(this, void 0, void 0, function* () {\n (0, assert_1.ok)(fsPath, 'a path argument must be provided');\n yield ioUtil.mkdir(fsPath, { recursive: true });\n });\n}\n/**\n * Returns path of a tool had the tool actually been invoked. Resolves via paths.\n * If you check and the tool does not exist, it will throw.\n *\n * @param tool name of the tool\n * @param check whether to check if tool exists\n * @returns Promise path to tool\n */\nfunction which(tool, check) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!tool) {\n throw new Error(\"parameter 'tool' is required\");\n }\n // recursive when check=true\n if (check) {\n const result = yield which(tool, false);\n if (!result) {\n if (ioUtil.IS_WINDOWS) {\n throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`);\n }\n else {\n throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`);\n }\n }\n return result;\n }\n const matches = yield findInPath(tool);\n if (matches && matches.length > 0) {\n return matches[0];\n }\n return '';\n });\n}\n/**\n * Returns a list of all occurrences of the given tool on the system path.\n *\n * @returns Promise the paths of the tool\n */\nfunction findInPath(tool) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!tool) {\n throw new Error(\"parameter 'tool' is required\");\n }\n // build the list of extensions to try\n const extensions = [];\n if (ioUtil.IS_WINDOWS && process.env['PATHEXT']) {\n for (const extension of process.env['PATHEXT'].split(path.delimiter)) {\n if (extension) {\n extensions.push(extension);\n }\n }\n }\n // if it's rooted, return it if exists. otherwise return empty.\n if (ioUtil.isRooted(tool)) {\n const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions);\n if (filePath) {\n return [filePath];\n }\n return [];\n }\n // if any path separators, return empty\n if (tool.includes(path.sep)) {\n return [];\n }\n // build the list of directories\n //\n // Note, technically \"where\" checks the current directory on Windows. From a toolkit perspective,\n // it feels like we should not do this. Checking the current directory seems like more of a use\n // case of a shell, and the which() function exposed by the toolkit should strive for consistency\n // across platforms.\n const directories = [];\n if (process.env.PATH) {\n for (const p of process.env.PATH.split(path.delimiter)) {\n if (p) {\n directories.push(p);\n }\n }\n }\n // find all matches\n const matches = [];\n for (const directory of directories) {\n const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions);\n if (filePath) {\n matches.push(filePath);\n }\n }\n return matches;\n });\n}\nfunction readCopyOptions(options) {\n const force = options.force == null ? true : options.force;\n const recursive = Boolean(options.recursive);\n const copySourceDirectory = options.copySourceDirectory == null\n ? true\n : Boolean(options.copySourceDirectory);\n return { force, recursive, copySourceDirectory };\n}\nfunction cpDirRecursive(sourceDir, destDir, currentDepth, force) {\n return __awaiter(this, void 0, void 0, function* () {\n // Ensure there is not a run away recursive copy\n if (currentDepth >= 255)\n return;\n currentDepth++;\n yield mkdirP(destDir);\n const files = yield ioUtil.readdir(sourceDir);\n for (const fileName of files) {\n const srcFile = `${sourceDir}/${fileName}`;\n const destFile = `${destDir}/${fileName}`;\n const srcFileStat = yield ioUtil.lstat(srcFile);\n if (srcFileStat.isDirectory()) {\n // Recurse\n yield cpDirRecursive(srcFile, destFile, currentDepth, force);\n }\n else {\n yield copyFile(srcFile, destFile, force);\n }\n }\n // Change the mode for the newly created directory\n yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode);\n });\n}\n// Buffered file copy\nfunction copyFile(srcFile, destFile, force) {\n return __awaiter(this, void 0, void 0, function* () {\n if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) {\n // unlink/re-link it\n try {\n yield ioUtil.lstat(destFile);\n yield ioUtil.unlink(destFile);\n }\n catch (e) {\n // Try to override file permission\n if (e.code === 'EPERM') {\n yield ioUtil.chmod(destFile, '0666');\n yield ioUtil.unlink(destFile);\n }\n // other errors = it doesn't exist, no work to do\n }\n // Copy over symlink\n const symlinkFull = yield ioUtil.readlink(srcFile);\n yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null);\n }\n else if (!(yield ioUtil.exists(destFile)) || force) {\n yield ioUtil.copyFile(srcFile, destFile);\n }\n });\n}\n//# sourceMappingURL=io.js.map","'use strict'\n\n/**\n * Ponyfill for `Array.prototype.find` which is only available in ES6 runtimes.\n *\n * Works with anything that has a `length` property and index access properties, including NodeList.\n *\n * @template {unknown} T\n * @param {Array | ({length:number, [number]: T})} list\n * @param {function (item: T, index: number, list:Array | ({length:number, [number]: T})):boolean} predicate\n * @param {Partial>?} ac `Array.prototype` by default,\n * \t\t\t\tallows injecting a custom implementation in tests\n * @returns {T | undefined}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find\n * @see https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find\n */\nfunction find(list, predicate, ac) {\n\tif (ac === undefined) {\n\t\tac = Array.prototype;\n\t}\n\tif (list && typeof ac.find === 'function') {\n\t\treturn ac.find.call(list, predicate);\n\t}\n\tfor (var i = 0; i < list.length; i++) {\n\t\tif (Object.prototype.hasOwnProperty.call(list, i)) {\n\t\t\tvar item = list[i];\n\t\t\tif (predicate.call(undefined, item, i, list)) {\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * \"Shallow freezes\" an object to render it immutable.\n * Uses `Object.freeze` if available,\n * otherwise the immutability is only in the type.\n *\n * Is used to create \"enum like\" objects.\n *\n * @template T\n * @param {T} object the object to freeze\n * @param {Pick = Object} oc `Object` by default,\n * \t\t\t\tallows to inject custom object constructor for tests\n * @returns {Readonly}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\n */\nfunction freeze(object, oc) {\n\tif (oc === undefined) {\n\t\toc = Object\n\t}\n\treturn oc && typeof oc.freeze === 'function' ? oc.freeze(object) : object\n}\n\n/**\n * Since we can not rely on `Object.assign` we provide a simplified version\n * that is sufficient for our needs.\n *\n * @param {Object} target\n * @param {Object | null | undefined} source\n *\n * @returns {Object} target\n * @throws TypeError if target is not an object\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n * @see https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign\n */\nfunction assign(target, source) {\n\tif (target === null || typeof target !== 'object') {\n\t\tthrow new TypeError('target is not an object')\n\t}\n\tfor (var key in source) {\n\t\tif (Object.prototype.hasOwnProperty.call(source, key)) {\n\t\t\ttarget[key] = source[key]\n\t\t}\n\t}\n\treturn target\n}\n\n/**\n * All mime types that are allowed as input to `DOMParser.parseFromString`\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec\n * @see DOMParser.prototype.parseFromString\n */\nvar MIME_TYPE = freeze({\n\t/**\n\t * `text/html`, the only mime type that triggers treating an XML document as HTML.\n\t *\n\t * @see DOMParser.SupportedType.isHTML\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec\n\t */\n\tHTML: 'text/html',\n\n\t/**\n\t * Helper method to check a mime type if it indicates an HTML document\n\t *\n\t * @param {string} [value]\n\t * @returns {boolean}\n\t *\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring \t */\n\tisHTML: function (value) {\n\t\treturn value === MIME_TYPE.HTML\n\t},\n\n\t/**\n\t * `application/xml`, the standard mime type for XML documents.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_APPLICATION: 'application/xml',\n\n\t/**\n\t * `text/html`, an alias for `application/xml`.\n\t *\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303\n\t * @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_TEXT: 'text/xml',\n\n\t/**\n\t * `application/xhtml+xml`, indicates an XML document that has the default HTML namespace,\n\t * but is parsed as an XML document.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec\n\t * @see https://en.wikipedia.org/wiki/XHTML Wikipedia\n\t */\n\tXML_XHTML_APPLICATION: 'application/xhtml+xml',\n\n\t/**\n\t * `image/svg+xml`,\n\t *\n\t * @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration\n\t * @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1\n\t * @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia\n\t */\n\tXML_SVG_IMAGE: 'image/svg+xml',\n})\n\n/**\n * Namespaces that are used in this code base.\n *\n * @see http://www.w3.org/TR/REC-xml-names\n */\nvar NAMESPACE = freeze({\n\t/**\n\t * The XHTML namespace.\n\t *\n\t * @see http://www.w3.org/1999/xhtml\n\t */\n\tHTML: 'http://www.w3.org/1999/xhtml',\n\n\t/**\n\t * Checks if `uri` equals `NAMESPACE.HTML`.\n\t *\n\t * @param {string} [uri]\n\t *\n\t * @see NAMESPACE.HTML\n\t */\n\tisHTML: function (uri) {\n\t\treturn uri === NAMESPACE.HTML\n\t},\n\n\t/**\n\t * The SVG namespace.\n\t *\n\t * @see http://www.w3.org/2000/svg\n\t */\n\tSVG: 'http://www.w3.org/2000/svg',\n\n\t/**\n\t * The `xml:` namespace.\n\t *\n\t * @see http://www.w3.org/XML/1998/namespace\n\t */\n\tXML: 'http://www.w3.org/XML/1998/namespace',\n\n\t/**\n\t * The `xmlns:` namespace\n\t *\n\t * @see https://www.w3.org/2000/xmlns/\n\t */\n\tXMLNS: 'http://www.w3.org/2000/xmlns/',\n})\n\nexports.assign = assign;\nexports.find = find;\nexports.freeze = freeze;\nexports.MIME_TYPE = MIME_TYPE;\nexports.NAMESPACE = NAMESPACE;\n","var conventions = require(\"./conventions\");\nvar dom = require('./dom')\nvar entities = require('./entities');\nvar sax = require('./sax');\n\nvar DOMImplementation = dom.DOMImplementation;\n\nvar NAMESPACE = conventions.NAMESPACE;\n\nvar ParseError = sax.ParseError;\nvar XMLReader = sax.XMLReader;\n\n/**\n * Normalizes line ending according to https://www.w3.org/TR/xml11/#sec-line-ends:\n *\n * > XML parsed entities are often stored in computer files which,\n * > for editing convenience, are organized into lines.\n * > These lines are typically separated by some combination\n * > of the characters CARRIAGE RETURN (#xD) and LINE FEED (#xA).\n * >\n * > To simplify the tasks of applications, the XML processor must behave\n * > as if it normalized all line breaks in external parsed entities (including the document entity)\n * > on input, before parsing, by translating all of the following to a single #xA character:\n * >\n * > 1. the two-character sequence #xD #xA\n * > 2. the two-character sequence #xD #x85\n * > 3. the single character #x85\n * > 4. the single character #x2028\n * > 5. any #xD character that is not immediately followed by #xA or #x85.\n *\n * @param {string} input\n * @returns {string}\n */\nfunction normalizeLineEndings(input) {\n\treturn input\n\t\t.replace(/\\r[\\n\\u0085]/g, '\\n')\n\t\t.replace(/[\\r\\u0085\\u2028]/g, '\\n')\n}\n\n/**\n * @typedef Locator\n * @property {number} [columnNumber]\n * @property {number} [lineNumber]\n */\n\n/**\n * @typedef DOMParserOptions\n * @property {DOMHandler} [domBuilder]\n * @property {Function} [errorHandler]\n * @property {(string) => string} [normalizeLineEndings] used to replace line endings before parsing\n * \t\t\t\t\t\tdefaults to `normalizeLineEndings`\n * @property {Locator} [locator]\n * @property {Record} [xmlns]\n *\n * @see normalizeLineEndings\n */\n\n/**\n * The DOMParser interface provides the ability to parse XML or HTML source code\n * from a string into a DOM `Document`.\n *\n * _xmldom is different from the spec in that it allows an `options` parameter,\n * to override the default behavior._\n *\n * @param {DOMParserOptions} [options]\n * @constructor\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-parsing-and-serialization\n */\nfunction DOMParser(options){\n\tthis.options = options ||{locator:{}};\n}\n\nDOMParser.prototype.parseFromString = function(source,mimeType){\n\tvar options = this.options;\n\tvar sax = new XMLReader();\n\tvar domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler\n\tvar errorHandler = options.errorHandler;\n\tvar locator = options.locator;\n\tvar defaultNSMap = options.xmlns||{};\n\tvar isHTML = /\\/x?html?$/.test(mimeType);//mimeType.toLowerCase().indexOf('html') > -1;\n \tvar entityMap = isHTML ? entities.HTML_ENTITIES : entities.XML_ENTITIES;\n\tif(locator){\n\t\tdomBuilder.setDocumentLocator(locator)\n\t}\n\n\tsax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);\n\tsax.domBuilder = options.domBuilder || domBuilder;\n\tif(isHTML){\n\t\tdefaultNSMap[''] = NAMESPACE.HTML;\n\t}\n\tdefaultNSMap.xml = defaultNSMap.xml || NAMESPACE.XML;\n\tvar normalize = options.normalizeLineEndings || normalizeLineEndings;\n\tif (source && typeof source === 'string') {\n\t\tsax.parse(\n\t\t\tnormalize(source),\n\t\t\tdefaultNSMap,\n\t\t\tentityMap\n\t\t)\n\t} else {\n\t\tsax.errorHandler.error('invalid doc source')\n\t}\n\treturn domBuilder.doc;\n}\nfunction buildErrorHandler(errorImpl,domBuilder,locator){\n\tif(!errorImpl){\n\t\tif(domBuilder instanceof DOMHandler){\n\t\t\treturn domBuilder;\n\t\t}\n\t\terrorImpl = domBuilder ;\n\t}\n\tvar errorHandler = {}\n\tvar isCallback = errorImpl instanceof Function;\n\tlocator = locator||{}\n\tfunction build(key){\n\t\tvar fn = errorImpl[key];\n\t\tif(!fn && isCallback){\n\t\t\tfn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;\n\t\t}\n\t\terrorHandler[key] = fn && function(msg){\n\t\t\tfn('[xmldom '+key+']\\t'+msg+_locator(locator));\n\t\t}||function(){};\n\t}\n\tbuild('warning');\n\tbuild('error');\n\tbuild('fatalError');\n\treturn errorHandler;\n}\n\n//console.log('#\\n\\n\\n\\n\\n\\n\\n####')\n/**\n * +ContentHandler+ErrorHandler\n * +LexicalHandler+EntityResolver2\n * -DeclHandler-DTDHandler\n *\n * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler\n * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2\n * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html\n */\nfunction DOMHandler() {\n this.cdata = false;\n}\nfunction position(locator,node){\n\tnode.lineNumber = locator.lineNumber;\n\tnode.columnNumber = locator.columnNumber;\n}\n/**\n * @see org.xml.sax.ContentHandler#startDocument\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html\n */\nDOMHandler.prototype = {\n\tstartDocument : function() {\n \tthis.doc = new DOMImplementation().createDocument(null, null, null);\n \tif (this.locator) {\n \tthis.doc.documentURI = this.locator.systemId;\n \t}\n\t},\n\tstartElement:function(namespaceURI, localName, qName, attrs) {\n\t\tvar doc = this.doc;\n\t var el = doc.createElementNS(namespaceURI, qName||localName);\n\t var len = attrs.length;\n\t appendElement(this, el);\n\t this.currentElement = el;\n\n\t\tthis.locator && position(this.locator,el)\n\t for (var i = 0 ; i < len; i++) {\n\t var namespaceURI = attrs.getURI(i);\n\t var value = attrs.getValue(i);\n\t var qName = attrs.getQName(i);\n\t\t\tvar attr = doc.createAttributeNS(namespaceURI, qName);\n\t\t\tthis.locator &&position(attrs.getLocator(i),attr);\n\t\t\tattr.value = attr.nodeValue = value;\n\t\t\tel.setAttributeNode(attr)\n\t }\n\t},\n\tendElement:function(namespaceURI, localName, qName) {\n\t\tvar current = this.currentElement\n\t\tvar tagName = current.tagName;\n\t\tthis.currentElement = current.parentNode;\n\t},\n\tstartPrefixMapping:function(prefix, uri) {\n\t},\n\tendPrefixMapping:function(prefix) {\n\t},\n\tprocessingInstruction:function(target, data) {\n\t var ins = this.doc.createProcessingInstruction(target, data);\n\t this.locator && position(this.locator,ins)\n\t appendElement(this, ins);\n\t},\n\tignorableWhitespace:function(ch, start, length) {\n\t},\n\tcharacters:function(chars, start, length) {\n\t\tchars = _toString.apply(this,arguments)\n\t\t//console.log(chars)\n\t\tif(chars){\n\t\t\tif (this.cdata) {\n\t\t\t\tvar charNode = this.doc.createCDATASection(chars);\n\t\t\t} else {\n\t\t\t\tvar charNode = this.doc.createTextNode(chars);\n\t\t\t}\n\t\t\tif(this.currentElement){\n\t\t\t\tthis.currentElement.appendChild(charNode);\n\t\t\t}else if(/^\\s*$/.test(chars)){\n\t\t\t\tthis.doc.appendChild(charNode);\n\t\t\t\t//process xml\n\t\t\t}\n\t\t\tthis.locator && position(this.locator,charNode)\n\t\t}\n\t},\n\tskippedEntity:function(name) {\n\t},\n\tendDocument:function() {\n\t\tthis.doc.normalize();\n\t},\n\tsetDocumentLocator:function (locator) {\n\t if(this.locator = locator){// && !('lineNumber' in locator)){\n\t \tlocator.lineNumber = 0;\n\t }\n\t},\n\t//LexicalHandler\n\tcomment:function(chars, start, length) {\n\t\tchars = _toString.apply(this,arguments)\n\t var comm = this.doc.createComment(chars);\n\t this.locator && position(this.locator,comm)\n\t appendElement(this, comm);\n\t},\n\n\tstartCDATA:function() {\n\t //used in characters() methods\n\t this.cdata = true;\n\t},\n\tendCDATA:function() {\n\t this.cdata = false;\n\t},\n\n\tstartDTD:function(name, publicId, systemId) {\n\t\tvar impl = this.doc.implementation;\n\t if (impl && impl.createDocumentType) {\n\t var dt = impl.createDocumentType(name, publicId, systemId);\n\t this.locator && position(this.locator,dt)\n\t appendElement(this, dt);\n\t\t\t\t\tthis.doc.doctype = dt;\n\t }\n\t},\n\t/**\n\t * @see org.xml.sax.ErrorHandler\n\t * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html\n\t */\n\twarning:function(error) {\n\t\tconsole.warn('[xmldom warning]\\t'+error,_locator(this.locator));\n\t},\n\terror:function(error) {\n\t\tconsole.error('[xmldom error]\\t'+error,_locator(this.locator));\n\t},\n\tfatalError:function(error) {\n\t\tthrow new ParseError(error, this.locator);\n\t}\n}\nfunction _locator(l){\n\tif(l){\n\t\treturn '\\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'\n\t}\n}\nfunction _toString(chars,start,length){\n\tif(typeof chars == 'string'){\n\t\treturn chars.substr(start,length)\n\t}else{//java sax connect width xmldom on rhino(what about: \"? && !(chars instanceof String)\")\n\t\tif(chars.length >= start+length || start){\n\t\t\treturn new java.lang.String(chars,start,length)+'';\n\t\t}\n\t\treturn chars;\n\t}\n}\n\n/*\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html\n * used method of org.xml.sax.ext.LexicalHandler:\n * #comment(chars, start, length)\n * #startCDATA()\n * #endCDATA()\n * #startDTD(name, publicId, systemId)\n *\n *\n * IGNORED method of org.xml.sax.ext.LexicalHandler:\n * #endDTD()\n * #startEntity(name)\n * #endEntity(name)\n *\n *\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html\n * IGNORED method of org.xml.sax.ext.DeclHandler\n * \t#attributeDecl(eName, aName, type, mode, value)\n * #elementDecl(name, model)\n * #externalEntityDecl(name, publicId, systemId)\n * #internalEntityDecl(name, value)\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html\n * IGNORED method of org.xml.sax.EntityResolver2\n * #resolveEntity(String name,String publicId,String baseURI,String systemId)\n * #resolveEntity(publicId, systemId)\n * #getExternalSubset(name, baseURI)\n * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html\n * IGNORED method of org.xml.sax.DTDHandler\n * #notationDecl(name, publicId, systemId) {};\n * #unparsedEntityDecl(name, publicId, systemId, notationName) {};\n */\n\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){\n\tDOMHandler.prototype[key] = function(){return null}\n})\n\n/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */\nfunction appendElement (hander,node) {\n if (!hander.currentElement) {\n hander.doc.appendChild(node);\n } else {\n hander.currentElement.appendChild(node);\n }\n}//appendChild and setAttributeNS are preformance key\n\nexports.__DOMHandler = DOMHandler;\nexports.normalizeLineEndings = normalizeLineEndings;\nexports.DOMParser = DOMParser;\n","var conventions = require(\"./conventions\");\n\nvar find = conventions.find;\nvar NAMESPACE = conventions.NAMESPACE;\n\n/**\n * A prerequisite for `[].filter`, to drop elements that are empty\n * @param {string} input\n * @returns {boolean}\n */\nfunction notEmptyString (input) {\n\treturn input !== ''\n}\n/**\n * @see https://infra.spec.whatwg.org/#split-on-ascii-whitespace\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n *\n * @param {string} input\n * @returns {string[]} (can be empty)\n */\nfunction splitOnASCIIWhitespace(input) {\n\t// U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, U+0020 SPACE\n\treturn input ? input.split(/[\\t\\n\\f\\r ]+/).filter(notEmptyString) : []\n}\n\n/**\n * Adds element as a key to current if it is not already present.\n *\n * @param {Record} current\n * @param {string} element\n * @returns {Record}\n */\nfunction orderedSetReducer (current, element) {\n\tif (!current.hasOwnProperty(element)) {\n\t\tcurrent[element] = true;\n\t}\n\treturn current;\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#ordered-set\n * @param {string} input\n * @returns {string[]}\n */\nfunction toOrderedSet(input) {\n\tif (!input) return [];\n\tvar list = splitOnASCIIWhitespace(input);\n\treturn Object.keys(list.reduce(orderedSetReducer, {}))\n}\n\n/**\n * Uses `list.indexOf` to implement something like `Array.prototype.includes`,\n * which we can not rely on being available.\n *\n * @param {any[]} list\n * @returns {function(any): boolean}\n */\nfunction arrayIncludes (list) {\n\treturn function(element) {\n\t\treturn list && list.indexOf(element) !== -1;\n\t}\n}\n\nfunction copy(src,dest){\n\tfor(var p in src){\n\t\tif (Object.prototype.hasOwnProperty.call(src, p)) {\n\t\t\tdest[p] = src[p];\n\t\t}\n\t}\n}\n\n/**\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*((?:.*\\{\\s*?[\\r\\n][\\s\\S]*?^})|\\S.*?(?=[;\\r\\n]));?\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*(\\S.*?(?=[;\\r\\n]));?\n */\nfunction _extends(Class,Super){\n\tvar pt = Class.prototype;\n\tif(!(pt instanceof Super)){\n\t\tfunction t(){};\n\t\tt.prototype = Super.prototype;\n\t\tt = new t();\n\t\tcopy(pt,t);\n\t\tClass.prototype = pt = t;\n\t}\n\tif(pt.constructor != Class){\n\t\tif(typeof Class != 'function'){\n\t\t\tconsole.error(\"unknown Class:\"+Class)\n\t\t}\n\t\tpt.constructor = Class\n\t}\n}\n\n// Node Types\nvar NodeType = {}\nvar ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;\nvar ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;\nvar TEXT_NODE = NodeType.TEXT_NODE = 3;\nvar CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;\nvar ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;\nvar ENTITY_NODE = NodeType.ENTITY_NODE = 6;\nvar PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;\nvar COMMENT_NODE = NodeType.COMMENT_NODE = 8;\nvar DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;\nvar DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;\nvar DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;\nvar NOTATION_NODE = NodeType.NOTATION_NODE = 12;\n\n// ExceptionCode\nvar ExceptionCode = {}\nvar ExceptionMessage = {};\nvar INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]=\"Index size error\"),1);\nvar DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]=\"DOMString size error\"),2);\nvar HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]=\"Hierarchy request error\"),3);\nvar WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]=\"Wrong document\"),4);\nvar INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]=\"Invalid character\"),5);\nvar NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]=\"No data allowed\"),6);\nvar NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]=\"No modification allowed\"),7);\nvar NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]=\"Not found\"),8);\nvar NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]=\"Not supported\"),9);\nvar INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]=\"Attribute in use\"),10);\n//level2\nvar INVALID_STATE_ERR \t= ExceptionCode.INVALID_STATE_ERR \t= ((ExceptionMessage[11]=\"Invalid state\"),11);\nvar SYNTAX_ERR \t= ExceptionCode.SYNTAX_ERR \t= ((ExceptionMessage[12]=\"Syntax error\"),12);\nvar INVALID_MODIFICATION_ERR \t= ExceptionCode.INVALID_MODIFICATION_ERR \t= ((ExceptionMessage[13]=\"Invalid modification\"),13);\nvar NAMESPACE_ERR \t= ExceptionCode.NAMESPACE_ERR \t= ((ExceptionMessage[14]=\"Invalid namespace\"),14);\nvar INVALID_ACCESS_ERR \t= ExceptionCode.INVALID_ACCESS_ERR \t= ((ExceptionMessage[15]=\"Invalid access\"),15);\n\n/**\n * DOM Level 2\n * Object DOMException\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html\n * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n */\nfunction DOMException(code, message) {\n\tif(message instanceof Error){\n\t\tvar error = message;\n\t}else{\n\t\terror = this;\n\t\tError.call(this, ExceptionMessage[code]);\n\t\tthis.message = ExceptionMessage[code];\n\t\tif(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);\n\t}\n\terror.code = code;\n\tif(message) this.message = this.message + \": \" + message;\n\treturn error;\n};\nDOMException.prototype = Error.prototype;\ncopy(ExceptionCode,DOMException)\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177\n * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.\n * The items in the NodeList are accessible via an integral index, starting from 0.\n */\nfunction NodeList() {\n};\nNodeList.prototype = {\n\t/**\n\t * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.\n\t * @standard level1\n\t */\n\tlength:0,\n\t/**\n\t * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.\n\t * @standard level1\n\t * @param index unsigned long\n\t * Index into the collection.\n\t * @return Node\n\t * \tThe node at the indexth position in the NodeList, or null if that is not a valid index.\n\t */\n\titem: function(index) {\n\t\treturn index >= 0 && index < this.length ? this[index] : null;\n\t},\n\ttoString:function(isHTML,nodeFilter){\n\t\tfor(var buf = [], i = 0;i=0){\n\t\tvar lastIndex = list.length-1\n\t\twhile(i0 || key == 'xmlns'){\n//\t\t\treturn null;\n//\t\t}\n\t\t//console.log()\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar attr = this[i];\n\t\t\t//console.log(attr.nodeName,key)\n\t\t\tif(attr.nodeName == key){\n\t\t\t\treturn attr;\n\t\t\t}\n\t\t}\n\t},\n\tsetNamedItem: function(attr) {\n\t\tvar el = attr.ownerElement;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\tvar oldAttr = this.getNamedItem(attr.nodeName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\t/* returns Node */\n\tsetNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR\n\t\tvar el = attr.ownerElement, oldAttr;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\toldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\n\t/* returns Node */\n\tremoveNamedItem: function(key) {\n\t\tvar attr = this.getNamedItem(key);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\n\n\t},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR\n\n\t//for level2\n\tremoveNamedItemNS:function(namespaceURI,localName){\n\t\tvar attr = this.getNamedItemNS(namespaceURI,localName);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t},\n\tgetNamedItemNS: function(namespaceURI, localName) {\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar node = this[i];\n\t\t\tif(node.localName == localName && node.namespaceURI == namespaceURI){\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n};\n\n/**\n * The DOMImplementation interface represents an object providing methods\n * which are not dependent on any particular document.\n * Such an object is returned by the `Document.implementation` property.\n *\n * __The individual methods describe the differences compared to the specs.__\n *\n * @constructor\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation MDN\n * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 DOM Level 1 Core (Initial)\n * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-102161490 DOM Level 2 Core\n * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490 DOM Level 3 Core\n * @see https://dom.spec.whatwg.org/#domimplementation DOM Living Standard\n */\nfunction DOMImplementation() {\n}\n\nDOMImplementation.prototype = {\n\t/**\n\t * The DOMImplementation.hasFeature() method returns a Boolean flag indicating if a given feature is supported.\n\t * The different implementations fairly diverged in what kind of features were reported.\n\t * The latest version of the spec settled to force this method to always return true, where the functionality was accurate and in use.\n\t *\n\t * @deprecated It is deprecated and modern browsers return true in all cases.\n\t *\n\t * @param {string} feature\n\t * @param {string} [version]\n\t * @returns {boolean} always true\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature MDN\n\t * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-5CED94D7 DOM Level 1 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature DOM Living Standard\n\t */\n\thasFeature: function(feature, version) {\n\t\t\treturn true;\n\t},\n\t/**\n\t * Creates an XML Document object of the specified type with its document element.\n\t *\n\t * __It behaves slightly different from the description in the living standard__:\n\t * - There is no interface/class `XMLDocument`, it returns a `Document` instance.\n\t * - `contentType`, `encoding`, `mode`, `origin`, `url` fields are currently not declared.\n\t * - this implementation is not validating names or qualified names\n\t * (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string|null} namespaceURI\n\t * @param {string} qualifiedName\n\t * @param {DocumentType=null} doctype\n\t * @returns {Document}\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocument DOM Level 2 Core (initial)\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument DOM Level 2 Core\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocument: function(namespaceURI, qualifiedName, doctype){\n\t\tvar doc = new Document();\n\t\tdoc.implementation = this;\n\t\tdoc.childNodes = new NodeList();\n\t\tdoc.doctype = doctype || null;\n\t\tif (doctype){\n\t\t\tdoc.appendChild(doctype);\n\t\t}\n\t\tif (qualifiedName){\n\t\t\tvar root = doc.createElementNS(namespaceURI, qualifiedName);\n\t\t\tdoc.appendChild(root);\n\t\t}\n\t\treturn doc;\n\t},\n\t/**\n\t * Returns a doctype, with the given `qualifiedName`, `publicId`, and `systemId`.\n\t *\n\t * __This behavior is slightly different from the in the specs__:\n\t * - this implementation is not validating names or qualified names\n\t * (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string} qualifiedName\n\t * @param {string} [publicId]\n\t * @param {string} [systemId]\n\t * @returns {DocumentType} which can either be used with `DOMImplementation.createDocument` upon document creation\n\t * \t\t\t\t or can be put into the document via methods like `Node.insertBefore()` or `Node.replaceChild()`\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocumentType MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocType DOM Level 2 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype DOM Living Standard\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocumentType: function(qualifiedName, publicId, systemId){\n\t\tvar node = new DocumentType();\n\t\tnode.name = qualifiedName;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.publicId = publicId || '';\n\t\tnode.systemId = systemId || '';\n\n\t\treturn node;\n\t}\n};\n\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247\n */\n\nfunction Node() {\n};\n\nNode.prototype = {\n\tfirstChild : null,\n\tlastChild : null,\n\tpreviousSibling : null,\n\tnextSibling : null,\n\tattributes : null,\n\tparentNode : null,\n\tchildNodes : null,\n\townerDocument : null,\n\tnodeValue : null,\n\tnamespaceURI : null,\n\tprefix : null,\n\tlocalName : null,\n\t// Modified in DOM Level 2:\n\tinsertBefore:function(newChild, refChild){//raises\n\t\treturn _insertBefore(this,newChild,refChild);\n\t},\n\treplaceChild:function(newChild, oldChild){//raises\n\t\t_insertBefore(this, newChild,oldChild, assertPreReplacementValidityInDocument);\n\t\tif(oldChild){\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t},\n\tremoveChild:function(oldChild){\n\t\treturn _removeChild(this,oldChild);\n\t},\n\tappendChild:function(newChild){\n\t\treturn this.insertBefore(newChild,null);\n\t},\n\thasChildNodes:function(){\n\t\treturn this.firstChild != null;\n\t},\n\tcloneNode:function(deep){\n\t\treturn cloneNode(this.ownerDocument||this,this,deep);\n\t},\n\t// Modified in DOM Level 2:\n\tnormalize:function(){\n\t\tvar child = this.firstChild;\n\t\twhile(child){\n\t\t\tvar next = child.nextSibling;\n\t\t\tif(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){\n\t\t\t\tthis.removeChild(next);\n\t\t\t\tchild.appendData(next.data);\n\t\t\t}else{\n\t\t\t\tchild.normalize();\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t}\n\t},\n \t// Introduced in DOM Level 2:\n\tisSupported:function(feature, version){\n\t\treturn this.ownerDocument.implementation.hasFeature(feature,version);\n\t},\n // Introduced in DOM Level 2:\n hasAttributes:function(){\n \treturn this.attributes.length>0;\n },\n\t/**\n\t * Look up the prefix associated to the given namespace URI, starting from this node.\n\t * **The default namespace declarations are ignored by this method.**\n\t * See Namespace Prefix Lookup for details on the algorithm used by this method.\n\t *\n\t * _Note: The implementation seems to be incomplete when compared to the algorithm described in the specs._\n\t *\n\t * @param {string | null} namespaceURI\n\t * @returns {string | null}\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html#lookupNamespacePrefixAlgo\n\t * @see https://dom.spec.whatwg.org/#dom-node-lookupprefix\n\t * @see https://github.com/xmldom/xmldom/issues/322\n\t */\n lookupPrefix:function(namespaceURI){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tfor(var n in map){\n\t\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(map, n) && map[n] === namespaceURI) {\n\t\t\t\t\t\t\treturn n;\n\t\t\t\t\t\t}\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n lookupNamespaceURI:function(prefix){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tif(Object.prototype.hasOwnProperty.call(map, prefix)){\n \t\t\t\treturn map[prefix] ;\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n isDefaultNamespace:function(namespaceURI){\n \tvar prefix = this.lookupPrefix(namespaceURI);\n \treturn prefix == null;\n }\n};\n\n\nfunction _xmlEncoder(c){\n\treturn c == '<' && '<' ||\n c == '>' && '>' ||\n c == '&' && '&' ||\n c == '\"' && '"' ||\n '&#'+c.charCodeAt()+';'\n}\n\n\ncopy(NodeType,Node);\ncopy(NodeType,Node.prototype);\n\n/**\n * @param callback return true for continue,false for break\n * @return boolean true: break visit;\n */\nfunction _visitNode(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tif(node = node.firstChild){\n\t\tdo{\n\t\t\tif(_visitNode(node,callback)){return true}\n }while(node=node.nextSibling)\n }\n}\n\n\n\nfunction Document(){\n\tthis.ownerDocument = this;\n}\n\nfunction _onAddAttribute(doc,el,newAttr){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tel._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value\n\t}\n}\n\nfunction _onRemoveAttribute(doc,el,newAttr,remove){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tdelete el._nsMap[newAttr.prefix?newAttr.localName:'']\n\t}\n}\n\n/**\n * Updates `el.childNodes`, updating the indexed items and it's `length`.\n * Passing `newChild` means it will be appended.\n * Otherwise it's assumed that an item has been removed,\n * and `el.firstNode` and it's `.nextSibling` are used\n * to walk the current list of child nodes.\n *\n * @param {Document} doc\n * @param {Node} el\n * @param {Node} [newChild]\n * @private\n */\nfunction _onUpdateChild (doc, el, newChild) {\n\tif(doc && doc._inc){\n\t\tdoc._inc++;\n\t\t//update childNodes\n\t\tvar cs = el.childNodes;\n\t\tif (newChild) {\n\t\t\tcs[cs.length++] = newChild;\n\t\t} else {\n\t\t\tvar child = el.firstChild;\n\t\t\tvar i = 0;\n\t\t\twhile (child) {\n\t\t\t\tcs[i++] = child;\n\t\t\t\tchild = child.nextSibling;\n\t\t\t}\n\t\t\tcs.length = i;\n\t\t\tdelete cs[cs.length];\n\t\t}\n\t}\n}\n\n/**\n * Removes the connections between `parentNode` and `child`\n * and any existing `child.previousSibling` or `child.nextSibling`.\n *\n * @see https://github.com/xmldom/xmldom/issues/135\n * @see https://github.com/xmldom/xmldom/issues/145\n *\n * @param {Node} parentNode\n * @param {Node} child\n * @returns {Node} the child that was removed.\n * @private\n */\nfunction _removeChild (parentNode, child) {\n\tvar previous = child.previousSibling;\n\tvar next = child.nextSibling;\n\tif (previous) {\n\t\tprevious.nextSibling = next;\n\t} else {\n\t\tparentNode.firstChild = next;\n\t}\n\tif (next) {\n\t\tnext.previousSibling = previous;\n\t} else {\n\t\tparentNode.lastChild = previous;\n\t}\n\tchild.parentNode = null;\n\tchild.previousSibling = null;\n\tchild.nextSibling = null;\n\t_onUpdateChild(parentNode.ownerDocument, parentNode);\n\treturn child;\n}\n\n/**\n * Returns `true` if `node` can be a parent for insertion.\n * @param {Node} node\n * @returns {boolean}\n */\nfunction hasValidParentNodeType(node) {\n\treturn (\n\t\tnode &&\n\t\t(node.nodeType === Node.DOCUMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || node.nodeType === Node.ELEMENT_NODE)\n\t);\n}\n\n/**\n * Returns `true` if `node` can be inserted according to it's `nodeType`.\n * @param {Node} node\n * @returns {boolean}\n */\nfunction hasInsertableNodeType(node) {\n\treturn (\n\t\tnode &&\n\t\t(isElementNode(node) ||\n\t\t\tisTextNode(node) ||\n\t\t\tisDocTypeNode(node) ||\n\t\t\tnode.nodeType === Node.DOCUMENT_FRAGMENT_NODE ||\n\t\t\tnode.nodeType === Node.COMMENT_NODE ||\n\t\t\tnode.nodeType === Node.PROCESSING_INSTRUCTION_NODE)\n\t);\n}\n\n/**\n * Returns true if `node` is a DOCTYPE node\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isDocTypeNode(node) {\n\treturn node && node.nodeType === Node.DOCUMENT_TYPE_NODE;\n}\n\n/**\n * Returns true if the node is an element\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isElementNode(node) {\n\treturn node && node.nodeType === Node.ELEMENT_NODE;\n}\n/**\n * Returns true if `node` is a text node\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isTextNode(node) {\n\treturn node && node.nodeType === Node.TEXT_NODE;\n}\n\n/**\n * Check if en element node can be inserted before `child`, or at the end if child is falsy,\n * according to the presence and position of a doctype node on the same level.\n *\n * @param {Document} doc The document node\n * @param {Node} child the node that would become the nextSibling if the element would be inserted\n * @returns {boolean} `true` if an element can be inserted before child\n * @private\n * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction isElementInsertionPossible(doc, child) {\n\tvar parentChildNodes = doc.childNodes || [];\n\tif (find(parentChildNodes, isElementNode) || isDocTypeNode(child)) {\n\t\treturn false;\n\t}\n\tvar docTypeNode = find(parentChildNodes, isDocTypeNode);\n\treturn !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));\n}\n\n/**\n * Check if en element node can be inserted before `child`, or at the end if child is falsy,\n * according to the presence and position of a doctype node on the same level.\n *\n * @param {Node} doc The document node\n * @param {Node} child the node that would become the nextSibling if the element would be inserted\n * @returns {boolean} `true` if an element can be inserted before child\n * @private\n * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction isElementReplacementPossible(doc, child) {\n\tvar parentChildNodes = doc.childNodes || [];\n\n\tfunction hasElementChildThatIsNotChild(node) {\n\t\treturn isElementNode(node) && node !== child;\n\t}\n\n\tif (find(parentChildNodes, hasElementChildThatIsNotChild)) {\n\t\treturn false;\n\t}\n\tvar docTypeNode = find(parentChildNodes, isDocTypeNode);\n\treturn !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));\n}\n\n/**\n * @private\n * Steps 1-5 of the checks before inserting and before replacing a child are the same.\n *\n * @param {Node} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node=} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreInsertionValidity1to5(parent, node, child) {\n\t// 1. If `parent` is not a Document, DocumentFragment, or Element node, then throw a \"HierarchyRequestError\" DOMException.\n\tif (!hasValidParentNodeType(parent)) {\n\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Unexpected parent node type ' + parent.nodeType);\n\t}\n\t// 2. If `node` is a host-including inclusive ancestor of `parent`, then throw a \"HierarchyRequestError\" DOMException.\n\t// not implemented!\n\t// 3. If `child` is non-null and its parent is not `parent`, then throw a \"NotFoundError\" DOMException.\n\tif (child && child.parentNode !== parent) {\n\t\tthrow new DOMException(NOT_FOUND_ERR, 'child not in parent');\n\t}\n\tif (\n\t\t// 4. If `node` is not a DocumentFragment, DocumentType, Element, or CharacterData node, then throw a \"HierarchyRequestError\" DOMException.\n\t\t!hasInsertableNodeType(node) ||\n\t\t// 5. If either `node` is a Text node and `parent` is a document,\n\t\t// the sax parser currently adds top level text nodes, this will be fixed in 0.9.0\n\t\t// || (node.nodeType === Node.TEXT_NODE && parent.nodeType === Node.DOCUMENT_NODE)\n\t\t// or `node` is a doctype and `parent` is not a document, then throw a \"HierarchyRequestError\" DOMException.\n\t\t(isDocTypeNode(node) && parent.nodeType !== Node.DOCUMENT_NODE)\n\t) {\n\t\tthrow new DOMException(\n\t\t\tHIERARCHY_REQUEST_ERR,\n\t\t\t'Unexpected node type ' + node.nodeType + ' for parent node type ' + parent.nodeType\n\t\t);\n\t}\n}\n\n/**\n * @private\n * Step 6 of the checks before inserting and before replacing a child are different.\n *\n * @param {Document} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node | undefined} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreInsertionValidityInDocument(parent, node, child) {\n\tvar parentChildNodes = parent.childNodes || [];\n\tvar nodeChildNodes = node.childNodes || [];\n\n\t// DocumentFragment\n\tif (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t\tvar nodeChildElements = nodeChildNodes.filter(isElementNode);\n\t\t// If node has more than one element child or has a Text node child.\n\t\tif (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');\n\t\t}\n\t\t// Otherwise, if `node` has one element child and either `parent` has an element child,\n\t\t// `child` is a doctype, or `child` is non-null and a doctype is following `child`.\n\t\tif (nodeChildElements.length === 1 && !isElementInsertionPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');\n\t\t}\n\t}\n\t// Element\n\tif (isElementNode(node)) {\n\t\t// `parent` has an element child, `child` is a doctype,\n\t\t// or `child` is non-null and a doctype is following `child`.\n\t\tif (!isElementInsertionPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');\n\t\t}\n\t}\n\t// DocumentType\n\tif (isDocTypeNode(node)) {\n\t\t// `parent` has a doctype child,\n\t\tif (find(parentChildNodes, isDocTypeNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');\n\t\t}\n\t\tvar parentElementChild = find(parentChildNodes, isElementNode);\n\t\t// `child` is non-null and an element is preceding `child`,\n\t\tif (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');\n\t\t}\n\t\t// or `child` is null and `parent` has an element child.\n\t\tif (!child && parentElementChild) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can not be appended since element is present');\n\t\t}\n\t}\n}\n\n/**\n * @private\n * Step 6 of the checks before inserting and before replacing a child are different.\n *\n * @param {Document} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node | undefined} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreReplacementValidityInDocument(parent, node, child) {\n\tvar parentChildNodes = parent.childNodes || [];\n\tvar nodeChildNodes = node.childNodes || [];\n\n\t// DocumentFragment\n\tif (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t\tvar nodeChildElements = nodeChildNodes.filter(isElementNode);\n\t\t// If `node` has more than one element child or has a Text node child.\n\t\tif (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');\n\t\t}\n\t\t// Otherwise, if `node` has one element child and either `parent` has an element child that is not `child` or a doctype is following `child`.\n\t\tif (nodeChildElements.length === 1 && !isElementReplacementPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');\n\t\t}\n\t}\n\t// Element\n\tif (isElementNode(node)) {\n\t\t// `parent` has an element child that is not `child` or a doctype is following `child`.\n\t\tif (!isElementReplacementPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');\n\t\t}\n\t}\n\t// DocumentType\n\tif (isDocTypeNode(node)) {\n\t\tfunction hasDoctypeChildThatIsNotChild(node) {\n\t\t\treturn isDocTypeNode(node) && node !== child;\n\t\t}\n\n\t\t// `parent` has a doctype child that is not `child`,\n\t\tif (find(parentChildNodes, hasDoctypeChildThatIsNotChild)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');\n\t\t}\n\t\tvar parentElementChild = find(parentChildNodes, isElementNode);\n\t\t// or an element is preceding `child`.\n\t\tif (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');\n\t\t}\n\t}\n}\n\n/**\n * @private\n * @param {Node} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node=} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction _insertBefore(parent, node, child, _inDocumentAssertion) {\n\t// To ensure pre-insertion validity of a node into a parent before a child, run these steps:\n\tassertPreInsertionValidity1to5(parent, node, child);\n\n\t// If parent is a document, and any of the statements below, switched on the interface node implements,\n\t// are true, then throw a \"HierarchyRequestError\" DOMException.\n\tif (parent.nodeType === Node.DOCUMENT_NODE) {\n\t\t(_inDocumentAssertion || assertPreInsertionValidityInDocument)(parent, node, child);\n\t}\n\n\tvar cp = node.parentNode;\n\tif(cp){\n\t\tcp.removeChild(node);//remove and update\n\t}\n\tif(node.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\tvar newFirst = node.firstChild;\n\t\tif (newFirst == null) {\n\t\t\treturn node;\n\t\t}\n\t\tvar newLast = node.lastChild;\n\t}else{\n\t\tnewFirst = newLast = node;\n\t}\n\tvar pre = child ? child.previousSibling : parent.lastChild;\n\n\tnewFirst.previousSibling = pre;\n\tnewLast.nextSibling = child;\n\n\n\tif(pre){\n\t\tpre.nextSibling = newFirst;\n\t}else{\n\t\tparent.firstChild = newFirst;\n\t}\n\tif(child == null){\n\t\tparent.lastChild = newLast;\n\t}else{\n\t\tchild.previousSibling = newLast;\n\t}\n\tdo{\n\t\tnewFirst.parentNode = parent;\n\t\t// Update ownerDocument for each node being inserted\n\t\tvar targetDoc = parent.ownerDocument || parent;\n\t\t_updateOwnerDocument(newFirst, targetDoc);\n\t}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))\n\t_onUpdateChild(parent.ownerDocument||parent, parent);\n\t//console.log(parent.lastChild.nextSibling == null)\n\tif (node.nodeType == DOCUMENT_FRAGMENT_NODE) {\n\t\tnode.firstChild = node.lastChild = null;\n\t}\n\treturn node;\n}\n\n/**\n * Recursively updates the ownerDocument property for a node and all its descendants\n * @param {Node} node\n * @param {Document} newOwnerDocument\n * @private\n */\nfunction _updateOwnerDocument(node, newOwnerDocument) {\n\tif (node.ownerDocument === newOwnerDocument) {\n\t\treturn;\n\t}\n\t\n\tnode.ownerDocument = newOwnerDocument;\n\t\n\t// Update attributes if this is an element\n\tif (node.nodeType === ELEMENT_NODE && node.attributes) {\n\t\tfor (var i = 0; i < node.attributes.length; i++) {\n\t\t\tvar attr = node.attributes.item(i);\n\t\t\tif (attr) {\n\t\t\t\tattr.ownerDocument = newOwnerDocument;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// Recursively update child nodes\n\tvar child = node.firstChild;\n\twhile (child) {\n\t\t_updateOwnerDocument(child, newOwnerDocument);\n\t\tchild = child.nextSibling;\n\t}\n}\n\n/**\n * Appends `newChild` to `parentNode`.\n * If `newChild` is already connected to a `parentNode` it is first removed from it.\n *\n * @see https://github.com/xmldom/xmldom/issues/135\n * @see https://github.com/xmldom/xmldom/issues/145\n * @param {Node} parentNode\n * @param {Node} newChild\n * @returns {Node}\n * @private\n */\nfunction _appendSingleChild (parentNode, newChild) {\n\tif (newChild.parentNode) {\n\t\tnewChild.parentNode.removeChild(newChild);\n\t}\n\tnewChild.parentNode = parentNode;\n\tnewChild.previousSibling = parentNode.lastChild;\n\tnewChild.nextSibling = null;\n\tif (newChild.previousSibling) {\n\t\tnewChild.previousSibling.nextSibling = newChild;\n\t} else {\n\t\tparentNode.firstChild = newChild;\n\t}\n\tparentNode.lastChild = newChild;\n\t_onUpdateChild(parentNode.ownerDocument, parentNode, newChild);\n\t\n\t// Update ownerDocument for the new child and all its descendants\n\tvar targetDoc = parentNode.ownerDocument || parentNode;\n\t_updateOwnerDocument(newChild, targetDoc);\n\t\n\treturn newChild;\n}\n\nDocument.prototype = {\n\t//implementation : null,\n\tnodeName : '#document',\n\tnodeType : DOCUMENT_NODE,\n\t/**\n\t * The DocumentType node of the document.\n\t *\n\t * @readonly\n\t * @type DocumentType\n\t */\n\tdoctype : null,\n\tdocumentElement : null,\n\t_inc : 1,\n\n\tinsertBefore : function(newChild, refChild){//raises\n\t\tif(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){\n\t\t\tvar child = newChild.firstChild;\n\t\t\twhile(child){\n\t\t\t\tvar next = child.nextSibling;\n\t\t\t\tthis.insertBefore(child,refChild);\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t\treturn newChild;\n\t\t}\n\t\t_insertBefore(this, newChild, refChild);\n\t\t_updateOwnerDocument(newChild, this);\n\t\tif (this.documentElement === null && newChild.nodeType === ELEMENT_NODE) {\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\n\t\treturn newChild;\n\t},\n\tremoveChild : function(oldChild){\n\t\tif(this.documentElement == oldChild){\n\t\t\tthis.documentElement = null;\n\t\t}\n\t\treturn _removeChild(this,oldChild);\n\t},\n\treplaceChild: function (newChild, oldChild) {\n\t\t//raises\n\t\t_insertBefore(this, newChild, oldChild, assertPreReplacementValidityInDocument);\n\t\t_updateOwnerDocument(newChild, this);\n\t\tif (oldChild) {\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t\tif (isElementNode(newChild)) {\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\t},\n\t// Introduced in DOM Level 2:\n\timportNode : function(importedNode,deep){\n\t\treturn importNode(this,importedNode,deep);\n\t},\n\t// Introduced in DOM Level 2:\n\tgetElementById :\tfunction(id){\n\t\tvar rtv = null;\n\t\t_visitNode(this.documentElement,function(node){\n\t\t\tif(node.nodeType == ELEMENT_NODE){\n\t\t\t\tif(node.getAttribute('id') == id){\n\t\t\t\t\trtv = node;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\treturn rtv;\n\t},\n\n\t/**\n\t * The `getElementsByClassName` method of `Document` interface returns an array-like object\n\t * of all child elements which have **all** of the given class name(s).\n\t *\n\t * Returns an empty list if `classeNames` is an empty string or only contains HTML white space characters.\n\t *\n\t *\n\t * Warning: This is a live LiveNodeList.\n\t * Changes in the DOM will reflect in the array as the changes occur.\n\t * If an element selected by this array no longer qualifies for the selector,\n\t * it will automatically be removed. Be aware of this for iteration purposes.\n\t *\n\t * @param {string} classNames is a string representing the class name(s) to match; multiple class names are separated by (ASCII-)whitespace\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName\n\t * @see https://dom.spec.whatwg.org/#concept-getelementsbyclassname\n\t */\n\tgetElementsByClassName: function(classNames) {\n\t\tvar classNamesSet = toOrderedSet(classNames)\n\t\treturn new LiveNodeList(this, function(base) {\n\t\t\tvar ls = [];\n\t\t\tif (classNamesSet.length > 0) {\n\t\t\t\t_visitNode(base.documentElement, function(node) {\n\t\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE) {\n\t\t\t\t\t\tvar nodeClassNames = node.getAttribute('class')\n\t\t\t\t\t\t// can be null if the attribute does not exist\n\t\t\t\t\t\tif (nodeClassNames) {\n\t\t\t\t\t\t\t// before splitting and iterating just compare them for the most common case\n\t\t\t\t\t\t\tvar matches = classNames === nodeClassNames;\n\t\t\t\t\t\t\tif (!matches) {\n\t\t\t\t\t\t\t\tvar nodeClassNamesSet = toOrderedSet(nodeClassNames)\n\t\t\t\t\t\t\t\tmatches = classNamesSet.every(arrayIncludes(nodeClassNamesSet))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(matches) {\n\t\t\t\t\t\t\t\tls.push(node);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ls;\n\t\t});\n\t},\n\n\t//document factory method:\n\tcreateElement :\tfunction(tagName){\n\t\tvar node = new Element();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = tagName;\n\t\tnode.tagName = tagName;\n\t\tnode.localName = tagName;\n\t\tnode.childNodes = new NodeList();\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\tcreateDocumentFragment :\tfunction(){\n\t\tvar node = new DocumentFragment();\n\t\tnode.ownerDocument = this;\n\t\tnode.childNodes = new NodeList();\n\t\treturn node;\n\t},\n\tcreateTextNode :\tfunction(data){\n\t\tvar node = new Text();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateComment :\tfunction(data){\n\t\tvar node = new Comment();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateCDATASection :\tfunction(data){\n\t\tvar node = new CDATASection();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateProcessingInstruction :\tfunction(target,data){\n\t\tvar node = new ProcessingInstruction();\n\t\tnode.ownerDocument = this;\n\t\tnode.tagName = node.nodeName = node.target = target;\n\t\tnode.nodeValue = node.data = data;\n\t\treturn node;\n\t},\n\tcreateAttribute :\tfunction(name){\n\t\tvar node = new Attr();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.name = name;\n\t\tnode.nodeName\t= name;\n\t\tnode.localName = name;\n\t\tnode.specified = true;\n\t\treturn node;\n\t},\n\tcreateEntityReference :\tfunction(name){\n\t\tvar node = new EntityReference();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.nodeName\t= name;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateElementNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Element();\n\t\tvar pl = qualifiedName.split(':');\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tnode.childNodes = new NodeList();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.tagName = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateAttributeNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Attr();\n\t\tvar pl = qualifiedName.split(':');\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.name = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tnode.specified = true;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\treturn node;\n\t}\n};\n_extends(Document,Node);\n\n\nfunction Element() {\n\tthis._nsMap = {};\n};\nElement.prototype = {\n\tnodeType : ELEMENT_NODE,\n\thasAttribute : function(name){\n\t\treturn this.getAttributeNode(name)!=null;\n\t},\n\tgetAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name);\n\t\treturn attr && attr.value || '';\n\t},\n\tgetAttributeNode : function(name){\n\t\treturn this.attributes.getNamedItem(name);\n\t},\n\tsetAttribute : function(name, value){\n\t\tvar attr = this.ownerDocument.createAttribute(name);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tremoveAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name)\n\t\tattr && this.removeAttributeNode(attr);\n\t},\n\n\t//four real opeartion method\n\tappendChild:function(newChild){\n\t\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\t\treturn this.insertBefore(newChild,null);\n\t\t}else{\n\t\t\treturn _appendSingleChild(this,newChild);\n\t\t}\n\t},\n\tsetAttributeNode : function(newAttr){\n\t\treturn this.attributes.setNamedItem(newAttr);\n\t},\n\tsetAttributeNodeNS : function(newAttr){\n\t\treturn this.attributes.setNamedItemNS(newAttr);\n\t},\n\tremoveAttributeNode : function(oldAttr){\n\t\t//console.log(this == oldAttr.ownerElement)\n\t\treturn this.attributes.removeNamedItem(oldAttr.nodeName);\n\t},\n\t//get real attribute name,and remove it by removeAttributeNode\n\tremoveAttributeNS : function(namespaceURI, localName){\n\t\tvar old = this.getAttributeNodeNS(namespaceURI, localName);\n\t\told && this.removeAttributeNode(old);\n\t},\n\n\thasAttributeNS : function(namespaceURI, localName){\n\t\treturn this.getAttributeNodeNS(namespaceURI, localName)!=null;\n\t},\n\tgetAttributeNS : function(namespaceURI, localName){\n\t\tvar attr = this.getAttributeNodeNS(namespaceURI, localName);\n\t\treturn attr && attr.value || '';\n\t},\n\tsetAttributeNS : function(namespaceURI, qualifiedName, value){\n\t\tvar attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tgetAttributeNodeNS : function(namespaceURI, localName){\n\t\treturn this.attributes.getNamedItemNS(namespaceURI, localName);\n\t},\n\n\tgetElementsByTagName : function(tagName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t});\n\t},\n\tgetElementsByTagNameNS : function(namespaceURI, localName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\n\t\t});\n\t}\n};\nDocument.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;\nDocument.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;\n\n\n_extends(Element,Node);\nfunction Attr() {\n};\nAttr.prototype.nodeType = ATTRIBUTE_NODE;\n_extends(Attr,Node);\n\n\nfunction CharacterData() {\n};\nCharacterData.prototype = {\n\tdata : '',\n\tsubstringData : function(offset, count) {\n\t\treturn this.data.substring(offset, offset+count);\n\t},\n\tappendData: function(text) {\n\t\ttext = this.data+text;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t},\n\tinsertData: function(offset,text) {\n\t\tthis.replaceData(offset,0,text);\n\n\t},\n\tappendChild:function(newChild){\n\t\tthrow new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])\n\t},\n\tdeleteData: function(offset, count) {\n\t\tthis.replaceData(offset,count,\"\");\n\t},\n\treplaceData: function(offset, count, text) {\n\t\tvar start = this.data.substring(0,offset);\n\t\tvar end = this.data.substring(offset+count);\n\t\ttext = start + text + end;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t}\n}\n_extends(CharacterData,Node);\nfunction Text() {\n};\nText.prototype = {\n\tnodeName : \"#text\",\n\tnodeType : TEXT_NODE,\n\tsplitText : function(offset) {\n\t\tvar text = this.data;\n\t\tvar newText = text.substring(offset);\n\t\ttext = text.substring(0, offset);\n\t\tthis.data = this.nodeValue = text;\n\t\tthis.length = text.length;\n\t\tvar newNode = this.ownerDocument.createTextNode(newText);\n\t\tif(this.parentNode){\n\t\t\tthis.parentNode.insertBefore(newNode, this.nextSibling);\n\t\t}\n\t\treturn newNode;\n\t}\n}\n_extends(Text,CharacterData);\nfunction Comment() {\n};\nComment.prototype = {\n\tnodeName : \"#comment\",\n\tnodeType : COMMENT_NODE\n}\n_extends(Comment,CharacterData);\n\nfunction CDATASection() {\n};\nCDATASection.prototype = {\n\tnodeName : \"#cdata-section\",\n\tnodeType : CDATA_SECTION_NODE\n}\n_extends(CDATASection,CharacterData);\n\n\nfunction DocumentType() {\n};\nDocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;\n_extends(DocumentType,Node);\n\nfunction Notation() {\n};\nNotation.prototype.nodeType = NOTATION_NODE;\n_extends(Notation,Node);\n\nfunction Entity() {\n};\nEntity.prototype.nodeType = ENTITY_NODE;\n_extends(Entity,Node);\n\nfunction EntityReference() {\n};\nEntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;\n_extends(EntityReference,Node);\n\nfunction DocumentFragment() {\n};\nDocumentFragment.prototype.nodeName =\t\"#document-fragment\";\nDocumentFragment.prototype.nodeType =\tDOCUMENT_FRAGMENT_NODE;\n_extends(DocumentFragment,Node);\n\n\nfunction ProcessingInstruction() {\n}\nProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;\n_extends(ProcessingInstruction,Node);\nfunction XMLSerializer(){}\nXMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){\n\treturn nodeSerializeToString.call(node,isHtml,nodeFilter);\n}\nNode.prototype.toString = nodeSerializeToString;\nfunction nodeSerializeToString(isHtml,nodeFilter){\n\tvar buf = [];\n\tvar refNode = this.nodeType == 9 && this.documentElement || this;\n\tvar prefix = refNode.prefix;\n\tvar uri = refNode.namespaceURI;\n\n\tif(uri && prefix == null){\n\t\t//console.log(prefix)\n\t\tvar prefix = refNode.lookupPrefix(uri);\n\t\tif(prefix == null){\n\t\t\t//isHTML = true;\n\t\t\tvar visibleNamespaces=[\n\t\t\t{namespace:uri,prefix:null}\n\t\t\t//{namespace:uri,prefix:''}\n\t\t\t]\n\t\t}\n\t}\n\tserializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);\n\t//console.log('###',this.nodeType,uri,prefix,buf.join(''))\n\treturn buf.join('');\n}\n\nfunction needNamespaceDefine(node, isHTML, visibleNamespaces) {\n\tvar prefix = node.prefix || '';\n\tvar uri = node.namespaceURI;\n\t// According to [Namespaces in XML 1.0](https://www.w3.org/TR/REC-xml-names/#ns-using) ,\n\t// and more specifically https://www.w3.org/TR/REC-xml-names/#nsc-NoPrefixUndecl :\n\t// > In a namespace declaration for a prefix [...], the attribute value MUST NOT be empty.\n\t// in a similar manner [Namespaces in XML 1.1](https://www.w3.org/TR/xml-names11/#ns-using)\n\t// and more specifically https://www.w3.org/TR/xml-names11/#nsc-NSDeclared :\n\t// > [...] Furthermore, the attribute value [...] must not be an empty string.\n\t// so serializing empty namespace value like xmlns:ds=\"\" would produce an invalid XML document.\n\tif (!uri) {\n\t\treturn false;\n\t}\n\tif (prefix === \"xml\" && uri === NAMESPACE.XML || uri === NAMESPACE.XMLNS) {\n\t\treturn false;\n\t}\n\n\tvar i = visibleNamespaces.length\n\twhile (i--) {\n\t\tvar ns = visibleNamespaces[i];\n\t\t// get namespace prefix\n\t\tif (ns.prefix === prefix) {\n\t\t\treturn ns.namespace !== uri;\n\t\t}\n\t}\n\treturn true;\n}\n/**\n * Well-formed constraint: No < in Attribute Values\n * > The replacement text of any entity referred to directly or indirectly\n * > in an attribute value must not contain a <.\n * @see https://www.w3.org/TR/xml11/#CleanAttrVals\n * @see https://www.w3.org/TR/xml11/#NT-AttValue\n *\n * Literal whitespace other than space that appear in attribute values\n * are serialized as their entity references, so they will be preserved.\n * (In contrast to whitespace literals in the input which are normalized to spaces)\n * @see https://www.w3.org/TR/xml11/#AVNormalize\n * @see https://w3c.github.io/DOM-Parsing/#serializing-an-element-s-attributes\n */\nfunction addSerializedAttribute(buf, qualifiedName, value) {\n\tbuf.push(' ', qualifiedName, '=\"', value.replace(/[<>&\"\\t\\n\\r]/g, _xmlEncoder), '\"')\n}\n\nfunction serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){\n\tif (!visibleNamespaces) {\n\t\tvisibleNamespaces = [];\n\t}\n\n\tif(nodeFilter){\n\t\tnode = nodeFilter(node);\n\t\tif(node){\n\t\t\tif(typeof node == 'string'){\n\t\t\t\tbuf.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\treturn;\n\t\t}\n\t\t//buf.sort.apply(attrs, attributeSorter);\n\t}\n\n\tswitch(node.nodeType){\n\tcase ELEMENT_NODE:\n\t\tvar attrs = node.attributes;\n\t\tvar len = attrs.length;\n\t\tvar child = node.firstChild;\n\t\tvar nodeName = node.tagName;\n\n\t\tisHTML = NAMESPACE.isHTML(node.namespaceURI) || isHTML\n\n\t\tvar prefixedNodeName = nodeName\n\t\tif (!isHTML && !node.prefix && node.namespaceURI) {\n\t\t\tvar defaultNS\n\t\t\t// lookup current default ns from `xmlns` attribute\n\t\t\tfor (var ai = 0; ai < attrs.length; ai++) {\n\t\t\t\tif (attrs.item(ai).name === 'xmlns') {\n\t\t\t\t\tdefaultNS = attrs.item(ai).value\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!defaultNS) {\n\t\t\t\t// lookup current default ns in visibleNamespaces\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.prefix === '' && namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tdefaultNS = namespace.namespace\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (defaultNS !== node.namespaceURI) {\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tif (namespace.prefix) {\n\t\t\t\t\t\t\tprefixedNodeName = namespace.prefix + ':' + nodeName\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbuf.push('<', prefixedNodeName);\n\n\t\tfor(var i=0;i');\n\t\t\t//if is cdata child node\n\t\t\tif(isHTML && /^script$/i.test(nodeName)){\n\t\t\t\twhile(child){\n\t\t\t\t\tif(child.data){\n\t\t\t\t\t\tbuf.push(child.data);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\t}\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\twhile(child){\n\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuf.push('');\n\t\t}else{\n\t\t\tbuf.push('/>');\n\t\t}\n\t\t// remove added visible namespaces\n\t\t//visibleNamespaces.length = startVisibleNamespaces;\n\t\treturn;\n\tcase DOCUMENT_NODE:\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t\treturn;\n\tcase ATTRIBUTE_NODE:\n\t\treturn addSerializedAttribute(buf, node.name, node.value);\n\tcase TEXT_NODE:\n\t\t/**\n\t\t * The ampersand character (&) and the left angle bracket (<) must not appear in their literal form,\n\t\t * except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section.\n\t\t * If they are needed elsewhere, they must be escaped using either numeric character references or the strings\n\t\t * `&` and `<` respectively.\n\t\t * The right angle bracket (>) may be represented using the string \" > \", and must, for compatibility,\n\t\t * be escaped using either `>` or a character reference when it appears in the string `]]>` in content,\n\t\t * when that string is not marking the end of a CDATA section.\n\t\t *\n\t\t * In the content of elements, character data is any string of characters\n\t\t * which does not contain the start-delimiter of any markup\n\t\t * and does not include the CDATA-section-close delimiter, `]]>`.\n\t\t *\n\t\t * @see https://www.w3.org/TR/xml/#NT-CharData\n\t\t * @see https://w3c.github.io/DOM-Parsing/#xml-serializing-a-text-node\n\t\t */\n\t\treturn buf.push(node.data\n\t\t\t.replace(/[<&>]/g,_xmlEncoder)\n\t\t);\n\tcase CDATA_SECTION_NODE:\n\t\treturn buf.push( '');\n\tcase COMMENT_NODE:\n\t\treturn buf.push( \"\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM ', sysid, '>');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i',\n\tlt: '<',\n\tquot: '\"',\n});\n\n/**\n * A map of all entities that are detected in an HTML document.\n * They contain all entries from `XML_ENTITIES`.\n *\n * @see XML_ENTITIES\n * @see DOMParser.parseFromString\n * @see DOMImplementation.prototype.createHTMLDocument\n * @see https://html.spec.whatwg.org/#named-character-references WHATWG HTML(5) Spec\n * @see https://html.spec.whatwg.org/entities.json JSON\n * @see https://www.w3.org/TR/xml-entity-names/ W3C XML Entity Names\n * @see https://www.w3.org/TR/html4/sgml/entities.html W3C HTML4/SGML\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML Wikipedia (HTML)\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML Wikpedia (XHTML)\n */\nexports.HTML_ENTITIES = freeze({\n\tAacute: '\\u00C1',\n\taacute: '\\u00E1',\n\tAbreve: '\\u0102',\n\tabreve: '\\u0103',\n\tac: '\\u223E',\n\tacd: '\\u223F',\n\tacE: '\\u223E\\u0333',\n\tAcirc: '\\u00C2',\n\tacirc: '\\u00E2',\n\tacute: '\\u00B4',\n\tAcy: '\\u0410',\n\tacy: '\\u0430',\n\tAElig: '\\u00C6',\n\taelig: '\\u00E6',\n\taf: '\\u2061',\n\tAfr: '\\uD835\\uDD04',\n\tafr: '\\uD835\\uDD1E',\n\tAgrave: '\\u00C0',\n\tagrave: '\\u00E0',\n\talefsym: '\\u2135',\n\taleph: '\\u2135',\n\tAlpha: '\\u0391',\n\talpha: '\\u03B1',\n\tAmacr: '\\u0100',\n\tamacr: '\\u0101',\n\tamalg: '\\u2A3F',\n\tAMP: '\\u0026',\n\tamp: '\\u0026',\n\tAnd: '\\u2A53',\n\tand: '\\u2227',\n\tandand: '\\u2A55',\n\tandd: '\\u2A5C',\n\tandslope: '\\u2A58',\n\tandv: '\\u2A5A',\n\tang: '\\u2220',\n\tange: '\\u29A4',\n\tangle: '\\u2220',\n\tangmsd: '\\u2221',\n\tangmsdaa: '\\u29A8',\n\tangmsdab: '\\u29A9',\n\tangmsdac: '\\u29AA',\n\tangmsdad: '\\u29AB',\n\tangmsdae: '\\u29AC',\n\tangmsdaf: '\\u29AD',\n\tangmsdag: '\\u29AE',\n\tangmsdah: '\\u29AF',\n\tangrt: '\\u221F',\n\tangrtvb: '\\u22BE',\n\tangrtvbd: '\\u299D',\n\tangsph: '\\u2222',\n\tangst: '\\u00C5',\n\tangzarr: '\\u237C',\n\tAogon: '\\u0104',\n\taogon: '\\u0105',\n\tAopf: '\\uD835\\uDD38',\n\taopf: '\\uD835\\uDD52',\n\tap: '\\u2248',\n\tapacir: '\\u2A6F',\n\tapE: '\\u2A70',\n\tape: '\\u224A',\n\tapid: '\\u224B',\n\tapos: '\\u0027',\n\tApplyFunction: '\\u2061',\n\tapprox: '\\u2248',\n\tapproxeq: '\\u224A',\n\tAring: '\\u00C5',\n\taring: '\\u00E5',\n\tAscr: '\\uD835\\uDC9C',\n\tascr: '\\uD835\\uDCB6',\n\tAssign: '\\u2254',\n\tast: '\\u002A',\n\tasymp: '\\u2248',\n\tasympeq: '\\u224D',\n\tAtilde: '\\u00C3',\n\tatilde: '\\u00E3',\n\tAuml: '\\u00C4',\n\tauml: '\\u00E4',\n\tawconint: '\\u2233',\n\tawint: '\\u2A11',\n\tbackcong: '\\u224C',\n\tbackepsilon: '\\u03F6',\n\tbackprime: '\\u2035',\n\tbacksim: '\\u223D',\n\tbacksimeq: '\\u22CD',\n\tBackslash: '\\u2216',\n\tBarv: '\\u2AE7',\n\tbarvee: '\\u22BD',\n\tBarwed: '\\u2306',\n\tbarwed: '\\u2305',\n\tbarwedge: '\\u2305',\n\tbbrk: '\\u23B5',\n\tbbrktbrk: '\\u23B6',\n\tbcong: '\\u224C',\n\tBcy: '\\u0411',\n\tbcy: '\\u0431',\n\tbdquo: '\\u201E',\n\tbecaus: '\\u2235',\n\tBecause: '\\u2235',\n\tbecause: '\\u2235',\n\tbemptyv: '\\u29B0',\n\tbepsi: '\\u03F6',\n\tbernou: '\\u212C',\n\tBernoullis: '\\u212C',\n\tBeta: '\\u0392',\n\tbeta: '\\u03B2',\n\tbeth: '\\u2136',\n\tbetween: '\\u226C',\n\tBfr: '\\uD835\\uDD05',\n\tbfr: '\\uD835\\uDD1F',\n\tbigcap: '\\u22C2',\n\tbigcirc: '\\u25EF',\n\tbigcup: '\\u22C3',\n\tbigodot: '\\u2A00',\n\tbigoplus: '\\u2A01',\n\tbigotimes: '\\u2A02',\n\tbigsqcup: '\\u2A06',\n\tbigstar: '\\u2605',\n\tbigtriangledown: '\\u25BD',\n\tbigtriangleup: '\\u25B3',\n\tbiguplus: '\\u2A04',\n\tbigvee: '\\u22C1',\n\tbigwedge: '\\u22C0',\n\tbkarow: '\\u290D',\n\tblacklozenge: '\\u29EB',\n\tblacksquare: '\\u25AA',\n\tblacktriangle: '\\u25B4',\n\tblacktriangledown: '\\u25BE',\n\tblacktriangleleft: '\\u25C2',\n\tblacktriangleright: '\\u25B8',\n\tblank: '\\u2423',\n\tblk12: '\\u2592',\n\tblk14: '\\u2591',\n\tblk34: '\\u2593',\n\tblock: '\\u2588',\n\tbne: '\\u003D\\u20E5',\n\tbnequiv: '\\u2261\\u20E5',\n\tbNot: '\\u2AED',\n\tbnot: '\\u2310',\n\tBopf: '\\uD835\\uDD39',\n\tbopf: '\\uD835\\uDD53',\n\tbot: '\\u22A5',\n\tbottom: '\\u22A5',\n\tbowtie: '\\u22C8',\n\tboxbox: '\\u29C9',\n\tboxDL: '\\u2557',\n\tboxDl: '\\u2556',\n\tboxdL: '\\u2555',\n\tboxdl: '\\u2510',\n\tboxDR: '\\u2554',\n\tboxDr: '\\u2553',\n\tboxdR: '\\u2552',\n\tboxdr: '\\u250C',\n\tboxH: '\\u2550',\n\tboxh: '\\u2500',\n\tboxHD: '\\u2566',\n\tboxHd: '\\u2564',\n\tboxhD: '\\u2565',\n\tboxhd: '\\u252C',\n\tboxHU: '\\u2569',\n\tboxHu: '\\u2567',\n\tboxhU: '\\u2568',\n\tboxhu: '\\u2534',\n\tboxminus: '\\u229F',\n\tboxplus: '\\u229E',\n\tboxtimes: '\\u22A0',\n\tboxUL: '\\u255D',\n\tboxUl: '\\u255C',\n\tboxuL: '\\u255B',\n\tboxul: '\\u2518',\n\tboxUR: '\\u255A',\n\tboxUr: '\\u2559',\n\tboxuR: '\\u2558',\n\tboxur: '\\u2514',\n\tboxV: '\\u2551',\n\tboxv: '\\u2502',\n\tboxVH: '\\u256C',\n\tboxVh: '\\u256B',\n\tboxvH: '\\u256A',\n\tboxvh: '\\u253C',\n\tboxVL: '\\u2563',\n\tboxVl: '\\u2562',\n\tboxvL: '\\u2561',\n\tboxvl: '\\u2524',\n\tboxVR: '\\u2560',\n\tboxVr: '\\u255F',\n\tboxvR: '\\u255E',\n\tboxvr: '\\u251C',\n\tbprime: '\\u2035',\n\tBreve: '\\u02D8',\n\tbreve: '\\u02D8',\n\tbrvbar: '\\u00A6',\n\tBscr: '\\u212C',\n\tbscr: '\\uD835\\uDCB7',\n\tbsemi: '\\u204F',\n\tbsim: '\\u223D',\n\tbsime: '\\u22CD',\n\tbsol: '\\u005C',\n\tbsolb: '\\u29C5',\n\tbsolhsub: '\\u27C8',\n\tbull: '\\u2022',\n\tbullet: '\\u2022',\n\tbump: '\\u224E',\n\tbumpE: '\\u2AAE',\n\tbumpe: '\\u224F',\n\tBumpeq: '\\u224E',\n\tbumpeq: '\\u224F',\n\tCacute: '\\u0106',\n\tcacute: '\\u0107',\n\tCap: '\\u22D2',\n\tcap: '\\u2229',\n\tcapand: '\\u2A44',\n\tcapbrcup: '\\u2A49',\n\tcapcap: '\\u2A4B',\n\tcapcup: '\\u2A47',\n\tcapdot: '\\u2A40',\n\tCapitalDifferentialD: '\\u2145',\n\tcaps: '\\u2229\\uFE00',\n\tcaret: '\\u2041',\n\tcaron: '\\u02C7',\n\tCayleys: '\\u212D',\n\tccaps: '\\u2A4D',\n\tCcaron: '\\u010C',\n\tccaron: '\\u010D',\n\tCcedil: '\\u00C7',\n\tccedil: '\\u00E7',\n\tCcirc: '\\u0108',\n\tccirc: '\\u0109',\n\tCconint: '\\u2230',\n\tccups: '\\u2A4C',\n\tccupssm: '\\u2A50',\n\tCdot: '\\u010A',\n\tcdot: '\\u010B',\n\tcedil: '\\u00B8',\n\tCedilla: '\\u00B8',\n\tcemptyv: '\\u29B2',\n\tcent: '\\u00A2',\n\tCenterDot: '\\u00B7',\n\tcenterdot: '\\u00B7',\n\tCfr: '\\u212D',\n\tcfr: '\\uD835\\uDD20',\n\tCHcy: '\\u0427',\n\tchcy: '\\u0447',\n\tcheck: '\\u2713',\n\tcheckmark: '\\u2713',\n\tChi: '\\u03A7',\n\tchi: '\\u03C7',\n\tcir: '\\u25CB',\n\tcirc: '\\u02C6',\n\tcirceq: '\\u2257',\n\tcirclearrowleft: '\\u21BA',\n\tcirclearrowright: '\\u21BB',\n\tcircledast: '\\u229B',\n\tcircledcirc: '\\u229A',\n\tcircleddash: '\\u229D',\n\tCircleDot: '\\u2299',\n\tcircledR: '\\u00AE',\n\tcircledS: '\\u24C8',\n\tCircleMinus: '\\u2296',\n\tCirclePlus: '\\u2295',\n\tCircleTimes: '\\u2297',\n\tcirE: '\\u29C3',\n\tcire: '\\u2257',\n\tcirfnint: '\\u2A10',\n\tcirmid: '\\u2AEF',\n\tcirscir: '\\u29C2',\n\tClockwiseContourIntegral: '\\u2232',\n\tCloseCurlyDoubleQuote: '\\u201D',\n\tCloseCurlyQuote: '\\u2019',\n\tclubs: '\\u2663',\n\tclubsuit: '\\u2663',\n\tColon: '\\u2237',\n\tcolon: '\\u003A',\n\tColone: '\\u2A74',\n\tcolone: '\\u2254',\n\tcoloneq: '\\u2254',\n\tcomma: '\\u002C',\n\tcommat: '\\u0040',\n\tcomp: '\\u2201',\n\tcompfn: '\\u2218',\n\tcomplement: '\\u2201',\n\tcomplexes: '\\u2102',\n\tcong: '\\u2245',\n\tcongdot: '\\u2A6D',\n\tCongruent: '\\u2261',\n\tConint: '\\u222F',\n\tconint: '\\u222E',\n\tContourIntegral: '\\u222E',\n\tCopf: '\\u2102',\n\tcopf: '\\uD835\\uDD54',\n\tcoprod: '\\u2210',\n\tCoproduct: '\\u2210',\n\tCOPY: '\\u00A9',\n\tcopy: '\\u00A9',\n\tcopysr: '\\u2117',\n\tCounterClockwiseContourIntegral: '\\u2233',\n\tcrarr: '\\u21B5',\n\tCross: '\\u2A2F',\n\tcross: '\\u2717',\n\tCscr: '\\uD835\\uDC9E',\n\tcscr: '\\uD835\\uDCB8',\n\tcsub: '\\u2ACF',\n\tcsube: '\\u2AD1',\n\tcsup: '\\u2AD0',\n\tcsupe: '\\u2AD2',\n\tctdot: '\\u22EF',\n\tcudarrl: '\\u2938',\n\tcudarrr: '\\u2935',\n\tcuepr: '\\u22DE',\n\tcuesc: '\\u22DF',\n\tcularr: '\\u21B6',\n\tcularrp: '\\u293D',\n\tCup: '\\u22D3',\n\tcup: '\\u222A',\n\tcupbrcap: '\\u2A48',\n\tCupCap: '\\u224D',\n\tcupcap: '\\u2A46',\n\tcupcup: '\\u2A4A',\n\tcupdot: '\\u228D',\n\tcupor: '\\u2A45',\n\tcups: '\\u222A\\uFE00',\n\tcurarr: '\\u21B7',\n\tcurarrm: '\\u293C',\n\tcurlyeqprec: '\\u22DE',\n\tcurlyeqsucc: '\\u22DF',\n\tcurlyvee: '\\u22CE',\n\tcurlywedge: '\\u22CF',\n\tcurren: '\\u00A4',\n\tcurvearrowleft: '\\u21B6',\n\tcurvearrowright: '\\u21B7',\n\tcuvee: '\\u22CE',\n\tcuwed: '\\u22CF',\n\tcwconint: '\\u2232',\n\tcwint: '\\u2231',\n\tcylcty: '\\u232D',\n\tDagger: '\\u2021',\n\tdagger: '\\u2020',\n\tdaleth: '\\u2138',\n\tDarr: '\\u21A1',\n\tdArr: '\\u21D3',\n\tdarr: '\\u2193',\n\tdash: '\\u2010',\n\tDashv: '\\u2AE4',\n\tdashv: '\\u22A3',\n\tdbkarow: '\\u290F',\n\tdblac: '\\u02DD',\n\tDcaron: '\\u010E',\n\tdcaron: '\\u010F',\n\tDcy: '\\u0414',\n\tdcy: '\\u0434',\n\tDD: '\\u2145',\n\tdd: '\\u2146',\n\tddagger: '\\u2021',\n\tddarr: '\\u21CA',\n\tDDotrahd: '\\u2911',\n\tddotseq: '\\u2A77',\n\tdeg: '\\u00B0',\n\tDel: '\\u2207',\n\tDelta: '\\u0394',\n\tdelta: '\\u03B4',\n\tdemptyv: '\\u29B1',\n\tdfisht: '\\u297F',\n\tDfr: '\\uD835\\uDD07',\n\tdfr: '\\uD835\\uDD21',\n\tdHar: '\\u2965',\n\tdharl: '\\u21C3',\n\tdharr: '\\u21C2',\n\tDiacriticalAcute: '\\u00B4',\n\tDiacriticalDot: '\\u02D9',\n\tDiacriticalDoubleAcute: '\\u02DD',\n\tDiacriticalGrave: '\\u0060',\n\tDiacriticalTilde: '\\u02DC',\n\tdiam: '\\u22C4',\n\tDiamond: '\\u22C4',\n\tdiamond: '\\u22C4',\n\tdiamondsuit: '\\u2666',\n\tdiams: '\\u2666',\n\tdie: '\\u00A8',\n\tDifferentialD: '\\u2146',\n\tdigamma: '\\u03DD',\n\tdisin: '\\u22F2',\n\tdiv: '\\u00F7',\n\tdivide: '\\u00F7',\n\tdivideontimes: '\\u22C7',\n\tdivonx: '\\u22C7',\n\tDJcy: '\\u0402',\n\tdjcy: '\\u0452',\n\tdlcorn: '\\u231E',\n\tdlcrop: '\\u230D',\n\tdollar: '\\u0024',\n\tDopf: '\\uD835\\uDD3B',\n\tdopf: '\\uD835\\uDD55',\n\tDot: '\\u00A8',\n\tdot: '\\u02D9',\n\tDotDot: '\\u20DC',\n\tdoteq: '\\u2250',\n\tdoteqdot: '\\u2251',\n\tDotEqual: '\\u2250',\n\tdotminus: '\\u2238',\n\tdotplus: '\\u2214',\n\tdotsquare: '\\u22A1',\n\tdoublebarwedge: '\\u2306',\n\tDoubleContourIntegral: '\\u222F',\n\tDoubleDot: '\\u00A8',\n\tDoubleDownArrow: '\\u21D3',\n\tDoubleLeftArrow: '\\u21D0',\n\tDoubleLeftRightArrow: '\\u21D4',\n\tDoubleLeftTee: '\\u2AE4',\n\tDoubleLongLeftArrow: '\\u27F8',\n\tDoubleLongLeftRightArrow: '\\u27FA',\n\tDoubleLongRightArrow: '\\u27F9',\n\tDoubleRightArrow: '\\u21D2',\n\tDoubleRightTee: '\\u22A8',\n\tDoubleUpArrow: '\\u21D1',\n\tDoubleUpDownArrow: '\\u21D5',\n\tDoubleVerticalBar: '\\u2225',\n\tDownArrow: '\\u2193',\n\tDownarrow: '\\u21D3',\n\tdownarrow: '\\u2193',\n\tDownArrowBar: '\\u2913',\n\tDownArrowUpArrow: '\\u21F5',\n\tDownBreve: '\\u0311',\n\tdowndownarrows: '\\u21CA',\n\tdownharpoonleft: '\\u21C3',\n\tdownharpoonright: '\\u21C2',\n\tDownLeftRightVector: '\\u2950',\n\tDownLeftTeeVector: '\\u295E',\n\tDownLeftVector: '\\u21BD',\n\tDownLeftVectorBar: '\\u2956',\n\tDownRightTeeVector: '\\u295F',\n\tDownRightVector: '\\u21C1',\n\tDownRightVectorBar: '\\u2957',\n\tDownTee: '\\u22A4',\n\tDownTeeArrow: '\\u21A7',\n\tdrbkarow: '\\u2910',\n\tdrcorn: '\\u231F',\n\tdrcrop: '\\u230C',\n\tDscr: '\\uD835\\uDC9F',\n\tdscr: '\\uD835\\uDCB9',\n\tDScy: '\\u0405',\n\tdscy: '\\u0455',\n\tdsol: '\\u29F6',\n\tDstrok: '\\u0110',\n\tdstrok: '\\u0111',\n\tdtdot: '\\u22F1',\n\tdtri: '\\u25BF',\n\tdtrif: '\\u25BE',\n\tduarr: '\\u21F5',\n\tduhar: '\\u296F',\n\tdwangle: '\\u29A6',\n\tDZcy: '\\u040F',\n\tdzcy: '\\u045F',\n\tdzigrarr: '\\u27FF',\n\tEacute: '\\u00C9',\n\teacute: '\\u00E9',\n\teaster: '\\u2A6E',\n\tEcaron: '\\u011A',\n\tecaron: '\\u011B',\n\tecir: '\\u2256',\n\tEcirc: '\\u00CA',\n\tecirc: '\\u00EA',\n\tecolon: '\\u2255',\n\tEcy: '\\u042D',\n\tecy: '\\u044D',\n\teDDot: '\\u2A77',\n\tEdot: '\\u0116',\n\teDot: '\\u2251',\n\tedot: '\\u0117',\n\tee: '\\u2147',\n\tefDot: '\\u2252',\n\tEfr: '\\uD835\\uDD08',\n\tefr: '\\uD835\\uDD22',\n\teg: '\\u2A9A',\n\tEgrave: '\\u00C8',\n\tegrave: '\\u00E8',\n\tegs: '\\u2A96',\n\tegsdot: '\\u2A98',\n\tel: '\\u2A99',\n\tElement: '\\u2208',\n\telinters: '\\u23E7',\n\tell: '\\u2113',\n\tels: '\\u2A95',\n\telsdot: '\\u2A97',\n\tEmacr: '\\u0112',\n\temacr: '\\u0113',\n\tempty: '\\u2205',\n\temptyset: '\\u2205',\n\tEmptySmallSquare: '\\u25FB',\n\temptyv: '\\u2205',\n\tEmptyVerySmallSquare: '\\u25AB',\n\temsp: '\\u2003',\n\temsp13: '\\u2004',\n\temsp14: '\\u2005',\n\tENG: '\\u014A',\n\teng: '\\u014B',\n\tensp: '\\u2002',\n\tEogon: '\\u0118',\n\teogon: '\\u0119',\n\tEopf: '\\uD835\\uDD3C',\n\teopf: '\\uD835\\uDD56',\n\tepar: '\\u22D5',\n\teparsl: '\\u29E3',\n\teplus: '\\u2A71',\n\tepsi: '\\u03B5',\n\tEpsilon: '\\u0395',\n\tepsilon: '\\u03B5',\n\tepsiv: '\\u03F5',\n\teqcirc: '\\u2256',\n\teqcolon: '\\u2255',\n\teqsim: '\\u2242',\n\teqslantgtr: '\\u2A96',\n\teqslantless: '\\u2A95',\n\tEqual: '\\u2A75',\n\tequals: '\\u003D',\n\tEqualTilde: '\\u2242',\n\tequest: '\\u225F',\n\tEquilibrium: '\\u21CC',\n\tequiv: '\\u2261',\n\tequivDD: '\\u2A78',\n\teqvparsl: '\\u29E5',\n\terarr: '\\u2971',\n\terDot: '\\u2253',\n\tEscr: '\\u2130',\n\tescr: '\\u212F',\n\tesdot: '\\u2250',\n\tEsim: '\\u2A73',\n\tesim: '\\u2242',\n\tEta: '\\u0397',\n\teta: '\\u03B7',\n\tETH: '\\u00D0',\n\teth: '\\u00F0',\n\tEuml: '\\u00CB',\n\teuml: '\\u00EB',\n\teuro: '\\u20AC',\n\texcl: '\\u0021',\n\texist: '\\u2203',\n\tExists: '\\u2203',\n\texpectation: '\\u2130',\n\tExponentialE: '\\u2147',\n\texponentiale: '\\u2147',\n\tfallingdotseq: '\\u2252',\n\tFcy: '\\u0424',\n\tfcy: '\\u0444',\n\tfemale: '\\u2640',\n\tffilig: '\\uFB03',\n\tfflig: '\\uFB00',\n\tffllig: '\\uFB04',\n\tFfr: '\\uD835\\uDD09',\n\tffr: '\\uD835\\uDD23',\n\tfilig: '\\uFB01',\n\tFilledSmallSquare: '\\u25FC',\n\tFilledVerySmallSquare: '\\u25AA',\n\tfjlig: '\\u0066\\u006A',\n\tflat: '\\u266D',\n\tfllig: '\\uFB02',\n\tfltns: '\\u25B1',\n\tfnof: '\\u0192',\n\tFopf: '\\uD835\\uDD3D',\n\tfopf: '\\uD835\\uDD57',\n\tForAll: '\\u2200',\n\tforall: '\\u2200',\n\tfork: '\\u22D4',\n\tforkv: '\\u2AD9',\n\tFouriertrf: '\\u2131',\n\tfpartint: '\\u2A0D',\n\tfrac12: '\\u00BD',\n\tfrac13: '\\u2153',\n\tfrac14: '\\u00BC',\n\tfrac15: '\\u2155',\n\tfrac16: '\\u2159',\n\tfrac18: '\\u215B',\n\tfrac23: '\\u2154',\n\tfrac25: '\\u2156',\n\tfrac34: '\\u00BE',\n\tfrac35: '\\u2157',\n\tfrac38: '\\u215C',\n\tfrac45: '\\u2158',\n\tfrac56: '\\u215A',\n\tfrac58: '\\u215D',\n\tfrac78: '\\u215E',\n\tfrasl: '\\u2044',\n\tfrown: '\\u2322',\n\tFscr: '\\u2131',\n\tfscr: '\\uD835\\uDCBB',\n\tgacute: '\\u01F5',\n\tGamma: '\\u0393',\n\tgamma: '\\u03B3',\n\tGammad: '\\u03DC',\n\tgammad: '\\u03DD',\n\tgap: '\\u2A86',\n\tGbreve: '\\u011E',\n\tgbreve: '\\u011F',\n\tGcedil: '\\u0122',\n\tGcirc: '\\u011C',\n\tgcirc: '\\u011D',\n\tGcy: '\\u0413',\n\tgcy: '\\u0433',\n\tGdot: '\\u0120',\n\tgdot: '\\u0121',\n\tgE: '\\u2267',\n\tge: '\\u2265',\n\tgEl: '\\u2A8C',\n\tgel: '\\u22DB',\n\tgeq: '\\u2265',\n\tgeqq: '\\u2267',\n\tgeqslant: '\\u2A7E',\n\tges: '\\u2A7E',\n\tgescc: '\\u2AA9',\n\tgesdot: '\\u2A80',\n\tgesdoto: '\\u2A82',\n\tgesdotol: '\\u2A84',\n\tgesl: '\\u22DB\\uFE00',\n\tgesles: '\\u2A94',\n\tGfr: '\\uD835\\uDD0A',\n\tgfr: '\\uD835\\uDD24',\n\tGg: '\\u22D9',\n\tgg: '\\u226B',\n\tggg: '\\u22D9',\n\tgimel: '\\u2137',\n\tGJcy: '\\u0403',\n\tgjcy: '\\u0453',\n\tgl: '\\u2277',\n\tgla: '\\u2AA5',\n\tglE: '\\u2A92',\n\tglj: '\\u2AA4',\n\tgnap: '\\u2A8A',\n\tgnapprox: '\\u2A8A',\n\tgnE: '\\u2269',\n\tgne: '\\u2A88',\n\tgneq: '\\u2A88',\n\tgneqq: '\\u2269',\n\tgnsim: '\\u22E7',\n\tGopf: '\\uD835\\uDD3E',\n\tgopf: '\\uD835\\uDD58',\n\tgrave: '\\u0060',\n\tGreaterEqual: '\\u2265',\n\tGreaterEqualLess: '\\u22DB',\n\tGreaterFullEqual: '\\u2267',\n\tGreaterGreater: '\\u2AA2',\n\tGreaterLess: '\\u2277',\n\tGreaterSlantEqual: '\\u2A7E',\n\tGreaterTilde: '\\u2273',\n\tGscr: '\\uD835\\uDCA2',\n\tgscr: '\\u210A',\n\tgsim: '\\u2273',\n\tgsime: '\\u2A8E',\n\tgsiml: '\\u2A90',\n\tGt: '\\u226B',\n\tGT: '\\u003E',\n\tgt: '\\u003E',\n\tgtcc: '\\u2AA7',\n\tgtcir: '\\u2A7A',\n\tgtdot: '\\u22D7',\n\tgtlPar: '\\u2995',\n\tgtquest: '\\u2A7C',\n\tgtrapprox: '\\u2A86',\n\tgtrarr: '\\u2978',\n\tgtrdot: '\\u22D7',\n\tgtreqless: '\\u22DB',\n\tgtreqqless: '\\u2A8C',\n\tgtrless: '\\u2277',\n\tgtrsim: '\\u2273',\n\tgvertneqq: '\\u2269\\uFE00',\n\tgvnE: '\\u2269\\uFE00',\n\tHacek: '\\u02C7',\n\thairsp: '\\u200A',\n\thalf: '\\u00BD',\n\thamilt: '\\u210B',\n\tHARDcy: '\\u042A',\n\thardcy: '\\u044A',\n\thArr: '\\u21D4',\n\tharr: '\\u2194',\n\tharrcir: '\\u2948',\n\tharrw: '\\u21AD',\n\tHat: '\\u005E',\n\thbar: '\\u210F',\n\tHcirc: '\\u0124',\n\thcirc: '\\u0125',\n\thearts: '\\u2665',\n\theartsuit: '\\u2665',\n\thellip: '\\u2026',\n\thercon: '\\u22B9',\n\tHfr: '\\u210C',\n\thfr: '\\uD835\\uDD25',\n\tHilbertSpace: '\\u210B',\n\thksearow: '\\u2925',\n\thkswarow: '\\u2926',\n\thoarr: '\\u21FF',\n\thomtht: '\\u223B',\n\thookleftarrow: '\\u21A9',\n\thookrightarrow: '\\u21AA',\n\tHopf: '\\u210D',\n\thopf: '\\uD835\\uDD59',\n\thorbar: '\\u2015',\n\tHorizontalLine: '\\u2500',\n\tHscr: '\\u210B',\n\thscr: '\\uD835\\uDCBD',\n\thslash: '\\u210F',\n\tHstrok: '\\u0126',\n\thstrok: '\\u0127',\n\tHumpDownHump: '\\u224E',\n\tHumpEqual: '\\u224F',\n\thybull: '\\u2043',\n\thyphen: '\\u2010',\n\tIacute: '\\u00CD',\n\tiacute: '\\u00ED',\n\tic: '\\u2063',\n\tIcirc: '\\u00CE',\n\ticirc: '\\u00EE',\n\tIcy: '\\u0418',\n\ticy: '\\u0438',\n\tIdot: '\\u0130',\n\tIEcy: '\\u0415',\n\tiecy: '\\u0435',\n\tiexcl: '\\u00A1',\n\tiff: '\\u21D4',\n\tIfr: '\\u2111',\n\tifr: '\\uD835\\uDD26',\n\tIgrave: '\\u00CC',\n\tigrave: '\\u00EC',\n\tii: '\\u2148',\n\tiiiint: '\\u2A0C',\n\tiiint: '\\u222D',\n\tiinfin: '\\u29DC',\n\tiiota: '\\u2129',\n\tIJlig: '\\u0132',\n\tijlig: '\\u0133',\n\tIm: '\\u2111',\n\tImacr: '\\u012A',\n\timacr: '\\u012B',\n\timage: '\\u2111',\n\tImaginaryI: '\\u2148',\n\timagline: '\\u2110',\n\timagpart: '\\u2111',\n\timath: '\\u0131',\n\timof: '\\u22B7',\n\timped: '\\u01B5',\n\tImplies: '\\u21D2',\n\tin: '\\u2208',\n\tincare: '\\u2105',\n\tinfin: '\\u221E',\n\tinfintie: '\\u29DD',\n\tinodot: '\\u0131',\n\tInt: '\\u222C',\n\tint: '\\u222B',\n\tintcal: '\\u22BA',\n\tintegers: '\\u2124',\n\tIntegral: '\\u222B',\n\tintercal: '\\u22BA',\n\tIntersection: '\\u22C2',\n\tintlarhk: '\\u2A17',\n\tintprod: '\\u2A3C',\n\tInvisibleComma: '\\u2063',\n\tInvisibleTimes: '\\u2062',\n\tIOcy: '\\u0401',\n\tiocy: '\\u0451',\n\tIogon: '\\u012E',\n\tiogon: '\\u012F',\n\tIopf: '\\uD835\\uDD40',\n\tiopf: '\\uD835\\uDD5A',\n\tIota: '\\u0399',\n\tiota: '\\u03B9',\n\tiprod: '\\u2A3C',\n\tiquest: '\\u00BF',\n\tIscr: '\\u2110',\n\tiscr: '\\uD835\\uDCBE',\n\tisin: '\\u2208',\n\tisindot: '\\u22F5',\n\tisinE: '\\u22F9',\n\tisins: '\\u22F4',\n\tisinsv: '\\u22F3',\n\tisinv: '\\u2208',\n\tit: '\\u2062',\n\tItilde: '\\u0128',\n\titilde: '\\u0129',\n\tIukcy: '\\u0406',\n\tiukcy: '\\u0456',\n\tIuml: '\\u00CF',\n\tiuml: '\\u00EF',\n\tJcirc: '\\u0134',\n\tjcirc: '\\u0135',\n\tJcy: '\\u0419',\n\tjcy: '\\u0439',\n\tJfr: '\\uD835\\uDD0D',\n\tjfr: '\\uD835\\uDD27',\n\tjmath: '\\u0237',\n\tJopf: '\\uD835\\uDD41',\n\tjopf: '\\uD835\\uDD5B',\n\tJscr: '\\uD835\\uDCA5',\n\tjscr: '\\uD835\\uDCBF',\n\tJsercy: '\\u0408',\n\tjsercy: '\\u0458',\n\tJukcy: '\\u0404',\n\tjukcy: '\\u0454',\n\tKappa: '\\u039A',\n\tkappa: '\\u03BA',\n\tkappav: '\\u03F0',\n\tKcedil: '\\u0136',\n\tkcedil: '\\u0137',\n\tKcy: '\\u041A',\n\tkcy: '\\u043A',\n\tKfr: '\\uD835\\uDD0E',\n\tkfr: '\\uD835\\uDD28',\n\tkgreen: '\\u0138',\n\tKHcy: '\\u0425',\n\tkhcy: '\\u0445',\n\tKJcy: '\\u040C',\n\tkjcy: '\\u045C',\n\tKopf: '\\uD835\\uDD42',\n\tkopf: '\\uD835\\uDD5C',\n\tKscr: '\\uD835\\uDCA6',\n\tkscr: '\\uD835\\uDCC0',\n\tlAarr: '\\u21DA',\n\tLacute: '\\u0139',\n\tlacute: '\\u013A',\n\tlaemptyv: '\\u29B4',\n\tlagran: '\\u2112',\n\tLambda: '\\u039B',\n\tlambda: '\\u03BB',\n\tLang: '\\u27EA',\n\tlang: '\\u27E8',\n\tlangd: '\\u2991',\n\tlangle: '\\u27E8',\n\tlap: '\\u2A85',\n\tLaplacetrf: '\\u2112',\n\tlaquo: '\\u00AB',\n\tLarr: '\\u219E',\n\tlArr: '\\u21D0',\n\tlarr: '\\u2190',\n\tlarrb: '\\u21E4',\n\tlarrbfs: '\\u291F',\n\tlarrfs: '\\u291D',\n\tlarrhk: '\\u21A9',\n\tlarrlp: '\\u21AB',\n\tlarrpl: '\\u2939',\n\tlarrsim: '\\u2973',\n\tlarrtl: '\\u21A2',\n\tlat: '\\u2AAB',\n\tlAtail: '\\u291B',\n\tlatail: '\\u2919',\n\tlate: '\\u2AAD',\n\tlates: '\\u2AAD\\uFE00',\n\tlBarr: '\\u290E',\n\tlbarr: '\\u290C',\n\tlbbrk: '\\u2772',\n\tlbrace: '\\u007B',\n\tlbrack: '\\u005B',\n\tlbrke: '\\u298B',\n\tlbrksld: '\\u298F',\n\tlbrkslu: '\\u298D',\n\tLcaron: '\\u013D',\n\tlcaron: '\\u013E',\n\tLcedil: '\\u013B',\n\tlcedil: '\\u013C',\n\tlceil: '\\u2308',\n\tlcub: '\\u007B',\n\tLcy: '\\u041B',\n\tlcy: '\\u043B',\n\tldca: '\\u2936',\n\tldquo: '\\u201C',\n\tldquor: '\\u201E',\n\tldrdhar: '\\u2967',\n\tldrushar: '\\u294B',\n\tldsh: '\\u21B2',\n\tlE: '\\u2266',\n\tle: '\\u2264',\n\tLeftAngleBracket: '\\u27E8',\n\tLeftArrow: '\\u2190',\n\tLeftarrow: '\\u21D0',\n\tleftarrow: '\\u2190',\n\tLeftArrowBar: '\\u21E4',\n\tLeftArrowRightArrow: '\\u21C6',\n\tleftarrowtail: '\\u21A2',\n\tLeftCeiling: '\\u2308',\n\tLeftDoubleBracket: '\\u27E6',\n\tLeftDownTeeVector: '\\u2961',\n\tLeftDownVector: '\\u21C3',\n\tLeftDownVectorBar: '\\u2959',\n\tLeftFloor: '\\u230A',\n\tleftharpoondown: '\\u21BD',\n\tleftharpoonup: '\\u21BC',\n\tleftleftarrows: '\\u21C7',\n\tLeftRightArrow: '\\u2194',\n\tLeftrightarrow: '\\u21D4',\n\tleftrightarrow: '\\u2194',\n\tleftrightarrows: '\\u21C6',\n\tleftrightharpoons: '\\u21CB',\n\tleftrightsquigarrow: '\\u21AD',\n\tLeftRightVector: '\\u294E',\n\tLeftTee: '\\u22A3',\n\tLeftTeeArrow: '\\u21A4',\n\tLeftTeeVector: '\\u295A',\n\tleftthreetimes: '\\u22CB',\n\tLeftTriangle: '\\u22B2',\n\tLeftTriangleBar: '\\u29CF',\n\tLeftTriangleEqual: '\\u22B4',\n\tLeftUpDownVector: '\\u2951',\n\tLeftUpTeeVector: '\\u2960',\n\tLeftUpVector: '\\u21BF',\n\tLeftUpVectorBar: '\\u2958',\n\tLeftVector: '\\u21BC',\n\tLeftVectorBar: '\\u2952',\n\tlEg: '\\u2A8B',\n\tleg: '\\u22DA',\n\tleq: '\\u2264',\n\tleqq: '\\u2266',\n\tleqslant: '\\u2A7D',\n\tles: '\\u2A7D',\n\tlescc: '\\u2AA8',\n\tlesdot: '\\u2A7F',\n\tlesdoto: '\\u2A81',\n\tlesdotor: '\\u2A83',\n\tlesg: '\\u22DA\\uFE00',\n\tlesges: '\\u2A93',\n\tlessapprox: '\\u2A85',\n\tlessdot: '\\u22D6',\n\tlesseqgtr: '\\u22DA',\n\tlesseqqgtr: '\\u2A8B',\n\tLessEqualGreater: '\\u22DA',\n\tLessFullEqual: '\\u2266',\n\tLessGreater: '\\u2276',\n\tlessgtr: '\\u2276',\n\tLessLess: '\\u2AA1',\n\tlesssim: '\\u2272',\n\tLessSlantEqual: '\\u2A7D',\n\tLessTilde: '\\u2272',\n\tlfisht: '\\u297C',\n\tlfloor: '\\u230A',\n\tLfr: '\\uD835\\uDD0F',\n\tlfr: '\\uD835\\uDD29',\n\tlg: '\\u2276',\n\tlgE: '\\u2A91',\n\tlHar: '\\u2962',\n\tlhard: '\\u21BD',\n\tlharu: '\\u21BC',\n\tlharul: '\\u296A',\n\tlhblk: '\\u2584',\n\tLJcy: '\\u0409',\n\tljcy: '\\u0459',\n\tLl: '\\u22D8',\n\tll: '\\u226A',\n\tllarr: '\\u21C7',\n\tllcorner: '\\u231E',\n\tLleftarrow: '\\u21DA',\n\tllhard: '\\u296B',\n\tlltri: '\\u25FA',\n\tLmidot: '\\u013F',\n\tlmidot: '\\u0140',\n\tlmoust: '\\u23B0',\n\tlmoustache: '\\u23B0',\n\tlnap: '\\u2A89',\n\tlnapprox: '\\u2A89',\n\tlnE: '\\u2268',\n\tlne: '\\u2A87',\n\tlneq: '\\u2A87',\n\tlneqq: '\\u2268',\n\tlnsim: '\\u22E6',\n\tloang: '\\u27EC',\n\tloarr: '\\u21FD',\n\tlobrk: '\\u27E6',\n\tLongLeftArrow: '\\u27F5',\n\tLongleftarrow: '\\u27F8',\n\tlongleftarrow: '\\u27F5',\n\tLongLeftRightArrow: '\\u27F7',\n\tLongleftrightarrow: '\\u27FA',\n\tlongleftrightarrow: '\\u27F7',\n\tlongmapsto: '\\u27FC',\n\tLongRightArrow: '\\u27F6',\n\tLongrightarrow: '\\u27F9',\n\tlongrightarrow: '\\u27F6',\n\tlooparrowleft: '\\u21AB',\n\tlooparrowright: '\\u21AC',\n\tlopar: '\\u2985',\n\tLopf: '\\uD835\\uDD43',\n\tlopf: '\\uD835\\uDD5D',\n\tloplus: '\\u2A2D',\n\tlotimes: '\\u2A34',\n\tlowast: '\\u2217',\n\tlowbar: '\\u005F',\n\tLowerLeftArrow: '\\u2199',\n\tLowerRightArrow: '\\u2198',\n\tloz: '\\u25CA',\n\tlozenge: '\\u25CA',\n\tlozf: '\\u29EB',\n\tlpar: '\\u0028',\n\tlparlt: '\\u2993',\n\tlrarr: '\\u21C6',\n\tlrcorner: '\\u231F',\n\tlrhar: '\\u21CB',\n\tlrhard: '\\u296D',\n\tlrm: '\\u200E',\n\tlrtri: '\\u22BF',\n\tlsaquo: '\\u2039',\n\tLscr: '\\u2112',\n\tlscr: '\\uD835\\uDCC1',\n\tLsh: '\\u21B0',\n\tlsh: '\\u21B0',\n\tlsim: '\\u2272',\n\tlsime: '\\u2A8D',\n\tlsimg: '\\u2A8F',\n\tlsqb: '\\u005B',\n\tlsquo: '\\u2018',\n\tlsquor: '\\u201A',\n\tLstrok: '\\u0141',\n\tlstrok: '\\u0142',\n\tLt: '\\u226A',\n\tLT: '\\u003C',\n\tlt: '\\u003C',\n\tltcc: '\\u2AA6',\n\tltcir: '\\u2A79',\n\tltdot: '\\u22D6',\n\tlthree: '\\u22CB',\n\tltimes: '\\u22C9',\n\tltlarr: '\\u2976',\n\tltquest: '\\u2A7B',\n\tltri: '\\u25C3',\n\tltrie: '\\u22B4',\n\tltrif: '\\u25C2',\n\tltrPar: '\\u2996',\n\tlurdshar: '\\u294A',\n\tluruhar: '\\u2966',\n\tlvertneqq: '\\u2268\\uFE00',\n\tlvnE: '\\u2268\\uFE00',\n\tmacr: '\\u00AF',\n\tmale: '\\u2642',\n\tmalt: '\\u2720',\n\tmaltese: '\\u2720',\n\tMap: '\\u2905',\n\tmap: '\\u21A6',\n\tmapsto: '\\u21A6',\n\tmapstodown: '\\u21A7',\n\tmapstoleft: '\\u21A4',\n\tmapstoup: '\\u21A5',\n\tmarker: '\\u25AE',\n\tmcomma: '\\u2A29',\n\tMcy: '\\u041C',\n\tmcy: '\\u043C',\n\tmdash: '\\u2014',\n\tmDDot: '\\u223A',\n\tmeasuredangle: '\\u2221',\n\tMediumSpace: '\\u205F',\n\tMellintrf: '\\u2133',\n\tMfr: '\\uD835\\uDD10',\n\tmfr: '\\uD835\\uDD2A',\n\tmho: '\\u2127',\n\tmicro: '\\u00B5',\n\tmid: '\\u2223',\n\tmidast: '\\u002A',\n\tmidcir: '\\u2AF0',\n\tmiddot: '\\u00B7',\n\tminus: '\\u2212',\n\tminusb: '\\u229F',\n\tminusd: '\\u2238',\n\tminusdu: '\\u2A2A',\n\tMinusPlus: '\\u2213',\n\tmlcp: '\\u2ADB',\n\tmldr: '\\u2026',\n\tmnplus: '\\u2213',\n\tmodels: '\\u22A7',\n\tMopf: '\\uD835\\uDD44',\n\tmopf: '\\uD835\\uDD5E',\n\tmp: '\\u2213',\n\tMscr: '\\u2133',\n\tmscr: '\\uD835\\uDCC2',\n\tmstpos: '\\u223E',\n\tMu: '\\u039C',\n\tmu: '\\u03BC',\n\tmultimap: '\\u22B8',\n\tmumap: '\\u22B8',\n\tnabla: '\\u2207',\n\tNacute: '\\u0143',\n\tnacute: '\\u0144',\n\tnang: '\\u2220\\u20D2',\n\tnap: '\\u2249',\n\tnapE: '\\u2A70\\u0338',\n\tnapid: '\\u224B\\u0338',\n\tnapos: '\\u0149',\n\tnapprox: '\\u2249',\n\tnatur: '\\u266E',\n\tnatural: '\\u266E',\n\tnaturals: '\\u2115',\n\tnbsp: '\\u00A0',\n\tnbump: '\\u224E\\u0338',\n\tnbumpe: '\\u224F\\u0338',\n\tncap: '\\u2A43',\n\tNcaron: '\\u0147',\n\tncaron: '\\u0148',\n\tNcedil: '\\u0145',\n\tncedil: '\\u0146',\n\tncong: '\\u2247',\n\tncongdot: '\\u2A6D\\u0338',\n\tncup: '\\u2A42',\n\tNcy: '\\u041D',\n\tncy: '\\u043D',\n\tndash: '\\u2013',\n\tne: '\\u2260',\n\tnearhk: '\\u2924',\n\tneArr: '\\u21D7',\n\tnearr: '\\u2197',\n\tnearrow: '\\u2197',\n\tnedot: '\\u2250\\u0338',\n\tNegativeMediumSpace: '\\u200B',\n\tNegativeThickSpace: '\\u200B',\n\tNegativeThinSpace: '\\u200B',\n\tNegativeVeryThinSpace: '\\u200B',\n\tnequiv: '\\u2262',\n\tnesear: '\\u2928',\n\tnesim: '\\u2242\\u0338',\n\tNestedGreaterGreater: '\\u226B',\n\tNestedLessLess: '\\u226A',\n\tNewLine: '\\u000A',\n\tnexist: '\\u2204',\n\tnexists: '\\u2204',\n\tNfr: '\\uD835\\uDD11',\n\tnfr: '\\uD835\\uDD2B',\n\tngE: '\\u2267\\u0338',\n\tnge: '\\u2271',\n\tngeq: '\\u2271',\n\tngeqq: '\\u2267\\u0338',\n\tngeqslant: '\\u2A7E\\u0338',\n\tnges: '\\u2A7E\\u0338',\n\tnGg: '\\u22D9\\u0338',\n\tngsim: '\\u2275',\n\tnGt: '\\u226B\\u20D2',\n\tngt: '\\u226F',\n\tngtr: '\\u226F',\n\tnGtv: '\\u226B\\u0338',\n\tnhArr: '\\u21CE',\n\tnharr: '\\u21AE',\n\tnhpar: '\\u2AF2',\n\tni: '\\u220B',\n\tnis: '\\u22FC',\n\tnisd: '\\u22FA',\n\tniv: '\\u220B',\n\tNJcy: '\\u040A',\n\tnjcy: '\\u045A',\n\tnlArr: '\\u21CD',\n\tnlarr: '\\u219A',\n\tnldr: '\\u2025',\n\tnlE: '\\u2266\\u0338',\n\tnle: '\\u2270',\n\tnLeftarrow: '\\u21CD',\n\tnleftarrow: '\\u219A',\n\tnLeftrightarrow: '\\u21CE',\n\tnleftrightarrow: '\\u21AE',\n\tnleq: '\\u2270',\n\tnleqq: '\\u2266\\u0338',\n\tnleqslant: '\\u2A7D\\u0338',\n\tnles: '\\u2A7D\\u0338',\n\tnless: '\\u226E',\n\tnLl: '\\u22D8\\u0338',\n\tnlsim: '\\u2274',\n\tnLt: '\\u226A\\u20D2',\n\tnlt: '\\u226E',\n\tnltri: '\\u22EA',\n\tnltrie: '\\u22EC',\n\tnLtv: '\\u226A\\u0338',\n\tnmid: '\\u2224',\n\tNoBreak: '\\u2060',\n\tNonBreakingSpace: '\\u00A0',\n\tNopf: '\\u2115',\n\tnopf: '\\uD835\\uDD5F',\n\tNot: '\\u2AEC',\n\tnot: '\\u00AC',\n\tNotCongruent: '\\u2262',\n\tNotCupCap: '\\u226D',\n\tNotDoubleVerticalBar: '\\u2226',\n\tNotElement: '\\u2209',\n\tNotEqual: '\\u2260',\n\tNotEqualTilde: '\\u2242\\u0338',\n\tNotExists: '\\u2204',\n\tNotGreater: '\\u226F',\n\tNotGreaterEqual: '\\u2271',\n\tNotGreaterFullEqual: '\\u2267\\u0338',\n\tNotGreaterGreater: '\\u226B\\u0338',\n\tNotGreaterLess: '\\u2279',\n\tNotGreaterSlantEqual: '\\u2A7E\\u0338',\n\tNotGreaterTilde: '\\u2275',\n\tNotHumpDownHump: '\\u224E\\u0338',\n\tNotHumpEqual: '\\u224F\\u0338',\n\tnotin: '\\u2209',\n\tnotindot: '\\u22F5\\u0338',\n\tnotinE: '\\u22F9\\u0338',\n\tnotinva: '\\u2209',\n\tnotinvb: '\\u22F7',\n\tnotinvc: '\\u22F6',\n\tNotLeftTriangle: '\\u22EA',\n\tNotLeftTriangleBar: '\\u29CF\\u0338',\n\tNotLeftTriangleEqual: '\\u22EC',\n\tNotLess: '\\u226E',\n\tNotLessEqual: '\\u2270',\n\tNotLessGreater: '\\u2278',\n\tNotLessLess: '\\u226A\\u0338',\n\tNotLessSlantEqual: '\\u2A7D\\u0338',\n\tNotLessTilde: '\\u2274',\n\tNotNestedGreaterGreater: '\\u2AA2\\u0338',\n\tNotNestedLessLess: '\\u2AA1\\u0338',\n\tnotni: '\\u220C',\n\tnotniva: '\\u220C',\n\tnotnivb: '\\u22FE',\n\tnotnivc: '\\u22FD',\n\tNotPrecedes: '\\u2280',\n\tNotPrecedesEqual: '\\u2AAF\\u0338',\n\tNotPrecedesSlantEqual: '\\u22E0',\n\tNotReverseElement: '\\u220C',\n\tNotRightTriangle: '\\u22EB',\n\tNotRightTriangleBar: '\\u29D0\\u0338',\n\tNotRightTriangleEqual: '\\u22ED',\n\tNotSquareSubset: '\\u228F\\u0338',\n\tNotSquareSubsetEqual: '\\u22E2',\n\tNotSquareSuperset: '\\u2290\\u0338',\n\tNotSquareSupersetEqual: '\\u22E3',\n\tNotSubset: '\\u2282\\u20D2',\n\tNotSubsetEqual: '\\u2288',\n\tNotSucceeds: '\\u2281',\n\tNotSucceedsEqual: '\\u2AB0\\u0338',\n\tNotSucceedsSlantEqual: '\\u22E1',\n\tNotSucceedsTilde: '\\u227F\\u0338',\n\tNotSuperset: '\\u2283\\u20D2',\n\tNotSupersetEqual: '\\u2289',\n\tNotTilde: '\\u2241',\n\tNotTildeEqual: '\\u2244',\n\tNotTildeFullEqual: '\\u2247',\n\tNotTildeTilde: '\\u2249',\n\tNotVerticalBar: '\\u2224',\n\tnpar: '\\u2226',\n\tnparallel: '\\u2226',\n\tnparsl: '\\u2AFD\\u20E5',\n\tnpart: '\\u2202\\u0338',\n\tnpolint: '\\u2A14',\n\tnpr: '\\u2280',\n\tnprcue: '\\u22E0',\n\tnpre: '\\u2AAF\\u0338',\n\tnprec: '\\u2280',\n\tnpreceq: '\\u2AAF\\u0338',\n\tnrArr: '\\u21CF',\n\tnrarr: '\\u219B',\n\tnrarrc: '\\u2933\\u0338',\n\tnrarrw: '\\u219D\\u0338',\n\tnRightarrow: '\\u21CF',\n\tnrightarrow: '\\u219B',\n\tnrtri: '\\u22EB',\n\tnrtrie: '\\u22ED',\n\tnsc: '\\u2281',\n\tnsccue: '\\u22E1',\n\tnsce: '\\u2AB0\\u0338',\n\tNscr: '\\uD835\\uDCA9',\n\tnscr: '\\uD835\\uDCC3',\n\tnshortmid: '\\u2224',\n\tnshortparallel: '\\u2226',\n\tnsim: '\\u2241',\n\tnsime: '\\u2244',\n\tnsimeq: '\\u2244',\n\tnsmid: '\\u2224',\n\tnspar: '\\u2226',\n\tnsqsube: '\\u22E2',\n\tnsqsupe: '\\u22E3',\n\tnsub: '\\u2284',\n\tnsubE: '\\u2AC5\\u0338',\n\tnsube: '\\u2288',\n\tnsubset: '\\u2282\\u20D2',\n\tnsubseteq: '\\u2288',\n\tnsubseteqq: '\\u2AC5\\u0338',\n\tnsucc: '\\u2281',\n\tnsucceq: '\\u2AB0\\u0338',\n\tnsup: '\\u2285',\n\tnsupE: '\\u2AC6\\u0338',\n\tnsupe: '\\u2289',\n\tnsupset: '\\u2283\\u20D2',\n\tnsupseteq: '\\u2289',\n\tnsupseteqq: '\\u2AC6\\u0338',\n\tntgl: '\\u2279',\n\tNtilde: '\\u00D1',\n\tntilde: '\\u00F1',\n\tntlg: '\\u2278',\n\tntriangleleft: '\\u22EA',\n\tntrianglelefteq: '\\u22EC',\n\tntriangleright: '\\u22EB',\n\tntrianglerighteq: '\\u22ED',\n\tNu: '\\u039D',\n\tnu: '\\u03BD',\n\tnum: '\\u0023',\n\tnumero: '\\u2116',\n\tnumsp: '\\u2007',\n\tnvap: '\\u224D\\u20D2',\n\tnVDash: '\\u22AF',\n\tnVdash: '\\u22AE',\n\tnvDash: '\\u22AD',\n\tnvdash: '\\u22AC',\n\tnvge: '\\u2265\\u20D2',\n\tnvgt: '\\u003E\\u20D2',\n\tnvHarr: '\\u2904',\n\tnvinfin: '\\u29DE',\n\tnvlArr: '\\u2902',\n\tnvle: '\\u2264\\u20D2',\n\tnvlt: '\\u003C\\u20D2',\n\tnvltrie: '\\u22B4\\u20D2',\n\tnvrArr: '\\u2903',\n\tnvrtrie: '\\u22B5\\u20D2',\n\tnvsim: '\\u223C\\u20D2',\n\tnwarhk: '\\u2923',\n\tnwArr: '\\u21D6',\n\tnwarr: '\\u2196',\n\tnwarrow: '\\u2196',\n\tnwnear: '\\u2927',\n\tOacute: '\\u00D3',\n\toacute: '\\u00F3',\n\toast: '\\u229B',\n\tocir: '\\u229A',\n\tOcirc: '\\u00D4',\n\tocirc: '\\u00F4',\n\tOcy: '\\u041E',\n\tocy: '\\u043E',\n\todash: '\\u229D',\n\tOdblac: '\\u0150',\n\todblac: '\\u0151',\n\todiv: '\\u2A38',\n\todot: '\\u2299',\n\todsold: '\\u29BC',\n\tOElig: '\\u0152',\n\toelig: '\\u0153',\n\tofcir: '\\u29BF',\n\tOfr: '\\uD835\\uDD12',\n\tofr: '\\uD835\\uDD2C',\n\togon: '\\u02DB',\n\tOgrave: '\\u00D2',\n\tograve: '\\u00F2',\n\togt: '\\u29C1',\n\tohbar: '\\u29B5',\n\tohm: '\\u03A9',\n\toint: '\\u222E',\n\tolarr: '\\u21BA',\n\tolcir: '\\u29BE',\n\tolcross: '\\u29BB',\n\toline: '\\u203E',\n\tolt: '\\u29C0',\n\tOmacr: '\\u014C',\n\tomacr: '\\u014D',\n\tOmega: '\\u03A9',\n\tomega: '\\u03C9',\n\tOmicron: '\\u039F',\n\tomicron: '\\u03BF',\n\tomid: '\\u29B6',\n\tominus: '\\u2296',\n\tOopf: '\\uD835\\uDD46',\n\toopf: '\\uD835\\uDD60',\n\topar: '\\u29B7',\n\tOpenCurlyDoubleQuote: '\\u201C',\n\tOpenCurlyQuote: '\\u2018',\n\toperp: '\\u29B9',\n\toplus: '\\u2295',\n\tOr: '\\u2A54',\n\tor: '\\u2228',\n\torarr: '\\u21BB',\n\tord: '\\u2A5D',\n\torder: '\\u2134',\n\torderof: '\\u2134',\n\tordf: '\\u00AA',\n\tordm: '\\u00BA',\n\torigof: '\\u22B6',\n\toror: '\\u2A56',\n\torslope: '\\u2A57',\n\torv: '\\u2A5B',\n\toS: '\\u24C8',\n\tOscr: '\\uD835\\uDCAA',\n\toscr: '\\u2134',\n\tOslash: '\\u00D8',\n\toslash: '\\u00F8',\n\tosol: '\\u2298',\n\tOtilde: '\\u00D5',\n\totilde: '\\u00F5',\n\tOtimes: '\\u2A37',\n\totimes: '\\u2297',\n\totimesas: '\\u2A36',\n\tOuml: '\\u00D6',\n\touml: '\\u00F6',\n\tovbar: '\\u233D',\n\tOverBar: '\\u203E',\n\tOverBrace: '\\u23DE',\n\tOverBracket: '\\u23B4',\n\tOverParenthesis: '\\u23DC',\n\tpar: '\\u2225',\n\tpara: '\\u00B6',\n\tparallel: '\\u2225',\n\tparsim: '\\u2AF3',\n\tparsl: '\\u2AFD',\n\tpart: '\\u2202',\n\tPartialD: '\\u2202',\n\tPcy: '\\u041F',\n\tpcy: '\\u043F',\n\tpercnt: '\\u0025',\n\tperiod: '\\u002E',\n\tpermil: '\\u2030',\n\tperp: '\\u22A5',\n\tpertenk: '\\u2031',\n\tPfr: '\\uD835\\uDD13',\n\tpfr: '\\uD835\\uDD2D',\n\tPhi: '\\u03A6',\n\tphi: '\\u03C6',\n\tphiv: '\\u03D5',\n\tphmmat: '\\u2133',\n\tphone: '\\u260E',\n\tPi: '\\u03A0',\n\tpi: '\\u03C0',\n\tpitchfork: '\\u22D4',\n\tpiv: '\\u03D6',\n\tplanck: '\\u210F',\n\tplanckh: '\\u210E',\n\tplankv: '\\u210F',\n\tplus: '\\u002B',\n\tplusacir: '\\u2A23',\n\tplusb: '\\u229E',\n\tpluscir: '\\u2A22',\n\tplusdo: '\\u2214',\n\tplusdu: '\\u2A25',\n\tpluse: '\\u2A72',\n\tPlusMinus: '\\u00B1',\n\tplusmn: '\\u00B1',\n\tplussim: '\\u2A26',\n\tplustwo: '\\u2A27',\n\tpm: '\\u00B1',\n\tPoincareplane: '\\u210C',\n\tpointint: '\\u2A15',\n\tPopf: '\\u2119',\n\tpopf: '\\uD835\\uDD61',\n\tpound: '\\u00A3',\n\tPr: '\\u2ABB',\n\tpr: '\\u227A',\n\tprap: '\\u2AB7',\n\tprcue: '\\u227C',\n\tprE: '\\u2AB3',\n\tpre: '\\u2AAF',\n\tprec: '\\u227A',\n\tprecapprox: '\\u2AB7',\n\tpreccurlyeq: '\\u227C',\n\tPrecedes: '\\u227A',\n\tPrecedesEqual: '\\u2AAF',\n\tPrecedesSlantEqual: '\\u227C',\n\tPrecedesTilde: '\\u227E',\n\tpreceq: '\\u2AAF',\n\tprecnapprox: '\\u2AB9',\n\tprecneqq: '\\u2AB5',\n\tprecnsim: '\\u22E8',\n\tprecsim: '\\u227E',\n\tPrime: '\\u2033',\n\tprime: '\\u2032',\n\tprimes: '\\u2119',\n\tprnap: '\\u2AB9',\n\tprnE: '\\u2AB5',\n\tprnsim: '\\u22E8',\n\tprod: '\\u220F',\n\tProduct: '\\u220F',\n\tprofalar: '\\u232E',\n\tprofline: '\\u2312',\n\tprofsurf: '\\u2313',\n\tprop: '\\u221D',\n\tProportion: '\\u2237',\n\tProportional: '\\u221D',\n\tpropto: '\\u221D',\n\tprsim: '\\u227E',\n\tprurel: '\\u22B0',\n\tPscr: '\\uD835\\uDCAB',\n\tpscr: '\\uD835\\uDCC5',\n\tPsi: '\\u03A8',\n\tpsi: '\\u03C8',\n\tpuncsp: '\\u2008',\n\tQfr: '\\uD835\\uDD14',\n\tqfr: '\\uD835\\uDD2E',\n\tqint: '\\u2A0C',\n\tQopf: '\\u211A',\n\tqopf: '\\uD835\\uDD62',\n\tqprime: '\\u2057',\n\tQscr: '\\uD835\\uDCAC',\n\tqscr: '\\uD835\\uDCC6',\n\tquaternions: '\\u210D',\n\tquatint: '\\u2A16',\n\tquest: '\\u003F',\n\tquesteq: '\\u225F',\n\tQUOT: '\\u0022',\n\tquot: '\\u0022',\n\trAarr: '\\u21DB',\n\trace: '\\u223D\\u0331',\n\tRacute: '\\u0154',\n\tracute: '\\u0155',\n\tradic: '\\u221A',\n\traemptyv: '\\u29B3',\n\tRang: '\\u27EB',\n\trang: '\\u27E9',\n\trangd: '\\u2992',\n\trange: '\\u29A5',\n\trangle: '\\u27E9',\n\traquo: '\\u00BB',\n\tRarr: '\\u21A0',\n\trArr: '\\u21D2',\n\trarr: '\\u2192',\n\trarrap: '\\u2975',\n\trarrb: '\\u21E5',\n\trarrbfs: '\\u2920',\n\trarrc: '\\u2933',\n\trarrfs: '\\u291E',\n\trarrhk: '\\u21AA',\n\trarrlp: '\\u21AC',\n\trarrpl: '\\u2945',\n\trarrsim: '\\u2974',\n\tRarrtl: '\\u2916',\n\trarrtl: '\\u21A3',\n\trarrw: '\\u219D',\n\trAtail: '\\u291C',\n\tratail: '\\u291A',\n\tratio: '\\u2236',\n\trationals: '\\u211A',\n\tRBarr: '\\u2910',\n\trBarr: '\\u290F',\n\trbarr: '\\u290D',\n\trbbrk: '\\u2773',\n\trbrace: '\\u007D',\n\trbrack: '\\u005D',\n\trbrke: '\\u298C',\n\trbrksld: '\\u298E',\n\trbrkslu: '\\u2990',\n\tRcaron: '\\u0158',\n\trcaron: '\\u0159',\n\tRcedil: '\\u0156',\n\trcedil: '\\u0157',\n\trceil: '\\u2309',\n\trcub: '\\u007D',\n\tRcy: '\\u0420',\n\trcy: '\\u0440',\n\trdca: '\\u2937',\n\trdldhar: '\\u2969',\n\trdquo: '\\u201D',\n\trdquor: '\\u201D',\n\trdsh: '\\u21B3',\n\tRe: '\\u211C',\n\treal: '\\u211C',\n\trealine: '\\u211B',\n\trealpart: '\\u211C',\n\treals: '\\u211D',\n\trect: '\\u25AD',\n\tREG: '\\u00AE',\n\treg: '\\u00AE',\n\tReverseElement: '\\u220B',\n\tReverseEquilibrium: '\\u21CB',\n\tReverseUpEquilibrium: '\\u296F',\n\trfisht: '\\u297D',\n\trfloor: '\\u230B',\n\tRfr: '\\u211C',\n\trfr: '\\uD835\\uDD2F',\n\trHar: '\\u2964',\n\trhard: '\\u21C1',\n\trharu: '\\u21C0',\n\trharul: '\\u296C',\n\tRho: '\\u03A1',\n\trho: '\\u03C1',\n\trhov: '\\u03F1',\n\tRightAngleBracket: '\\u27E9',\n\tRightArrow: '\\u2192',\n\tRightarrow: '\\u21D2',\n\trightarrow: '\\u2192',\n\tRightArrowBar: '\\u21E5',\n\tRightArrowLeftArrow: '\\u21C4',\n\trightarrowtail: '\\u21A3',\n\tRightCeiling: '\\u2309',\n\tRightDoubleBracket: '\\u27E7',\n\tRightDownTeeVector: '\\u295D',\n\tRightDownVector: '\\u21C2',\n\tRightDownVectorBar: '\\u2955',\n\tRightFloor: '\\u230B',\n\trightharpoondown: '\\u21C1',\n\trightharpoonup: '\\u21C0',\n\trightleftarrows: '\\u21C4',\n\trightleftharpoons: '\\u21CC',\n\trightrightarrows: '\\u21C9',\n\trightsquigarrow: '\\u219D',\n\tRightTee: '\\u22A2',\n\tRightTeeArrow: '\\u21A6',\n\tRightTeeVector: '\\u295B',\n\trightthreetimes: '\\u22CC',\n\tRightTriangle: '\\u22B3',\n\tRightTriangleBar: '\\u29D0',\n\tRightTriangleEqual: '\\u22B5',\n\tRightUpDownVector: '\\u294F',\n\tRightUpTeeVector: '\\u295C',\n\tRightUpVector: '\\u21BE',\n\tRightUpVectorBar: '\\u2954',\n\tRightVector: '\\u21C0',\n\tRightVectorBar: '\\u2953',\n\tring: '\\u02DA',\n\trisingdotseq: '\\u2253',\n\trlarr: '\\u21C4',\n\trlhar: '\\u21CC',\n\trlm: '\\u200F',\n\trmoust: '\\u23B1',\n\trmoustache: '\\u23B1',\n\trnmid: '\\u2AEE',\n\troang: '\\u27ED',\n\troarr: '\\u21FE',\n\trobrk: '\\u27E7',\n\tropar: '\\u2986',\n\tRopf: '\\u211D',\n\tropf: '\\uD835\\uDD63',\n\troplus: '\\u2A2E',\n\trotimes: '\\u2A35',\n\tRoundImplies: '\\u2970',\n\trpar: '\\u0029',\n\trpargt: '\\u2994',\n\trppolint: '\\u2A12',\n\trrarr: '\\u21C9',\n\tRrightarrow: '\\u21DB',\n\trsaquo: '\\u203A',\n\tRscr: '\\u211B',\n\trscr: '\\uD835\\uDCC7',\n\tRsh: '\\u21B1',\n\trsh: '\\u21B1',\n\trsqb: '\\u005D',\n\trsquo: '\\u2019',\n\trsquor: '\\u2019',\n\trthree: '\\u22CC',\n\trtimes: '\\u22CA',\n\trtri: '\\u25B9',\n\trtrie: '\\u22B5',\n\trtrif: '\\u25B8',\n\trtriltri: '\\u29CE',\n\tRuleDelayed: '\\u29F4',\n\truluhar: '\\u2968',\n\trx: '\\u211E',\n\tSacute: '\\u015A',\n\tsacute: '\\u015B',\n\tsbquo: '\\u201A',\n\tSc: '\\u2ABC',\n\tsc: '\\u227B',\n\tscap: '\\u2AB8',\n\tScaron: '\\u0160',\n\tscaron: '\\u0161',\n\tsccue: '\\u227D',\n\tscE: '\\u2AB4',\n\tsce: '\\u2AB0',\n\tScedil: '\\u015E',\n\tscedil: '\\u015F',\n\tScirc: '\\u015C',\n\tscirc: '\\u015D',\n\tscnap: '\\u2ABA',\n\tscnE: '\\u2AB6',\n\tscnsim: '\\u22E9',\n\tscpolint: '\\u2A13',\n\tscsim: '\\u227F',\n\tScy: '\\u0421',\n\tscy: '\\u0441',\n\tsdot: '\\u22C5',\n\tsdotb: '\\u22A1',\n\tsdote: '\\u2A66',\n\tsearhk: '\\u2925',\n\tseArr: '\\u21D8',\n\tsearr: '\\u2198',\n\tsearrow: '\\u2198',\n\tsect: '\\u00A7',\n\tsemi: '\\u003B',\n\tseswar: '\\u2929',\n\tsetminus: '\\u2216',\n\tsetmn: '\\u2216',\n\tsext: '\\u2736',\n\tSfr: '\\uD835\\uDD16',\n\tsfr: '\\uD835\\uDD30',\n\tsfrown: '\\u2322',\n\tsharp: '\\u266F',\n\tSHCHcy: '\\u0429',\n\tshchcy: '\\u0449',\n\tSHcy: '\\u0428',\n\tshcy: '\\u0448',\n\tShortDownArrow: '\\u2193',\n\tShortLeftArrow: '\\u2190',\n\tshortmid: '\\u2223',\n\tshortparallel: '\\u2225',\n\tShortRightArrow: '\\u2192',\n\tShortUpArrow: '\\u2191',\n\tshy: '\\u00AD',\n\tSigma: '\\u03A3',\n\tsigma: '\\u03C3',\n\tsigmaf: '\\u03C2',\n\tsigmav: '\\u03C2',\n\tsim: '\\u223C',\n\tsimdot: '\\u2A6A',\n\tsime: '\\u2243',\n\tsimeq: '\\u2243',\n\tsimg: '\\u2A9E',\n\tsimgE: '\\u2AA0',\n\tsiml: '\\u2A9D',\n\tsimlE: '\\u2A9F',\n\tsimne: '\\u2246',\n\tsimplus: '\\u2A24',\n\tsimrarr: '\\u2972',\n\tslarr: '\\u2190',\n\tSmallCircle: '\\u2218',\n\tsmallsetminus: '\\u2216',\n\tsmashp: '\\u2A33',\n\tsmeparsl: '\\u29E4',\n\tsmid: '\\u2223',\n\tsmile: '\\u2323',\n\tsmt: '\\u2AAA',\n\tsmte: '\\u2AAC',\n\tsmtes: '\\u2AAC\\uFE00',\n\tSOFTcy: '\\u042C',\n\tsoftcy: '\\u044C',\n\tsol: '\\u002F',\n\tsolb: '\\u29C4',\n\tsolbar: '\\u233F',\n\tSopf: '\\uD835\\uDD4A',\n\tsopf: '\\uD835\\uDD64',\n\tspades: '\\u2660',\n\tspadesuit: '\\u2660',\n\tspar: '\\u2225',\n\tsqcap: '\\u2293',\n\tsqcaps: '\\u2293\\uFE00',\n\tsqcup: '\\u2294',\n\tsqcups: '\\u2294\\uFE00',\n\tSqrt: '\\u221A',\n\tsqsub: '\\u228F',\n\tsqsube: '\\u2291',\n\tsqsubset: '\\u228F',\n\tsqsubseteq: '\\u2291',\n\tsqsup: '\\u2290',\n\tsqsupe: '\\u2292',\n\tsqsupset: '\\u2290',\n\tsqsupseteq: '\\u2292',\n\tsqu: '\\u25A1',\n\tSquare: '\\u25A1',\n\tsquare: '\\u25A1',\n\tSquareIntersection: '\\u2293',\n\tSquareSubset: '\\u228F',\n\tSquareSubsetEqual: '\\u2291',\n\tSquareSuperset: '\\u2290',\n\tSquareSupersetEqual: '\\u2292',\n\tSquareUnion: '\\u2294',\n\tsquarf: '\\u25AA',\n\tsquf: '\\u25AA',\n\tsrarr: '\\u2192',\n\tSscr: '\\uD835\\uDCAE',\n\tsscr: '\\uD835\\uDCC8',\n\tssetmn: '\\u2216',\n\tssmile: '\\u2323',\n\tsstarf: '\\u22C6',\n\tStar: '\\u22C6',\n\tstar: '\\u2606',\n\tstarf: '\\u2605',\n\tstraightepsilon: '\\u03F5',\n\tstraightphi: '\\u03D5',\n\tstrns: '\\u00AF',\n\tSub: '\\u22D0',\n\tsub: '\\u2282',\n\tsubdot: '\\u2ABD',\n\tsubE: '\\u2AC5',\n\tsube: '\\u2286',\n\tsubedot: '\\u2AC3',\n\tsubmult: '\\u2AC1',\n\tsubnE: '\\u2ACB',\n\tsubne: '\\u228A',\n\tsubplus: '\\u2ABF',\n\tsubrarr: '\\u2979',\n\tSubset: '\\u22D0',\n\tsubset: '\\u2282',\n\tsubseteq: '\\u2286',\n\tsubseteqq: '\\u2AC5',\n\tSubsetEqual: '\\u2286',\n\tsubsetneq: '\\u228A',\n\tsubsetneqq: '\\u2ACB',\n\tsubsim: '\\u2AC7',\n\tsubsub: '\\u2AD5',\n\tsubsup: '\\u2AD3',\n\tsucc: '\\u227B',\n\tsuccapprox: '\\u2AB8',\n\tsucccurlyeq: '\\u227D',\n\tSucceeds: '\\u227B',\n\tSucceedsEqual: '\\u2AB0',\n\tSucceedsSlantEqual: '\\u227D',\n\tSucceedsTilde: '\\u227F',\n\tsucceq: '\\u2AB0',\n\tsuccnapprox: '\\u2ABA',\n\tsuccneqq: '\\u2AB6',\n\tsuccnsim: '\\u22E9',\n\tsuccsim: '\\u227F',\n\tSuchThat: '\\u220B',\n\tSum: '\\u2211',\n\tsum: '\\u2211',\n\tsung: '\\u266A',\n\tSup: '\\u22D1',\n\tsup: '\\u2283',\n\tsup1: '\\u00B9',\n\tsup2: '\\u00B2',\n\tsup3: '\\u00B3',\n\tsupdot: '\\u2ABE',\n\tsupdsub: '\\u2AD8',\n\tsupE: '\\u2AC6',\n\tsupe: '\\u2287',\n\tsupedot: '\\u2AC4',\n\tSuperset: '\\u2283',\n\tSupersetEqual: '\\u2287',\n\tsuphsol: '\\u27C9',\n\tsuphsub: '\\u2AD7',\n\tsuplarr: '\\u297B',\n\tsupmult: '\\u2AC2',\n\tsupnE: '\\u2ACC',\n\tsupne: '\\u228B',\n\tsupplus: '\\u2AC0',\n\tSupset: '\\u22D1',\n\tsupset: '\\u2283',\n\tsupseteq: '\\u2287',\n\tsupseteqq: '\\u2AC6',\n\tsupsetneq: '\\u228B',\n\tsupsetneqq: '\\u2ACC',\n\tsupsim: '\\u2AC8',\n\tsupsub: '\\u2AD4',\n\tsupsup: '\\u2AD6',\n\tswarhk: '\\u2926',\n\tswArr: '\\u21D9',\n\tswarr: '\\u2199',\n\tswarrow: '\\u2199',\n\tswnwar: '\\u292A',\n\tszlig: '\\u00DF',\n\tTab: '\\u0009',\n\ttarget: '\\u2316',\n\tTau: '\\u03A4',\n\ttau: '\\u03C4',\n\ttbrk: '\\u23B4',\n\tTcaron: '\\u0164',\n\ttcaron: '\\u0165',\n\tTcedil: '\\u0162',\n\ttcedil: '\\u0163',\n\tTcy: '\\u0422',\n\ttcy: '\\u0442',\n\ttdot: '\\u20DB',\n\ttelrec: '\\u2315',\n\tTfr: '\\uD835\\uDD17',\n\ttfr: '\\uD835\\uDD31',\n\tthere4: '\\u2234',\n\tTherefore: '\\u2234',\n\ttherefore: '\\u2234',\n\tTheta: '\\u0398',\n\ttheta: '\\u03B8',\n\tthetasym: '\\u03D1',\n\tthetav: '\\u03D1',\n\tthickapprox: '\\u2248',\n\tthicksim: '\\u223C',\n\tThickSpace: '\\u205F\\u200A',\n\tthinsp: '\\u2009',\n\tThinSpace: '\\u2009',\n\tthkap: '\\u2248',\n\tthksim: '\\u223C',\n\tTHORN: '\\u00DE',\n\tthorn: '\\u00FE',\n\tTilde: '\\u223C',\n\ttilde: '\\u02DC',\n\tTildeEqual: '\\u2243',\n\tTildeFullEqual: '\\u2245',\n\tTildeTilde: '\\u2248',\n\ttimes: '\\u00D7',\n\ttimesb: '\\u22A0',\n\ttimesbar: '\\u2A31',\n\ttimesd: '\\u2A30',\n\ttint: '\\u222D',\n\ttoea: '\\u2928',\n\ttop: '\\u22A4',\n\ttopbot: '\\u2336',\n\ttopcir: '\\u2AF1',\n\tTopf: '\\uD835\\uDD4B',\n\ttopf: '\\uD835\\uDD65',\n\ttopfork: '\\u2ADA',\n\ttosa: '\\u2929',\n\ttprime: '\\u2034',\n\tTRADE: '\\u2122',\n\ttrade: '\\u2122',\n\ttriangle: '\\u25B5',\n\ttriangledown: '\\u25BF',\n\ttriangleleft: '\\u25C3',\n\ttrianglelefteq: '\\u22B4',\n\ttriangleq: '\\u225C',\n\ttriangleright: '\\u25B9',\n\ttrianglerighteq: '\\u22B5',\n\ttridot: '\\u25EC',\n\ttrie: '\\u225C',\n\ttriminus: '\\u2A3A',\n\tTripleDot: '\\u20DB',\n\ttriplus: '\\u2A39',\n\ttrisb: '\\u29CD',\n\ttritime: '\\u2A3B',\n\ttrpezium: '\\u23E2',\n\tTscr: '\\uD835\\uDCAF',\n\ttscr: '\\uD835\\uDCC9',\n\tTScy: '\\u0426',\n\ttscy: '\\u0446',\n\tTSHcy: '\\u040B',\n\ttshcy: '\\u045B',\n\tTstrok: '\\u0166',\n\ttstrok: '\\u0167',\n\ttwixt: '\\u226C',\n\ttwoheadleftarrow: '\\u219E',\n\ttwoheadrightarrow: '\\u21A0',\n\tUacute: '\\u00DA',\n\tuacute: '\\u00FA',\n\tUarr: '\\u219F',\n\tuArr: '\\u21D1',\n\tuarr: '\\u2191',\n\tUarrocir: '\\u2949',\n\tUbrcy: '\\u040E',\n\tubrcy: '\\u045E',\n\tUbreve: '\\u016C',\n\tubreve: '\\u016D',\n\tUcirc: '\\u00DB',\n\tucirc: '\\u00FB',\n\tUcy: '\\u0423',\n\tucy: '\\u0443',\n\tudarr: '\\u21C5',\n\tUdblac: '\\u0170',\n\tudblac: '\\u0171',\n\tudhar: '\\u296E',\n\tufisht: '\\u297E',\n\tUfr: '\\uD835\\uDD18',\n\tufr: '\\uD835\\uDD32',\n\tUgrave: '\\u00D9',\n\tugrave: '\\u00F9',\n\tuHar: '\\u2963',\n\tuharl: '\\u21BF',\n\tuharr: '\\u21BE',\n\tuhblk: '\\u2580',\n\tulcorn: '\\u231C',\n\tulcorner: '\\u231C',\n\tulcrop: '\\u230F',\n\tultri: '\\u25F8',\n\tUmacr: '\\u016A',\n\tumacr: '\\u016B',\n\tuml: '\\u00A8',\n\tUnderBar: '\\u005F',\n\tUnderBrace: '\\u23DF',\n\tUnderBracket: '\\u23B5',\n\tUnderParenthesis: '\\u23DD',\n\tUnion: '\\u22C3',\n\tUnionPlus: '\\u228E',\n\tUogon: '\\u0172',\n\tuogon: '\\u0173',\n\tUopf: '\\uD835\\uDD4C',\n\tuopf: '\\uD835\\uDD66',\n\tUpArrow: '\\u2191',\n\tUparrow: '\\u21D1',\n\tuparrow: '\\u2191',\n\tUpArrowBar: '\\u2912',\n\tUpArrowDownArrow: '\\u21C5',\n\tUpDownArrow: '\\u2195',\n\tUpdownarrow: '\\u21D5',\n\tupdownarrow: '\\u2195',\n\tUpEquilibrium: '\\u296E',\n\tupharpoonleft: '\\u21BF',\n\tupharpoonright: '\\u21BE',\n\tuplus: '\\u228E',\n\tUpperLeftArrow: '\\u2196',\n\tUpperRightArrow: '\\u2197',\n\tUpsi: '\\u03D2',\n\tupsi: '\\u03C5',\n\tupsih: '\\u03D2',\n\tUpsilon: '\\u03A5',\n\tupsilon: '\\u03C5',\n\tUpTee: '\\u22A5',\n\tUpTeeArrow: '\\u21A5',\n\tupuparrows: '\\u21C8',\n\turcorn: '\\u231D',\n\turcorner: '\\u231D',\n\turcrop: '\\u230E',\n\tUring: '\\u016E',\n\turing: '\\u016F',\n\turtri: '\\u25F9',\n\tUscr: '\\uD835\\uDCB0',\n\tuscr: '\\uD835\\uDCCA',\n\tutdot: '\\u22F0',\n\tUtilde: '\\u0168',\n\tutilde: '\\u0169',\n\tutri: '\\u25B5',\n\tutrif: '\\u25B4',\n\tuuarr: '\\u21C8',\n\tUuml: '\\u00DC',\n\tuuml: '\\u00FC',\n\tuwangle: '\\u29A7',\n\tvangrt: '\\u299C',\n\tvarepsilon: '\\u03F5',\n\tvarkappa: '\\u03F0',\n\tvarnothing: '\\u2205',\n\tvarphi: '\\u03D5',\n\tvarpi: '\\u03D6',\n\tvarpropto: '\\u221D',\n\tvArr: '\\u21D5',\n\tvarr: '\\u2195',\n\tvarrho: '\\u03F1',\n\tvarsigma: '\\u03C2',\n\tvarsubsetneq: '\\u228A\\uFE00',\n\tvarsubsetneqq: '\\u2ACB\\uFE00',\n\tvarsupsetneq: '\\u228B\\uFE00',\n\tvarsupsetneqq: '\\u2ACC\\uFE00',\n\tvartheta: '\\u03D1',\n\tvartriangleleft: '\\u22B2',\n\tvartriangleright: '\\u22B3',\n\tVbar: '\\u2AEB',\n\tvBar: '\\u2AE8',\n\tvBarv: '\\u2AE9',\n\tVcy: '\\u0412',\n\tvcy: '\\u0432',\n\tVDash: '\\u22AB',\n\tVdash: '\\u22A9',\n\tvDash: '\\u22A8',\n\tvdash: '\\u22A2',\n\tVdashl: '\\u2AE6',\n\tVee: '\\u22C1',\n\tvee: '\\u2228',\n\tveebar: '\\u22BB',\n\tveeeq: '\\u225A',\n\tvellip: '\\u22EE',\n\tVerbar: '\\u2016',\n\tverbar: '\\u007C',\n\tVert: '\\u2016',\n\tvert: '\\u007C',\n\tVerticalBar: '\\u2223',\n\tVerticalLine: '\\u007C',\n\tVerticalSeparator: '\\u2758',\n\tVerticalTilde: '\\u2240',\n\tVeryThinSpace: '\\u200A',\n\tVfr: '\\uD835\\uDD19',\n\tvfr: '\\uD835\\uDD33',\n\tvltri: '\\u22B2',\n\tvnsub: '\\u2282\\u20D2',\n\tvnsup: '\\u2283\\u20D2',\n\tVopf: '\\uD835\\uDD4D',\n\tvopf: '\\uD835\\uDD67',\n\tvprop: '\\u221D',\n\tvrtri: '\\u22B3',\n\tVscr: '\\uD835\\uDCB1',\n\tvscr: '\\uD835\\uDCCB',\n\tvsubnE: '\\u2ACB\\uFE00',\n\tvsubne: '\\u228A\\uFE00',\n\tvsupnE: '\\u2ACC\\uFE00',\n\tvsupne: '\\u228B\\uFE00',\n\tVvdash: '\\u22AA',\n\tvzigzag: '\\u299A',\n\tWcirc: '\\u0174',\n\twcirc: '\\u0175',\n\twedbar: '\\u2A5F',\n\tWedge: '\\u22C0',\n\twedge: '\\u2227',\n\twedgeq: '\\u2259',\n\tweierp: '\\u2118',\n\tWfr: '\\uD835\\uDD1A',\n\twfr: '\\uD835\\uDD34',\n\tWopf: '\\uD835\\uDD4E',\n\twopf: '\\uD835\\uDD68',\n\twp: '\\u2118',\n\twr: '\\u2240',\n\twreath: '\\u2240',\n\tWscr: '\\uD835\\uDCB2',\n\twscr: '\\uD835\\uDCCC',\n\txcap: '\\u22C2',\n\txcirc: '\\u25EF',\n\txcup: '\\u22C3',\n\txdtri: '\\u25BD',\n\tXfr: '\\uD835\\uDD1B',\n\txfr: '\\uD835\\uDD35',\n\txhArr: '\\u27FA',\n\txharr: '\\u27F7',\n\tXi: '\\u039E',\n\txi: '\\u03BE',\n\txlArr: '\\u27F8',\n\txlarr: '\\u27F5',\n\txmap: '\\u27FC',\n\txnis: '\\u22FB',\n\txodot: '\\u2A00',\n\tXopf: '\\uD835\\uDD4F',\n\txopf: '\\uD835\\uDD69',\n\txoplus: '\\u2A01',\n\txotime: '\\u2A02',\n\txrArr: '\\u27F9',\n\txrarr: '\\u27F6',\n\tXscr: '\\uD835\\uDCB3',\n\txscr: '\\uD835\\uDCCD',\n\txsqcup: '\\u2A06',\n\txuplus: '\\u2A04',\n\txutri: '\\u25B3',\n\txvee: '\\u22C1',\n\txwedge: '\\u22C0',\n\tYacute: '\\u00DD',\n\tyacute: '\\u00FD',\n\tYAcy: '\\u042F',\n\tyacy: '\\u044F',\n\tYcirc: '\\u0176',\n\tycirc: '\\u0177',\n\tYcy: '\\u042B',\n\tycy: '\\u044B',\n\tyen: '\\u00A5',\n\tYfr: '\\uD835\\uDD1C',\n\tyfr: '\\uD835\\uDD36',\n\tYIcy: '\\u0407',\n\tyicy: '\\u0457',\n\tYopf: '\\uD835\\uDD50',\n\tyopf: '\\uD835\\uDD6A',\n\tYscr: '\\uD835\\uDCB4',\n\tyscr: '\\uD835\\uDCCE',\n\tYUcy: '\\u042E',\n\tyucy: '\\u044E',\n\tYuml: '\\u0178',\n\tyuml: '\\u00FF',\n\tZacute: '\\u0179',\n\tzacute: '\\u017A',\n\tZcaron: '\\u017D',\n\tzcaron: '\\u017E',\n\tZcy: '\\u0417',\n\tzcy: '\\u0437',\n\tZdot: '\\u017B',\n\tzdot: '\\u017C',\n\tzeetrf: '\\u2128',\n\tZeroWidthSpace: '\\u200B',\n\tZeta: '\\u0396',\n\tzeta: '\\u03B6',\n\tZfr: '\\u2128',\n\tzfr: '\\uD835\\uDD37',\n\tZHcy: '\\u0416',\n\tzhcy: '\\u0436',\n\tzigrarr: '\\u21DD',\n\tZopf: '\\u2124',\n\tzopf: '\\uD835\\uDD6B',\n\tZscr: '\\uD835\\uDCB5',\n\tzscr: '\\uD835\\uDCCF',\n\tzwj: '\\u200D',\n\tzwnj: '\\u200C',\n});\n\n/**\n * @deprecated use `HTML_ENTITIES` instead\n * @see HTML_ENTITIES\n */\nexports.entityMap = exports.HTML_ENTITIES;\n","var dom = require('./dom')\nexports.DOMImplementation = dom.DOMImplementation\nexports.XMLSerializer = dom.XMLSerializer\nexports.DOMParser = require('./dom-parser').DOMParser\n","var NAMESPACE = require(\"./conventions\").NAMESPACE;\n\n//[4] \tNameStartChar\t ::= \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n//[4a] \tNameChar\t ::= \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\n//[5] \tName\t ::= \tNameStartChar (NameChar)*\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\n\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\nvar S_TAG = 0;//tag name offerring\nvar S_ATTR = 1;//attr name offerring\nvar S_ATTR_SPACE=2;//attr name end and space offer\nvar S_EQ = 3;//=space?\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\nvar S_TAG_CLOSE = 7;//closed el\n\n/**\n * Creates an error that will not be caught by XMLReader aka the SAX parser.\n *\n * @param {string} message\n * @param {any?} locator Optional, can provide details about the location in the source\n * @constructor\n */\nfunction ParseError(message, locator) {\n\tthis.message = message\n\tthis.locator = locator\n\tif(Error.captureStackTrace) Error.captureStackTrace(this, ParseError);\n}\nParseError.prototype = new Error();\nParseError.prototype.name = ParseError.name\n\nfunction XMLReader(){\n\n}\n\nXMLReader.prototype = {\n\tparse:function(source,defaultNSMap,entityMap){\n\t\tvar domBuilder = this.domBuilder;\n\t\tdomBuilder.startDocument();\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\n\t\tparse(source,defaultNSMap,entityMap,\n\t\t\t\tdomBuilder,this.errorHandler);\n\t\tdomBuilder.endDocument();\n\t}\n}\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\n\tfunction fixedFromCharCode(code) {\n\t\t// String.prototype.fromCharCode does not supports\n\t\t// > 2 bytes unicode chars directly\n\t\tif (code > 0xffff) {\n\t\t\tcode -= 0x10000;\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\n\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\n\t\t} else {\n\t\t\treturn String.fromCharCode(code);\n\t\t}\n\t}\n\tfunction entityReplacer(a){\n\t\tvar k = a.slice(1,-1);\n\t\tif (Object.hasOwnProperty.call(entityMap, k)) {\n\t\t\treturn entityMap[k];\n\t\t}else if(k.charAt(0) === '#'){\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\n\t\t}else{\n\t\t\terrorHandler.error('entity not found:'+a);\n\t\t\treturn a;\n\t\t}\n\t}\n\tfunction appendText(end){//has some bugs\n\t\tif(end>start){\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\tlocator&&position(start);\n\t\t\tdomBuilder.characters(xt,0,end-start);\n\t\t\tstart = end\n\t\t}\n\t}\n\tfunction position(p,m){\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\n\t\t\tlineStart = m.index;\n\t\t\tlineEnd = lineStart + m[0].length;\n\t\t\tlocator.lineNumber++;\n\t\t\t//console.log('line++:',locator,startPos,endPos)\n\t\t}\n\t\tlocator.columnNumber = p-lineStart+1;\n\t}\n\tvar lineStart = 0;\n\tvar lineEnd = 0;\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\n\tvar locator = domBuilder.locator;\n\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\n\tvar closeMap = {};\n\tvar start = 0;\n\twhile(true){\n\t\ttry{\n\t\t\tvar tagStart = source.indexOf('<',start);\n\t\t\tif(tagStart<0){\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\n\t\t\t\t\tvar doc = domBuilder.doc;\n\t \t\t\tvar text = doc.createTextNode(source.substr(start));\n\t \t\t\tdoc.appendChild(text);\n\t \t\t\tdomBuilder.currentElement = text;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(tagStart>start){\n\t\t\t\tappendText(tagStart);\n\t\t\t}\n\t\t\tswitch(source.charAt(tagStart+1)){\n\t\t\tcase '/':\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\n\t\t\t\tvar tagName = source.substring(tagStart + 2, end).replace(/[ \\t\\n\\r]+$/g, '');\n\t\t\t\tvar config = parseStack.pop();\n\t\t\t\tif(end<0){\n\n\t \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\n\t \t\tend = tagStart+1+tagName.length;\n\t \t}else if(tagName.match(/\\s\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\n\t\t\t\tbreak;\n\t\t\tcase '!':// start){\n\t\t\tstart = end;\n\t\t}else{\n\t\t\t//TODO: 这里有可能sax回退,有位置错误风险\n\t\t\tappendText(Math.max(tagStart,start)+1);\n\t\t}\n\t}\n}\nfunction copyLocator(f,t){\n\tt.lineNumber = f.lineNumber;\n\tt.columnNumber = f.columnNumber;\n\treturn t;\n}\n\n/**\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\n */\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\n\n\t/**\n\t * @param {string} qname\n\t * @param {string} value\n\t * @param {number} startIndex\n\t */\n\tfunction addAttribute(qname, value, startIndex) {\n\t\tif (el.attributeNames.hasOwnProperty(qname)) {\n\t\t\terrorHandler.fatalError('Attribute ' + qname + ' redefined')\n\t\t}\n\t\tel.addValue(\n\t\t\tqname,\n\t\t\t// @see https://www.w3.org/TR/xml/#AVNormalize\n\t\t\t// since the xmldom sax parser does not \"interpret\" DTD the following is not implemented:\n\t\t\t// - recursive replacement of (DTD) entity references\n\t\t\t// - trimming and collapsing multiple spaces into a single one for attributes that are not of type CDATA\n\t\t\tvalue.replace(/[\\t\\n\\r]/g, ' ').replace(/&#?\\w+;/g, entityReplacer),\n\t\t\tstartIndex\n\t\t)\n\t}\n\tvar attrName;\n\tvar value;\n\tvar p = ++start;\n\tvar s = S_TAG;//status\n\twhile(true){\n\t\tvar c = source.charAt(p);\n\t\tswitch(c){\n\t\tcase '=':\n\t\t\tif(s === S_ATTR){//attrName\n\t\t\t\tattrName = source.slice(start,p);\n\t\t\t\ts = S_EQ;\n\t\t\t}else if(s === S_ATTR_SPACE){\n\t\t\t\ts = S_EQ;\n\t\t\t}else{\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\n\t\t\t\tthrow new Error('attribute equal must after attrName'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '\\'':\n\t\tcase '\"':\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\n\t\t\t\t){//equal\n\t\t\t\tif(s === S_ATTR){\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t}\n\t\t\t\tstart = p+1;\n\t\t\t\tp = source.indexOf(c,start)\n\t\t\t\tif(p>0){\n\t\t\t\t\tvalue = source.slice(start, p);\n\t\t\t\t\taddAttribute(attrName, value, start-1);\n\t\t\t\t\ts = S_ATTR_END;\n\t\t\t\t}else{\n\t\t\t\t\t//fatalError: no end quot match\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\n\t\t\t\t}\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\tvalue = source.slice(start, p);\n\t\t\t\taddAttribute(attrName, value, start);\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\n\t\t\t\tstart = p+1;\n\t\t\t\ts = S_ATTR_END\n\t\t\t}else{\n\t\t\t\t//fatalError: no equal before\n\t\t\t\tthrow new Error('attribute value must after \"=\"'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '/':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\ts =S_TAG_CLOSE;\n\t\t\t\tel.closed = true;\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\tcase S_ATTR:\n\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tel.closed = true;\n\t\t\t\tbreak;\n\t\t\t//case S_EQ:\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\") // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ''://end document\n\t\t\terrorHandler.error('unexpected end of input');\n\t\t\tif(s == S_TAG){\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\t}\n\t\t\treturn p;\n\t\tcase '>':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\tbreak;//normal\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\n\t\t\tcase S_ATTR:\n\t\t\t\tvalue = source.slice(start,p);\n\t\t\t\tif(value.slice(-1) === '/'){\n\t\t\t\t\tel.closed = true;\n\t\t\t\t\tvalue = value.slice(0,-1)\n\t\t\t\t}\n\t\t\tcase S_ATTR_SPACE:\n\t\t\t\tif(s === S_ATTR_SPACE){\n\t\t\t\t\tvalue = attrName;\n\t\t\t\t}\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\t}else{\n\t\t\t\t\tif(!NAMESPACE.isHTML(currentNSMap['']) || !value.match(/^(?:disabled|checked|selected)$/i)){\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(value, value, start)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase S_EQ:\n\t\t\t\tthrow new Error('attribute value missed!!');\n\t\t\t}\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\n\t\t\treturn p;\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\n\t\tcase '\\u0080':\n\t\t\tc = ' ';\n\t\tdefault:\n\t\t\tif(c<= ' '){//space\n\t\t\t\tswitch(s){\n\t\t\t\tcase S_TAG:\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR:\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t\ts = S_ATTR_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\t\t\tvar value = source.slice(start, p);\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\t//case S_TAG_SPACE:\n\t\t\t\t//case S_EQ:\n\t\t\t\t//case S_ATTR_SPACE:\n\t\t\t\t//\tvoid();break;\n\t\t\t\t//case S_TAG_CLOSE:\n\t\t\t\t\t//ignore warning\n\t\t\t\t}\n\t\t\t}else{//not space\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\n\t\t\t\tswitch(s){\n\t\t\t\t//case S_TAG:void();break;\n\t\t\t\t//case S_ATTR:void();break;\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tvar tagName = el.tagName;\n\t\t\t\t\tif (!NAMESPACE.isHTML(currentNSMap['']) || !attrName.match(/^(?:disabled|checked|selected)$/i)) {\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(attrName, attrName, start);\n\t\t\t\t\tstart = p;\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\n\t\t\t\tcase S_TAG_SPACE:\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_EQ:\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_TAG_CLOSE:\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\n\t\t\t\t}\n\t\t\t}\n\t\t}//end outer switch\n\t\t//console.log('p++',p)\n\t\tp++;\n\t}\n}\n/**\n * @return true if has new namespace define\n */\nfunction appendElement(el,domBuilder,currentNSMap){\n\tvar tagName = el.tagName;\n\tvar localNSMap = null;\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\n\tvar i = el.length;\n\twhile(i--){\n\t\tvar a = el[i];\n\t\tvar qName = a.qName;\n\t\tvar value = a.value;\n\t\tvar nsp = qName.indexOf(':');\n\t\tif(nsp>0){\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\n\t\t\tvar localName = qName.slice(nsp+1);\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\n\t\t}else{\n\t\t\tlocalName = qName;\n\t\t\tprefix = null\n\t\t\tnsPrefix = qName === 'xmlns' && ''\n\t\t}\n\t\t//can not set prefix,because prefix !== ''\n\t\ta.localName = localName ;\n\t\t//prefix == null for no ns prefix attribute\n\t\tif(nsPrefix !== false){//hack!!\n\t\t\tif(localNSMap == null){\n\t\t\t\tlocalNSMap = {}\n\t\t\t\t//console.log(currentNSMap,0)\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\n\t\t\t\t//console.log(currentNSMap,1)\n\t\t\t}\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\n\t\t\ta.uri = NAMESPACE.XMLNS\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value)\n\t\t}\n\t}\n\tvar i = el.length;\n\twhile(i--){\n\t\ta = el[i];\n\t\tvar prefix = a.prefix;\n\t\tif(prefix){//no prefix attribute has no namespace\n\t\t\tif(prefix === 'xml'){\n\t\t\t\ta.uri = NAMESPACE.XML;\n\t\t\t}if(prefix !== 'xmlns'){\n\t\t\t\ta.uri = currentNSMap[prefix || '']\n\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\n\t\t\t}\n\t\t}\n\t}\n\tvar nsp = tagName.indexOf(':');\n\tif(nsp>0){\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\n\t}else{\n\t\tprefix = null;//important!!\n\t\tlocalName = el.localName = tagName;\n\t}\n\t//no prefix element has default namespace\n\tvar ns = el.uri = currentNSMap[prefix || ''];\n\tdomBuilder.startElement(ns,localName,tagName,el);\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\n\t//localNSMap = null\n\tif(el.closed){\n\t\tdomBuilder.endElement(ns,localName,tagName);\n\t\tif(localNSMap){\n\t\t\tfor (prefix in localNSMap) {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) {\n\t\t\t\t\tdomBuilder.endPrefixMapping(prefix);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}else{\n\t\tel.currentNSMap = currentNSMap;\n\t\tel.localNSMap = localNSMap;\n\t\t//parseStack.push(el);\n\t\treturn true;\n\t}\n}\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\n\tif(/^(?:script|textarea)$/i.test(tagName)){\n\t\tvar elEndStart = source.indexOf('',elStartEnd);\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\n\t\tif(/[&<]/.test(text)){\n\t\t\tif(/^script$/i.test(tagName)){\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\n\t\t\t\t\t//lexHandler.startCDATA();\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\t\t//lexHandler.endCDATA();\n\t\t\t\t\treturn elEndStart;\n\t\t\t\t//}\n\t\t\t}//}else{//text area\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\treturn elEndStart;\n\t\t\t//}\n\n\t\t}\n\t}\n\treturn elStartEnd+1;\n}\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\n\t//if(tagName in closeMap){\n\tvar pos = closeMap[tagName];\n\tif(pos == null){\n\t\t//console.log(tagName)\n\t\tpos = source.lastIndexOf('')\n\t\tif(pos',start+4);\n\t\t\t//append comment source.substring(4,end)// | item |\n// | item | | item | | item |\n// | ... | | ... | | ... |\n// | item | | item | | item |\n// | item | | item | | item |\n// | [empty] | <-- top | item | | item |\n// | [empty] | | item | | item |\n// | [empty] | | [empty] | <-- top top --> | [empty] |\n// +-----------+ +-----------+ +-----------+\n//\n// Or, if there is only one circular buffer, it looks something\n// like either of these:\n//\n// head tail head tail\n// | | | |\n// v v v v\n// +-----------+ +-----------+\n// | [null] | | [null] |\n// +-----------+ +-----------+\n// | [empty] | | item |\n// | [empty] | | item |\n// | item | <-- bottom top --> | [empty] |\n// | item | | [empty] |\n// | [empty] | <-- top bottom --> | item |\n// | [empty] | | item |\n// +-----------+ +-----------+\n//\n// Adding a value means moving `top` forward by one, removing means\n// moving `bottom` forward by one. After reaching the end, the queue\n// wraps around.\n//\n// When `top === bottom` the current queue is empty and when\n// `top + 1 === bottom` it's full. This wastes a single space of storage\n// but allows much quicker checks.\n\nclass FixedCircularBuffer {\n constructor() {\n this.bottom = 0;\n this.top = 0;\n this.list = new Array(kSize);\n this.next = null;\n }\n\n isEmpty() {\n return this.top === this.bottom;\n }\n\n isFull() {\n return ((this.top + 1) & kMask) === this.bottom;\n }\n\n push(data) {\n this.list[this.top] = data;\n this.top = (this.top + 1) & kMask;\n }\n\n shift() {\n const nextItem = this.list[this.bottom];\n if (nextItem === undefined)\n return null;\n this.list[this.bottom] = undefined;\n this.bottom = (this.bottom + 1) & kMask;\n return nextItem;\n }\n}\n\nmodule.exports = class FixedQueue {\n constructor() {\n this.head = this.tail = new FixedCircularBuffer();\n }\n\n isEmpty() {\n return this.head.isEmpty();\n }\n\n push(data) {\n if (this.head.isFull()) {\n // Head is full: Creates a new queue, sets the old queue's `.next` to it,\n // and sets it as the new main queue.\n this.head = this.head.next = new FixedCircularBuffer();\n }\n this.head.push(data);\n }\n\n shift() {\n const tail = this.tail;\n const next = tail.shift();\n if (tail.isEmpty() && tail.next !== null) {\n // If there is another queue, it forms the new tail.\n this.tail = tail.next;\n }\n return next;\n }\n};\n","'use strict'\n\nconst DispatcherBase = require('./dispatcher-base')\nconst FixedQueue = require('./node/fixed-queue')\nconst { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require('./core/symbols')\nconst PoolStats = require('./pool-stats')\n\nconst kClients = Symbol('clients')\nconst kNeedDrain = Symbol('needDrain')\nconst kQueue = Symbol('queue')\nconst kClosedResolve = Symbol('closed resolve')\nconst kOnDrain = Symbol('onDrain')\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kGetDispatcher = Symbol('get dispatcher')\nconst kAddClient = Symbol('add client')\nconst kRemoveClient = Symbol('remove client')\nconst kStats = Symbol('stats')\n\nclass PoolBase extends DispatcherBase {\n constructor () {\n super()\n\n this[kQueue] = new FixedQueue()\n this[kClients] = []\n this[kQueued] = 0\n\n const pool = this\n\n this[kOnDrain] = function onDrain (origin, targets) {\n const queue = pool[kQueue]\n\n let needDrain = false\n\n while (!needDrain) {\n const item = queue.shift()\n if (!item) {\n break\n }\n pool[kQueued]--\n needDrain = !this.dispatch(item.opts, item.handler)\n }\n\n this[kNeedDrain] = needDrain\n\n if (!this[kNeedDrain] && pool[kNeedDrain]) {\n pool[kNeedDrain] = false\n pool.emit('drain', origin, [pool, ...targets])\n }\n\n if (pool[kClosedResolve] && queue.isEmpty()) {\n Promise\n .all(pool[kClients].map(c => c.close()))\n .then(pool[kClosedResolve])\n }\n }\n\n this[kOnConnect] = (origin, targets) => {\n pool.emit('connect', origin, [pool, ...targets])\n }\n\n this[kOnDisconnect] = (origin, targets, err) => {\n pool.emit('disconnect', origin, [pool, ...targets], err)\n }\n\n this[kOnConnectionError] = (origin, targets, err) => {\n pool.emit('connectionError', origin, [pool, ...targets], err)\n }\n\n this[kStats] = new PoolStats(this)\n }\n\n get [kBusy] () {\n return this[kNeedDrain]\n }\n\n get [kConnected] () {\n return this[kClients].filter(client => client[kConnected]).length\n }\n\n get [kFree] () {\n return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length\n }\n\n get [kPending] () {\n let ret = this[kQueued]\n for (const { [kPending]: pending } of this[kClients]) {\n ret += pending\n }\n return ret\n }\n\n get [kRunning] () {\n let ret = 0\n for (const { [kRunning]: running } of this[kClients]) {\n ret += running\n }\n return ret\n }\n\n get [kSize] () {\n let ret = this[kQueued]\n for (const { [kSize]: size } of this[kClients]) {\n ret += size\n }\n return ret\n }\n\n get stats () {\n return this[kStats]\n }\n\n async [kClose] () {\n if (this[kQueue].isEmpty()) {\n return Promise.all(this[kClients].map(c => c.close()))\n } else {\n return new Promise((resolve) => {\n this[kClosedResolve] = resolve\n })\n }\n }\n\n async [kDestroy] (err) {\n while (true) {\n const item = this[kQueue].shift()\n if (!item) {\n break\n }\n item.handler.onError(err)\n }\n\n return Promise.all(this[kClients].map(c => c.destroy(err)))\n }\n\n [kDispatch] (opts, handler) {\n const dispatcher = this[kGetDispatcher]()\n\n if (!dispatcher) {\n this[kNeedDrain] = true\n this[kQueue].push({ opts, handler })\n this[kQueued]++\n } else if (!dispatcher.dispatch(opts, handler)) {\n dispatcher[kNeedDrain] = true\n this[kNeedDrain] = !this[kGetDispatcher]()\n }\n\n return !this[kNeedDrain]\n }\n\n [kAddClient] (client) {\n client\n .on('drain', this[kOnDrain])\n .on('connect', this[kOnConnect])\n .on('disconnect', this[kOnDisconnect])\n .on('connectionError', this[kOnConnectionError])\n\n this[kClients].push(client)\n\n if (this[kNeedDrain]) {\n process.nextTick(() => {\n if (this[kNeedDrain]) {\n this[kOnDrain](client[kUrl], [this, client])\n }\n })\n }\n\n return this\n }\n\n [kRemoveClient] (client) {\n client.close(() => {\n const idx = this[kClients].indexOf(client)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n })\n\n this[kNeedDrain] = this[kClients].some(dispatcher => (\n !dispatcher[kNeedDrain] &&\n dispatcher.closed !== true &&\n dispatcher.destroyed !== true\n ))\n }\n}\n\nmodule.exports = {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kRemoveClient,\n kGetDispatcher\n}\n","const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require('./core/symbols')\nconst kPool = Symbol('pool')\n\nclass PoolStats {\n constructor (pool) {\n this[kPool] = pool\n }\n\n get connected () {\n return this[kPool][kConnected]\n }\n\n get free () {\n return this[kPool][kFree]\n }\n\n get pending () {\n return this[kPool][kPending]\n }\n\n get queued () {\n return this[kPool][kQueued]\n }\n\n get running () {\n return this[kPool][kRunning]\n }\n\n get size () {\n return this[kPool][kSize]\n }\n}\n\nmodule.exports = PoolStats\n","'use strict'\n\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kGetDispatcher\n} = require('./pool-base')\nconst Client = require('./client')\nconst {\n InvalidArgumentError\n} = require('./core/errors')\nconst util = require('./core/util')\nconst { kUrl, kInterceptors } = require('./core/symbols')\nconst buildConnector = require('./core/connect')\n\nconst kOptions = Symbol('options')\nconst kConnections = Symbol('connections')\nconst kFactory = Symbol('factory')\n\nfunction defaultFactory (origin, opts) {\n return new Client(origin, opts)\n}\n\nclass Pool extends PoolBase {\n constructor (origin, {\n connections,\n factory = defaultFactory,\n connect,\n connectTimeout,\n tls,\n maxCachedSessions,\n socketPath,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n allowH2,\n ...options\n } = {}) {\n super()\n\n if (connections != null && (!Number.isFinite(connections) || connections < 0)) {\n throw new InvalidArgumentError('invalid connections')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n socketPath,\n timeout: connectTimeout,\n ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n }\n\n this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool)\n ? options.interceptors.Pool\n : []\n this[kConnections] = connections || null\n this[kUrl] = util.parseOrigin(origin)\n this[kOptions] = { ...util.deepClone(options), connect, allowH2 }\n this[kOptions].interceptors = options.interceptors\n ? { ...options.interceptors }\n : undefined\n this[kFactory] = factory\n\n this.on('connectionError', (origin, targets, error) => {\n // If a connection error occurs, we remove the client from the pool,\n // and emit a connectionError event. They will not be re-used.\n // Fixes https://github.com/nodejs/undici/issues/3895\n for (const target of targets) {\n // Do not use kRemoveClient here, as it will close the client,\n // but the client cannot be closed in this state.\n const idx = this[kClients].indexOf(target)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n }\n })\n }\n\n [kGetDispatcher] () {\n let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain])\n\n if (dispatcher) {\n return dispatcher\n }\n\n if (!this[kConnections] || this[kClients].length < this[kConnections]) {\n dispatcher = this[kFactory](this[kUrl], this[kOptions])\n this[kAddClient](dispatcher)\n }\n\n return dispatcher\n }\n}\n\nmodule.exports = Pool\n","'use strict'\n\nconst { kProxy, kClose, kDestroy, kInterceptors } = require('./core/symbols')\nconst { URL } = require('url')\nconst Agent = require('./agent')\nconst Pool = require('./pool')\nconst DispatcherBase = require('./dispatcher-base')\nconst { InvalidArgumentError, RequestAbortedError } = require('./core/errors')\nconst buildConnector = require('./core/connect')\n\nconst kAgent = Symbol('proxy agent')\nconst kClient = Symbol('proxy client')\nconst kProxyHeaders = Symbol('proxy headers')\nconst kRequestTls = Symbol('request tls settings')\nconst kProxyTls = Symbol('proxy tls settings')\nconst kConnectEndpoint = Symbol('connect endpoint function')\n\nfunction defaultProtocolPort (protocol) {\n return protocol === 'https:' ? 443 : 80\n}\n\nfunction buildProxyOptions (opts) {\n if (typeof opts === 'string') {\n opts = { uri: opts }\n }\n\n if (!opts || !opts.uri) {\n throw new InvalidArgumentError('Proxy opts.uri is mandatory')\n }\n\n return {\n uri: opts.uri,\n protocol: opts.protocol || 'https'\n }\n}\n\nfunction defaultFactory (origin, opts) {\n return new Pool(origin, opts)\n}\n\nclass ProxyAgent extends DispatcherBase {\n constructor (opts) {\n super(opts)\n this[kProxy] = buildProxyOptions(opts)\n this[kAgent] = new Agent(opts)\n this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent)\n ? opts.interceptors.ProxyAgent\n : []\n\n if (typeof opts === 'string') {\n opts = { uri: opts }\n }\n\n if (!opts || !opts.uri) {\n throw new InvalidArgumentError('Proxy opts.uri is mandatory')\n }\n\n const { clientFactory = defaultFactory } = opts\n\n if (typeof clientFactory !== 'function') {\n throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')\n }\n\n this[kRequestTls] = opts.requestTls\n this[kProxyTls] = opts.proxyTls\n this[kProxyHeaders] = opts.headers || {}\n\n const resolvedUrl = new URL(opts.uri)\n const { origin, port, host, username, password } = resolvedUrl\n\n if (opts.auth && opts.token) {\n throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')\n } else if (opts.auth) {\n /* @deprecated in favour of opts.token */\n this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`\n } else if (opts.token) {\n this[kProxyHeaders]['proxy-authorization'] = opts.token\n } else if (username && password) {\n this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`\n }\n\n const connect = buildConnector({ ...opts.proxyTls })\n this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })\n this[kClient] = clientFactory(resolvedUrl, { connect })\n this[kAgent] = new Agent({\n ...opts,\n connect: async (opts, callback) => {\n let requestedHost = opts.host\n if (!opts.port) {\n requestedHost += `:${defaultProtocolPort(opts.protocol)}`\n }\n try {\n const { socket, statusCode } = await this[kClient].connect({\n origin,\n port,\n path: requestedHost,\n signal: opts.signal,\n headers: {\n ...this[kProxyHeaders],\n host\n }\n })\n if (statusCode !== 200) {\n socket.on('error', () => {}).destroy()\n callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))\n }\n if (opts.protocol !== 'https:') {\n callback(null, socket)\n return\n }\n let servername\n if (this[kRequestTls]) {\n servername = this[kRequestTls].servername\n } else {\n servername = opts.servername\n }\n this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback)\n } catch (err) {\n callback(err)\n }\n }\n })\n }\n\n dispatch (opts, handler) {\n const { host } = new URL(opts.origin)\n const headers = buildHeaders(opts.headers)\n throwIfProxyAuthIsSent(headers)\n return this[kAgent].dispatch(\n {\n ...opts,\n headers: {\n ...headers,\n host\n }\n },\n handler\n )\n }\n\n async [kClose] () {\n await this[kAgent].close()\n await this[kClient].close()\n }\n\n async [kDestroy] () {\n await this[kAgent].destroy()\n await this[kClient].destroy()\n }\n}\n\n/**\n * @param {string[] | Record} headers\n * @returns {Record}\n */\nfunction buildHeaders (headers) {\n // When using undici.fetch, the headers list is stored\n // as an array.\n if (Array.isArray(headers)) {\n /** @type {Record} */\n const headersPair = {}\n\n for (let i = 0; i < headers.length; i += 2) {\n headersPair[headers[i]] = headers[i + 1]\n }\n\n return headersPair\n }\n\n return headers\n}\n\n/**\n * @param {Record} headers\n *\n * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers\n * Nevertheless, it was changed and to avoid a security vulnerability by end users\n * this check was created.\n * It should be removed in the next major version for performance reasons\n */\nfunction throwIfProxyAuthIsSent (headers) {\n const existProxyAuth = headers && Object.keys(headers)\n .find((key) => key.toLowerCase() === 'proxy-authorization')\n if (existProxyAuth) {\n throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')\n }\n}\n\nmodule.exports = ProxyAgent\n","'use strict'\n\nlet fastNow = Date.now()\nlet fastNowTimeout\n\nconst fastTimers = []\n\nfunction onTimeout () {\n fastNow = Date.now()\n\n let len = fastTimers.length\n let idx = 0\n while (idx < len) {\n const timer = fastTimers[idx]\n\n if (timer.state === 0) {\n timer.state = fastNow + timer.delay\n } else if (timer.state > 0 && fastNow >= timer.state) {\n timer.state = -1\n timer.callback(timer.opaque)\n }\n\n if (timer.state === -1) {\n timer.state = -2\n if (idx !== len - 1) {\n fastTimers[idx] = fastTimers.pop()\n } else {\n fastTimers.pop()\n }\n len -= 1\n } else {\n idx += 1\n }\n }\n\n if (fastTimers.length > 0) {\n refreshTimeout()\n }\n}\n\nfunction refreshTimeout () {\n if (fastNowTimeout && fastNowTimeout.refresh) {\n fastNowTimeout.refresh()\n } else {\n clearTimeout(fastNowTimeout)\n fastNowTimeout = setTimeout(onTimeout, 1e3)\n if (fastNowTimeout.unref) {\n fastNowTimeout.unref()\n }\n }\n}\n\nclass Timeout {\n constructor (callback, delay, opaque) {\n this.callback = callback\n this.delay = delay\n this.opaque = opaque\n\n // -2 not in timer list\n // -1 in timer list but inactive\n // 0 in timer list waiting for time\n // > 0 in timer list waiting for time to expire\n this.state = -2\n\n this.refresh()\n }\n\n refresh () {\n if (this.state === -2) {\n fastTimers.push(this)\n if (!fastNowTimeout || fastTimers.length === 1) {\n refreshTimeout()\n }\n }\n\n this.state = 0\n }\n\n clear () {\n this.state = -1\n }\n}\n\nmodule.exports = {\n setTimeout (callback, delay, opaque) {\n return delay < 1e3\n ? setTimeout(callback, delay, opaque)\n : new Timeout(callback, delay, opaque)\n },\n clearTimeout (timeout) {\n if (timeout instanceof Timeout) {\n timeout.clear()\n } else {\n clearTimeout(timeout)\n }\n }\n}\n","'use strict'\n\nconst diagnosticsChannel = require('diagnostics_channel')\nconst { uid, states } = require('./constants')\nconst {\n kReadyState,\n kSentClose,\n kByteParser,\n kReceivedClose\n} = require('./symbols')\nconst { fireEvent, failWebsocketConnection } = require('./util')\nconst { CloseEvent } = require('./events')\nconst { makeRequest } = require('../fetch/request')\nconst { fetching } = require('../fetch/index')\nconst { Headers } = require('../fetch/headers')\nconst { getGlobalDispatcher } = require('../global')\nconst { kHeadersList } = require('../core/symbols')\n\nconst channels = {}\nchannels.open = diagnosticsChannel.channel('undici:websocket:open')\nchannels.close = diagnosticsChannel.channel('undici:websocket:close')\nchannels.socketError = diagnosticsChannel.channel('undici:websocket:socket_error')\n\n/** @type {import('crypto')} */\nlet crypto\ntry {\n crypto = require('crypto')\n} catch {\n\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#concept-websocket-establish\n * @param {URL} url\n * @param {string|string[]} protocols\n * @param {import('./websocket').WebSocket} ws\n * @param {(response: any) => void} onEstablish\n * @param {Partial} options\n */\nfunction establishWebSocketConnection (url, protocols, ws, onEstablish, options) {\n // 1. Let requestURL be a copy of url, with its scheme set to \"http\", if url’s\n // scheme is \"ws\", and to \"https\" otherwise.\n const requestURL = url\n\n requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:'\n\n // 2. Let request be a new request, whose URL is requestURL, client is client,\n // service-workers mode is \"none\", referrer is \"no-referrer\", mode is\n // \"websocket\", credentials mode is \"include\", cache mode is \"no-store\" ,\n // and redirect mode is \"error\".\n const request = makeRequest({\n urlList: [requestURL],\n serviceWorkers: 'none',\n referrer: 'no-referrer',\n mode: 'websocket',\n credentials: 'include',\n cache: 'no-store',\n redirect: 'error'\n })\n\n // Note: undici extension, allow setting custom headers.\n if (options.headers) {\n const headersList = new Headers(options.headers)[kHeadersList]\n\n request.headersList = headersList\n }\n\n // 3. Append (`Upgrade`, `websocket`) to request’s header list.\n // 4. Append (`Connection`, `Upgrade`) to request’s header list.\n // Note: both of these are handled by undici currently.\n // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397\n\n // 5. Let keyValue be a nonce consisting of a randomly selected\n // 16-byte value that has been forgiving-base64-encoded and\n // isomorphic encoded.\n const keyValue = crypto.randomBytes(16).toString('base64')\n\n // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s\n // header list.\n request.headersList.append('sec-websocket-key', keyValue)\n\n // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s\n // header list.\n request.headersList.append('sec-websocket-version', '13')\n\n // 8. For each protocol in protocols, combine\n // (`Sec-WebSocket-Protocol`, protocol) in request’s header\n // list.\n for (const protocol of protocols) {\n request.headersList.append('sec-websocket-protocol', protocol)\n }\n\n // 9. Let permessageDeflate be a user-agent defined\n // \"permessage-deflate\" extension header value.\n // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673\n // TODO: enable once permessage-deflate is supported\n const permessageDeflate = '' // 'permessage-deflate; 15'\n\n // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to\n // request’s header list.\n // request.headersList.append('sec-websocket-extensions', permessageDeflate)\n\n // 11. Fetch request with useParallelQueue set to true, and\n // processResponse given response being these steps:\n const controller = fetching({\n request,\n useParallelQueue: true,\n dispatcher: options.dispatcher ?? getGlobalDispatcher(),\n processResponse (response) {\n // 1. If response is a network error or its status is not 101,\n // fail the WebSocket connection.\n if (response.type === 'error' || response.status !== 101) {\n failWebsocketConnection(ws, 'Received network error or non-101 status code.')\n return\n }\n\n // 2. If protocols is not the empty list and extracting header\n // list values given `Sec-WebSocket-Protocol` and response’s\n // header list results in null, failure, or the empty byte\n // sequence, then fail the WebSocket connection.\n if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) {\n failWebsocketConnection(ws, 'Server did not respond with sent protocols.')\n return\n }\n\n // 3. Follow the requirements stated step 2 to step 6, inclusive,\n // of the last set of steps in section 4.1 of The WebSocket\n // Protocol to validate response. This either results in fail\n // the WebSocket connection or the WebSocket connection is\n // established.\n\n // 2. If the response lacks an |Upgrade| header field or the |Upgrade|\n // header field contains a value that is not an ASCII case-\n // insensitive match for the value \"websocket\", the client MUST\n // _Fail the WebSocket Connection_.\n if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') {\n failWebsocketConnection(ws, 'Server did not set Upgrade header to \"websocket\".')\n return\n }\n\n // 3. If the response lacks a |Connection| header field or the\n // |Connection| header field doesn't contain a token that is an\n // ASCII case-insensitive match for the value \"Upgrade\", the client\n // MUST _Fail the WebSocket Connection_.\n if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') {\n failWebsocketConnection(ws, 'Server did not set Connection header to \"upgrade\".')\n return\n }\n\n // 4. If the response lacks a |Sec-WebSocket-Accept| header field or\n // the |Sec-WebSocket-Accept| contains a value other than the\n // base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-\n // Key| (as a string, not base64-decoded) with the string \"258EAFA5-\n // E914-47DA-95CA-C5AB0DC85B11\" but ignoring any leading and\n // trailing whitespace, the client MUST _Fail the WebSocket\n // Connection_.\n const secWSAccept = response.headersList.get('Sec-WebSocket-Accept')\n const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64')\n if (secWSAccept !== digest) {\n failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.')\n return\n }\n\n // 5. If the response includes a |Sec-WebSocket-Extensions| header\n // field and this header field indicates the use of an extension\n // that was not present in the client's handshake (the server has\n // indicated an extension not requested by the client), the client\n // MUST _Fail the WebSocket Connection_. (The parsing of this\n // header field to determine which extensions are requested is\n // discussed in Section 9.1.)\n const secExtension = response.headersList.get('Sec-WebSocket-Extensions')\n\n if (secExtension !== null && secExtension !== permessageDeflate) {\n failWebsocketConnection(ws, 'Received different permessage-deflate than the one set.')\n return\n }\n\n // 6. If the response includes a |Sec-WebSocket-Protocol| header field\n // and this header field indicates the use of a subprotocol that was\n // not present in the client's handshake (the server has indicated a\n // subprotocol not requested by the client), the client MUST _Fail\n // the WebSocket Connection_.\n const secProtocol = response.headersList.get('Sec-WebSocket-Protocol')\n\n if (secProtocol !== null && secProtocol !== request.headersList.get('Sec-WebSocket-Protocol')) {\n failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.')\n return\n }\n\n response.socket.on('data', onSocketData)\n response.socket.on('close', onSocketClose)\n response.socket.on('error', onSocketError)\n\n if (channels.open.hasSubscribers) {\n channels.open.publish({\n address: response.socket.address(),\n protocol: secProtocol,\n extensions: secExtension\n })\n }\n\n onEstablish(response)\n }\n })\n\n return controller\n}\n\n/**\n * @param {Buffer} chunk\n */\nfunction onSocketData (chunk) {\n if (!this.ws[kByteParser].write(chunk)) {\n this.pause()\n }\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4\n */\nfunction onSocketClose () {\n const { ws } = this\n\n // If the TCP connection was closed after the\n // WebSocket closing handshake was completed, the WebSocket connection\n // is said to have been closed _cleanly_.\n const wasClean = ws[kSentClose] && ws[kReceivedClose]\n\n let code = 1005\n let reason = ''\n\n const result = ws[kByteParser].closingInfo\n\n if (result) {\n code = result.code ?? 1005\n reason = result.reason\n } else if (!ws[kSentClose]) {\n // If _The WebSocket\n // Connection is Closed_ and no Close control frame was received by the\n // endpoint (such as could occur if the underlying transport connection\n // is lost), _The WebSocket Connection Close Code_ is considered to be\n // 1006.\n code = 1006\n }\n\n // 1. Change the ready state to CLOSED (3).\n ws[kReadyState] = states.CLOSED\n\n // 2. If the user agent was required to fail the WebSocket\n // connection, or if the WebSocket connection was closed\n // after being flagged as full, fire an event named error\n // at the WebSocket object.\n // TODO\n\n // 3. Fire an event named close at the WebSocket object,\n // using CloseEvent, with the wasClean attribute\n // initialized to true if the connection closed cleanly\n // and false otherwise, the code attribute initialized to\n // the WebSocket connection close code, and the reason\n // attribute initialized to the result of applying UTF-8\n // decode without BOM to the WebSocket connection close\n // reason.\n fireEvent('close', ws, CloseEvent, {\n wasClean, code, reason\n })\n\n if (channels.close.hasSubscribers) {\n channels.close.publish({\n websocket: ws,\n code,\n reason\n })\n }\n}\n\nfunction onSocketError (error) {\n const { ws } = this\n\n ws[kReadyState] = states.CLOSING\n\n if (channels.socketError.hasSubscribers) {\n channels.socketError.publish(error)\n }\n\n this.destroy()\n}\n\nmodule.exports = {\n establishWebSocketConnection\n}\n","'use strict'\n\n// This is a Globally Unique Identifier unique used\n// to validate that the endpoint accepts websocket\n// connections.\n// See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3\nconst uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'\n\n/** @type {PropertyDescriptor} */\nconst staticPropertyDescriptors = {\n enumerable: true,\n writable: false,\n configurable: false\n}\n\nconst states = {\n CONNECTING: 0,\n OPEN: 1,\n CLOSING: 2,\n CLOSED: 3\n}\n\nconst opcodes = {\n CONTINUATION: 0x0,\n TEXT: 0x1,\n BINARY: 0x2,\n CLOSE: 0x8,\n PING: 0x9,\n PONG: 0xA\n}\n\nconst maxUnsigned16Bit = 2 ** 16 - 1 // 65535\n\nconst parserStates = {\n INFO: 0,\n PAYLOADLENGTH_16: 2,\n PAYLOADLENGTH_64: 3,\n READ_DATA: 4\n}\n\nconst emptyBuffer = Buffer.allocUnsafe(0)\n\nmodule.exports = {\n uid,\n staticPropertyDescriptors,\n states,\n opcodes,\n maxUnsigned16Bit,\n parserStates,\n emptyBuffer\n}\n","'use strict'\n\nconst { webidl } = require('../fetch/webidl')\nconst { kEnumerableProperty } = require('../core/util')\nconst { MessagePort } = require('worker_threads')\n\n/**\n * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent\n */\nclass MessageEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' })\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.MessageEventInit(eventInitDict)\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n }\n\n get data () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.data\n }\n\n get origin () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.origin\n }\n\n get lastEventId () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.lastEventId\n }\n\n get source () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.source\n }\n\n get ports () {\n webidl.brandCheck(this, MessageEvent)\n\n if (!Object.isFrozen(this.#eventInit.ports)) {\n Object.freeze(this.#eventInit.ports)\n }\n\n return this.#eventInit.ports\n }\n\n initMessageEvent (\n type,\n bubbles = false,\n cancelable = false,\n data = null,\n origin = '',\n lastEventId = '',\n source = null,\n ports = []\n ) {\n webidl.brandCheck(this, MessageEvent)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' })\n\n return new MessageEvent(type, {\n bubbles, cancelable, data, origin, lastEventId, source, ports\n })\n }\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#the-closeevent-interface\n */\nclass CloseEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' })\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.CloseEventInit(eventInitDict)\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n }\n\n get wasClean () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.wasClean\n }\n\n get code () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.code\n }\n\n get reason () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.reason\n }\n}\n\n// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface\nclass ErrorEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' })\n\n super(type, eventInitDict)\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})\n\n this.#eventInit = eventInitDict\n }\n\n get message () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.message\n }\n\n get filename () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.filename\n }\n\n get lineno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.lineno\n }\n\n get colno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.colno\n }\n\n get error () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.error\n }\n}\n\nObject.defineProperties(MessageEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'MessageEvent',\n configurable: true\n },\n data: kEnumerableProperty,\n origin: kEnumerableProperty,\n lastEventId: kEnumerableProperty,\n source: kEnumerableProperty,\n ports: kEnumerableProperty,\n initMessageEvent: kEnumerableProperty\n})\n\nObject.defineProperties(CloseEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'CloseEvent',\n configurable: true\n },\n reason: kEnumerableProperty,\n code: kEnumerableProperty,\n wasClean: kEnumerableProperty\n})\n\nObject.defineProperties(ErrorEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'ErrorEvent',\n configurable: true\n },\n message: kEnumerableProperty,\n filename: kEnumerableProperty,\n lineno: kEnumerableProperty,\n colno: kEnumerableProperty,\n error: kEnumerableProperty\n})\n\nwebidl.converters.MessagePort = webidl.interfaceConverter(MessagePort)\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.MessagePort\n)\n\nconst eventInit = [\n {\n key: 'bubbles',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'cancelable',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'composed',\n converter: webidl.converters.boolean,\n defaultValue: false\n }\n]\n\nwebidl.converters.MessageEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'data',\n converter: webidl.converters.any,\n defaultValue: null\n },\n {\n key: 'origin',\n converter: webidl.converters.USVString,\n defaultValue: ''\n },\n {\n key: 'lastEventId',\n converter: webidl.converters.DOMString,\n defaultValue: ''\n },\n {\n key: 'source',\n // Node doesn't implement WindowProxy or ServiceWorker, so the only\n // valid value for source is a MessagePort.\n converter: webidl.nullableConverter(webidl.converters.MessagePort),\n defaultValue: null\n },\n {\n key: 'ports',\n converter: webidl.converters['sequence'],\n get defaultValue () {\n return []\n }\n }\n])\n\nwebidl.converters.CloseEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'wasClean',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'code',\n converter: webidl.converters['unsigned short'],\n defaultValue: 0\n },\n {\n key: 'reason',\n converter: webidl.converters.USVString,\n defaultValue: ''\n }\n])\n\nwebidl.converters.ErrorEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'message',\n converter: webidl.converters.DOMString,\n defaultValue: ''\n },\n {\n key: 'filename',\n converter: webidl.converters.USVString,\n defaultValue: ''\n },\n {\n key: 'lineno',\n converter: webidl.converters['unsigned long'],\n defaultValue: 0\n },\n {\n key: 'colno',\n converter: webidl.converters['unsigned long'],\n defaultValue: 0\n },\n {\n key: 'error',\n converter: webidl.converters.any\n }\n])\n\nmodule.exports = {\n MessageEvent,\n CloseEvent,\n ErrorEvent\n}\n","'use strict'\n\nconst { maxUnsigned16Bit } = require('./constants')\n\n/** @type {import('crypto')} */\nlet crypto\ntry {\n crypto = require('crypto')\n} catch {\n\n}\n\nclass WebsocketFrameSend {\n /**\n * @param {Buffer|undefined} data\n */\n constructor (data) {\n this.frameData = data\n this.maskKey = crypto.randomBytes(4)\n }\n\n createFrame (opcode) {\n const bodyLength = this.frameData?.byteLength ?? 0\n\n /** @type {number} */\n let payloadLength = bodyLength // 0-125\n let offset = 6\n\n if (bodyLength > maxUnsigned16Bit) {\n offset += 8 // payload length is next 8 bytes\n payloadLength = 127\n } else if (bodyLength > 125) {\n offset += 2 // payload length is next 2 bytes\n payloadLength = 126\n }\n\n const buffer = Buffer.allocUnsafe(bodyLength + offset)\n\n // Clear first 2 bytes, everything else is overwritten\n buffer[0] = buffer[1] = 0\n buffer[0] |= 0x80 // FIN\n buffer[0] = (buffer[0] & 0xF0) + opcode // opcode\n\n /*! ws. MIT License. Einar Otto Stangvik */\n buffer[offset - 4] = this.maskKey[0]\n buffer[offset - 3] = this.maskKey[1]\n buffer[offset - 2] = this.maskKey[2]\n buffer[offset - 1] = this.maskKey[3]\n\n buffer[1] = payloadLength\n\n if (payloadLength === 126) {\n buffer.writeUInt16BE(bodyLength, 2)\n } else if (payloadLength === 127) {\n // Clear extended payload length\n buffer[2] = buffer[3] = 0\n buffer.writeUIntBE(bodyLength, 4, 6)\n }\n\n buffer[1] |= 0x80 // MASK\n\n // mask body\n for (let i = 0; i < bodyLength; i++) {\n buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]\n }\n\n return buffer\n }\n}\n\nmodule.exports = {\n WebsocketFrameSend\n}\n","'use strict'\n\nconst { Writable } = require('stream')\nconst diagnosticsChannel = require('diagnostics_channel')\nconst { parserStates, opcodes, states, emptyBuffer } = require('./constants')\nconst { kReadyState, kSentClose, kResponse, kReceivedClose } = require('./symbols')\nconst { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = require('./util')\nconst { WebsocketFrameSend } = require('./frame')\n\n// This code was influenced by ws released under the MIT license.\n// Copyright (c) 2011 Einar Otto Stangvik \n// Copyright (c) 2013 Arnout Kazemier and contributors\n// Copyright (c) 2016 Luigi Pinca and contributors\n\nconst channels = {}\nchannels.ping = diagnosticsChannel.channel('undici:websocket:ping')\nchannels.pong = diagnosticsChannel.channel('undici:websocket:pong')\n\nclass ByteParser extends Writable {\n #buffers = []\n #byteOffset = 0\n\n #state = parserStates.INFO\n\n #info = {}\n #fragments = []\n\n constructor (ws) {\n super()\n\n this.ws = ws\n }\n\n /**\n * @param {Buffer} chunk\n * @param {() => void} callback\n */\n _write (chunk, _, callback) {\n this.#buffers.push(chunk)\n this.#byteOffset += chunk.length\n\n this.run(callback)\n }\n\n /**\n * Runs whenever a new chunk is received.\n * Callback is called whenever there are no more chunks buffering,\n * or not enough bytes are buffered to parse.\n */\n run (callback) {\n while (true) {\n if (this.#state === parserStates.INFO) {\n // If there aren't enough bytes to parse the payload length, etc.\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n\n this.#info.fin = (buffer[0] & 0x80) !== 0\n this.#info.opcode = buffer[0] & 0x0F\n\n // If we receive a fragmented message, we use the type of the first\n // frame to parse the full message as binary/text, when it's terminated\n this.#info.originalOpcode ??= this.#info.opcode\n\n this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION\n\n if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) {\n // Only text and binary frames can be fragmented\n failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.')\n return\n }\n\n const payloadLength = buffer[1] & 0x7F\n\n if (payloadLength <= 125) {\n this.#info.payloadLength = payloadLength\n this.#state = parserStates.READ_DATA\n } else if (payloadLength === 126) {\n this.#state = parserStates.PAYLOADLENGTH_16\n } else if (payloadLength === 127) {\n this.#state = parserStates.PAYLOADLENGTH_64\n }\n\n if (this.#info.fragmented && payloadLength > 125) {\n // A fragmented frame can't be fragmented itself\n failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.')\n return\n } else if (\n (this.#info.opcode === opcodes.PING ||\n this.#info.opcode === opcodes.PONG ||\n this.#info.opcode === opcodes.CLOSE) &&\n payloadLength > 125\n ) {\n // Control frames can have a payload length of 125 bytes MAX\n failWebsocketConnection(this.ws, 'Payload length for control frame exceeded 125 bytes.')\n return\n } else if (this.#info.opcode === opcodes.CLOSE) {\n if (payloadLength === 1) {\n failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.')\n return\n }\n\n const body = this.consume(payloadLength)\n\n this.#info.closeInfo = this.parseCloseBody(false, body)\n\n if (!this.ws[kSentClose]) {\n // If an endpoint receives a Close frame and did not previously send a\n // Close frame, the endpoint MUST send a Close frame in response. (When\n // sending a Close frame in response, the endpoint typically echos the\n // status code it received.)\n const body = Buffer.allocUnsafe(2)\n body.writeUInt16BE(this.#info.closeInfo.code, 0)\n const closeFrame = new WebsocketFrameSend(body)\n\n this.ws[kResponse].socket.write(\n closeFrame.createFrame(opcodes.CLOSE),\n (err) => {\n if (!err) {\n this.ws[kSentClose] = true\n }\n }\n )\n }\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n this.ws[kReadyState] = states.CLOSING\n this.ws[kReceivedClose] = true\n\n this.end()\n\n return\n } else if (this.#info.opcode === opcodes.PING) {\n // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in\n // response, unless it already received a Close frame.\n // A Pong frame sent in response to a Ping frame must have identical\n // \"Application data\"\n\n const body = this.consume(payloadLength)\n\n if (!this.ws[kReceivedClose]) {\n const frame = new WebsocketFrameSend(body)\n\n this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG))\n\n if (channels.ping.hasSubscribers) {\n channels.ping.publish({\n payload: body\n })\n }\n }\n\n this.#state = parserStates.INFO\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n return\n }\n } else if (this.#info.opcode === opcodes.PONG) {\n // A Pong frame MAY be sent unsolicited. This serves as a\n // unidirectional heartbeat. A response to an unsolicited Pong frame is\n // not expected.\n\n const body = this.consume(payloadLength)\n\n if (channels.pong.hasSubscribers) {\n channels.pong.publish({\n payload: body\n })\n }\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n return\n }\n }\n } else if (this.#state === parserStates.PAYLOADLENGTH_16) {\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n\n this.#info.payloadLength = buffer.readUInt16BE(0)\n this.#state = parserStates.READ_DATA\n } else if (this.#state === parserStates.PAYLOADLENGTH_64) {\n if (this.#byteOffset < 8) {\n return callback()\n }\n\n const buffer = this.consume(8)\n const upper = buffer.readUInt32BE(0)\n\n // 2^31 is the maxinimum bytes an arraybuffer can contain\n // on 32-bit systems. Although, on 64-bit systems, this is\n // 2^53-1 bytes.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e\n if (upper > 2 ** 31 - 1) {\n failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.')\n return\n }\n\n const lower = buffer.readUInt32BE(4)\n\n this.#info.payloadLength = (upper << 8) + lower\n this.#state = parserStates.READ_DATA\n } else if (this.#state === parserStates.READ_DATA) {\n if (this.#byteOffset < this.#info.payloadLength) {\n // If there is still more data in this chunk that needs to be read\n return callback()\n } else if (this.#byteOffset >= this.#info.payloadLength) {\n // If the server sent multiple frames in a single chunk\n\n const body = this.consume(this.#info.payloadLength)\n\n this.#fragments.push(body)\n\n // If the frame is unfragmented, or a fragmented frame was terminated,\n // a message was received\n if (!this.#info.fragmented || (this.#info.fin && this.#info.opcode === opcodes.CONTINUATION)) {\n const fullMessage = Buffer.concat(this.#fragments)\n\n websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage)\n\n this.#info = {}\n this.#fragments.length = 0\n }\n\n this.#state = parserStates.INFO\n }\n }\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n break\n }\n }\n }\n\n /**\n * Take n bytes from the buffered Buffers\n * @param {number} n\n * @returns {Buffer|null}\n */\n consume (n) {\n if (n > this.#byteOffset) {\n return null\n } else if (n === 0) {\n return emptyBuffer\n }\n\n if (this.#buffers[0].length === n) {\n this.#byteOffset -= this.#buffers[0].length\n return this.#buffers.shift()\n }\n\n const buffer = Buffer.allocUnsafe(n)\n let offset = 0\n\n while (offset !== n) {\n const next = this.#buffers[0]\n const { length } = next\n\n if (length + offset === n) {\n buffer.set(this.#buffers.shift(), offset)\n break\n } else if (length + offset > n) {\n buffer.set(next.subarray(0, n - offset), offset)\n this.#buffers[0] = next.subarray(n - offset)\n break\n } else {\n buffer.set(this.#buffers.shift(), offset)\n offset += next.length\n }\n }\n\n this.#byteOffset -= n\n\n return buffer\n }\n\n parseCloseBody (onlyCode, data) {\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5\n /** @type {number|undefined} */\n let code\n\n if (data.length >= 2) {\n // _The WebSocket Connection Close Code_ is\n // defined as the status code (Section 7.4) contained in the first Close\n // control frame received by the application\n code = data.readUInt16BE(0)\n }\n\n if (onlyCode) {\n if (!isValidStatusCode(code)) {\n return null\n }\n\n return { code }\n }\n\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6\n /** @type {Buffer} */\n let reason = data.subarray(2)\n\n // Remove BOM\n if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) {\n reason = reason.subarray(3)\n }\n\n if (code !== undefined && !isValidStatusCode(code)) {\n return null\n }\n\n try {\n // TODO: optimize this\n reason = new TextDecoder('utf-8', { fatal: true }).decode(reason)\n } catch {\n return null\n }\n\n return { code, reason }\n }\n\n get closingInfo () {\n return this.#info.closeInfo\n }\n}\n\nmodule.exports = {\n ByteParser\n}\n","'use strict'\n\nmodule.exports = {\n kWebSocketURL: Symbol('url'),\n kReadyState: Symbol('ready state'),\n kController: Symbol('controller'),\n kResponse: Symbol('response'),\n kBinaryType: Symbol('binary type'),\n kSentClose: Symbol('sent close'),\n kReceivedClose: Symbol('received close'),\n kByteParser: Symbol('byte parser')\n}\n","'use strict'\n\nconst { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require('./symbols')\nconst { states, opcodes } = require('./constants')\nconst { MessageEvent, ErrorEvent } = require('./events')\n\n/* globals Blob */\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isEstablished (ws) {\n // If the server's response is validated as provided for above, it is\n // said that _The WebSocket Connection is Established_ and that the\n // WebSocket Connection is in the OPEN state.\n return ws[kReadyState] === states.OPEN\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isClosing (ws) {\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n return ws[kReadyState] === states.CLOSING\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isClosed (ws) {\n return ws[kReadyState] === states.CLOSED\n}\n\n/**\n * @see https://dom.spec.whatwg.org/#concept-event-fire\n * @param {string} e\n * @param {EventTarget} target\n * @param {EventInit | undefined} eventInitDict\n */\nfunction fireEvent (e, target, eventConstructor = Event, eventInitDict) {\n // 1. If eventConstructor is not given, then let eventConstructor be Event.\n\n // 2. Let event be the result of creating an event given eventConstructor,\n // in the relevant realm of target.\n // 3. Initialize event’s type attribute to e.\n const event = new eventConstructor(e, eventInitDict) // eslint-disable-line new-cap\n\n // 4. Initialize any other IDL attributes of event as described in the\n // invocation of this algorithm.\n\n // 5. Return the result of dispatching event at target, with legacy target\n // override flag set if set.\n target.dispatchEvent(event)\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @param {import('./websocket').WebSocket} ws\n * @param {number} type Opcode\n * @param {Buffer} data application data\n */\nfunction websocketMessageReceived (ws, type, data) {\n // 1. If ready state is not OPEN (1), then return.\n if (ws[kReadyState] !== states.OPEN) {\n return\n }\n\n // 2. Let dataForEvent be determined by switching on type and binary type:\n let dataForEvent\n\n if (type === opcodes.TEXT) {\n // -> type indicates that the data is Text\n // a new DOMString containing data\n try {\n dataForEvent = new TextDecoder('utf-8', { fatal: true }).decode(data)\n } catch {\n failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.')\n return\n }\n } else if (type === opcodes.BINARY) {\n if (ws[kBinaryType] === 'blob') {\n // -> type indicates that the data is Binary and binary type is \"blob\"\n // a new Blob object, created in the relevant Realm of the WebSocket\n // object, that represents data as its raw data\n dataForEvent = new Blob([data])\n } else {\n // -> type indicates that the data is Binary and binary type is \"arraybuffer\"\n // a new ArrayBuffer object, created in the relevant Realm of the\n // WebSocket object, whose contents are data\n dataForEvent = new Uint8Array(data).buffer\n }\n }\n\n // 3. Fire an event named message at the WebSocket object, using MessageEvent,\n // with the origin attribute initialized to the serialization of the WebSocket\n // object’s url's origin, and the data attribute initialized to dataForEvent.\n fireEvent('message', ws, MessageEvent, {\n origin: ws[kWebSocketURL].origin,\n data: dataForEvent\n })\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455\n * @see https://datatracker.ietf.org/doc/html/rfc2616\n * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407\n * @param {string} protocol\n */\nfunction isValidSubprotocol (protocol) {\n // If present, this value indicates one\n // or more comma-separated subprotocol the client wishes to speak,\n // ordered by preference. The elements that comprise this value\n // MUST be non-empty strings with characters in the range U+0021 to\n // U+007E not including separator characters as defined in\n // [RFC2616] and MUST all be unique strings.\n if (protocol.length === 0) {\n return false\n }\n\n for (const char of protocol) {\n const code = char.charCodeAt(0)\n\n if (\n code < 0x21 ||\n code > 0x7E ||\n char === '(' ||\n char === ')' ||\n char === '<' ||\n char === '>' ||\n char === '@' ||\n char === ',' ||\n char === ';' ||\n char === ':' ||\n char === '\\\\' ||\n char === '\"' ||\n char === '/' ||\n char === '[' ||\n char === ']' ||\n char === '?' ||\n char === '=' ||\n char === '{' ||\n char === '}' ||\n code === 32 || // SP\n code === 9 // HT\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4\n * @param {number} code\n */\nfunction isValidStatusCode (code) {\n if (code >= 1000 && code < 1015) {\n return (\n code !== 1004 && // reserved\n code !== 1005 && // \"MUST NOT be set as a status code\"\n code !== 1006 // \"MUST NOT be set as a status code\"\n )\n }\n\n return code >= 3000 && code <= 4999\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n * @param {string|undefined} reason\n */\nfunction failWebsocketConnection (ws, reason) {\n const { [kController]: controller, [kResponse]: response } = ws\n\n controller.abort()\n\n if (response?.socket && !response.socket.destroyed) {\n response.socket.destroy()\n }\n\n if (reason) {\n fireEvent('error', ws, ErrorEvent, {\n error: new Error(reason)\n })\n }\n}\n\nmodule.exports = {\n isEstablished,\n isClosing,\n isClosed,\n fireEvent,\n isValidSubprotocol,\n isValidStatusCode,\n failWebsocketConnection,\n websocketMessageReceived\n}\n","'use strict'\n\nconst { webidl } = require('../fetch/webidl')\nconst { DOMException } = require('../fetch/constants')\nconst { URLSerializer } = require('../fetch/dataURL')\nconst { getGlobalOrigin } = require('../fetch/global')\nconst { staticPropertyDescriptors, states, opcodes, emptyBuffer } = require('./constants')\nconst {\n kWebSocketURL,\n kReadyState,\n kController,\n kBinaryType,\n kResponse,\n kSentClose,\n kByteParser\n} = require('./symbols')\nconst { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = require('./util')\nconst { establishWebSocketConnection } = require('./connection')\nconst { WebsocketFrameSend } = require('./frame')\nconst { ByteParser } = require('./receiver')\nconst { kEnumerableProperty, isBlobLike } = require('../core/util')\nconst { getGlobalDispatcher } = require('../global')\nconst { types } = require('util')\n\nlet experimentalWarned = false\n\n// https://websockets.spec.whatwg.org/#interface-definition\nclass WebSocket extends EventTarget {\n #events = {\n open: null,\n error: null,\n close: null,\n message: null\n }\n\n #bufferedAmount = 0\n #protocol = ''\n #extensions = ''\n\n /**\n * @param {string} url\n * @param {string|string[]} protocols\n */\n constructor (url, protocols = []) {\n super()\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket constructor' })\n\n if (!experimentalWarned) {\n experimentalWarned = true\n process.emitWarning('WebSockets are experimental, expect them to change at any time.', {\n code: 'UNDICI-WS'\n })\n }\n\n const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols)\n\n url = webidl.converters.USVString(url)\n protocols = options.protocols\n\n // 1. Let baseURL be this's relevant settings object's API base URL.\n const baseURL = getGlobalOrigin()\n\n // 1. Let urlRecord be the result of applying the URL parser to url with baseURL.\n let urlRecord\n\n try {\n urlRecord = new URL(url, baseURL)\n } catch (e) {\n // 3. If urlRecord is failure, then throw a \"SyntaxError\" DOMException.\n throw new DOMException(e, 'SyntaxError')\n }\n\n // 4. If urlRecord’s scheme is \"http\", then set urlRecord’s scheme to \"ws\".\n if (urlRecord.protocol === 'http:') {\n urlRecord.protocol = 'ws:'\n } else if (urlRecord.protocol === 'https:') {\n // 5. Otherwise, if urlRecord’s scheme is \"https\", set urlRecord’s scheme to \"wss\".\n urlRecord.protocol = 'wss:'\n }\n\n // 6. If urlRecord’s scheme is not \"ws\" or \"wss\", then throw a \"SyntaxError\" DOMException.\n if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') {\n throw new DOMException(\n `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`,\n 'SyntaxError'\n )\n }\n\n // 7. If urlRecord’s fragment is non-null, then throw a \"SyntaxError\"\n // DOMException.\n if (urlRecord.hash || urlRecord.href.endsWith('#')) {\n throw new DOMException('Got fragment', 'SyntaxError')\n }\n\n // 8. If protocols is a string, set protocols to a sequence consisting\n // of just that string.\n if (typeof protocols === 'string') {\n protocols = [protocols]\n }\n\n // 9. If any of the values in protocols occur more than once or otherwise\n // fail to match the requirements for elements that comprise the value\n // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket\n // protocol, then throw a \"SyntaxError\" DOMException.\n if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n // 10. Set this's url to urlRecord.\n this[kWebSocketURL] = new URL(urlRecord.href)\n\n // 11. Let client be this's relevant settings object.\n\n // 12. Run this step in parallel:\n\n // 1. Establish a WebSocket connection given urlRecord, protocols,\n // and client.\n this[kController] = establishWebSocketConnection(\n urlRecord,\n protocols,\n this,\n (response) => this.#onConnectionEstablished(response),\n options\n )\n\n // Each WebSocket object has an associated ready state, which is a\n // number representing the state of the connection. Initially it must\n // be CONNECTING (0).\n this[kReadyState] = WebSocket.CONNECTING\n\n // The extensions attribute must initially return the empty string.\n\n // The protocol attribute must initially return the empty string.\n\n // Each WebSocket object has an associated binary type, which is a\n // BinaryType. Initially it must be \"blob\".\n this[kBinaryType] = 'blob'\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-close\n * @param {number|undefined} code\n * @param {string|undefined} reason\n */\n close (code = undefined, reason = undefined) {\n webidl.brandCheck(this, WebSocket)\n\n if (code !== undefined) {\n code = webidl.converters['unsigned short'](code, { clamp: true })\n }\n\n if (reason !== undefined) {\n reason = webidl.converters.USVString(reason)\n }\n\n // 1. If code is present, but is neither an integer equal to 1000 nor an\n // integer in the range 3000 to 4999, inclusive, throw an\n // \"InvalidAccessError\" DOMException.\n if (code !== undefined) {\n if (code !== 1000 && (code < 3000 || code > 4999)) {\n throw new DOMException('invalid code', 'InvalidAccessError')\n }\n }\n\n let reasonByteLength = 0\n\n // 2. If reason is present, then run these substeps:\n if (reason !== undefined) {\n // 1. Let reasonBytes be the result of encoding reason.\n // 2. If reasonBytes is longer than 123 bytes, then throw a\n // \"SyntaxError\" DOMException.\n reasonByteLength = Buffer.byteLength(reason)\n\n if (reasonByteLength > 123) {\n throw new DOMException(\n `Reason must be less than 123 bytes; received ${reasonByteLength}`,\n 'SyntaxError'\n )\n }\n }\n\n // 3. Run the first matching steps from the following list:\n if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) {\n // If this's ready state is CLOSING (2) or CLOSED (3)\n // Do nothing.\n } else if (!isEstablished(this)) {\n // If the WebSocket connection is not yet established\n // Fail the WebSocket connection and set this's ready state\n // to CLOSING (2).\n failWebsocketConnection(this, 'Connection was closed before it was established.')\n this[kReadyState] = WebSocket.CLOSING\n } else if (!isClosing(this)) {\n // If the WebSocket closing handshake has not yet been started\n // Start the WebSocket closing handshake and set this's ready\n // state to CLOSING (2).\n // - If neither code nor reason is present, the WebSocket Close\n // message must not have a body.\n // - If code is present, then the status code to use in the\n // WebSocket Close message must be the integer given by code.\n // - If reason is also present, then reasonBytes must be\n // provided in the Close message after the status code.\n\n const frame = new WebsocketFrameSend()\n\n // If neither code nor reason is present, the WebSocket Close\n // message must not have a body.\n\n // If code is present, then the status code to use in the\n // WebSocket Close message must be the integer given by code.\n if (code !== undefined && reason === undefined) {\n frame.frameData = Buffer.allocUnsafe(2)\n frame.frameData.writeUInt16BE(code, 0)\n } else if (code !== undefined && reason !== undefined) {\n // If reason is also present, then reasonBytes must be\n // provided in the Close message after the status code.\n frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength)\n frame.frameData.writeUInt16BE(code, 0)\n // the body MAY contain UTF-8-encoded data with value /reason/\n frame.frameData.write(reason, 2, 'utf-8')\n } else {\n frame.frameData = emptyBuffer\n }\n\n /** @type {import('stream').Duplex} */\n const socket = this[kResponse].socket\n\n socket.write(frame.createFrame(opcodes.CLOSE), (err) => {\n if (!err) {\n this[kSentClose] = true\n }\n })\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n this[kReadyState] = states.CLOSING\n } else {\n // Otherwise\n // Set this's ready state to CLOSING (2).\n this[kReadyState] = WebSocket.CLOSING\n }\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-send\n * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data\n */\n send (data) {\n webidl.brandCheck(this, WebSocket)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket.send' })\n\n data = webidl.converters.WebSocketSendData(data)\n\n // 1. If this's ready state is CONNECTING, then throw an\n // \"InvalidStateError\" DOMException.\n if (this[kReadyState] === WebSocket.CONNECTING) {\n throw new DOMException('Sent before connected.', 'InvalidStateError')\n }\n\n // 2. Run the appropriate set of steps from the following list:\n // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1\n // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n\n if (!isEstablished(this) || isClosing(this)) {\n return\n }\n\n /** @type {import('stream').Duplex} */\n const socket = this[kResponse].socket\n\n // If data is a string\n if (typeof data === 'string') {\n // If the WebSocket connection is established and the WebSocket\n // closing handshake has not yet started, then the user agent\n // must send a WebSocket Message comprised of the data argument\n // using a text frame opcode; if the data cannot be sent, e.g.\n // because it would need to be buffered but the buffer is full,\n // the user agent must flag the WebSocket as full and then close\n // the WebSocket connection. Any invocation of this method with a\n // string argument that does not throw an exception must increase\n // the bufferedAmount attribute by the number of bytes needed to\n // express the argument as UTF-8.\n\n const value = Buffer.from(data)\n const frame = new WebsocketFrameSend(value)\n const buffer = frame.createFrame(opcodes.TEXT)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n } else if (types.isArrayBuffer(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need\n // to be buffered but the buffer is full, the user agent must flag\n // the WebSocket as full and then close the WebSocket connection.\n // The data to be sent is the data stored in the buffer described\n // by the ArrayBuffer object. Any invocation of this method with an\n // ArrayBuffer argument that does not throw an exception must\n // increase the bufferedAmount attribute by the length of the\n // ArrayBuffer in bytes.\n\n const value = Buffer.from(data)\n const frame = new WebsocketFrameSend(value)\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n } else if (ArrayBuffer.isView(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The\n // data to be sent is the data stored in the section of the buffer\n // described by the ArrayBuffer object that data references. Any\n // invocation of this method with this kind of argument that does\n // not throw an exception must increase the bufferedAmount attribute\n // by the length of data’s buffer in bytes.\n\n const ab = Buffer.from(data, data.byteOffset, data.byteLength)\n\n const frame = new WebsocketFrameSend(ab)\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += ab.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= ab.byteLength\n })\n } else if (isBlobLike(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The data\n // to be sent is the raw data represented by the Blob object. Any\n // invocation of this method with a Blob argument that does not throw\n // an exception must increase the bufferedAmount attribute by the size\n // of the Blob object’s raw data, in bytes.\n\n const frame = new WebsocketFrameSend()\n\n data.arrayBuffer().then((ab) => {\n const value = Buffer.from(ab)\n frame.frameData = value\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n })\n }\n }\n\n get readyState () {\n webidl.brandCheck(this, WebSocket)\n\n // The readyState getter steps are to return this's ready state.\n return this[kReadyState]\n }\n\n get bufferedAmount () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#bufferedAmount\n }\n\n get url () {\n webidl.brandCheck(this, WebSocket)\n\n // The url getter steps are to return this's url, serialized.\n return URLSerializer(this[kWebSocketURL])\n }\n\n get extensions () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#extensions\n }\n\n get protocol () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#protocol\n }\n\n get onopen () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.open\n }\n\n set onopen (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.open) {\n this.removeEventListener('open', this.#events.open)\n }\n\n if (typeof fn === 'function') {\n this.#events.open = fn\n this.addEventListener('open', fn)\n } else {\n this.#events.open = null\n }\n }\n\n get onerror () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.error\n }\n\n set onerror (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.error) {\n this.removeEventListener('error', this.#events.error)\n }\n\n if (typeof fn === 'function') {\n this.#events.error = fn\n this.addEventListener('error', fn)\n } else {\n this.#events.error = null\n }\n }\n\n get onclose () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.close\n }\n\n set onclose (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.close) {\n this.removeEventListener('close', this.#events.close)\n }\n\n if (typeof fn === 'function') {\n this.#events.close = fn\n this.addEventListener('close', fn)\n } else {\n this.#events.close = null\n }\n }\n\n get onmessage () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.message\n }\n\n set onmessage (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.message) {\n this.removeEventListener('message', this.#events.message)\n }\n\n if (typeof fn === 'function') {\n this.#events.message = fn\n this.addEventListener('message', fn)\n } else {\n this.#events.message = null\n }\n }\n\n get binaryType () {\n webidl.brandCheck(this, WebSocket)\n\n return this[kBinaryType]\n }\n\n set binaryType (type) {\n webidl.brandCheck(this, WebSocket)\n\n if (type !== 'blob' && type !== 'arraybuffer') {\n this[kBinaryType] = 'blob'\n } else {\n this[kBinaryType] = type\n }\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n */\n #onConnectionEstablished (response) {\n // processResponse is called when the \"response’s header list has been received and initialized.\"\n // once this happens, the connection is open\n this[kResponse] = response\n\n const parser = new ByteParser(this)\n parser.on('drain', function onParserDrain () {\n this.ws[kResponse].socket.resume()\n })\n\n response.socket.ws = this\n this[kByteParser] = parser\n\n // 1. Change the ready state to OPEN (1).\n this[kReadyState] = states.OPEN\n\n // 2. Change the extensions attribute’s value to the extensions in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1\n const extensions = response.headersList.get('sec-websocket-extensions')\n\n if (extensions !== null) {\n this.#extensions = extensions\n }\n\n // 3. Change the protocol attribute’s value to the subprotocol in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9\n const protocol = response.headersList.get('sec-websocket-protocol')\n\n if (protocol !== null) {\n this.#protocol = protocol\n }\n\n // 4. Fire an event named open at the WebSocket object.\n fireEvent('open', this)\n }\n}\n\n// https://websockets.spec.whatwg.org/#dom-websocket-connecting\nWebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING\n// https://websockets.spec.whatwg.org/#dom-websocket-open\nWebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN\n// https://websockets.spec.whatwg.org/#dom-websocket-closing\nWebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING\n// https://websockets.spec.whatwg.org/#dom-websocket-closed\nWebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED\n\nObject.defineProperties(WebSocket.prototype, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors,\n url: kEnumerableProperty,\n readyState: kEnumerableProperty,\n bufferedAmount: kEnumerableProperty,\n onopen: kEnumerableProperty,\n onerror: kEnumerableProperty,\n onclose: kEnumerableProperty,\n close: kEnumerableProperty,\n onmessage: kEnumerableProperty,\n binaryType: kEnumerableProperty,\n send: kEnumerableProperty,\n extensions: kEnumerableProperty,\n protocol: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'WebSocket',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nObject.defineProperties(WebSocket, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors\n})\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.DOMString\n)\n\nwebidl.converters['DOMString or sequence'] = function (V) {\n if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) {\n return webidl.converters['sequence'](V)\n }\n\n return webidl.converters.DOMString(V)\n}\n\n// This implements the propsal made in https://github.com/whatwg/websockets/issues/42\nwebidl.converters.WebSocketInit = webidl.dictionaryConverter([\n {\n key: 'protocols',\n converter: webidl.converters['DOMString or sequence'],\n get defaultValue () {\n return []\n }\n },\n {\n key: 'dispatcher',\n converter: (V) => V,\n get defaultValue () {\n return getGlobalDispatcher()\n }\n },\n {\n key: 'headers',\n converter: webidl.nullableConverter(webidl.converters.HeadersInit)\n }\n])\n\nwebidl.converters['DOMString or sequence or WebSocketInit'] = function (V) {\n if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) {\n return webidl.converters.WebSocketInit(V)\n }\n\n return { protocols: webidl.converters['DOMString or sequence'](V) }\n}\n\nwebidl.converters.WebSocketSendData = function (V) {\n if (webidl.util.Type(V) === 'Object') {\n if (isBlobLike(V)) {\n return webidl.converters.Blob(V, { strict: false })\n }\n\n if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) {\n return webidl.converters.BufferSource(V)\n }\n }\n\n return webidl.converters.USVString(V)\n}\n\nmodule.exports = {\n WebSocket\n}\n","/*\r\n * xpath.js\r\n *\r\n * An XPath 1.0 library for JavaScript.\r\n *\r\n * Cameron McCormack \r\n *\r\n * This work is licensed under the MIT License.\r\n *\r\n * Revision 20: April 26, 2011\r\n * Fixed a typo resulting in FIRST_ORDERED_NODE_TYPE results being wrong,\r\n * thanks to .\r\n *\r\n * Revision 19: November 29, 2005\r\n * Nodesets now store their nodes in a height balanced tree, increasing\r\n * performance for the common case of selecting nodes in document order,\r\n * thanks to Sébastien Cramatte .\r\n * AVL tree code adapted from Raimund Neumann .\r\n *\r\n * Revision 18: October 27, 2005\r\n * DOM 3 XPath support. Caveats:\r\n * - namespace prefixes aren't resolved in XPathEvaluator.createExpression,\r\n * but in XPathExpression.evaluate.\r\n * - XPathResult.invalidIteratorState is not implemented.\r\n *\r\n * Revision 17: October 25, 2005\r\n * Some core XPath function fixes and a patch to avoid crashing certain\r\n * versions of MSXML in PathExpr.prototype.getOwnerElement, thanks to\r\n * Sébastien Cramatte .\r\n *\r\n * Revision 16: September 22, 2005\r\n * Workarounds for some IE 5.5 deficiencies.\r\n * Fixed problem with prefix node tests on attribute nodes.\r\n *\r\n * Revision 15: May 21, 2005\r\n * Fixed problem with QName node tests on elements with an xmlns=\"...\".\r\n *\r\n * Revision 14: May 19, 2005\r\n * Fixed QName node tests on attribute node regression.\r\n *\r\n * Revision 13: May 3, 2005\r\n * Node tests are case insensitive now if working in an HTML DOM.\r\n *\r\n * Revision 12: April 26, 2005\r\n * Updated licence. Slight code changes to enable use of Dean\r\n * Edwards' script compression, http://dean.edwards.name/packer/ .\r\n *\r\n * Revision 11: April 23, 2005\r\n * Fixed bug with 'and' and 'or' operators, fix thanks to\r\n * Sandy McArthur .\r\n *\r\n * Revision 10: April 15, 2005\r\n * Added support for a virtual root node, supposedly helpful for\r\n * implementing XForms. Fixed problem with QName node tests and\r\n * the parent axis.\r\n *\r\n * Revision 9: March 17, 2005\r\n * Namespace resolver tweaked so using the document node as the context\r\n * for namespace lookups is equivalent to using the document element.\r\n *\r\n * Revision 8: February 13, 2005\r\n * Handle implicit declaration of 'xmlns' namespace prefix.\r\n * Fixed bug when comparing nodesets.\r\n * Instance data can now be associated with a FunctionResolver, and\r\n * workaround for MSXML not supporting 'localName' and 'getElementById',\r\n * thanks to Grant Gongaware.\r\n * Fix a few problems when the context node is the root node.\r\n *\r\n * Revision 7: February 11, 2005\r\n * Default namespace resolver fix from Grant Gongaware\r\n * .\r\n *\r\n * Revision 6: February 10, 2005\r\n * Fixed bug in 'number' function.\r\n *\r\n * Revision 5: February 9, 2005\r\n * Fixed bug where text nodes not getting converted to string values.\r\n *\r\n * Revision 4: January 21, 2005\r\n * Bug in 'name' function, fix thanks to Bill Edney.\r\n * Fixed incorrect processing of namespace nodes.\r\n * Fixed NamespaceResolver to resolve 'xml' namespace.\r\n * Implemented union '|' operator.\r\n *\r\n * Revision 3: January 14, 2005\r\n * Fixed bug with nodeset comparisons, bug lexing < and >.\r\n *\r\n * Revision 2: October 26, 2004\r\n * QName node test namespace handling fixed. Few other bug fixes.\r\n *\r\n * Revision 1: August 13, 2004\r\n * Bug fixes from William J. Edney .\r\n * Added minimal licence.\r\n *\r\n * Initial version: June 14, 2004\r\n */\r\n\r\n// non-node wrapper\r\nvar xpath = (typeof exports === 'undefined') ? {} : exports;\r\n\r\n(function (exports) {\r\n \"use strict\";\r\n\r\n // namespace nodes are not part of the DOM spec, so we use a custom nodetype for them.\r\n // should NOT be used externally\r\n var NAMESPACE_NODE_NODETYPE = '__namespace';\r\n\r\n var isNil = function (x) {\r\n return x === null || x === undefined;\r\n };\r\n\r\n var isValidNodeType = function (nodeType) {\r\n return nodeType === NAMESPACE_NODE_NODETYPE ||\r\n (Number.isInteger(nodeType)\r\n && nodeType >= 1\r\n && nodeType <= 11\r\n );\r\n };\r\n\r\n var isNodeLike = function (value) {\r\n return value\r\n && isValidNodeType(value.nodeType)\r\n && typeof value.nodeName === \"string\";\r\n };\r\n\r\n // functional helpers\r\n function curry(func) {\r\n var slice = Array.prototype.slice,\r\n totalargs = func.length,\r\n partial = function (args, fn) {\r\n return function () {\r\n return fn.apply(this, args.concat(slice.call(arguments)));\r\n }\r\n },\r\n fn = function () {\r\n var args = slice.call(arguments);\r\n return (args.length < totalargs) ?\r\n partial(args, fn) :\r\n func.apply(this, slice.apply(arguments, [0, totalargs]));\r\n };\r\n return fn;\r\n }\r\n\r\n var forEach = function (f, xs) {\r\n for (var i = 0; i < xs.length; i += 1) {\r\n f(xs[i], i, xs);\r\n }\r\n };\r\n\r\n var reduce = function (f, seed, xs) {\r\n var acc = seed;\r\n\r\n forEach(function (x, i) { acc = f(acc, x, i); }, xs);\r\n\r\n return acc;\r\n };\r\n\r\n var map = function (f, xs) {\r\n var mapped = new Array(xs.length);\r\n\r\n forEach(function (x, i) { mapped[i] = f(x); }, xs);\r\n\r\n return mapped;\r\n };\r\n\r\n var filter = function (f, xs) {\r\n var filtered = [];\r\n\r\n forEach(function (x, i) { if (f(x, i)) { filtered.push(x); } }, xs);\r\n\r\n return filtered;\r\n };\r\n\r\n var includes = function (values, value) {\r\n for (var i = 0; i < values.length; i += 1) {\r\n if (values[i] === value) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n function always(value) { return function () { return value; } }\r\n\r\n function toString(x) { return x.toString(); }\r\n var join = function (s, xs) { return xs.join(s); };\r\n var wrap = function (pref, suf, str) { return pref + str + suf; };\r\n\r\n var prototypeConcat = Array.prototype.concat;\r\n\r\n var sortNodes = function (nodes, reverse) {\r\n var ns = new XNodeSet();\r\n\r\n ns.addArray(nodes);\r\n\r\n var sorted = ns.toArray();\r\n\r\n return reverse ? sorted.reverse() : sorted;\r\n }\r\n\r\n // .apply() fails above a certain number of arguments - https://github.com/goto100/xpath/pull/98\r\n var MAX_ARGUMENT_LENGTH = 32767;\r\n\r\n function flatten(arr) {\r\n var result = [];\r\n\r\n for (var start = 0; start < arr.length; start += MAX_ARGUMENT_LENGTH) {\r\n var chunk = arr.slice(start, start + MAX_ARGUMENT_LENGTH);\r\n\r\n result = prototypeConcat.apply(result, chunk);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function assign(target, varArgs) { // .length of function is 2\r\n var to = Object(target);\r\n\r\n for (var index = 1; index < arguments.length; index++) {\r\n var nextSource = arguments[index];\r\n\r\n if (nextSource != null) { // Skip over if undefined or null\r\n for (var nextKey in nextSource) {\r\n // Avoid bugs when hasOwnProperty is shadowed\r\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\r\n to[nextKey] = nextSource[nextKey];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return to;\r\n }\r\n\r\n var NodeTypes = {\r\n ELEMENT_NODE: 1,\r\n ATTRIBUTE_NODE: 2,\r\n TEXT_NODE: 3,\r\n CDATA_SECTION_NODE: 4,\r\n PROCESSING_INSTRUCTION_NODE: 7,\r\n COMMENT_NODE: 8,\r\n DOCUMENT_NODE: 9,\r\n DOCUMENT_TYPE_NODE: 10,\r\n DOCUMENT_FRAGMENT_NODE: 11,\r\n NAMESPACE_NODE: NAMESPACE_NODE_NODETYPE,\r\n };\r\n\r\n // XPathParser ///////////////////////////////////////////////////////////////\r\n\r\n XPathParser.prototype = new Object();\r\n XPathParser.prototype.constructor = XPathParser;\r\n XPathParser.superclass = Object.prototype;\r\n\r\n function XPathParser() {\r\n this.init();\r\n }\r\n\r\n XPathParser.prototype.init = function () {\r\n this.reduceActions = [];\r\n\r\n this.reduceActions[3] = function (rhs) {\r\n return new OrOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[5] = function (rhs) {\r\n return new AndOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[7] = function (rhs) {\r\n return new EqualsOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[8] = function (rhs) {\r\n return new NotEqualOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[10] = function (rhs) {\r\n return new LessThanOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[11] = function (rhs) {\r\n return new GreaterThanOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[12] = function (rhs) {\r\n return new LessThanOrEqualOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[13] = function (rhs) {\r\n return new GreaterThanOrEqualOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[15] = function (rhs) {\r\n return new PlusOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[16] = function (rhs) {\r\n return new MinusOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[18] = function (rhs) {\r\n return new MultiplyOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[19] = function (rhs) {\r\n return new DivOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[20] = function (rhs) {\r\n return new ModOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[22] = function (rhs) {\r\n return new UnaryMinusOperation(rhs[1]);\r\n };\r\n this.reduceActions[24] = function (rhs) {\r\n return new BarOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[25] = function (rhs) {\r\n return new PathExpr(undefined, undefined, rhs[0]);\r\n };\r\n this.reduceActions[27] = function (rhs) {\r\n rhs[0].locationPath = rhs[2];\r\n return rhs[0];\r\n };\r\n this.reduceActions[28] = function (rhs) {\r\n rhs[0].locationPath = rhs[2];\r\n rhs[0].locationPath.steps.unshift(new Step(Step.DESCENDANTORSELF, NodeTest.nodeTest, []));\r\n return rhs[0];\r\n };\r\n this.reduceActions[29] = function (rhs) {\r\n return new PathExpr(rhs[0], [], undefined);\r\n };\r\n this.reduceActions[30] = function (rhs) {\r\n if (Utilities.instance_of(rhs[0], PathExpr)) {\r\n if (rhs[0].filterPredicates == undefined) {\r\n rhs[0].filterPredicates = [];\r\n }\r\n rhs[0].filterPredicates.push(rhs[1]);\r\n return rhs[0];\r\n } else {\r\n return new PathExpr(rhs[0], [rhs[1]], undefined);\r\n }\r\n };\r\n this.reduceActions[32] = function (rhs) {\r\n return rhs[1];\r\n };\r\n this.reduceActions[33] = function (rhs) {\r\n return new XString(rhs[0]);\r\n };\r\n this.reduceActions[34] = function (rhs) {\r\n return new XNumber(rhs[0]);\r\n };\r\n this.reduceActions[36] = function (rhs) {\r\n return new FunctionCall(rhs[0], []);\r\n };\r\n this.reduceActions[37] = function (rhs) {\r\n return new FunctionCall(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[38] = function (rhs) {\r\n return [rhs[0]];\r\n };\r\n this.reduceActions[39] = function (rhs) {\r\n rhs[2].unshift(rhs[0]);\r\n return rhs[2];\r\n };\r\n this.reduceActions[43] = function (rhs) {\r\n return new LocationPath(true, []);\r\n };\r\n this.reduceActions[44] = function (rhs) {\r\n rhs[1].absolute = true;\r\n return rhs[1];\r\n };\r\n this.reduceActions[46] = function (rhs) {\r\n return new LocationPath(false, [rhs[0]]);\r\n };\r\n this.reduceActions[47] = function (rhs) {\r\n rhs[0].steps.push(rhs[2]);\r\n return rhs[0];\r\n };\r\n this.reduceActions[49] = function (rhs) {\r\n return new Step(rhs[0], rhs[1], []);\r\n };\r\n this.reduceActions[50] = function (rhs) {\r\n return new Step(Step.CHILD, rhs[0], []);\r\n };\r\n this.reduceActions[51] = function (rhs) {\r\n return new Step(rhs[0], rhs[1], rhs[2]);\r\n };\r\n this.reduceActions[52] = function (rhs) {\r\n return new Step(Step.CHILD, rhs[0], rhs[1]);\r\n };\r\n this.reduceActions[54] = function (rhs) {\r\n return [rhs[0]];\r\n };\r\n this.reduceActions[55] = function (rhs) {\r\n rhs[1].unshift(rhs[0]);\r\n return rhs[1];\r\n };\r\n this.reduceActions[56] = function (rhs) {\r\n if (rhs[0] == \"ancestor\") {\r\n return Step.ANCESTOR;\r\n } else if (rhs[0] == \"ancestor-or-self\") {\r\n return Step.ANCESTORORSELF;\r\n } else if (rhs[0] == \"attribute\") {\r\n return Step.ATTRIBUTE;\r\n } else if (rhs[0] == \"child\") {\r\n return Step.CHILD;\r\n } else if (rhs[0] == \"descendant\") {\r\n return Step.DESCENDANT;\r\n } else if (rhs[0] == \"descendant-or-self\") {\r\n return Step.DESCENDANTORSELF;\r\n } else if (rhs[0] == \"following\") {\r\n return Step.FOLLOWING;\r\n } else if (rhs[0] == \"following-sibling\") {\r\n return Step.FOLLOWINGSIBLING;\r\n } else if (rhs[0] == \"namespace\") {\r\n return Step.NAMESPACE;\r\n } else if (rhs[0] == \"parent\") {\r\n return Step.PARENT;\r\n } else if (rhs[0] == \"preceding\") {\r\n return Step.PRECEDING;\r\n } else if (rhs[0] == \"preceding-sibling\") {\r\n return Step.PRECEDINGSIBLING;\r\n } else if (rhs[0] == \"self\") {\r\n return Step.SELF;\r\n }\r\n return -1;\r\n };\r\n this.reduceActions[57] = function (rhs) {\r\n return Step.ATTRIBUTE;\r\n };\r\n this.reduceActions[59] = function (rhs) {\r\n if (rhs[0] == \"comment\") {\r\n return NodeTest.commentTest;\r\n } else if (rhs[0] == \"text\") {\r\n return NodeTest.textTest;\r\n } else if (rhs[0] == \"processing-instruction\") {\r\n return NodeTest.anyPiTest;\r\n } else if (rhs[0] == \"node\") {\r\n return NodeTest.nodeTest;\r\n }\r\n return new NodeTest(-1, undefined);\r\n };\r\n this.reduceActions[60] = function (rhs) {\r\n return new NodeTest.PITest(rhs[2]);\r\n };\r\n this.reduceActions[61] = function (rhs) {\r\n return rhs[1];\r\n };\r\n this.reduceActions[63] = function (rhs) {\r\n rhs[1].absolute = true;\r\n rhs[1].steps.unshift(new Step(Step.DESCENDANTORSELF, NodeTest.nodeTest, []));\r\n return rhs[1];\r\n };\r\n this.reduceActions[64] = function (rhs) {\r\n rhs[0].steps.push(new Step(Step.DESCENDANTORSELF, NodeTest.nodeTest, []));\r\n rhs[0].steps.push(rhs[2]);\r\n return rhs[0];\r\n };\r\n this.reduceActions[65] = function (rhs) {\r\n return new Step(Step.SELF, NodeTest.nodeTest, []);\r\n };\r\n this.reduceActions[66] = function (rhs) {\r\n return new Step(Step.PARENT, NodeTest.nodeTest, []);\r\n };\r\n this.reduceActions[67] = function (rhs) {\r\n return new VariableReference(rhs[1]);\r\n };\r\n this.reduceActions[68] = function (rhs) {\r\n return NodeTest.nameTestAny;\r\n };\r\n this.reduceActions[69] = function (rhs) {\r\n return new NodeTest.NameTestPrefixAny(rhs[0].split(':')[0]);\r\n };\r\n this.reduceActions[70] = function (rhs) {\r\n return new NodeTest.NameTestQName(rhs[0]);\r\n };\r\n };\r\n\r\n XPathParser.actionTable = [\r\n \" s s sssssssss s ss s ss\",\r\n \" s \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \" rrrrr \",\r\n \" s s sssssssss s ss s ss\",\r\n \"rs rrrrrrrr s sssssrrrrrr rrs rs \",\r\n \" s s sssssssss s ss s ss\",\r\n \" s \",\r\n \" s \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" s \",\r\n \" s \",\r\n \" s s sssss s s \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"a \",\r\n \"r s rr r \",\r\n \"r sr rr r \",\r\n \"r s rr s rr r \",\r\n \"r rssrr rss rr r \",\r\n \"r rrrrr rrrss rr r \",\r\n \"r rrrrrsss rrrrr rr r \",\r\n \"r rrrrrrrr rrrrr rr r \",\r\n \"r rrrrrrrr rrrrrs rr r \",\r\n \"r rrrrrrrr rrrrrr rr r \",\r\n \"r rrrrrrrr rrrrrr rr r \",\r\n \"r srrrrrrrr rrrrrrs rr sr \",\r\n \"r srrrrrrrr rrrrrrs rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrr rrrrrr rr r \",\r\n \"r rrrrrrrr rrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \" sssss \",\r\n \"r rrrrrrrrr rrrrrrr rr sr \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" s \",\r\n \"r srrrrrrrr rrrrrrs rr r \",\r\n \"r rrrrrrrr rrrrr rr r \",\r\n \" s \",\r\n \" s \",\r\n \" rrrrr \",\r\n \" s s sssssssss s sss s ss\",\r\n \"r srrrrrrrr rrrrrrs rr r \",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssss s s \",\r\n \" s s sssss s s \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" s s sssss s s \",\r\n \" s s sssss s s \",\r\n \"r rrrrrrrrr rrrrrrr rr sr \",\r\n \"r rrrrrrrrr rrrrrrr rr sr \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" s \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" rr \",\r\n \" s \",\r\n \" rs \",\r\n \"r sr rr r \",\r\n \"r s rr s rr r \",\r\n \"r rssrr rss rr r \",\r\n \"r rssrr rss rr r \",\r\n \"r rrrrr rrrss rr r \",\r\n \"r rrrrr rrrss rr r \",\r\n \"r rrrrr rrrss rr r \",\r\n \"r rrrrr rrrss rr r \",\r\n \"r rrrrrsss rrrrr rr r \",\r\n \"r rrrrrsss rrrrr rr r \",\r\n \"r rrrrrrrr rrrrr rr r \",\r\n \"r rrrrrrrr rrrrr rr r \",\r\n \"r rrrrrrrr rrrrr rr r \",\r\n \"r rrrrrrrr rrrrrr rr r \",\r\n \" r \",\r\n \" s \",\r\n \"r srrrrrrrr rrrrrrs rr r \",\r\n \"r srrrrrrrr rrrrrrs rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" s s sssssssss s ss s ss\",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" r \"\r\n ];\r\n\r\n XPathParser.actionTableNumber = [\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" J \",\r\n \"a aaaaaaaaa aaaaaaa aa a \",\r\n \" YYYYY \",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \"K1 KKKKKKKK . +*)('KKKKKK KK# K\\\" \",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" N \",\r\n \" O \",\r\n \"e eeeeeeeee eeeeeee ee ee \",\r\n \"f fffffffff fffffff ff ff \",\r\n \"d ddddddddd ddddddd dd dd \",\r\n \"B BBBBBBBBB BBBBBBB BB BB \",\r\n \"A AAAAAAAAA AAAAAAA AA AA \",\r\n \" P \",\r\n \" Q \",\r\n \" 1 . +*)(' # \\\" \",\r\n \"b bbbbbbbbb bbbbbbb bb b \",\r\n \" \",\r\n \"! S !! ! \",\r\n \"\\\" T\\\" \\\"\\\" \\\" \",\r\n \"$ V $$ U $$ $ \",\r\n \"& &ZY&& &XW && & \",\r\n \") ))))) )))\\\\[ )) ) \",\r\n \". ....._^] ..... .. . \",\r\n \"1 11111111 11111 11 1 \",\r\n \"5 55555555 55555` 55 5 \",\r\n \"7 77777777 777777 77 7 \",\r\n \"9 99999999 999999 99 9 \",\r\n \": c:::::::: ::::::b :: a: \",\r\n \"I fIIIIIIII IIIIIIe II I \",\r\n \"= ========= ======= == == \",\r\n \"? ????????? ??????? ?? ?? \",\r\n \"C CCCCCCCCC CCCCCCC CC CC \",\r\n \"J JJJJJJJJ JJJJJJ JJ J \",\r\n \"M MMMMMMMM MMMMMM MM M \",\r\n \"N NNNNNNNNN NNNNNNN NN N \",\r\n \"P PPPPPPPPP PPPPPPP PP P \",\r\n \" +*)(' \",\r\n \"R RRRRRRRRR RRRRRRR RR aR \",\r\n \"U UUUUUUUUU UUUUUUU UU U \",\r\n \"Z ZZZZZZZZZ ZZZZZZZ ZZ ZZ \",\r\n \"c ccccccccc ccccccc cc cc \",\r\n \" j \",\r\n \"L fLLLLLLLL LLLLLLe LL L \",\r\n \"6 66666666 66666 66 6 \",\r\n \" k \",\r\n \" l \",\r\n \" XXXXX \",\r\n \" 1 0 /.-,+*)(' & %$m # \\\"!\",\r\n \"_ f________ ______e __ _ \",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 . +*)(' # \\\" \",\r\n \" 1 . +*)(' # \\\" \",\r\n \"> >>>>>>>>> >>>>>>> >> >> \",\r\n \" 1 . +*)(' # \\\" \",\r\n \" 1 . +*)(' # \\\" \",\r\n \"Q QQQQQQQQQ QQQQQQQ QQ aQ \",\r\n \"V VVVVVVVVV VVVVVVV VV aV \",\r\n \"T TTTTTTTTT TTTTTTT TT T \",\r\n \"@ @@@@@@@@@ @@@@@@@ @@ @@ \",\r\n \" \\x87 \",\r\n \"[ [[[[[[[[[ [[[[[[[ [[ [[ \",\r\n \"D DDDDDDDDD DDDDDDD DD DD \",\r\n \" HH \",\r\n \" \\x88 \",\r\n \" F\\x89 \",\r\n \"# T# ## # \",\r\n \"% V %% U %% % \",\r\n \"' 'ZY'' 'XW '' ' \",\r\n \"( (ZY(( (XW (( ( \",\r\n \"+ +++++ +++\\\\[ ++ + \",\r\n \"* ***** ***\\\\[ ** * \",\r\n \"- ----- ---\\\\[ -- - \",\r\n \", ,,,,, ,,,\\\\[ ,, , \",\r\n \"0 00000_^] 00000 00 0 \",\r\n \"/ /////_^] ///// // / \",\r\n \"2 22222222 22222 22 2 \",\r\n \"3 33333333 33333 33 3 \",\r\n \"4 44444444 44444 44 4 \",\r\n \"8 88888888 888888 88 8 \",\r\n \" ^ \",\r\n \" \\x8a \",\r\n \"; f;;;;;;;; ;;;;;;e ;; ; \",\r\n \"< f<<<<<<<< <<<<<?@ AB CDEFGH IJ \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \"L456789:;<=>?@ AB CDEFGH IJ \",\r\n \" M EFGH IJ \",\r\n \" N;<=>?@ AB CDEFGH IJ \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" S EFGH IJ \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" e \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" h J \",\r\n \" i j \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \"o456789:;<=>?@ ABpqCDEFGH IJ \",\r\n \" \",\r\n \" r6789:;<=>?@ AB CDEFGH IJ \",\r\n \" s789:;<=>?@ AB CDEFGH IJ \",\r\n \" t89:;<=>?@ AB CDEFGH IJ \",\r\n \" u89:;<=>?@ AB CDEFGH IJ \",\r\n \" v9:;<=>?@ AB CDEFGH IJ \",\r\n \" w9:;<=>?@ AB CDEFGH IJ \",\r\n \" x9:;<=>?@ AB CDEFGH IJ \",\r\n \" y9:;<=>?@ AB CDEFGH IJ \",\r\n \" z:;<=>?@ AB CDEFGH IJ \",\r\n \" {:;<=>?@ AB CDEFGH IJ \",\r\n \" |;<=>?@ AB CDEFGH IJ \",\r\n \" };<=>?@ AB CDEFGH IJ \",\r\n \" ~;<=>?@ AB CDEFGH IJ \",\r\n \" \\x7f=>?@ AB CDEFGH IJ \",\r\n \"\\x80456789:;<=>?@ AB CDEFGH IJ\\x81\",\r\n \" \\x82 EFGH IJ \",\r\n \" \\x83 EFGH IJ \",\r\n \" \",\r\n \" \\x84 GH IJ \",\r\n \" \\x85 GH IJ \",\r\n \" i \\x86 \",\r\n \" i \\x87 \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \"o456789:;<=>?@ AB\\x8cqCDEFGH IJ \",\r\n \" \",\r\n \" \"\r\n ];\r\n\r\n XPathParser.productions = [\r\n [1, 1, 2],\r\n [2, 1, 3],\r\n [3, 1, 4],\r\n [3, 3, 3, -9, 4],\r\n [4, 1, 5],\r\n [4, 3, 4, -8, 5],\r\n [5, 1, 6],\r\n [5, 3, 5, -22, 6],\r\n [5, 3, 5, -5, 6],\r\n [6, 1, 7],\r\n [6, 3, 6, -23, 7],\r\n [6, 3, 6, -24, 7],\r\n [6, 3, 6, -6, 7],\r\n [6, 3, 6, -7, 7],\r\n [7, 1, 8],\r\n [7, 3, 7, -25, 8],\r\n [7, 3, 7, -26, 8],\r\n [8, 1, 9],\r\n [8, 3, 8, -12, 9],\r\n [8, 3, 8, -11, 9],\r\n [8, 3, 8, -10, 9],\r\n [9, 1, 10],\r\n [9, 2, -26, 9],\r\n [10, 1, 11],\r\n [10, 3, 10, -27, 11],\r\n [11, 1, 12],\r\n [11, 1, 13],\r\n [11, 3, 13, -28, 14],\r\n [11, 3, 13, -4, 14],\r\n [13, 1, 15],\r\n [13, 2, 13, 16],\r\n [15, 1, 17],\r\n [15, 3, -29, 2, -30],\r\n [15, 1, -15],\r\n [15, 1, -16],\r\n [15, 1, 18],\r\n [18, 3, -13, -29, -30],\r\n [18, 4, -13, -29, 19, -30],\r\n [19, 1, 20],\r\n [19, 3, 20, -31, 19],\r\n [20, 1, 2],\r\n [12, 1, 14],\r\n [12, 1, 21],\r\n [21, 1, -28],\r\n [21, 2, -28, 14],\r\n [21, 1, 22],\r\n [14, 1, 23],\r\n [14, 3, 14, -28, 23],\r\n [14, 1, 24],\r\n [23, 2, 25, 26],\r\n [23, 1, 26],\r\n [23, 3, 25, 26, 27],\r\n [23, 2, 26, 27],\r\n [23, 1, 28],\r\n [27, 1, 16],\r\n [27, 2, 16, 27],\r\n [25, 2, -14, -3],\r\n [25, 1, -32],\r\n [26, 1, 29],\r\n [26, 3, -20, -29, -30],\r\n [26, 4, -21, -29, -15, -30],\r\n [16, 3, -33, 30, -34],\r\n [30, 1, 2],\r\n [22, 2, -4, 14],\r\n [24, 3, 14, -4, 23],\r\n [28, 1, -35],\r\n [28, 1, -2],\r\n [17, 2, -36, -18],\r\n [29, 1, -17],\r\n [29, 1, -19],\r\n [29, 1, -18]\r\n ];\r\n\r\n XPathParser.DOUBLEDOT = 2;\r\n XPathParser.DOUBLECOLON = 3;\r\n XPathParser.DOUBLESLASH = 4;\r\n XPathParser.NOTEQUAL = 5;\r\n XPathParser.LESSTHANOREQUAL = 6;\r\n XPathParser.GREATERTHANOREQUAL = 7;\r\n XPathParser.AND = 8;\r\n XPathParser.OR = 9;\r\n XPathParser.MOD = 10;\r\n XPathParser.DIV = 11;\r\n XPathParser.MULTIPLYOPERATOR = 12;\r\n XPathParser.FUNCTIONNAME = 13;\r\n XPathParser.AXISNAME = 14;\r\n XPathParser.LITERAL = 15;\r\n XPathParser.NUMBER = 16;\r\n XPathParser.ASTERISKNAMETEST = 17;\r\n XPathParser.QNAME = 18;\r\n XPathParser.NCNAMECOLONASTERISK = 19;\r\n XPathParser.NODETYPE = 20;\r\n XPathParser.PROCESSINGINSTRUCTIONWITHLITERAL = 21;\r\n XPathParser.EQUALS = 22;\r\n XPathParser.LESSTHAN = 23;\r\n XPathParser.GREATERTHAN = 24;\r\n XPathParser.PLUS = 25;\r\n XPathParser.MINUS = 26;\r\n XPathParser.BAR = 27;\r\n XPathParser.SLASH = 28;\r\n XPathParser.LEFTPARENTHESIS = 29;\r\n XPathParser.RIGHTPARENTHESIS = 30;\r\n XPathParser.COMMA = 31;\r\n XPathParser.AT = 32;\r\n XPathParser.LEFTBRACKET = 33;\r\n XPathParser.RIGHTBRACKET = 34;\r\n XPathParser.DOT = 35;\r\n XPathParser.DOLLAR = 36;\r\n\r\n XPathParser.prototype.tokenize = function (s1) {\r\n var types = [];\r\n var values = [];\r\n var s = s1 + '\\0';\r\n\r\n var pos = 0;\r\n var c = s.charAt(pos++);\r\n while (1) {\r\n while (c == ' ' || c == '\\t' || c == '\\r' || c == '\\n') {\r\n c = s.charAt(pos++);\r\n }\r\n if (c == '\\0' || pos >= s.length) {\r\n break;\r\n }\r\n\r\n if (c == '(') {\r\n types.push(XPathParser.LEFTPARENTHESIS);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == ')') {\r\n types.push(XPathParser.RIGHTPARENTHESIS);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '[') {\r\n types.push(XPathParser.LEFTBRACKET);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == ']') {\r\n types.push(XPathParser.RIGHTBRACKET);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '@') {\r\n types.push(XPathParser.AT);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == ',') {\r\n types.push(XPathParser.COMMA);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '|') {\r\n types.push(XPathParser.BAR);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '+') {\r\n types.push(XPathParser.PLUS);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '-') {\r\n types.push(XPathParser.MINUS);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '=') {\r\n types.push(XPathParser.EQUALS);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '$') {\r\n types.push(XPathParser.DOLLAR);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n\r\n if (c == '.') {\r\n c = s.charAt(pos++);\r\n if (c == '.') {\r\n types.push(XPathParser.DOUBLEDOT);\r\n values.push(\"..\");\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c >= '0' && c <= '9') {\r\n var number = \".\" + c;\r\n c = s.charAt(pos++);\r\n while (c >= '0' && c <= '9') {\r\n number += c;\r\n c = s.charAt(pos++);\r\n }\r\n types.push(XPathParser.NUMBER);\r\n values.push(number);\r\n continue;\r\n }\r\n types.push(XPathParser.DOT);\r\n values.push('.');\r\n continue;\r\n }\r\n\r\n if (c == '\\'' || c == '\"') {\r\n var delimiter = c;\r\n var literal = \"\";\r\n while (pos < s.length && (c = s.charAt(pos)) !== delimiter) {\r\n literal += c;\r\n pos += 1;\r\n }\r\n if (c !== delimiter) {\r\n throw XPathException.fromMessage(\"Unterminated string literal: \" + delimiter + literal);\r\n }\r\n pos += 1;\r\n types.push(XPathParser.LITERAL);\r\n values.push(literal);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n\r\n if (c >= '0' && c <= '9') {\r\n var number = c;\r\n c = s.charAt(pos++);\r\n while (c >= '0' && c <= '9') {\r\n number += c;\r\n c = s.charAt(pos++);\r\n }\r\n if (c == '.') {\r\n if (s.charAt(pos) >= '0' && s.charAt(pos) <= '9') {\r\n number += c;\r\n number += s.charAt(pos++);\r\n c = s.charAt(pos++);\r\n while (c >= '0' && c <= '9') {\r\n number += c;\r\n c = s.charAt(pos++);\r\n }\r\n }\r\n }\r\n types.push(XPathParser.NUMBER);\r\n values.push(number);\r\n continue;\r\n }\r\n\r\n if (c == '*') {\r\n if (types.length > 0) {\r\n var last = types[types.length - 1];\r\n if (last != XPathParser.AT\r\n && last != XPathParser.DOUBLECOLON\r\n && last != XPathParser.LEFTPARENTHESIS\r\n && last != XPathParser.LEFTBRACKET\r\n && last != XPathParser.AND\r\n && last != XPathParser.OR\r\n && last != XPathParser.MOD\r\n && last != XPathParser.DIV\r\n && last != XPathParser.MULTIPLYOPERATOR\r\n && last != XPathParser.SLASH\r\n && last != XPathParser.DOUBLESLASH\r\n && last != XPathParser.BAR\r\n && last != XPathParser.PLUS\r\n && last != XPathParser.MINUS\r\n && last != XPathParser.EQUALS\r\n && last != XPathParser.NOTEQUAL\r\n && last != XPathParser.LESSTHAN\r\n && last != XPathParser.LESSTHANOREQUAL\r\n && last != XPathParser.GREATERTHAN\r\n && last != XPathParser.GREATERTHANOREQUAL) {\r\n types.push(XPathParser.MULTIPLYOPERATOR);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n }\r\n types.push(XPathParser.ASTERISKNAMETEST);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n\r\n if (c == ':') {\r\n if (s.charAt(pos) == ':') {\r\n types.push(XPathParser.DOUBLECOLON);\r\n values.push(\"::\");\r\n pos++;\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n }\r\n\r\n if (c == '/') {\r\n c = s.charAt(pos++);\r\n if (c == '/') {\r\n types.push(XPathParser.DOUBLESLASH);\r\n values.push(\"//\");\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n types.push(XPathParser.SLASH);\r\n values.push('/');\r\n continue;\r\n }\r\n\r\n if (c == '!') {\r\n if (s.charAt(pos) == '=') {\r\n types.push(XPathParser.NOTEQUAL);\r\n values.push(\"!=\");\r\n pos++;\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n }\r\n\r\n if (c == '<') {\r\n if (s.charAt(pos) == '=') {\r\n types.push(XPathParser.LESSTHANOREQUAL);\r\n values.push(\"<=\");\r\n pos++;\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n types.push(XPathParser.LESSTHAN);\r\n values.push('<');\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n\r\n if (c == '>') {\r\n if (s.charAt(pos) == '=') {\r\n types.push(XPathParser.GREATERTHANOREQUAL);\r\n values.push(\">=\");\r\n pos++;\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n types.push(XPathParser.GREATERTHAN);\r\n values.push('>');\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n\r\n if (c == '_' || Utilities.isLetter(c.charCodeAt(0))) {\r\n var name = c;\r\n c = s.charAt(pos++);\r\n while (Utilities.isNCNameChar(c.charCodeAt(0))) {\r\n name += c;\r\n c = s.charAt(pos++);\r\n }\r\n if (types.length > 0) {\r\n var last = types[types.length - 1];\r\n if (last != XPathParser.AT\r\n && last != XPathParser.DOUBLECOLON\r\n && last != XPathParser.LEFTPARENTHESIS\r\n && last != XPathParser.LEFTBRACKET\r\n && last != XPathParser.AND\r\n && last != XPathParser.OR\r\n && last != XPathParser.MOD\r\n && last != XPathParser.DIV\r\n && last != XPathParser.MULTIPLYOPERATOR\r\n && last != XPathParser.SLASH\r\n && last != XPathParser.DOUBLESLASH\r\n && last != XPathParser.BAR\r\n && last != XPathParser.PLUS\r\n && last != XPathParser.MINUS\r\n && last != XPathParser.EQUALS\r\n && last != XPathParser.NOTEQUAL\r\n && last != XPathParser.LESSTHAN\r\n && last != XPathParser.LESSTHANOREQUAL\r\n && last != XPathParser.GREATERTHAN\r\n && last != XPathParser.GREATERTHANOREQUAL) {\r\n if (name == \"and\") {\r\n types.push(XPathParser.AND);\r\n values.push(name);\r\n continue;\r\n }\r\n if (name == \"or\") {\r\n types.push(XPathParser.OR);\r\n values.push(name);\r\n continue;\r\n }\r\n if (name == \"mod\") {\r\n types.push(XPathParser.MOD);\r\n values.push(name);\r\n continue;\r\n }\r\n if (name == \"div\") {\r\n types.push(XPathParser.DIV);\r\n values.push(name);\r\n continue;\r\n }\r\n }\r\n }\r\n if (c == ':') {\r\n if (s.charAt(pos) == '*') {\r\n types.push(XPathParser.NCNAMECOLONASTERISK);\r\n values.push(name + \":*\");\r\n pos++;\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (s.charAt(pos) == '_' || Utilities.isLetter(s.charCodeAt(pos))) {\r\n name += ':';\r\n c = s.charAt(pos++);\r\n while (Utilities.isNCNameChar(c.charCodeAt(0))) {\r\n name += c;\r\n c = s.charAt(pos++);\r\n }\r\n if (c == '(') {\r\n types.push(XPathParser.FUNCTIONNAME);\r\n values.push(name);\r\n continue;\r\n }\r\n types.push(XPathParser.QNAME);\r\n values.push(name);\r\n continue;\r\n }\r\n if (s.charAt(pos) == ':') {\r\n types.push(XPathParser.AXISNAME);\r\n values.push(name);\r\n continue;\r\n }\r\n }\r\n if (c == '(') {\r\n if (name == \"comment\" || name == \"text\" || name == \"node\") {\r\n types.push(XPathParser.NODETYPE);\r\n values.push(name);\r\n continue;\r\n }\r\n if (name == \"processing-instruction\") {\r\n if (s.charAt(pos) == ')') {\r\n types.push(XPathParser.NODETYPE);\r\n } else {\r\n types.push(XPathParser.PROCESSINGINSTRUCTIONWITHLITERAL);\r\n }\r\n values.push(name);\r\n continue;\r\n }\r\n types.push(XPathParser.FUNCTIONNAME);\r\n values.push(name);\r\n continue;\r\n }\r\n types.push(XPathParser.QNAME);\r\n values.push(name);\r\n continue;\r\n }\r\n\r\n throw new Error(\"Unexpected character \" + c);\r\n }\r\n types.push(1);\r\n values.push(\"[EOF]\");\r\n return [types, values];\r\n };\r\n\r\n XPathParser.SHIFT = 's';\r\n XPathParser.REDUCE = 'r';\r\n XPathParser.ACCEPT = 'a';\r\n\r\n XPathParser.prototype.parse = function (s) {\r\n if (!s) {\r\n throw new Error('XPath expression unspecified.');\r\n }\r\n if (typeof s !== 'string'){\r\n throw new Error('XPath expression must be a string.');\r\n }\r\n\r\n var types;\r\n var values;\r\n var res = this.tokenize(s);\r\n if (res == undefined) {\r\n return undefined;\r\n }\r\n types = res[0];\r\n values = res[1];\r\n var tokenPos = 0;\r\n var state = [];\r\n var tokenType = [];\r\n var tokenValue = [];\r\n var s;\r\n var a;\r\n var t;\r\n\r\n state.push(0);\r\n tokenType.push(1);\r\n tokenValue.push(\"_S\");\r\n\r\n a = types[tokenPos];\r\n t = values[tokenPos++];\r\n while (1) {\r\n s = state[state.length - 1];\r\n switch (XPathParser.actionTable[s].charAt(a - 1)) {\r\n case XPathParser.SHIFT:\r\n tokenType.push(-a);\r\n tokenValue.push(t);\r\n state.push(XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32);\r\n a = types[tokenPos];\r\n t = values[tokenPos++];\r\n break;\r\n case XPathParser.REDUCE:\r\n var num = XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][1];\r\n var rhs = [];\r\n for (var i = 0; i < num; i++) {\r\n tokenType.pop();\r\n rhs.unshift(tokenValue.pop());\r\n state.pop();\r\n }\r\n var s_ = state[state.length - 1];\r\n tokenType.push(XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][0]);\r\n if (this.reduceActions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32] == undefined) {\r\n tokenValue.push(rhs[0]);\r\n } else {\r\n tokenValue.push(this.reduceActions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32](rhs));\r\n }\r\n state.push(XPathParser.gotoTable[s_].charCodeAt(XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][0] - 2) - 33);\r\n break;\r\n case XPathParser.ACCEPT:\r\n return new XPath(tokenValue.pop());\r\n default:\r\n throw new Error(\"XPath parse error\");\r\n }\r\n }\r\n };\r\n\r\n // XPath /////////////////////////////////////////////////////////////////////\r\n\r\n XPath.prototype = new Object();\r\n XPath.prototype.constructor = XPath;\r\n XPath.superclass = Object.prototype;\r\n\r\n function XPath(e) {\r\n this.expression = e;\r\n }\r\n\r\n XPath.prototype.toString = function () {\r\n return this.expression.toString();\r\n };\r\n\r\n function setIfUnset(obj, prop, value) {\r\n if (!(prop in obj)) {\r\n obj[prop] = value;\r\n }\r\n }\r\n\r\n XPath.prototype.evaluate = function (c) {\r\n var node = c.expressionContextNode;\r\n\r\n if (!(isNil(node) || isNodeLike(node))) {\r\n throw new Error(\"Context node does not appear to be a valid DOM node.\");\r\n }\r\n\r\n c.contextNode = c.expressionContextNode;\r\n c.contextSize = 1;\r\n c.contextPosition = 1;\r\n\r\n // [2017-11-25] Removed usage of .implementation.hasFeature() since it does\r\n // not reliably detect HTML DOMs (always returns false in xmldom and true in browsers)\r\n if (c.isHtml) {\r\n setIfUnset(c, 'caseInsensitive', true);\r\n setIfUnset(c, 'allowAnyNamespaceForNoPrefix', true);\r\n }\r\n\r\n setIfUnset(c, 'caseInsensitive', false);\r\n\r\n return this.expression.evaluate(c);\r\n };\r\n\r\n XPath.XML_NAMESPACE_URI = \"http://www.w3.org/XML/1998/namespace\";\r\n XPath.XMLNS_NAMESPACE_URI = \"http://www.w3.org/2000/xmlns/\";\r\n\r\n // Expression ////////////////////////////////////////////////////////////////\r\n\r\n Expression.prototype = new Object();\r\n Expression.prototype.constructor = Expression;\r\n Expression.superclass = Object.prototype;\r\n\r\n function Expression() {\r\n }\r\n\r\n Expression.prototype.init = function () {\r\n };\r\n\r\n Expression.prototype.toString = function () {\r\n return \"\";\r\n };\r\n\r\n Expression.prototype.evaluate = function (c) {\r\n throw new Error(\"Could not evaluate expression.\");\r\n };\r\n\r\n // UnaryOperation ////////////////////////////////////////////////////////////\r\n\r\n UnaryOperation.prototype = new Expression();\r\n UnaryOperation.prototype.constructor = UnaryOperation;\r\n UnaryOperation.superclass = Expression.prototype;\r\n\r\n function UnaryOperation(rhs) {\r\n if (arguments.length > 0) {\r\n this.init(rhs);\r\n }\r\n }\r\n\r\n UnaryOperation.prototype.init = function (rhs) {\r\n this.rhs = rhs;\r\n };\r\n\r\n // UnaryMinusOperation ///////////////////////////////////////////////////////\r\n\r\n UnaryMinusOperation.prototype = new UnaryOperation();\r\n UnaryMinusOperation.prototype.constructor = UnaryMinusOperation;\r\n UnaryMinusOperation.superclass = UnaryOperation.prototype;\r\n\r\n function UnaryMinusOperation(rhs) {\r\n if (arguments.length > 0) {\r\n this.init(rhs);\r\n }\r\n }\r\n\r\n UnaryMinusOperation.prototype.init = function (rhs) {\r\n UnaryMinusOperation.superclass.init.call(this, rhs);\r\n };\r\n\r\n UnaryMinusOperation.prototype.evaluate = function (c) {\r\n return this.rhs.evaluate(c).number().negate();\r\n };\r\n\r\n UnaryMinusOperation.prototype.toString = function () {\r\n return \"-\" + this.rhs.toString();\r\n };\r\n\r\n // BinaryOperation ///////////////////////////////////////////////////////////\r\n\r\n BinaryOperation.prototype = new Expression();\r\n BinaryOperation.prototype.constructor = BinaryOperation;\r\n BinaryOperation.superclass = Expression.prototype;\r\n\r\n function BinaryOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n BinaryOperation.prototype.init = function (lhs, rhs) {\r\n this.lhs = lhs;\r\n this.rhs = rhs;\r\n };\r\n\r\n // OrOperation ///////////////////////////////////////////////////////////////\r\n\r\n OrOperation.prototype = new BinaryOperation();\r\n OrOperation.prototype.constructor = OrOperation;\r\n OrOperation.superclass = BinaryOperation.prototype;\r\n\r\n function OrOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n OrOperation.prototype.init = function (lhs, rhs) {\r\n OrOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n OrOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" or \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n OrOperation.prototype.evaluate = function (c) {\r\n var b = this.lhs.evaluate(c).bool();\r\n if (b.booleanValue()) {\r\n return b;\r\n }\r\n return this.rhs.evaluate(c).bool();\r\n };\r\n\r\n // AndOperation //////////////////////////////////////////////////////////////\r\n\r\n AndOperation.prototype = new BinaryOperation();\r\n AndOperation.prototype.constructor = AndOperation;\r\n AndOperation.superclass = BinaryOperation.prototype;\r\n\r\n function AndOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n AndOperation.prototype.init = function (lhs, rhs) {\r\n AndOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n AndOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" and \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n AndOperation.prototype.evaluate = function (c) {\r\n var b = this.lhs.evaluate(c).bool();\r\n if (!b.booleanValue()) {\r\n return b;\r\n }\r\n return this.rhs.evaluate(c).bool();\r\n };\r\n\r\n // EqualsOperation ///////////////////////////////////////////////////////////\r\n\r\n EqualsOperation.prototype = new BinaryOperation();\r\n EqualsOperation.prototype.constructor = EqualsOperation;\r\n EqualsOperation.superclass = BinaryOperation.prototype;\r\n\r\n function EqualsOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n EqualsOperation.prototype.init = function (lhs, rhs) {\r\n EqualsOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n EqualsOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" = \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n EqualsOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).equals(this.rhs.evaluate(c));\r\n };\r\n\r\n // NotEqualOperation /////////////////////////////////////////////////////////\r\n\r\n NotEqualOperation.prototype = new BinaryOperation();\r\n NotEqualOperation.prototype.constructor = NotEqualOperation;\r\n NotEqualOperation.superclass = BinaryOperation.prototype;\r\n\r\n function NotEqualOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n NotEqualOperation.prototype.init = function (lhs, rhs) {\r\n NotEqualOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n NotEqualOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" != \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n NotEqualOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).notequal(this.rhs.evaluate(c));\r\n };\r\n\r\n // LessThanOperation /////////////////////////////////////////////////////////\r\n\r\n LessThanOperation.prototype = new BinaryOperation();\r\n LessThanOperation.prototype.constructor = LessThanOperation;\r\n LessThanOperation.superclass = BinaryOperation.prototype;\r\n\r\n function LessThanOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n LessThanOperation.prototype.init = function (lhs, rhs) {\r\n LessThanOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n LessThanOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).lessthan(this.rhs.evaluate(c));\r\n };\r\n\r\n LessThanOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" < \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // GreaterThanOperation //////////////////////////////////////////////////////\r\n\r\n GreaterThanOperation.prototype = new BinaryOperation();\r\n GreaterThanOperation.prototype.constructor = GreaterThanOperation;\r\n GreaterThanOperation.superclass = BinaryOperation.prototype;\r\n\r\n function GreaterThanOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n GreaterThanOperation.prototype.init = function (lhs, rhs) {\r\n GreaterThanOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n GreaterThanOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).greaterthan(this.rhs.evaluate(c));\r\n };\r\n\r\n GreaterThanOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" > \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // LessThanOrEqualOperation //////////////////////////////////////////////////\r\n\r\n LessThanOrEqualOperation.prototype = new BinaryOperation();\r\n LessThanOrEqualOperation.prototype.constructor = LessThanOrEqualOperation;\r\n LessThanOrEqualOperation.superclass = BinaryOperation.prototype;\r\n\r\n function LessThanOrEqualOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n LessThanOrEqualOperation.prototype.init = function (lhs, rhs) {\r\n LessThanOrEqualOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n LessThanOrEqualOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).lessthanorequal(this.rhs.evaluate(c));\r\n };\r\n\r\n LessThanOrEqualOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" <= \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // GreaterThanOrEqualOperation ///////////////////////////////////////////////\r\n\r\n GreaterThanOrEqualOperation.prototype = new BinaryOperation();\r\n GreaterThanOrEqualOperation.prototype.constructor = GreaterThanOrEqualOperation;\r\n GreaterThanOrEqualOperation.superclass = BinaryOperation.prototype;\r\n\r\n function GreaterThanOrEqualOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n GreaterThanOrEqualOperation.prototype.init = function (lhs, rhs) {\r\n GreaterThanOrEqualOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n GreaterThanOrEqualOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).greaterthanorequal(this.rhs.evaluate(c));\r\n };\r\n\r\n GreaterThanOrEqualOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" >= \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // PlusOperation /////////////////////////////////////////////////////////////\r\n\r\n PlusOperation.prototype = new BinaryOperation();\r\n PlusOperation.prototype.constructor = PlusOperation;\r\n PlusOperation.superclass = BinaryOperation.prototype;\r\n\r\n function PlusOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n PlusOperation.prototype.init = function (lhs, rhs) {\r\n PlusOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n PlusOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).number().plus(this.rhs.evaluate(c).number());\r\n };\r\n\r\n PlusOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" + \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // MinusOperation ////////////////////////////////////////////////////////////\r\n\r\n MinusOperation.prototype = new BinaryOperation();\r\n MinusOperation.prototype.constructor = MinusOperation;\r\n MinusOperation.superclass = BinaryOperation.prototype;\r\n\r\n function MinusOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n MinusOperation.prototype.init = function (lhs, rhs) {\r\n MinusOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n MinusOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).number().minus(this.rhs.evaluate(c).number());\r\n };\r\n\r\n MinusOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" - \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // MultiplyOperation /////////////////////////////////////////////////////////\r\n\r\n MultiplyOperation.prototype = new BinaryOperation();\r\n MultiplyOperation.prototype.constructor = MultiplyOperation;\r\n MultiplyOperation.superclass = BinaryOperation.prototype;\r\n\r\n function MultiplyOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n MultiplyOperation.prototype.init = function (lhs, rhs) {\r\n MultiplyOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n MultiplyOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).number().multiply(this.rhs.evaluate(c).number());\r\n };\r\n\r\n MultiplyOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" * \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // DivOperation //////////////////////////////////////////////////////////////\r\n\r\n DivOperation.prototype = new BinaryOperation();\r\n DivOperation.prototype.constructor = DivOperation;\r\n DivOperation.superclass = BinaryOperation.prototype;\r\n\r\n function DivOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n DivOperation.prototype.init = function (lhs, rhs) {\r\n DivOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n DivOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).number().div(this.rhs.evaluate(c).number());\r\n };\r\n\r\n DivOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" div \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // ModOperation //////////////////////////////////////////////////////////////\r\n\r\n ModOperation.prototype = new BinaryOperation();\r\n ModOperation.prototype.constructor = ModOperation;\r\n ModOperation.superclass = BinaryOperation.prototype;\r\n\r\n function ModOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n ModOperation.prototype.init = function (lhs, rhs) {\r\n ModOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n ModOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).number().mod(this.rhs.evaluate(c).number());\r\n };\r\n\r\n ModOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" mod \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // BarOperation //////////////////////////////////////////////////////////////\r\n\r\n BarOperation.prototype = new BinaryOperation();\r\n BarOperation.prototype.constructor = BarOperation;\r\n BarOperation.superclass = BinaryOperation.prototype;\r\n\r\n function BarOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n BarOperation.prototype.init = function (lhs, rhs) {\r\n BarOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n BarOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).nodeset().union(this.rhs.evaluate(c).nodeset());\r\n };\r\n\r\n BarOperation.prototype.toString = function () {\r\n return map(toString, [this.lhs, this.rhs]).join(' | ');\r\n };\r\n\r\n // PathExpr //////////////////////////////////////////////////////////////////\r\n\r\n PathExpr.prototype = new Expression();\r\n PathExpr.prototype.constructor = PathExpr;\r\n PathExpr.superclass = Expression.prototype;\r\n\r\n function PathExpr(filter, filterPreds, locpath) {\r\n if (arguments.length > 0) {\r\n this.init(filter, filterPreds, locpath);\r\n }\r\n }\r\n\r\n PathExpr.prototype.init = function (filter, filterPreds, locpath) {\r\n PathExpr.superclass.init.call(this);\r\n this.filter = filter;\r\n this.filterPredicates = filterPreds;\r\n this.locationPath = locpath;\r\n };\r\n\r\n /**\r\n * Returns the topmost node of the tree containing node\r\n */\r\n function findRoot(node) {\r\n while (node && node.parentNode) {\r\n node = node.parentNode;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n var applyPredicates = function (predicates, c, nodes, reverse) {\r\n if (predicates.length === 0) {\r\n return nodes;\r\n }\r\n\r\n var ctx = c.extend({});\r\n\r\n return reduce(\r\n function (inNodes, pred) {\r\n ctx.contextSize = inNodes.length;\r\n\r\n return filter(\r\n function (node, i) {\r\n ctx.contextNode = node;\r\n ctx.contextPosition = i + 1;\r\n\r\n return PathExpr.predicateMatches(pred, ctx);\r\n },\r\n inNodes\r\n );\r\n },\r\n sortNodes(nodes, reverse),\r\n predicates\r\n );\r\n };\r\n\r\n PathExpr.getRoot = function (xpc, nodes) {\r\n var firstNode = nodes[0];\r\n\r\n // xpc.virtualRoot could possibly provide a root even if firstNode is null,\r\n // so using a guard here instead of throwing.\r\n if (firstNode && firstNode.nodeType === NodeTypes.DOCUMENT_NODE) {\r\n return firstNode;\r\n }\r\n\r\n if (xpc.virtualRoot) {\r\n return xpc.virtualRoot;\r\n }\r\n\r\n if (!firstNode) {\r\n throw new Error('Context node not found when determining document root.');\r\n }\r\n\r\n var ownerDoc = firstNode.ownerDocument;\r\n\r\n if (ownerDoc) {\r\n return ownerDoc;\r\n }\r\n\r\n // IE 5.5 doesn't have ownerDocument?\r\n var n = firstNode;\r\n while (n.parentNode != null) {\r\n n = n.parentNode;\r\n }\r\n return n;\r\n }\r\n\r\n var getPrefixForNamespaceNode = function (attrNode) {\r\n var nm = String(attrNode.name);\r\n\r\n if (nm === \"xmlns\") {\r\n return \"\";\r\n }\r\n\r\n if (nm.substring(0, 6) === \"xmlns:\") {\r\n return nm.substring(6, nm.length);\r\n }\r\n\r\n return null;\r\n };\r\n\r\n PathExpr.applyStep = function (step, xpc, node) {\r\n if (!node) {\r\n throw new Error('Context node not found when evaluating XPath step: ' + step);\r\n }\r\n\r\n var newNodes = [];\r\n xpc.contextNode = node;\r\n\r\n switch (step.axis) {\r\n case Step.ANCESTOR:\r\n // look at all the ancestor nodes\r\n if (xpc.contextNode === xpc.virtualRoot) {\r\n break;\r\n }\r\n var m;\r\n if (xpc.contextNode.nodeType == NodeTypes.ATTRIBUTE_NODE) {\r\n m = PathExpr.getOwnerElement(xpc.contextNode);\r\n } else {\r\n m = xpc.contextNode.parentNode;\r\n }\r\n while (m != null) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n if (m === xpc.virtualRoot) {\r\n break;\r\n }\r\n m = m.parentNode;\r\n }\r\n break;\r\n\r\n case Step.ANCESTORORSELF:\r\n // look at all the ancestor nodes and the current node\r\n for (var m = xpc.contextNode; m != null; m = m.nodeType == NodeTypes.ATTRIBUTE_NODE ? PathExpr.getOwnerElement(m) : m.parentNode) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n if (m === xpc.virtualRoot) {\r\n break;\r\n }\r\n }\r\n break;\r\n\r\n case Step.ATTRIBUTE:\r\n // look at the attributes\r\n var nnm = xpc.contextNode.attributes;\r\n if (nnm != null) {\r\n for (var k = 0; k < nnm.length; k++) {\r\n var m = nnm.item(k);\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case Step.CHILD:\r\n // look at all child elements\r\n for (var m = xpc.contextNode.firstChild; m != null; m = m.nextSibling) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n }\r\n break;\r\n\r\n case Step.DESCENDANT:\r\n // look at all descendant nodes\r\n var st = [xpc.contextNode.firstChild];\r\n while (st.length > 0) {\r\n for (var m = st.pop(); m != null;) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n if (m.firstChild != null) {\r\n st.push(m.nextSibling);\r\n m = m.firstChild;\r\n } else {\r\n m = m.nextSibling;\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case Step.DESCENDANTORSELF:\r\n // look at self\r\n if (step.nodeTest.matches(xpc.contextNode, xpc)) {\r\n newNodes.push(xpc.contextNode);\r\n }\r\n // look at all descendant nodes\r\n var st = [xpc.contextNode.firstChild];\r\n while (st.length > 0) {\r\n for (var m = st.pop(); m != null;) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n if (m.firstChild != null) {\r\n st.push(m.nextSibling);\r\n m = m.firstChild;\r\n } else {\r\n m = m.nextSibling;\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case Step.FOLLOWING:\r\n if (xpc.contextNode === xpc.virtualRoot) {\r\n break;\r\n }\r\n var st = [];\r\n if (xpc.contextNode.firstChild != null) {\r\n st.unshift(xpc.contextNode.firstChild);\r\n } else {\r\n st.unshift(xpc.contextNode.nextSibling);\r\n }\r\n for (var m = xpc.contextNode.parentNode; m != null && m.nodeType != NodeTypes.DOCUMENT_NODE && m !== xpc.virtualRoot; m = m.parentNode) {\r\n st.unshift(m.nextSibling);\r\n }\r\n do {\r\n for (var m = st.pop(); m != null;) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n if (m.firstChild != null) {\r\n st.push(m.nextSibling);\r\n m = m.firstChild;\r\n } else {\r\n m = m.nextSibling;\r\n }\r\n }\r\n } while (st.length > 0);\r\n break;\r\n\r\n case Step.FOLLOWINGSIBLING:\r\n if (xpc.contextNode === xpc.virtualRoot) {\r\n break;\r\n }\r\n for (var m = xpc.contextNode.nextSibling; m != null; m = m.nextSibling) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n }\r\n break;\r\n\r\n case Step.NAMESPACE:\r\n var nodes = {};\r\n\r\n if (xpc.contextNode.nodeType == NodeTypes.ELEMENT_NODE) {\r\n // BUG: This only collects the namespaces on the current node, but seemingly\r\n // it should collect all those in scope\r\n nodes[\"xml\"] = new XPathNamespace(\"xml\", null, XPath.XML_NAMESPACE_URI, xpc.contextNode);\r\n\r\n for (var m = xpc.contextNode; m != null && m.nodeType == NodeTypes.ELEMENT_NODE; m = m.parentNode) {\r\n for (var k = 0; k < m.attributes.length; k++) {\r\n var attr = m.attributes.item(k);\r\n\r\n var pre = getPrefixForNamespaceNode(attr);\r\n\r\n if (pre != null && nodes[pre] == undefined) {\r\n nodes[pre] = new XPathNamespace(pre, attr, attr.value, xpc.contextNode);\r\n }\r\n }\r\n }\r\n\r\n for (var pre in nodes) {\r\n var node = nodes[pre];\r\n\r\n if (step.nodeTest.matches(node, xpc)) {\r\n newNodes.push(node);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case Step.PARENT:\r\n m = null;\r\n if (xpc.contextNode !== xpc.virtualRoot) {\r\n if (xpc.contextNode.nodeType == NodeTypes.ATTRIBUTE_NODE) {\r\n m = PathExpr.getOwnerElement(xpc.contextNode);\r\n } else {\r\n m = xpc.contextNode.parentNode;\r\n }\r\n }\r\n if (m != null && step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n break;\r\n\r\n case Step.PRECEDING:\r\n var st;\r\n if (xpc.virtualRoot != null) {\r\n st = [xpc.virtualRoot];\r\n } else {\r\n // cannot rely on .ownerDocument because the node may be in a document fragment\r\n st = [findRoot(xpc.contextNode)];\r\n }\r\n outer: while (st.length > 0) {\r\n for (var m = st.pop(); m != null;) {\r\n if (m == xpc.contextNode) {\r\n break outer;\r\n }\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.unshift(m);\r\n }\r\n if (m.firstChild != null) {\r\n st.push(m.nextSibling);\r\n m = m.firstChild;\r\n } else {\r\n m = m.nextSibling;\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case Step.PRECEDINGSIBLING:\r\n if (xpc.contextNode === xpc.virtualRoot) {\r\n break;\r\n }\r\n for (var m = xpc.contextNode.previousSibling; m != null; m = m.previousSibling) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n }\r\n break;\r\n\r\n case Step.SELF:\r\n if (step.nodeTest.matches(xpc.contextNode, xpc)) {\r\n newNodes.push(xpc.contextNode);\r\n }\r\n break;\r\n\r\n default:\r\n }\r\n\r\n return newNodes;\r\n };\r\n\r\n function applyStepWithPredicates(step, xpc, node) {\r\n return applyPredicates(\r\n step.predicates,\r\n xpc,\r\n PathExpr.applyStep(step, xpc, node),\r\n includes(REVERSE_AXES, step.axis)\r\n );\r\n }\r\n\r\n function applyStepToNodes(context, nodes, step) {\r\n return flatten(\r\n map(\r\n applyStepWithPredicates.bind(null, step, context),\r\n nodes\r\n )\r\n );\r\n }\r\n\r\n PathExpr.applySteps = function (steps, xpc, nodes) {\r\n return reduce(\r\n applyStepToNodes.bind(null, xpc),\r\n nodes,\r\n steps\r\n );\r\n }\r\n\r\n PathExpr.prototype.applyFilter = function (c, xpc) {\r\n if (!this.filter) {\r\n return { nodes: [c.contextNode] };\r\n }\r\n\r\n var ns = this.filter.evaluate(c);\r\n\r\n if (!Utilities.instance_of(ns, XNodeSet)) {\r\n if (this.filterPredicates != null && this.filterPredicates.length > 0 || this.locationPath != null) {\r\n throw new Error(\"Path expression filter must evaluate to a nodeset if predicates or location path are used\");\r\n }\r\n\r\n return { nonNodes: ns };\r\n }\r\n\r\n return {\r\n nodes: applyPredicates(\r\n this.filterPredicates || [],\r\n xpc,\r\n ns.toUnsortedArray(),\r\n false // reverse\r\n )\r\n };\r\n };\r\n\r\n PathExpr.applyLocationPath = function (locationPath, xpc, nodes) {\r\n if (!locationPath) {\r\n return nodes;\r\n }\r\n\r\n var startNodes = locationPath.absolute ? [PathExpr.getRoot(xpc, nodes)] : nodes;\r\n\r\n return PathExpr.applySteps(locationPath.steps, xpc, startNodes);\r\n };\r\n\r\n PathExpr.prototype.evaluate = function (c) {\r\n var xpc = assign(new XPathContext(), c);\r\n\r\n var filterResult = this.applyFilter(c, xpc);\r\n\r\n if ('nonNodes' in filterResult) {\r\n return filterResult.nonNodes;\r\n }\r\n\r\n var ns = new XNodeSet();\r\n ns.addArray(PathExpr.applyLocationPath(this.locationPath, xpc, filterResult.nodes));\r\n return ns;\r\n };\r\n\r\n PathExpr.predicateMatches = function (pred, c) {\r\n var res = pred.evaluate(c);\r\n\r\n return Utilities.instance_of(res, XNumber)\r\n ? c.contextPosition === res.numberValue()\r\n : res.booleanValue();\r\n };\r\n\r\n PathExpr.predicateString = function (predicate) {\r\n return wrap('[', ']', predicate.toString());\r\n }\r\n\r\n PathExpr.predicatesString = function (predicates) {\r\n return join(\r\n '',\r\n map(PathExpr.predicateString, predicates)\r\n );\r\n }\r\n\r\n PathExpr.prototype.toString = function () {\r\n if (this.filter != undefined) {\r\n var filterStr = toString(this.filter);\r\n\r\n if (Utilities.instance_of(this.filter, XString)) {\r\n return wrap(\"'\", \"'\", filterStr);\r\n }\r\n if (this.filterPredicates != undefined && this.filterPredicates.length) {\r\n return wrap('(', ')', filterStr) +\r\n PathExpr.predicatesString(this.filterPredicates);\r\n }\r\n if (this.locationPath != undefined) {\r\n return filterStr +\r\n (this.locationPath.absolute ? '' : '/') +\r\n toString(this.locationPath);\r\n }\r\n\r\n return filterStr;\r\n }\r\n\r\n return toString(this.locationPath);\r\n };\r\n\r\n PathExpr.getOwnerElement = function (n) {\r\n // DOM 2 has ownerElement\r\n if (n.ownerElement) {\r\n return n.ownerElement;\r\n }\r\n // DOM 1 Internet Explorer can use selectSingleNode (ironically)\r\n try {\r\n if (n.selectSingleNode) {\r\n return n.selectSingleNode(\"..\");\r\n }\r\n } catch (e) {\r\n }\r\n // Other DOM 1 implementations must use this egregious search\r\n var doc = n.nodeType == NodeTypes.DOCUMENT_NODE\r\n ? n\r\n : n.ownerDocument;\r\n var elts = doc.getElementsByTagName(\"*\");\r\n for (var i = 0; i < elts.length; i++) {\r\n var elt = elts.item(i);\r\n var nnm = elt.attributes;\r\n for (var j = 0; j < nnm.length; j++) {\r\n var an = nnm.item(j);\r\n if (an === n) {\r\n return elt;\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n // LocationPath //////////////////////////////////////////////////////////////\r\n\r\n LocationPath.prototype = new Object();\r\n LocationPath.prototype.constructor = LocationPath;\r\n LocationPath.superclass = Object.prototype;\r\n\r\n function LocationPath(abs, steps) {\r\n if (arguments.length > 0) {\r\n this.init(abs, steps);\r\n }\r\n }\r\n\r\n LocationPath.prototype.init = function (abs, steps) {\r\n this.absolute = abs;\r\n this.steps = steps;\r\n };\r\n\r\n LocationPath.prototype.toString = function () {\r\n return (\r\n (this.absolute ? '/' : '') +\r\n map(toString, this.steps).join('/')\r\n );\r\n };\r\n\r\n // Step //////////////////////////////////////////////////////////////////////\r\n\r\n Step.prototype = new Object();\r\n Step.prototype.constructor = Step;\r\n Step.superclass = Object.prototype;\r\n\r\n function Step(axis, nodetest, preds) {\r\n if (arguments.length > 0) {\r\n this.init(axis, nodetest, preds);\r\n }\r\n }\r\n\r\n Step.prototype.init = function (axis, nodetest, preds) {\r\n this.axis = axis;\r\n this.nodeTest = nodetest;\r\n this.predicates = preds;\r\n };\r\n\r\n Step.prototype.toString = function () {\r\n return Step.STEPNAMES[this.axis] +\r\n \"::\" +\r\n this.nodeTest.toString() +\r\n PathExpr.predicatesString(this.predicates);\r\n };\r\n\r\n\r\n Step.ANCESTOR = 0;\r\n Step.ANCESTORORSELF = 1;\r\n Step.ATTRIBUTE = 2;\r\n Step.CHILD = 3;\r\n Step.DESCENDANT = 4;\r\n Step.DESCENDANTORSELF = 5;\r\n Step.FOLLOWING = 6;\r\n Step.FOLLOWINGSIBLING = 7;\r\n Step.NAMESPACE = 8;\r\n Step.PARENT = 9;\r\n Step.PRECEDING = 10;\r\n Step.PRECEDINGSIBLING = 11;\r\n Step.SELF = 12;\r\n\r\n Step.STEPNAMES = reduce(function (acc, x) { return acc[x[0]] = x[1], acc; }, {}, [\r\n [Step.ANCESTOR, 'ancestor'],\r\n [Step.ANCESTORORSELF, 'ancestor-or-self'],\r\n [Step.ATTRIBUTE, 'attribute'],\r\n [Step.CHILD, 'child'],\r\n [Step.DESCENDANT, 'descendant'],\r\n [Step.DESCENDANTORSELF, 'descendant-or-self'],\r\n [Step.FOLLOWING, 'following'],\r\n [Step.FOLLOWINGSIBLING, 'following-sibling'],\r\n [Step.NAMESPACE, 'namespace'],\r\n [Step.PARENT, 'parent'],\r\n [Step.PRECEDING, 'preceding'],\r\n [Step.PRECEDINGSIBLING, 'preceding-sibling'],\r\n [Step.SELF, 'self']\r\n ]);\r\n\r\n var REVERSE_AXES = [\r\n Step.ANCESTOR,\r\n Step.ANCESTORORSELF,\r\n Step.PARENT,\r\n Step.PRECEDING,\r\n Step.PRECEDINGSIBLING\r\n ];\r\n\r\n // NodeTest //////////////////////////////////////////////////////////////////\r\n\r\n NodeTest.prototype = new Object();\r\n NodeTest.prototype.constructor = NodeTest;\r\n NodeTest.superclass = Object.prototype;\r\n\r\n function NodeTest(type, value) {\r\n if (arguments.length > 0) {\r\n this.init(type, value);\r\n }\r\n }\r\n\r\n NodeTest.prototype.init = function (type, value) {\r\n this.type = type;\r\n this.value = value;\r\n };\r\n\r\n NodeTest.prototype.toString = function () {\r\n return \"\";\r\n };\r\n\r\n NodeTest.prototype.matches = function (n, xpc) {\r\n console.warn('unknown node test type');\r\n };\r\n\r\n NodeTest.NAMETESTANY = 0;\r\n NodeTest.NAMETESTPREFIXANY = 1;\r\n NodeTest.NAMETESTQNAME = 2;\r\n NodeTest.COMMENT = 3;\r\n NodeTest.TEXT = 4;\r\n NodeTest.PI = 5;\r\n NodeTest.NODE = 6;\r\n\r\n NodeTest.isNodeType = function (types) {\r\n return function (node) {\r\n return includes(types, node.nodeType);\r\n };\r\n };\r\n\r\n NodeTest.makeNodeTestType = function (type, members, ctor) {\r\n var newType = ctor || function () { };\r\n\r\n newType.prototype = new NodeTest(type);\r\n newType.prototype.constructor = newType;\r\n\r\n assign(newType.prototype, members);\r\n\r\n return newType;\r\n };\r\n // create invariant node test for certain node types\r\n NodeTest.makeNodeTypeTest = function (type, nodeTypes, stringVal) {\r\n return new (NodeTest.makeNodeTestType(type, {\r\n matches: NodeTest.isNodeType(nodeTypes),\r\n toString: always(stringVal)\r\n }))();\r\n };\r\n\r\n NodeTest.hasPrefix = function (node) {\r\n return node.prefix || (node.nodeName || node.tagName).indexOf(':') !== -1;\r\n };\r\n\r\n NodeTest.isElementOrAttribute = NodeTest.isNodeType([1, 2]);\r\n NodeTest.nameSpaceMatches = function (prefix, xpc, n) {\r\n var nNamespace = (n.namespaceURI || '');\r\n\r\n if (!prefix) {\r\n return !nNamespace || (xpc.allowAnyNamespaceForNoPrefix && !NodeTest.hasPrefix(n));\r\n }\r\n\r\n var ns = xpc.namespaceResolver.getNamespace(prefix, xpc.expressionContextNode);\r\n\r\n if (ns == null) {\r\n throw new Error(\"Cannot resolve QName \" + prefix);\r\n }\r\n\r\n return ns === nNamespace;\r\n };\r\n NodeTest.localNameMatches = function (localName, xpc, n) {\r\n var nLocalName = (n.localName || n.nodeName);\r\n\r\n return xpc.caseInsensitive\r\n ? localName.toLowerCase() === nLocalName.toLowerCase()\r\n : localName === nLocalName;\r\n };\r\n\r\n NodeTest.NameTestPrefixAny = NodeTest.makeNodeTestType(\r\n NodeTest.NAMETESTPREFIXANY,\r\n {\r\n matches: function (n, xpc) {\r\n return NodeTest.isElementOrAttribute(n) &&\r\n NodeTest.nameSpaceMatches(this.prefix, xpc, n);\r\n },\r\n toString: function () {\r\n return this.prefix + \":*\";\r\n }\r\n },\r\n function NameTestPrefixAny(prefix) { this.prefix = prefix; }\r\n );\r\n\r\n NodeTest.NameTestQName = NodeTest.makeNodeTestType(\r\n NodeTest.NAMETESTQNAME,\r\n {\r\n matches: function (n, xpc) {\r\n return NodeTest.isNodeType(\r\n [\r\n NodeTypes.ELEMENT_NODE,\r\n NodeTypes.ATTRIBUTE_NODE,\r\n NodeTypes.NAMESPACE_NODE,\r\n ]\r\n )(n) &&\r\n NodeTest.nameSpaceMatches(this.prefix, xpc, n) &&\r\n NodeTest.localNameMatches(this.localName, xpc, n);\r\n },\r\n toString: function () {\r\n return this.name;\r\n }\r\n },\r\n function NameTestQName(name) {\r\n var nameParts = name.split(':');\r\n\r\n this.name = name;\r\n this.prefix = nameParts.length > 1 ? nameParts[0] : null;\r\n this.localName = nameParts[nameParts.length > 1 ? 1 : 0];\r\n }\r\n );\r\n\r\n NodeTest.PITest = NodeTest.makeNodeTestType(NodeTest.PI, {\r\n matches: function (n, xpc) {\r\n return NodeTest.isNodeType(\r\n [NodeTypes.PROCESSING_INSTRUCTION_NODE]\r\n )(n) &&\r\n (n.target || n.nodeName) === this.name;\r\n },\r\n toString: function () {\r\n return wrap('processing-instruction(\"', '\")', this.name);\r\n }\r\n }, function (name) { this.name = name; })\r\n\r\n // singletons\r\n\r\n // elements, attributes, namespaces\r\n NodeTest.nameTestAny = NodeTest.makeNodeTypeTest(\r\n NodeTest.NAMETESTANY,\r\n [\r\n NodeTypes.ELEMENT_NODE,\r\n NodeTypes.ATTRIBUTE_NODE,\r\n NodeTypes.NAMESPACE_NODE,\r\n ],\r\n '*'\r\n );\r\n // text, cdata\r\n NodeTest.textTest = NodeTest.makeNodeTypeTest(\r\n NodeTest.TEXT,\r\n [\r\n NodeTypes.TEXT_NODE,\r\n NodeTypes.CDATA_SECTION_NODE,\r\n ],\r\n 'text()'\r\n );\r\n NodeTest.commentTest = NodeTest.makeNodeTypeTest(\r\n NodeTest.COMMENT,\r\n [NodeTypes.COMMENT_NODE],\r\n 'comment()'\r\n );\r\n // elements, attributes, text, cdata, PIs, comments, document nodes\r\n NodeTest.nodeTest = NodeTest.makeNodeTypeTest(\r\n NodeTest.NODE,\r\n [\r\n NodeTypes.ELEMENT_NODE,\r\n NodeTypes.ATTRIBUTE_NODE,\r\n NodeTypes.TEXT_NODE,\r\n NodeTypes.CDATA_SECTION_NODE,\r\n NodeTypes.PROCESSING_INSTRUCTION_NODE,\r\n NodeTypes.COMMENT_NODE,\r\n NodeTypes.DOCUMENT_NODE,\r\n ],\r\n 'node()'\r\n );\r\n NodeTest.anyPiTest = NodeTest.makeNodeTypeTest(\r\n NodeTest.PI,\r\n [NodeTypes.PROCESSING_INSTRUCTION_NODE],\r\n 'processing-instruction()'\r\n );\r\n\r\n // VariableReference /////////////////////////////////////////////////////////\r\n\r\n VariableReference.prototype = new Expression();\r\n VariableReference.prototype.constructor = VariableReference;\r\n VariableReference.superclass = Expression.prototype;\r\n\r\n function VariableReference(v) {\r\n if (arguments.length > 0) {\r\n this.init(v);\r\n }\r\n }\r\n\r\n VariableReference.prototype.init = function (v) {\r\n this.variable = v;\r\n };\r\n\r\n VariableReference.prototype.toString = function () {\r\n return \"$\" + this.variable;\r\n };\r\n\r\n VariableReference.prototype.evaluate = function (c) {\r\n var parts = Utilities.resolveQName(this.variable, c.namespaceResolver, c.contextNode, false);\r\n\r\n if (parts[0] == null) {\r\n throw new Error(\"Cannot resolve QName \" + fn);\r\n }\r\n var result = c.variableResolver.getVariable(parts[1], parts[0]);\r\n if (!result) {\r\n throw XPathException.fromMessage(\"Undeclared variable: \" + this.toString());\r\n }\r\n return result;\r\n };\r\n\r\n // FunctionCall //////////////////////////////////////////////////////////////\r\n\r\n FunctionCall.prototype = new Expression();\r\n FunctionCall.prototype.constructor = FunctionCall;\r\n FunctionCall.superclass = Expression.prototype;\r\n\r\n function FunctionCall(fn, args) {\r\n if (arguments.length > 0) {\r\n this.init(fn, args);\r\n }\r\n }\r\n\r\n FunctionCall.prototype.init = function (fn, args) {\r\n this.functionName = fn;\r\n this.arguments = args;\r\n };\r\n\r\n FunctionCall.prototype.toString = function () {\r\n var s = this.functionName + \"(\";\r\n for (var i = 0; i < this.arguments.length; i++) {\r\n if (i > 0) {\r\n s += \", \";\r\n }\r\n s += this.arguments[i].toString();\r\n }\r\n return s + \")\";\r\n };\r\n\r\n FunctionCall.prototype.evaluate = function (c) {\r\n var f = FunctionResolver.getFunctionFromContext(this.functionName, c);\r\n\r\n if (!f) {\r\n throw new Error(\"Unknown function \" + this.functionName);\r\n }\r\n\r\n var a = [c].concat(this.arguments);\r\n return f.apply(c.functionResolver.thisArg, a);\r\n };\r\n\r\n // Operators /////////////////////////////////////////////////////////////////\r\n\r\n var Operators = new Object();\r\n\r\n Operators.equals = function (l, r) {\r\n return l.equals(r);\r\n };\r\n\r\n Operators.notequal = function (l, r) {\r\n return l.notequal(r);\r\n };\r\n\r\n Operators.lessthan = function (l, r) {\r\n return l.lessthan(r);\r\n };\r\n\r\n Operators.greaterthan = function (l, r) {\r\n return l.greaterthan(r);\r\n };\r\n\r\n Operators.lessthanorequal = function (l, r) {\r\n return l.lessthanorequal(r);\r\n };\r\n\r\n Operators.greaterthanorequal = function (l, r) {\r\n return l.greaterthanorequal(r);\r\n };\r\n\r\n // XString ///////////////////////////////////////////////////////////////////\r\n\r\n XString.prototype = new Expression();\r\n XString.prototype.constructor = XString;\r\n XString.superclass = Expression.prototype;\r\n\r\n function XString(s) {\r\n if (arguments.length > 0) {\r\n this.init(s);\r\n }\r\n }\r\n\r\n XString.prototype.init = function (s) {\r\n this.str = String(s);\r\n };\r\n\r\n XString.prototype.toString = function () {\r\n return this.str;\r\n };\r\n\r\n XString.prototype.evaluate = function (c) {\r\n return this;\r\n };\r\n\r\n XString.prototype.string = function () {\r\n return this;\r\n };\r\n\r\n XString.prototype.number = function () {\r\n return new XNumber(this.str);\r\n };\r\n\r\n XString.prototype.bool = function () {\r\n return new XBoolean(this.str);\r\n };\r\n\r\n XString.prototype.nodeset = function () {\r\n throw new Error(\"Cannot convert string to nodeset\");\r\n };\r\n\r\n XString.prototype.stringValue = function () {\r\n return this.str;\r\n };\r\n\r\n XString.prototype.numberValue = function () {\r\n return this.number().numberValue();\r\n };\r\n\r\n XString.prototype.booleanValue = function () {\r\n return this.bool().booleanValue();\r\n };\r\n\r\n XString.prototype.equals = function (r) {\r\n if (Utilities.instance_of(r, XBoolean)) {\r\n return this.bool().equals(r);\r\n }\r\n if (Utilities.instance_of(r, XNumber)) {\r\n return this.number().equals(r);\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithString(this, Operators.equals);\r\n }\r\n return new XBoolean(this.str == r.str);\r\n };\r\n\r\n XString.prototype.notequal = function (r) {\r\n if (Utilities.instance_of(r, XBoolean)) {\r\n return this.bool().notequal(r);\r\n }\r\n if (Utilities.instance_of(r, XNumber)) {\r\n return this.number().notequal(r);\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithString(this, Operators.notequal);\r\n }\r\n return new XBoolean(this.str != r.str);\r\n };\r\n\r\n XString.prototype.lessthan = function (r) {\r\n return this.number().lessthan(r);\r\n };\r\n\r\n XString.prototype.greaterthan = function (r) {\r\n return this.number().greaterthan(r);\r\n };\r\n\r\n XString.prototype.lessthanorequal = function (r) {\r\n return this.number().lessthanorequal(r);\r\n };\r\n\r\n XString.prototype.greaterthanorequal = function (r) {\r\n return this.number().greaterthanorequal(r);\r\n };\r\n\r\n // XNumber ///////////////////////////////////////////////////////////////////\r\n\r\n XNumber.prototype = new Expression();\r\n XNumber.prototype.constructor = XNumber;\r\n XNumber.superclass = Expression.prototype;\r\n\r\n function XNumber(n) {\r\n if (arguments.length > 0) {\r\n this.init(n);\r\n }\r\n }\r\n\r\n XNumber.prototype.init = function (n) {\r\n this.num = typeof n === \"string\" ? this.parse(n) : Number(n);\r\n };\r\n\r\n XNumber.prototype.numberFormat = /^\\s*-?[0-9]*\\.?[0-9]+\\s*$/;\r\n\r\n XNumber.prototype.parse = function (s) {\r\n // XPath representation of numbers is more restrictive than what Number() or parseFloat() allow\r\n return this.numberFormat.test(s) ? parseFloat(s) : Number.NaN;\r\n };\r\n\r\n function padSmallNumber(numberStr) {\r\n var parts = numberStr.split('e-');\r\n var base = parts[0].replace('.', '');\r\n var exponent = Number(parts[1]);\r\n\r\n for (var i = 0; i < exponent - 1; i += 1) {\r\n base = '0' + base;\r\n }\r\n\r\n return '0.' + base;\r\n }\r\n\r\n function padLargeNumber(numberStr) {\r\n var parts = numberStr.split('e');\r\n var base = parts[0].replace('.', '');\r\n var exponent = Number(parts[1]);\r\n var zerosToAppend = exponent + 1 - base.length;\r\n\r\n for (var i = 0; i < zerosToAppend; i += 1) {\r\n base += '0';\r\n }\r\n\r\n return base;\r\n }\r\n\r\n XNumber.prototype.toString = function () {\r\n var strValue = this.num.toString();\r\n\r\n if (strValue.indexOf('e-') !== -1) {\r\n return padSmallNumber(strValue);\r\n }\r\n\r\n if (strValue.indexOf('e') !== -1) {\r\n return padLargeNumber(strValue);\r\n }\r\n\r\n return strValue;\r\n };\r\n\r\n XNumber.prototype.evaluate = function (c) {\r\n return this;\r\n };\r\n\r\n XNumber.prototype.string = function () {\r\n\r\n\r\n return new XString(this.toString());\r\n };\r\n\r\n XNumber.prototype.number = function () {\r\n return this;\r\n };\r\n\r\n XNumber.prototype.bool = function () {\r\n return new XBoolean(this.num);\r\n };\r\n\r\n XNumber.prototype.nodeset = function () {\r\n throw new Error(\"Cannot convert number to nodeset\");\r\n };\r\n\r\n XNumber.prototype.stringValue = function () {\r\n return this.string().stringValue();\r\n };\r\n\r\n XNumber.prototype.numberValue = function () {\r\n return this.num;\r\n };\r\n\r\n XNumber.prototype.booleanValue = function () {\r\n return this.bool().booleanValue();\r\n };\r\n\r\n XNumber.prototype.negate = function () {\r\n return new XNumber(-this.num);\r\n };\r\n\r\n XNumber.prototype.equals = function (r) {\r\n if (Utilities.instance_of(r, XBoolean)) {\r\n return this.bool().equals(r);\r\n }\r\n if (Utilities.instance_of(r, XString)) {\r\n return this.equals(r.number());\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.equals);\r\n }\r\n return new XBoolean(this.num == r.num);\r\n };\r\n\r\n XNumber.prototype.notequal = function (r) {\r\n if (Utilities.instance_of(r, XBoolean)) {\r\n return this.bool().notequal(r);\r\n }\r\n if (Utilities.instance_of(r, XString)) {\r\n return this.notequal(r.number());\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.notequal);\r\n }\r\n return new XBoolean(this.num != r.num);\r\n };\r\n\r\n XNumber.prototype.lessthan = function (r) {\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.greaterthan);\r\n }\r\n if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {\r\n return this.lessthan(r.number());\r\n }\r\n return new XBoolean(this.num < r.num);\r\n };\r\n\r\n XNumber.prototype.greaterthan = function (r) {\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.lessthan);\r\n }\r\n if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {\r\n return this.greaterthan(r.number());\r\n }\r\n return new XBoolean(this.num > r.num);\r\n };\r\n\r\n XNumber.prototype.lessthanorequal = function (r) {\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.greaterthanorequal);\r\n }\r\n if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {\r\n return this.lessthanorequal(r.number());\r\n }\r\n return new XBoolean(this.num <= r.num);\r\n };\r\n\r\n XNumber.prototype.greaterthanorequal = function (r) {\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.lessthanorequal);\r\n }\r\n if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {\r\n return this.greaterthanorequal(r.number());\r\n }\r\n return new XBoolean(this.num >= r.num);\r\n };\r\n\r\n XNumber.prototype.plus = function (r) {\r\n return new XNumber(this.num + r.num);\r\n };\r\n\r\n XNumber.prototype.minus = function (r) {\r\n return new XNumber(this.num - r.num);\r\n };\r\n\r\n XNumber.prototype.multiply = function (r) {\r\n return new XNumber(this.num * r.num);\r\n };\r\n\r\n XNumber.prototype.div = function (r) {\r\n return new XNumber(this.num / r.num);\r\n };\r\n\r\n XNumber.prototype.mod = function (r) {\r\n return new XNumber(this.num % r.num);\r\n };\r\n\r\n // XBoolean //////////////////////////////////////////////////////////////////\r\n\r\n XBoolean.prototype = new Expression();\r\n XBoolean.prototype.constructor = XBoolean;\r\n XBoolean.superclass = Expression.prototype;\r\n\r\n function XBoolean(b) {\r\n if (arguments.length > 0) {\r\n this.init(b);\r\n }\r\n }\r\n\r\n XBoolean.prototype.init = function (b) {\r\n this.b = Boolean(b);\r\n };\r\n\r\n XBoolean.prototype.toString = function () {\r\n return this.b.toString();\r\n };\r\n\r\n XBoolean.prototype.evaluate = function (c) {\r\n return this;\r\n };\r\n\r\n XBoolean.prototype.string = function () {\r\n return new XString(this.b);\r\n };\r\n\r\n XBoolean.prototype.number = function () {\r\n return new XNumber(this.b);\r\n };\r\n\r\n XBoolean.prototype.bool = function () {\r\n return this;\r\n };\r\n\r\n XBoolean.prototype.nodeset = function () {\r\n throw new Error(\"Cannot convert boolean to nodeset\");\r\n };\r\n\r\n XBoolean.prototype.stringValue = function () {\r\n return this.string().stringValue();\r\n };\r\n\r\n XBoolean.prototype.numberValue = function () {\r\n return this.number().numberValue();\r\n };\r\n\r\n XBoolean.prototype.booleanValue = function () {\r\n return this.b;\r\n };\r\n\r\n XBoolean.prototype.not = function () {\r\n return new XBoolean(!this.b);\r\n };\r\n\r\n XBoolean.prototype.equals = function (r) {\r\n if (Utilities.instance_of(r, XString) || Utilities.instance_of(r, XNumber)) {\r\n return this.equals(r.bool());\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithBoolean(this, Operators.equals);\r\n }\r\n return new XBoolean(this.b == r.b);\r\n };\r\n\r\n XBoolean.prototype.notequal = function (r) {\r\n if (Utilities.instance_of(r, XString) || Utilities.instance_of(r, XNumber)) {\r\n return this.notequal(r.bool());\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithBoolean(this, Operators.notequal);\r\n }\r\n return new XBoolean(this.b != r.b);\r\n };\r\n\r\n XBoolean.prototype.lessthan = function (r) {\r\n return this.number().lessthan(r);\r\n };\r\n\r\n XBoolean.prototype.greaterthan = function (r) {\r\n return this.number().greaterthan(r);\r\n };\r\n\r\n XBoolean.prototype.lessthanorequal = function (r) {\r\n return this.number().lessthanorequal(r);\r\n };\r\n\r\n XBoolean.prototype.greaterthanorequal = function (r) {\r\n return this.number().greaterthanorequal(r);\r\n };\r\n\r\n XBoolean.true_ = new XBoolean(true);\r\n XBoolean.false_ = new XBoolean(false);\r\n\r\n // AVLTree ///////////////////////////////////////////////////////////////////\r\n\r\n AVLTree.prototype = new Object();\r\n AVLTree.prototype.constructor = AVLTree;\r\n AVLTree.superclass = Object.prototype;\r\n\r\n function AVLTree(n) {\r\n this.init(n);\r\n }\r\n\r\n AVLTree.prototype.init = function (n) {\r\n this.left = null;\r\n this.right = null;\r\n this.node = n;\r\n this.depth = 1;\r\n };\r\n\r\n AVLTree.prototype.balance = function () {\r\n var ldepth = this.left == null ? 0 : this.left.depth;\r\n var rdepth = this.right == null ? 0 : this.right.depth;\r\n\r\n if (ldepth > rdepth + 1) {\r\n // LR or LL rotation\r\n var lldepth = this.left.left == null ? 0 : this.left.left.depth;\r\n var lrdepth = this.left.right == null ? 0 : this.left.right.depth;\r\n\r\n if (lldepth < lrdepth) {\r\n // LR rotation consists of a RR rotation of the left child\r\n this.left.rotateRR();\r\n // plus a LL rotation of this node, which happens anyway\r\n }\r\n this.rotateLL();\r\n } else if (ldepth + 1 < rdepth) {\r\n // RR or RL rorarion\r\n var rrdepth = this.right.right == null ? 0 : this.right.right.depth;\r\n var rldepth = this.right.left == null ? 0 : this.right.left.depth;\r\n\r\n if (rldepth > rrdepth) {\r\n // RR rotation consists of a LL rotation of the right child\r\n this.right.rotateLL();\r\n // plus a RR rotation of this node, which happens anyway\r\n }\r\n this.rotateRR();\r\n }\r\n };\r\n\r\n AVLTree.prototype.rotateLL = function () {\r\n // the left side is too long => rotate from the left (_not_ leftwards)\r\n var nodeBefore = this.node;\r\n var rightBefore = this.right;\r\n this.node = this.left.node;\r\n this.right = this.left;\r\n this.left = this.left.left;\r\n this.right.left = this.right.right;\r\n this.right.right = rightBefore;\r\n this.right.node = nodeBefore;\r\n this.right.updateInNewLocation();\r\n this.updateInNewLocation();\r\n };\r\n\r\n AVLTree.prototype.rotateRR = function () {\r\n // the right side is too long => rotate from the right (_not_ rightwards)\r\n var nodeBefore = this.node;\r\n var leftBefore = this.left;\r\n this.node = this.right.node;\r\n this.left = this.right;\r\n this.right = this.right.right;\r\n this.left.right = this.left.left;\r\n this.left.left = leftBefore;\r\n this.left.node = nodeBefore;\r\n this.left.updateInNewLocation();\r\n this.updateInNewLocation();\r\n };\r\n\r\n AVLTree.prototype.updateInNewLocation = function () {\r\n this.getDepthFromChildren();\r\n };\r\n\r\n AVLTree.prototype.getDepthFromChildren = function () {\r\n this.depth = this.node == null ? 0 : 1;\r\n if (this.left != null) {\r\n this.depth = this.left.depth + 1;\r\n }\r\n if (this.right != null && this.depth <= this.right.depth) {\r\n this.depth = this.right.depth + 1;\r\n }\r\n };\r\n\r\n function nodeOrder(n1, n2) {\r\n if (n1 === n2) {\r\n return 0;\r\n }\r\n\r\n if (n1.compareDocumentPosition) {\r\n var cpos = n1.compareDocumentPosition(n2);\r\n\r\n if (cpos & 0x01) {\r\n // not in the same document; return an arbitrary result (is there a better way to do this)\r\n return 1;\r\n }\r\n if (cpos & 0x0A) {\r\n // n2 precedes or contains n1\r\n return 1;\r\n }\r\n if (cpos & 0x14) {\r\n // n2 follows or is contained by n1\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n var d1 = 0,\r\n d2 = 0;\r\n for (var m1 = n1; m1 != null; m1 = m1.parentNode || m1.ownerElement) {\r\n d1++;\r\n }\r\n for (var m2 = n2; m2 != null; m2 = m2.parentNode || m2.ownerElement) {\r\n d2++;\r\n }\r\n\r\n // step up to same depth\r\n if (d1 > d2) {\r\n while (d1 > d2) {\r\n n1 = n1.parentNode || n1.ownerElement;\r\n d1--;\r\n }\r\n if (n1 === n2) {\r\n return 1;\r\n }\r\n } else if (d2 > d1) {\r\n while (d2 > d1) {\r\n n2 = n2.parentNode || n2.ownerElement;\r\n d2--;\r\n }\r\n if (n1 === n2) {\r\n return -1;\r\n }\r\n }\r\n\r\n var n1Par = n1.parentNode || n1.ownerElement,\r\n n2Par = n2.parentNode || n2.ownerElement;\r\n\r\n // find common parent\r\n while (n1Par !== n2Par) {\r\n n1 = n1Par;\r\n n2 = n2Par;\r\n n1Par = n1.parentNode || n1.ownerElement;\r\n n2Par = n2.parentNode || n2.ownerElement;\r\n }\r\n\r\n var n1isAttr = isAttributeLike(n1);\r\n var n2isAttr = isAttributeLike(n2);\r\n\r\n if (n1isAttr && !n2isAttr) {\r\n return -1;\r\n }\r\n if (!n1isAttr && n2isAttr) {\r\n return 1;\r\n }\r\n\r\n // xml namespace node comes before others. namespace nodes before non-namespace nodes\r\n if (n1.isXPathNamespace) {\r\n if (n1.nodeValue === XPath.XML_NAMESPACE_URI) {\r\n return -1;\r\n }\r\n\r\n if (!n2.isXPathNamespace) {\r\n return -1;\r\n }\r\n\r\n if (n2.nodeValue === XPath.XML_NAMESPACE_URI) {\r\n return 1;\r\n }\r\n } else if (n2.isXPathNamespace) {\r\n return 1;\r\n }\r\n\r\n if (n1Par) {\r\n var cn = n1isAttr ? n1Par.attributes : n1Par.childNodes;\r\n var len = cn.length;\r\n var n1Compare = n1.baseNode || n1;\r\n var n2Compare = n2.baseNode || n2;\r\n\r\n for (var i = 0; i < len; i += 1) {\r\n var n = cn[i];\r\n if (n === n1Compare) {\r\n return -1;\r\n }\r\n if (n === n2Compare) {\r\n return 1;\r\n }\r\n }\r\n }\r\n\r\n throw new Error('Unexpected: could not determine node order');\r\n }\r\n\r\n AVLTree.prototype.add = function (n) {\r\n if (n === this.node) {\r\n return false;\r\n }\r\n\r\n var o = nodeOrder(n, this.node);\r\n\r\n var ret = false;\r\n if (o == -1) {\r\n if (this.left == null) {\r\n this.left = new AVLTree(n);\r\n ret = true;\r\n } else {\r\n ret = this.left.add(n);\r\n if (ret) {\r\n this.balance();\r\n }\r\n }\r\n } else if (o == 1) {\r\n if (this.right == null) {\r\n this.right = new AVLTree(n);\r\n ret = true;\r\n } else {\r\n ret = this.right.add(n);\r\n if (ret) {\r\n this.balance();\r\n }\r\n }\r\n }\r\n\r\n if (ret) {\r\n this.getDepthFromChildren();\r\n }\r\n return ret;\r\n };\r\n\r\n // XNodeSet //////////////////////////////////////////////////////////////////\r\n\r\n XNodeSet.prototype = new Expression();\r\n XNodeSet.prototype.constructor = XNodeSet;\r\n XNodeSet.superclass = Expression.prototype;\r\n\r\n function XNodeSet() {\r\n this.init();\r\n }\r\n\r\n XNodeSet.prototype.init = function () {\r\n this.tree = null;\r\n this.nodes = [];\r\n this.size = 0;\r\n };\r\n\r\n XNodeSet.prototype.toString = function () {\r\n var p = this.first();\r\n if (p == null) {\r\n return \"\";\r\n }\r\n return this.stringForNode(p);\r\n };\r\n\r\n XNodeSet.prototype.evaluate = function (c) {\r\n return this;\r\n };\r\n\r\n XNodeSet.prototype.string = function () {\r\n return new XString(this.toString());\r\n };\r\n\r\n XNodeSet.prototype.stringValue = function () {\r\n return this.toString();\r\n };\r\n\r\n XNodeSet.prototype.number = function () {\r\n return new XNumber(this.string());\r\n };\r\n\r\n XNodeSet.prototype.numberValue = function () {\r\n return Number(this.string());\r\n };\r\n\r\n XNodeSet.prototype.bool = function () {\r\n return new XBoolean(this.booleanValue());\r\n };\r\n\r\n XNodeSet.prototype.booleanValue = function () {\r\n return !!this.size;\r\n };\r\n\r\n XNodeSet.prototype.nodeset = function () {\r\n return this;\r\n };\r\n\r\n XNodeSet.prototype.stringForNode = function (n) {\r\n if (n.nodeType == NodeTypes.DOCUMENT_NODE ||\r\n n.nodeType == NodeTypes.ELEMENT_NODE ||\r\n n.nodeType === NodeTypes.DOCUMENT_FRAGMENT_NODE) {\r\n return this.stringForContainerNode(n);\r\n }\r\n if (n.nodeType === NodeTypes.ATTRIBUTE_NODE) {\r\n return n.value || n.nodeValue;\r\n }\r\n if (n.isNamespaceNode) {\r\n return n.namespace;\r\n }\r\n return n.nodeValue;\r\n };\r\n\r\n XNodeSet.prototype.stringForContainerNode = function (n) {\r\n var s = \"\";\r\n for (var n2 = n.firstChild; n2 != null; n2 = n2.nextSibling) {\r\n var nt = n2.nodeType;\r\n // Element, Text, CDATA, Document, Document Fragment\r\n if (nt === 1 || nt === 3 || nt === 4 || nt === 9 || nt === 11) {\r\n s += this.stringForNode(n2);\r\n }\r\n }\r\n return s;\r\n };\r\n\r\n XNodeSet.prototype.buildTree = function () {\r\n if (!this.tree && this.nodes.length) {\r\n this.tree = new AVLTree(this.nodes[0]);\r\n for (var i = 1; i < this.nodes.length; i += 1) {\r\n this.tree.add(this.nodes[i]);\r\n }\r\n }\r\n\r\n return this.tree;\r\n };\r\n\r\n XNodeSet.prototype.first = function () {\r\n var p = this.buildTree();\r\n if (p == null) {\r\n return null;\r\n }\r\n while (p.left != null) {\r\n p = p.left;\r\n }\r\n return p.node;\r\n };\r\n\r\n XNodeSet.prototype.add = function (n) {\r\n for (var i = 0; i < this.nodes.length; i += 1) {\r\n if (n === this.nodes[i]) {\r\n return;\r\n }\r\n }\r\n\r\n this.tree = null;\r\n this.nodes.push(n);\r\n this.size += 1;\r\n };\r\n\r\n XNodeSet.prototype.addArray = function (ns) {\r\n var self = this;\r\n\r\n forEach(function (x) { self.add(x); }, ns);\r\n };\r\n\r\n /**\r\n * Returns an array of the node set's contents in document order\r\n */\r\n XNodeSet.prototype.toArray = function () {\r\n var a = [];\r\n this.toArrayRec(this.buildTree(), a);\r\n return a;\r\n };\r\n\r\n XNodeSet.prototype.toArrayRec = function (t, a) {\r\n if (t != null) {\r\n this.toArrayRec(t.left, a);\r\n a.push(t.node);\r\n this.toArrayRec(t.right, a);\r\n }\r\n };\r\n\r\n /**\r\n * Returns an array of the node set's contents in arbitrary order\r\n */\r\n XNodeSet.prototype.toUnsortedArray = function () {\r\n return this.nodes.slice();\r\n };\r\n\r\n XNodeSet.prototype.compareWithString = function (r, o) {\r\n var a = this.toUnsortedArray();\r\n for (var i = 0; i < a.length; i++) {\r\n var n = a[i];\r\n var l = new XString(this.stringForNode(n));\r\n var res = o(l, r);\r\n if (res.booleanValue()) {\r\n return res;\r\n }\r\n }\r\n return new XBoolean(false);\r\n };\r\n\r\n XNodeSet.prototype.compareWithNumber = function (r, o) {\r\n var a = this.toUnsortedArray();\r\n for (var i = 0; i < a.length; i++) {\r\n var n = a[i];\r\n var l = new XNumber(this.stringForNode(n));\r\n var res = o(l, r);\r\n if (res.booleanValue()) {\r\n return res;\r\n }\r\n }\r\n return new XBoolean(false);\r\n };\r\n\r\n XNodeSet.prototype.compareWithBoolean = function (r, o) {\r\n return o(this.bool(), r);\r\n };\r\n\r\n XNodeSet.prototype.compareWithNodeSet = function (r, o) {\r\n var arr = this.toUnsortedArray();\r\n var oInvert = function (lop, rop) { return o(rop, lop); };\r\n\r\n for (var i = 0; i < arr.length; i++) {\r\n var l = new XString(this.stringForNode(arr[i]));\r\n\r\n var res = r.compareWithString(l, oInvert);\r\n if (res.booleanValue()) {\r\n return res;\r\n }\r\n }\r\n\r\n return new XBoolean(false);\r\n };\r\n\r\n XNodeSet.compareWith = curry(function (o, r) {\r\n if (Utilities.instance_of(r, XString)) {\r\n return this.compareWithString(r, o);\r\n }\r\n if (Utilities.instance_of(r, XNumber)) {\r\n return this.compareWithNumber(r, o);\r\n }\r\n if (Utilities.instance_of(r, XBoolean)) {\r\n return this.compareWithBoolean(r, o);\r\n }\r\n return this.compareWithNodeSet(r, o);\r\n });\r\n\r\n XNodeSet.prototype.equals = XNodeSet.compareWith(Operators.equals);\r\n XNodeSet.prototype.notequal = XNodeSet.compareWith(Operators.notequal);\r\n XNodeSet.prototype.lessthan = XNodeSet.compareWith(Operators.lessthan);\r\n XNodeSet.prototype.greaterthan = XNodeSet.compareWith(Operators.greaterthan);\r\n XNodeSet.prototype.lessthanorequal = XNodeSet.compareWith(Operators.lessthanorequal);\r\n XNodeSet.prototype.greaterthanorequal = XNodeSet.compareWith(Operators.greaterthanorequal);\r\n\r\n XNodeSet.prototype.union = function (r) {\r\n var ns = new XNodeSet();\r\n ns.addArray(this.toUnsortedArray());\r\n ns.addArray(r.toUnsortedArray());\r\n return ns;\r\n };\r\n\r\n // XPathNamespace ////////////////////////////////////////////////////////////\r\n\r\n XPathNamespace.prototype = new Object();\r\n XPathNamespace.prototype.constructor = XPathNamespace;\r\n XPathNamespace.superclass = Object.prototype;\r\n\r\n function XPathNamespace(pre, node, uri, p) {\r\n this.isXPathNamespace = true;\r\n this.baseNode = node;\r\n this.ownerDocument = p.ownerDocument;\r\n this.nodeName = pre;\r\n this.prefix = pre;\r\n this.localName = pre;\r\n this.namespaceURI = null;\r\n this.nodeValue = uri;\r\n this.ownerElement = p;\r\n this.nodeType = NodeTypes.NAMESPACE_NODE;\r\n }\r\n\r\n XPathNamespace.prototype.toString = function () {\r\n return \"{ \\\"\" + this.prefix + \"\\\", \\\"\" + this.namespaceURI + \"\\\" }\";\r\n };\r\n\r\n // XPathContext //////////////////////////////////////////////////////////////\r\n\r\n XPathContext.prototype = new Object();\r\n XPathContext.prototype.constructor = XPathContext;\r\n XPathContext.superclass = Object.prototype;\r\n\r\n function XPathContext(vr, nr, fr) {\r\n this.variableResolver = vr != null ? vr : new VariableResolver();\r\n this.namespaceResolver = nr != null ? nr : new NamespaceResolver();\r\n this.functionResolver = fr != null ? fr : new FunctionResolver();\r\n }\r\n\r\n XPathContext.prototype.extend = function (newProps) {\r\n return assign(new XPathContext(), this, newProps);\r\n };\r\n\r\n // VariableResolver //////////////////////////////////////////////////////////\r\n\r\n VariableResolver.prototype = new Object();\r\n VariableResolver.prototype.constructor = VariableResolver;\r\n VariableResolver.superclass = Object.prototype;\r\n\r\n function VariableResolver() {\r\n }\r\n\r\n VariableResolver.prototype.getVariable = function (ln, ns) {\r\n return null;\r\n };\r\n\r\n // FunctionResolver //////////////////////////////////////////////////////////\r\n\r\n FunctionResolver.prototype = new Object();\r\n FunctionResolver.prototype.constructor = FunctionResolver;\r\n FunctionResolver.superclass = Object.prototype;\r\n\r\n function FunctionResolver(thisArg) {\r\n this.thisArg = thisArg != null ? thisArg : Functions;\r\n this.functions = new Object();\r\n this.addStandardFunctions();\r\n }\r\n\r\n FunctionResolver.prototype.addStandardFunctions = function () {\r\n this.functions[\"{}last\"] = Functions.last;\r\n this.functions[\"{}position\"] = Functions.position;\r\n this.functions[\"{}count\"] = Functions.count;\r\n this.functions[\"{}id\"] = Functions.id;\r\n this.functions[\"{}local-name\"] = Functions.localName;\r\n this.functions[\"{}namespace-uri\"] = Functions.namespaceURI;\r\n this.functions[\"{}name\"] = Functions.name;\r\n this.functions[\"{}string\"] = Functions.string;\r\n this.functions[\"{}concat\"] = Functions.concat;\r\n this.functions[\"{}starts-with\"] = Functions.startsWith;\r\n this.functions[\"{}contains\"] = Functions.contains;\r\n this.functions[\"{}substring-before\"] = Functions.substringBefore;\r\n this.functions[\"{}substring-after\"] = Functions.substringAfter;\r\n this.functions[\"{}substring\"] = Functions.substring;\r\n this.functions[\"{}string-length\"] = Functions.stringLength;\r\n this.functions[\"{}normalize-space\"] = Functions.normalizeSpace;\r\n this.functions[\"{}translate\"] = Functions.translate;\r\n this.functions[\"{}boolean\"] = Functions.boolean_;\r\n this.functions[\"{}not\"] = Functions.not;\r\n this.functions[\"{}true\"] = Functions.true_;\r\n this.functions[\"{}false\"] = Functions.false_;\r\n this.functions[\"{}lang\"] = Functions.lang;\r\n this.functions[\"{}number\"] = Functions.number;\r\n this.functions[\"{}sum\"] = Functions.sum;\r\n this.functions[\"{}floor\"] = Functions.floor;\r\n this.functions[\"{}ceiling\"] = Functions.ceiling;\r\n this.functions[\"{}round\"] = Functions.round;\r\n };\r\n\r\n FunctionResolver.prototype.addFunction = function (ns, ln, f) {\r\n this.functions[\"{\" + ns + \"}\" + ln] = f;\r\n };\r\n\r\n FunctionResolver.getFunctionFromContext = function (qName, context) {\r\n var parts = Utilities.resolveQName(qName, context.namespaceResolver, context.contextNode, false);\r\n\r\n if (parts[0] === null) {\r\n throw new Error(\"Cannot resolve QName \" + name);\r\n }\r\n\r\n return context.functionResolver.getFunction(parts[1], parts[0]);\r\n };\r\n\r\n FunctionResolver.prototype.getFunction = function (localName, namespace) {\r\n return this.functions[\"{\" + namespace + \"}\" + localName];\r\n };\r\n\r\n // NamespaceResolver /////////////////////////////////////////////////////////\r\n\r\n NamespaceResolver.prototype = new Object();\r\n NamespaceResolver.prototype.constructor = NamespaceResolver;\r\n NamespaceResolver.superclass = Object.prototype;\r\n\r\n function NamespaceResolver() {\r\n }\r\n\r\n NamespaceResolver.prototype.getNamespace = function (prefix, n) {\r\n if (prefix == \"xml\") {\r\n return XPath.XML_NAMESPACE_URI;\r\n } else if (prefix == \"xmlns\") {\r\n return XPath.XMLNS_NAMESPACE_URI;\r\n }\r\n if (n.nodeType == NodeTypes.DOCUMENT_NODE) {\r\n n = n.documentElement;\r\n } else if (n.nodeType == NodeTypes.ATTRIBUTE_NODE) {\r\n n = PathExpr.getOwnerElement(n);\r\n } else if (n.nodeType != NodeTypes.ELEMENT_NODE) {\r\n n = n.parentNode;\r\n }\r\n while (n != null && n.nodeType == NodeTypes.ELEMENT_NODE) {\r\n var nnm = n.attributes;\r\n for (var i = 0; i < nnm.length; i++) {\r\n var a = nnm.item(i);\r\n var aname = a.name || a.nodeName;\r\n if ((aname === \"xmlns\" && prefix === \"\")\r\n || aname === \"xmlns:\" + prefix) {\r\n return String(a.value || a.nodeValue);\r\n }\r\n }\r\n n = n.parentNode;\r\n }\r\n return null;\r\n };\r\n\r\n // Functions /////////////////////////////////////////////////////////////////\r\n\r\n var Functions = new Object();\r\n\r\n Functions.last = function (c) {\r\n if (arguments.length != 1) {\r\n throw new Error(\"Function last expects ()\");\r\n }\r\n\r\n return new XNumber(c.contextSize);\r\n };\r\n\r\n Functions.position = function (c) {\r\n if (arguments.length != 1) {\r\n throw new Error(\"Function position expects ()\");\r\n }\r\n\r\n return new XNumber(c.contextPosition);\r\n };\r\n\r\n Functions.count = function () {\r\n var c = arguments[0];\r\n var ns;\r\n if (arguments.length != 2 || !Utilities.instance_of(ns = arguments[1].evaluate(c), XNodeSet)) {\r\n throw new Error(\"Function count expects (node-set)\");\r\n }\r\n return new XNumber(ns.size);\r\n };\r\n\r\n Functions.id = function () {\r\n var c = arguments[0];\r\n var id;\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function id expects (object)\");\r\n }\r\n id = arguments[1].evaluate(c);\r\n if (Utilities.instance_of(id, XNodeSet)) {\r\n id = id.toArray().join(\" \");\r\n } else {\r\n id = id.stringValue();\r\n }\r\n var ids = id.split(/[\\x0d\\x0a\\x09\\x20]+/);\r\n var count = 0;\r\n var ns = new XNodeSet();\r\n var doc = c.contextNode.nodeType == NodeTypes.DOCUMENT_NODE\r\n ? c.contextNode\r\n : c.contextNode.ownerDocument;\r\n for (var i = 0; i < ids.length; i++) {\r\n var n;\r\n if (doc.getElementById) {\r\n n = doc.getElementById(ids[i]);\r\n } else {\r\n n = Utilities.getElementById(doc, ids[i]);\r\n }\r\n if (n != null) {\r\n ns.add(n);\r\n count++;\r\n }\r\n }\r\n return ns;\r\n };\r\n\r\n Functions.localName = function (c, eNode) {\r\n var n;\r\n\r\n if (arguments.length == 1) {\r\n n = c.contextNode;\r\n } else if (arguments.length == 2) {\r\n n = eNode.evaluate(c).first();\r\n } else {\r\n throw new Error(\"Function local-name expects (node-set?)\");\r\n }\r\n\r\n if (n == null) {\r\n return new XString(\"\");\r\n }\r\n\r\n return new XString(\r\n n.localName || // standard elements and attributes\r\n n.baseName || // IE\r\n n.target || // processing instructions\r\n n.nodeName || // DOM1 elements\r\n \"\" // fallback\r\n );\r\n };\r\n\r\n Functions.namespaceURI = function () {\r\n var c = arguments[0];\r\n var n;\r\n\r\n if (arguments.length == 1) {\r\n n = c.contextNode;\r\n } else if (arguments.length == 2) {\r\n n = arguments[1].evaluate(c).first();\r\n } else {\r\n throw new Error(\"Function namespace-uri expects (node-set?)\");\r\n }\r\n\r\n if (n == null) {\r\n return new XString(\"\");\r\n }\r\n return new XString(n.namespaceURI || '');\r\n };\r\n\r\n Functions.name = function () {\r\n var c = arguments[0];\r\n var n;\r\n if (arguments.length == 1) {\r\n n = c.contextNode;\r\n } else if (arguments.length == 2) {\r\n n = arguments[1].evaluate(c).first();\r\n } else {\r\n throw new Error(\"Function name expects (node-set?)\");\r\n }\r\n if (n == null) {\r\n return new XString(\"\");\r\n }\r\n if (n.nodeType == NodeTypes.ELEMENT_NODE) {\r\n return new XString(n.nodeName);\r\n } else if (n.nodeType == NodeTypes.ATTRIBUTE_NODE) {\r\n return new XString(n.name || n.nodeName);\r\n } else if (n.nodeType === NodeTypes.PROCESSING_INSTRUCTION_NODE) {\r\n return new XString(n.target || n.nodeName);\r\n } else if (n.localName == null) {\r\n return new XString(\"\");\r\n } else {\r\n return new XString(n.localName);\r\n }\r\n };\r\n\r\n Functions.string = function () {\r\n var c = arguments[0];\r\n if (arguments.length == 1) {\r\n return new XString(XNodeSet.prototype.stringForNode(c.contextNode));\r\n } else if (arguments.length == 2) {\r\n return arguments[1].evaluate(c).string();\r\n }\r\n throw new Error(\"Function string expects (object?)\");\r\n };\r\n\r\n Functions.concat = function (c) {\r\n if (arguments.length < 3) {\r\n throw new Error(\"Function concat expects (string, string[, string]*)\");\r\n }\r\n var s = \"\";\r\n for (var i = 1; i < arguments.length; i++) {\r\n s += arguments[i].evaluate(c).stringValue();\r\n }\r\n return new XString(s);\r\n };\r\n\r\n Functions.startsWith = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 3) {\r\n throw new Error(\"Function startsWith expects (string, string)\");\r\n }\r\n var s1 = arguments[1].evaluate(c).stringValue();\r\n var s2 = arguments[2].evaluate(c).stringValue();\r\n return new XBoolean(s1.substring(0, s2.length) == s2);\r\n };\r\n\r\n Functions.contains = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 3) {\r\n throw new Error(\"Function contains expects (string, string)\");\r\n }\r\n var s1 = arguments[1].evaluate(c).stringValue();\r\n var s2 = arguments[2].evaluate(c).stringValue();\r\n return new XBoolean(s1.indexOf(s2) !== -1);\r\n };\r\n\r\n Functions.substringBefore = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 3) {\r\n throw new Error(\"Function substring-before expects (string, string)\");\r\n }\r\n var s1 = arguments[1].evaluate(c).stringValue();\r\n var s2 = arguments[2].evaluate(c).stringValue();\r\n return new XString(s1.substring(0, s1.indexOf(s2)));\r\n };\r\n\r\n Functions.substringAfter = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 3) {\r\n throw new Error(\"Function substring-after expects (string, string)\");\r\n }\r\n var s1 = arguments[1].evaluate(c).stringValue();\r\n var s2 = arguments[2].evaluate(c).stringValue();\r\n if (s2.length == 0) {\r\n return new XString(s1);\r\n }\r\n var i = s1.indexOf(s2);\r\n if (i == -1) {\r\n return new XString(\"\");\r\n }\r\n return new XString(s1.substring(i + s2.length));\r\n };\r\n\r\n Functions.substring = function () {\r\n var c = arguments[0];\r\n if (!(arguments.length == 3 || arguments.length == 4)) {\r\n throw new Error(\"Function substring expects (string, number, number?)\");\r\n }\r\n var s = arguments[1].evaluate(c).stringValue();\r\n var n1 = Math.round(arguments[2].evaluate(c).numberValue()) - 1;\r\n var n2 = arguments.length == 4 ? n1 + Math.round(arguments[3].evaluate(c).numberValue()) : undefined;\r\n return new XString(s.substring(n1, n2));\r\n };\r\n\r\n Functions.stringLength = function () {\r\n var c = arguments[0];\r\n var s;\r\n if (arguments.length == 1) {\r\n s = XNodeSet.prototype.stringForNode(c.contextNode);\r\n } else if (arguments.length == 2) {\r\n s = arguments[1].evaluate(c).stringValue();\r\n } else {\r\n throw new Error(\"Function string-length expects (string?)\");\r\n }\r\n return new XNumber(s.length);\r\n };\r\n\r\n Functions.normalizeSpace = function () {\r\n var c = arguments[0];\r\n var s;\r\n if (arguments.length == 1) {\r\n s = XNodeSet.prototype.stringForNode(c.contextNode);\r\n } else if (arguments.length == 2) {\r\n s = arguments[1].evaluate(c).stringValue();\r\n } else {\r\n throw new Error(\"Function normalize-space expects (string?)\");\r\n }\r\n var i = 0;\r\n var j = s.length - 1;\r\n while (Utilities.isSpace(s.charCodeAt(j))) {\r\n j--;\r\n }\r\n var t = \"\";\r\n while (i <= j && Utilities.isSpace(s.charCodeAt(i))) {\r\n i++;\r\n }\r\n while (i <= j) {\r\n if (Utilities.isSpace(s.charCodeAt(i))) {\r\n t += \" \";\r\n while (i <= j && Utilities.isSpace(s.charCodeAt(i))) {\r\n i++;\r\n }\r\n } else {\r\n t += s.charAt(i);\r\n i++;\r\n }\r\n }\r\n return new XString(t);\r\n };\r\n\r\n Functions.translate = function (c, eValue, eFrom, eTo) {\r\n if (arguments.length != 4) {\r\n throw new Error(\"Function translate expects (string, string, string)\");\r\n }\r\n\r\n var value = eValue.evaluate(c).stringValue();\r\n var from = eFrom.evaluate(c).stringValue();\r\n var to = eTo.evaluate(c).stringValue();\r\n\r\n var cMap = reduce(function (acc, ch, i) {\r\n if (!(ch in acc)) {\r\n acc[ch] = i > to.length ? '' : to[i];\r\n }\r\n return acc;\r\n }, {}, from);\r\n\r\n var t = join(\r\n '',\r\n map(function (ch) {\r\n return ch in cMap ? cMap[ch] : ch;\r\n }, value)\r\n );\r\n\r\n return new XString(t);\r\n };\r\n\r\n Functions.boolean_ = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function boolean expects (object)\");\r\n }\r\n return arguments[1].evaluate(c).bool();\r\n };\r\n\r\n Functions.not = function (c, eValue) {\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function not expects (object)\");\r\n }\r\n return eValue.evaluate(c).bool().not();\r\n };\r\n\r\n Functions.true_ = function () {\r\n if (arguments.length != 1) {\r\n throw new Error(\"Function true expects ()\");\r\n }\r\n return XBoolean.true_;\r\n };\r\n\r\n Functions.false_ = function () {\r\n if (arguments.length != 1) {\r\n throw new Error(\"Function false expects ()\");\r\n }\r\n return XBoolean.false_;\r\n };\r\n\r\n Functions.lang = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function lang expects (string)\");\r\n }\r\n var lang;\r\n for (var n = c.contextNode; n != null && n.nodeType != NodeTypes.DOCUMENT_NODE; n = n.parentNode) {\r\n var a = n.getAttributeNS(XPath.XML_NAMESPACE_URI, \"lang\");\r\n if (a != null) {\r\n lang = String(a);\r\n break;\r\n }\r\n }\r\n if (lang == null) {\r\n return XBoolean.false_;\r\n }\r\n var s = arguments[1].evaluate(c).stringValue();\r\n return new XBoolean(lang.substring(0, s.length) == s\r\n && (lang.length == s.length || lang.charAt(s.length) == '-'));\r\n };\r\n\r\n Functions.number = function () {\r\n var c = arguments[0];\r\n if (!(arguments.length == 1 || arguments.length == 2)) {\r\n throw new Error(\"Function number expects (object?)\");\r\n }\r\n if (arguments.length == 1) {\r\n return new XNumber(XNodeSet.prototype.stringForNode(c.contextNode));\r\n }\r\n return arguments[1].evaluate(c).number();\r\n };\r\n\r\n Functions.sum = function () {\r\n var c = arguments[0];\r\n var ns;\r\n if (arguments.length != 2 || !Utilities.instance_of((ns = arguments[1].evaluate(c)), XNodeSet)) {\r\n throw new Error(\"Function sum expects (node-set)\");\r\n }\r\n ns = ns.toUnsortedArray();\r\n var n = 0;\r\n for (var i = 0; i < ns.length; i++) {\r\n n += new XNumber(XNodeSet.prototype.stringForNode(ns[i])).numberValue();\r\n }\r\n return new XNumber(n);\r\n };\r\n\r\n Functions.floor = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function floor expects (number)\");\r\n }\r\n return new XNumber(Math.floor(arguments[1].evaluate(c).numberValue()));\r\n };\r\n\r\n Functions.ceiling = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function ceiling expects (number)\");\r\n }\r\n return new XNumber(Math.ceil(arguments[1].evaluate(c).numberValue()));\r\n };\r\n\r\n Functions.round = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function round expects (number)\");\r\n }\r\n return new XNumber(Math.round(arguments[1].evaluate(c).numberValue()));\r\n };\r\n\r\n // Utilities /////////////////////////////////////////////////////////////////\r\n\r\n var Utilities = new Object();\r\n\r\n // Returns true if the node is an attribute node or namespace node\r\n var isAttributeLike = function (val) {\r\n return val && (\r\n val.nodeType === NodeTypes.ATTRIBUTE_NODE ||\r\n val.ownerElement ||\r\n val.isXPathNamespace\r\n );\r\n }\r\n\r\n Utilities.splitQName = function (qn) {\r\n var i = qn.indexOf(\":\");\r\n if (i == -1) {\r\n return [null, qn];\r\n }\r\n return [qn.substring(0, i), qn.substring(i + 1)];\r\n };\r\n\r\n Utilities.resolveQName = function (qn, nr, n, useDefault) {\r\n var parts = Utilities.splitQName(qn);\r\n if (parts[0] != null) {\r\n parts[0] = nr.getNamespace(parts[0], n);\r\n } else {\r\n if (useDefault) {\r\n parts[0] = nr.getNamespace(\"\", n);\r\n if (parts[0] == null) {\r\n parts[0] = \"\";\r\n }\r\n } else {\r\n parts[0] = \"\";\r\n }\r\n }\r\n return parts;\r\n };\r\n\r\n Utilities.isSpace = function (c) {\r\n return c == 0x9 || c == 0xd || c == 0xa || c == 0x20;\r\n };\r\n\r\n Utilities.isLetter = function (c) {\r\n return c >= 0x0041 && c <= 0x005A ||\r\n c >= 0x0061 && c <= 0x007A ||\r\n c >= 0x00C0 && c <= 0x00D6 ||\r\n c >= 0x00D8 && c <= 0x00F6 ||\r\n c >= 0x00F8 && c <= 0x00FF ||\r\n c >= 0x0100 && c <= 0x0131 ||\r\n c >= 0x0134 && c <= 0x013E ||\r\n c >= 0x0141 && c <= 0x0148 ||\r\n c >= 0x014A && c <= 0x017E ||\r\n c >= 0x0180 && c <= 0x01C3 ||\r\n c >= 0x01CD && c <= 0x01F0 ||\r\n c >= 0x01F4 && c <= 0x01F5 ||\r\n c >= 0x01FA && c <= 0x0217 ||\r\n c >= 0x0250 && c <= 0x02A8 ||\r\n c >= 0x02BB && c <= 0x02C1 ||\r\n c == 0x0386 ||\r\n c >= 0x0388 && c <= 0x038A ||\r\n c == 0x038C ||\r\n c >= 0x038E && c <= 0x03A1 ||\r\n c >= 0x03A3 && c <= 0x03CE ||\r\n c >= 0x03D0 && c <= 0x03D6 ||\r\n c == 0x03DA ||\r\n c == 0x03DC ||\r\n c == 0x03DE ||\r\n c == 0x03E0 ||\r\n c >= 0x03E2 && c <= 0x03F3 ||\r\n c >= 0x0401 && c <= 0x040C ||\r\n c >= 0x040E && c <= 0x044F ||\r\n c >= 0x0451 && c <= 0x045C ||\r\n c >= 0x045E && c <= 0x0481 ||\r\n c >= 0x0490 && c <= 0x04C4 ||\r\n c >= 0x04C7 && c <= 0x04C8 ||\r\n c >= 0x04CB && c <= 0x04CC ||\r\n c >= 0x04D0 && c <= 0x04EB ||\r\n c >= 0x04EE && c <= 0x04F5 ||\r\n c >= 0x04F8 && c <= 0x04F9 ||\r\n c >= 0x0531 && c <= 0x0556 ||\r\n c == 0x0559 ||\r\n c >= 0x0561 && c <= 0x0586 ||\r\n c >= 0x05D0 && c <= 0x05EA ||\r\n c >= 0x05F0 && c <= 0x05F2 ||\r\n c >= 0x0621 && c <= 0x063A ||\r\n c >= 0x0641 && c <= 0x064A ||\r\n c >= 0x0671 && c <= 0x06B7 ||\r\n c >= 0x06BA && c <= 0x06BE ||\r\n c >= 0x06C0 && c <= 0x06CE ||\r\n c >= 0x06D0 && c <= 0x06D3 ||\r\n c == 0x06D5 ||\r\n c >= 0x06E5 && c <= 0x06E6 ||\r\n c >= 0x0905 && c <= 0x0939 ||\r\n c == 0x093D ||\r\n c >= 0x0958 && c <= 0x0961 ||\r\n c >= 0x0985 && c <= 0x098C ||\r\n c >= 0x098F && c <= 0x0990 ||\r\n c >= 0x0993 && c <= 0x09A8 ||\r\n c >= 0x09AA && c <= 0x09B0 ||\r\n c == 0x09B2 ||\r\n c >= 0x09B6 && c <= 0x09B9 ||\r\n c >= 0x09DC && c <= 0x09DD ||\r\n c >= 0x09DF && c <= 0x09E1 ||\r\n c >= 0x09F0 && c <= 0x09F1 ||\r\n c >= 0x0A05 && c <= 0x0A0A ||\r\n c >= 0x0A0F && c <= 0x0A10 ||\r\n c >= 0x0A13 && c <= 0x0A28 ||\r\n c >= 0x0A2A && c <= 0x0A30 ||\r\n c >= 0x0A32 && c <= 0x0A33 ||\r\n c >= 0x0A35 && c <= 0x0A36 ||\r\n c >= 0x0A38 && c <= 0x0A39 ||\r\n c >= 0x0A59 && c <= 0x0A5C ||\r\n c == 0x0A5E ||\r\n c >= 0x0A72 && c <= 0x0A74 ||\r\n c >= 0x0A85 && c <= 0x0A8B ||\r\n c == 0x0A8D ||\r\n c >= 0x0A8F && c <= 0x0A91 ||\r\n c >= 0x0A93 && c <= 0x0AA8 ||\r\n c >= 0x0AAA && c <= 0x0AB0 ||\r\n c >= 0x0AB2 && c <= 0x0AB3 ||\r\n c >= 0x0AB5 && c <= 0x0AB9 ||\r\n c == 0x0ABD ||\r\n c == 0x0AE0 ||\r\n c >= 0x0B05 && c <= 0x0B0C ||\r\n c >= 0x0B0F && c <= 0x0B10 ||\r\n c >= 0x0B13 && c <= 0x0B28 ||\r\n c >= 0x0B2A && c <= 0x0B30 ||\r\n c >= 0x0B32 && c <= 0x0B33 ||\r\n c >= 0x0B36 && c <= 0x0B39 ||\r\n c == 0x0B3D ||\r\n c >= 0x0B5C && c <= 0x0B5D ||\r\n c >= 0x0B5F && c <= 0x0B61 ||\r\n c >= 0x0B85 && c <= 0x0B8A ||\r\n c >= 0x0B8E && c <= 0x0B90 ||\r\n c >= 0x0B92 && c <= 0x0B95 ||\r\n c >= 0x0B99 && c <= 0x0B9A ||\r\n c == 0x0B9C ||\r\n c >= 0x0B9E && c <= 0x0B9F ||\r\n c >= 0x0BA3 && c <= 0x0BA4 ||\r\n c >= 0x0BA8 && c <= 0x0BAA ||\r\n c >= 0x0BAE && c <= 0x0BB5 ||\r\n c >= 0x0BB7 && c <= 0x0BB9 ||\r\n c >= 0x0C05 && c <= 0x0C0C ||\r\n c >= 0x0C0E && c <= 0x0C10 ||\r\n c >= 0x0C12 && c <= 0x0C28 ||\r\n c >= 0x0C2A && c <= 0x0C33 ||\r\n c >= 0x0C35 && c <= 0x0C39 ||\r\n c >= 0x0C60 && c <= 0x0C61 ||\r\n c >= 0x0C85 && c <= 0x0C8C ||\r\n c >= 0x0C8E && c <= 0x0C90 ||\r\n c >= 0x0C92 && c <= 0x0CA8 ||\r\n c >= 0x0CAA && c <= 0x0CB3 ||\r\n c >= 0x0CB5 && c <= 0x0CB9 ||\r\n c == 0x0CDE ||\r\n c >= 0x0CE0 && c <= 0x0CE1 ||\r\n c >= 0x0D05 && c <= 0x0D0C ||\r\n c >= 0x0D0E && c <= 0x0D10 ||\r\n c >= 0x0D12 && c <= 0x0D28 ||\r\n c >= 0x0D2A && c <= 0x0D39 ||\r\n c >= 0x0D60 && c <= 0x0D61 ||\r\n c >= 0x0E01 && c <= 0x0E2E ||\r\n c == 0x0E30 ||\r\n c >= 0x0E32 && c <= 0x0E33 ||\r\n c >= 0x0E40 && c <= 0x0E45 ||\r\n c >= 0x0E81 && c <= 0x0E82 ||\r\n c == 0x0E84 ||\r\n c >= 0x0E87 && c <= 0x0E88 ||\r\n c == 0x0E8A ||\r\n c == 0x0E8D ||\r\n c >= 0x0E94 && c <= 0x0E97 ||\r\n c >= 0x0E99 && c <= 0x0E9F ||\r\n c >= 0x0EA1 && c <= 0x0EA3 ||\r\n c == 0x0EA5 ||\r\n c == 0x0EA7 ||\r\n c >= 0x0EAA && c <= 0x0EAB ||\r\n c >= 0x0EAD && c <= 0x0EAE ||\r\n c == 0x0EB0 ||\r\n c >= 0x0EB2 && c <= 0x0EB3 ||\r\n c == 0x0EBD ||\r\n c >= 0x0EC0 && c <= 0x0EC4 ||\r\n c >= 0x0F40 && c <= 0x0F47 ||\r\n c >= 0x0F49 && c <= 0x0F69 ||\r\n c >= 0x10A0 && c <= 0x10C5 ||\r\n c >= 0x10D0 && c <= 0x10F6 ||\r\n c == 0x1100 ||\r\n c >= 0x1102 && c <= 0x1103 ||\r\n c >= 0x1105 && c <= 0x1107 ||\r\n c == 0x1109 ||\r\n c >= 0x110B && c <= 0x110C ||\r\n c >= 0x110E && c <= 0x1112 ||\r\n c == 0x113C ||\r\n c == 0x113E ||\r\n c == 0x1140 ||\r\n c == 0x114C ||\r\n c == 0x114E ||\r\n c == 0x1150 ||\r\n c >= 0x1154 && c <= 0x1155 ||\r\n c == 0x1159 ||\r\n c >= 0x115F && c <= 0x1161 ||\r\n c == 0x1163 ||\r\n c == 0x1165 ||\r\n c == 0x1167 ||\r\n c == 0x1169 ||\r\n c >= 0x116D && c <= 0x116E ||\r\n c >= 0x1172 && c <= 0x1173 ||\r\n c == 0x1175 ||\r\n c == 0x119E ||\r\n c == 0x11A8 ||\r\n c == 0x11AB ||\r\n c >= 0x11AE && c <= 0x11AF ||\r\n c >= 0x11B7 && c <= 0x11B8 ||\r\n c == 0x11BA ||\r\n c >= 0x11BC && c <= 0x11C2 ||\r\n c == 0x11EB ||\r\n c == 0x11F0 ||\r\n c == 0x11F9 ||\r\n c >= 0x1E00 && c <= 0x1E9B ||\r\n c >= 0x1EA0 && c <= 0x1EF9 ||\r\n c >= 0x1F00 && c <= 0x1F15 ||\r\n c >= 0x1F18 && c <= 0x1F1D ||\r\n c >= 0x1F20 && c <= 0x1F45 ||\r\n c >= 0x1F48 && c <= 0x1F4D ||\r\n c >= 0x1F50 && c <= 0x1F57 ||\r\n c == 0x1F59 ||\r\n c == 0x1F5B ||\r\n c == 0x1F5D ||\r\n c >= 0x1F5F && c <= 0x1F7D ||\r\n c >= 0x1F80 && c <= 0x1FB4 ||\r\n c >= 0x1FB6 && c <= 0x1FBC ||\r\n c == 0x1FBE ||\r\n c >= 0x1FC2 && c <= 0x1FC4 ||\r\n c >= 0x1FC6 && c <= 0x1FCC ||\r\n c >= 0x1FD0 && c <= 0x1FD3 ||\r\n c >= 0x1FD6 && c <= 0x1FDB ||\r\n c >= 0x1FE0 && c <= 0x1FEC ||\r\n c >= 0x1FF2 && c <= 0x1FF4 ||\r\n c >= 0x1FF6 && c <= 0x1FFC ||\r\n c == 0x2126 ||\r\n c >= 0x212A && c <= 0x212B ||\r\n c == 0x212E ||\r\n c >= 0x2180 && c <= 0x2182 ||\r\n c >= 0x3041 && c <= 0x3094 ||\r\n c >= 0x30A1 && c <= 0x30FA ||\r\n c >= 0x3105 && c <= 0x312C ||\r\n c >= 0xAC00 && c <= 0xD7A3 ||\r\n c >= 0x4E00 && c <= 0x9FA5 ||\r\n c == 0x3007 ||\r\n c >= 0x3021 && c <= 0x3029;\r\n };\r\n\r\n Utilities.isNCNameChar = function (c) {\r\n return c >= 0x0030 && c <= 0x0039\r\n || c >= 0x0660 && c <= 0x0669\r\n || c >= 0x06F0 && c <= 0x06F9\r\n || c >= 0x0966 && c <= 0x096F\r\n || c >= 0x09E6 && c <= 0x09EF\r\n || c >= 0x0A66 && c <= 0x0A6F\r\n || c >= 0x0AE6 && c <= 0x0AEF\r\n || c >= 0x0B66 && c <= 0x0B6F\r\n || c >= 0x0BE7 && c <= 0x0BEF\r\n || c >= 0x0C66 && c <= 0x0C6F\r\n || c >= 0x0CE6 && c <= 0x0CEF\r\n || c >= 0x0D66 && c <= 0x0D6F\r\n || c >= 0x0E50 && c <= 0x0E59\r\n || c >= 0x0ED0 && c <= 0x0ED9\r\n || c >= 0x0F20 && c <= 0x0F29\r\n || c == 0x002E\r\n || c == 0x002D\r\n || c == 0x005F\r\n || Utilities.isLetter(c)\r\n || c >= 0x0300 && c <= 0x0345\r\n || c >= 0x0360 && c <= 0x0361\r\n || c >= 0x0483 && c <= 0x0486\r\n || c >= 0x0591 && c <= 0x05A1\r\n || c >= 0x05A3 && c <= 0x05B9\r\n || c >= 0x05BB && c <= 0x05BD\r\n || c == 0x05BF\r\n || c >= 0x05C1 && c <= 0x05C2\r\n || c == 0x05C4\r\n || c >= 0x064B && c <= 0x0652\r\n || c == 0x0670\r\n || c >= 0x06D6 && c <= 0x06DC\r\n || c >= 0x06DD && c <= 0x06DF\r\n || c >= 0x06E0 && c <= 0x06E4\r\n || c >= 0x06E7 && c <= 0x06E8\r\n || c >= 0x06EA && c <= 0x06ED\r\n || c >= 0x0901 && c <= 0x0903\r\n || c == 0x093C\r\n || c >= 0x093E && c <= 0x094C\r\n || c == 0x094D\r\n || c >= 0x0951 && c <= 0x0954\r\n || c >= 0x0962 && c <= 0x0963\r\n || c >= 0x0981 && c <= 0x0983\r\n || c == 0x09BC\r\n || c == 0x09BE\r\n || c == 0x09BF\r\n || c >= 0x09C0 && c <= 0x09C4\r\n || c >= 0x09C7 && c <= 0x09C8\r\n || c >= 0x09CB && c <= 0x09CD\r\n || c == 0x09D7\r\n || c >= 0x09E2 && c <= 0x09E3\r\n || c == 0x0A02\r\n || c == 0x0A3C\r\n || c == 0x0A3E\r\n || c == 0x0A3F\r\n || c >= 0x0A40 && c <= 0x0A42\r\n || c >= 0x0A47 && c <= 0x0A48\r\n || c >= 0x0A4B && c <= 0x0A4D\r\n || c >= 0x0A70 && c <= 0x0A71\r\n || c >= 0x0A81 && c <= 0x0A83\r\n || c == 0x0ABC\r\n || c >= 0x0ABE && c <= 0x0AC5\r\n || c >= 0x0AC7 && c <= 0x0AC9\r\n || c >= 0x0ACB && c <= 0x0ACD\r\n || c >= 0x0B01 && c <= 0x0B03\r\n || c == 0x0B3C\r\n || c >= 0x0B3E && c <= 0x0B43\r\n || c >= 0x0B47 && c <= 0x0B48\r\n || c >= 0x0B4B && c <= 0x0B4D\r\n || c >= 0x0B56 && c <= 0x0B57\r\n || c >= 0x0B82 && c <= 0x0B83\r\n || c >= 0x0BBE && c <= 0x0BC2\r\n || c >= 0x0BC6 && c <= 0x0BC8\r\n || c >= 0x0BCA && c <= 0x0BCD\r\n || c == 0x0BD7\r\n || c >= 0x0C01 && c <= 0x0C03\r\n || c >= 0x0C3E && c <= 0x0C44\r\n || c >= 0x0C46 && c <= 0x0C48\r\n || c >= 0x0C4A && c <= 0x0C4D\r\n || c >= 0x0C55 && c <= 0x0C56\r\n || c >= 0x0C82 && c <= 0x0C83\r\n || c >= 0x0CBE && c <= 0x0CC4\r\n || c >= 0x0CC6 && c <= 0x0CC8\r\n || c >= 0x0CCA && c <= 0x0CCD\r\n || c >= 0x0CD5 && c <= 0x0CD6\r\n || c >= 0x0D02 && c <= 0x0D03\r\n || c >= 0x0D3E && c <= 0x0D43\r\n || c >= 0x0D46 && c <= 0x0D48\r\n || c >= 0x0D4A && c <= 0x0D4D\r\n || c == 0x0D57\r\n || c == 0x0E31\r\n || c >= 0x0E34 && c <= 0x0E3A\r\n || c >= 0x0E47 && c <= 0x0E4E\r\n || c == 0x0EB1\r\n || c >= 0x0EB4 && c <= 0x0EB9\r\n || c >= 0x0EBB && c <= 0x0EBC\r\n || c >= 0x0EC8 && c <= 0x0ECD\r\n || c >= 0x0F18 && c <= 0x0F19\r\n || c == 0x0F35\r\n || c == 0x0F37\r\n || c == 0x0F39\r\n || c == 0x0F3E\r\n || c == 0x0F3F\r\n || c >= 0x0F71 && c <= 0x0F84\r\n || c >= 0x0F86 && c <= 0x0F8B\r\n || c >= 0x0F90 && c <= 0x0F95\r\n || c == 0x0F97\r\n || c >= 0x0F99 && c <= 0x0FAD\r\n || c >= 0x0FB1 && c <= 0x0FB7\r\n || c == 0x0FB9\r\n || c >= 0x20D0 && c <= 0x20DC\r\n || c == 0x20E1\r\n || c >= 0x302A && c <= 0x302F\r\n || c == 0x3099\r\n || c == 0x309A\r\n || c == 0x00B7\r\n || c == 0x02D0\r\n || c == 0x02D1\r\n || c == 0x0387\r\n || c == 0x0640\r\n || c == 0x0E46\r\n || c == 0x0EC6\r\n || c == 0x3005\r\n || c >= 0x3031 && c <= 0x3035\r\n || c >= 0x309D && c <= 0x309E\r\n || c >= 0x30FC && c <= 0x30FE;\r\n };\r\n\r\n Utilities.coalesceText = function (n) {\r\n for (var m = n.firstChild; m != null; m = m.nextSibling) {\r\n if (m.nodeType == NodeTypes.TEXT_NODE || m.nodeType == NodeTypes.CDATA_SECTION_NODE) {\r\n var s = m.nodeValue;\r\n var first = m;\r\n m = m.nextSibling;\r\n while (m != null && (m.nodeType == NodeTypes.TEXT_NODE || m.nodeType == NodeTypes.CDATA_SECTION_NODE)) {\r\n s += m.nodeValue;\r\n var del = m;\r\n m = m.nextSibling;\r\n del.parentNode.removeChild(del);\r\n }\r\n if (first.nodeType == NodeTypes.CDATA_SECTION_NODE) {\r\n var p = first.parentNode;\r\n if (first.nextSibling == null) {\r\n p.removeChild(first);\r\n p.appendChild(p.ownerDocument.createTextNode(s));\r\n } else {\r\n var next = first.nextSibling;\r\n p.removeChild(first);\r\n p.insertBefore(p.ownerDocument.createTextNode(s), next);\r\n }\r\n } else {\r\n first.nodeValue = s;\r\n }\r\n if (m == null) {\r\n break;\r\n }\r\n } else if (m.nodeType == NodeTypes.ELEMENT_NODE) {\r\n Utilities.coalesceText(m);\r\n }\r\n }\r\n };\r\n\r\n Utilities.instance_of = function (o, c) {\r\n while (o != null) {\r\n if (o.constructor === c) {\r\n return true;\r\n }\r\n if (o === Object) {\r\n return false;\r\n }\r\n o = o.constructor.superclass;\r\n }\r\n return false;\r\n };\r\n\r\n Utilities.getElementById = function (n, id) {\r\n // Note that this does not check the DTD to check for actual\r\n // attributes of type ID, so this may be a bit wrong.\r\n if (n.nodeType == NodeTypes.ELEMENT_NODE) {\r\n if (n.getAttribute(\"id\") == id\r\n || n.getAttributeNS(null, \"id\") == id) {\r\n return n;\r\n }\r\n }\r\n for (var m = n.firstChild; m != null; m = m.nextSibling) {\r\n var res = Utilities.getElementById(m, id);\r\n if (res != null) {\r\n return res;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n // XPathException ////////////////////////////////////////////////////////////\r\n\r\n var XPathException = (function () {\r\n function getMessage(code, exception) {\r\n var msg = exception ? \": \" + exception.toString() : \"\";\r\n switch (code) {\r\n case XPathException.INVALID_EXPRESSION_ERR:\r\n return \"Invalid expression\" + msg;\r\n case XPathException.TYPE_ERR:\r\n return \"Type error\" + msg;\r\n }\r\n return null;\r\n }\r\n\r\n function XPathException(code, error, message) {\r\n var err = Error.call(this, getMessage(code, error) || message);\r\n\r\n err.code = code;\r\n err.exception = error;\r\n\r\n return err;\r\n }\r\n\r\n XPathException.prototype = Object.create(Error.prototype);\r\n XPathException.prototype.constructor = XPathException;\r\n XPathException.superclass = Error;\r\n\r\n XPathException.prototype.toString = function () {\r\n return this.message;\r\n };\r\n\r\n XPathException.fromMessage = function (message, error) {\r\n return new XPathException(null, error, message);\r\n };\r\n\r\n XPathException.INVALID_EXPRESSION_ERR = 51;\r\n XPathException.TYPE_ERR = 52;\r\n\r\n return XPathException;\r\n })();\r\n\r\n // XPathExpression ///////////////////////////////////////////////////////////\r\n\r\n XPathExpression.prototype = {};\r\n XPathExpression.prototype.constructor = XPathExpression;\r\n XPathExpression.superclass = Object.prototype;\r\n\r\n function XPathExpression(e, r, p) {\r\n this.xpath = p.parse(e);\r\n this.context = new XPathContext();\r\n this.context.namespaceResolver = new XPathNSResolverWrapper(r);\r\n }\r\n\r\n XPathExpression.getOwnerDocument = function (n) {\r\n return n.nodeType === NodeTypes.DOCUMENT_NODE ? n : n.ownerDocument;\r\n }\r\n\r\n XPathExpression.detectHtmlDom = function (n) {\r\n if (!n) { return false; }\r\n\r\n var doc = XPathExpression.getOwnerDocument(n);\r\n\r\n try {\r\n return doc.implementation.hasFeature(\"HTML\", \"2.0\");\r\n } catch (e) {\r\n return true;\r\n }\r\n }\r\n\r\n XPathExpression.prototype.evaluate = function (n, t, res) {\r\n this.context.expressionContextNode = n;\r\n // backward compatibility - no reliable way to detect whether the DOM is HTML, but\r\n // this library has been using this method up until now, so we will continue to use it\r\n // ONLY when using an XPathExpression\r\n this.context.caseInsensitive = XPathExpression.detectHtmlDom(n);\r\n\r\n var result = this.xpath.evaluate(this.context);\r\n\r\n return new XPathResult(result, t);\r\n }\r\n\r\n // XPathNSResolverWrapper ////////////////////////////////////////////////////\r\n\r\n XPathNSResolverWrapper.prototype = {};\r\n XPathNSResolverWrapper.prototype.constructor = XPathNSResolverWrapper;\r\n XPathNSResolverWrapper.superclass = Object.prototype;\r\n\r\n function XPathNSResolverWrapper(r) {\r\n this.xpathNSResolver = r;\r\n }\r\n\r\n XPathNSResolverWrapper.prototype.getNamespace = function (prefix, n) {\r\n if (this.xpathNSResolver == null) {\r\n return null;\r\n }\r\n return this.xpathNSResolver.lookupNamespaceURI(prefix);\r\n };\r\n\r\n // NodeXPathNSResolver ///////////////////////////////////////////////////////\r\n\r\n NodeXPathNSResolver.prototype = {};\r\n NodeXPathNSResolver.prototype.constructor = NodeXPathNSResolver;\r\n NodeXPathNSResolver.superclass = Object.prototype;\r\n\r\n function NodeXPathNSResolver(n) {\r\n this.node = n;\r\n this.namespaceResolver = new NamespaceResolver();\r\n }\r\n\r\n NodeXPathNSResolver.prototype.lookupNamespaceURI = function (prefix) {\r\n return this.namespaceResolver.getNamespace(prefix, this.node);\r\n };\r\n\r\n // XPathResult ///////////////////////////////////////////////////////////////\r\n\r\n XPathResult.prototype = {};\r\n XPathResult.prototype.constructor = XPathResult;\r\n XPathResult.superclass = Object.prototype;\r\n\r\n function XPathResult(v, t) {\r\n if (t == XPathResult.ANY_TYPE) {\r\n if (v.constructor === XString) {\r\n t = XPathResult.STRING_TYPE;\r\n } else if (v.constructor === XNumber) {\r\n t = XPathResult.NUMBER_TYPE;\r\n } else if (v.constructor === XBoolean) {\r\n t = XPathResult.BOOLEAN_TYPE;\r\n } else if (v.constructor === XNodeSet) {\r\n t = XPathResult.UNORDERED_NODE_ITERATOR_TYPE;\r\n }\r\n }\r\n this.resultType = t;\r\n switch (t) {\r\n case XPathResult.NUMBER_TYPE:\r\n this.numberValue = v.numberValue();\r\n return;\r\n case XPathResult.STRING_TYPE:\r\n this.stringValue = v.stringValue();\r\n return;\r\n case XPathResult.BOOLEAN_TYPE:\r\n this.booleanValue = v.booleanValue();\r\n return;\r\n case XPathResult.ANY_UNORDERED_NODE_TYPE:\r\n case XPathResult.FIRST_ORDERED_NODE_TYPE:\r\n if (v.constructor === XNodeSet) {\r\n this.singleNodeValue = v.first();\r\n return;\r\n }\r\n break;\r\n case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:\r\n case XPathResult.ORDERED_NODE_ITERATOR_TYPE:\r\n if (v.constructor === XNodeSet) {\r\n this.invalidIteratorState = false;\r\n this.nodes = v.toArray();\r\n this.iteratorIndex = 0;\r\n return;\r\n }\r\n break;\r\n case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:\r\n case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:\r\n if (v.constructor === XNodeSet) {\r\n this.nodes = v.toArray();\r\n this.snapshotLength = this.nodes.length;\r\n return;\r\n }\r\n break;\r\n }\r\n throw new XPathException(XPathException.TYPE_ERR);\r\n };\r\n\r\n XPathResult.prototype.iterateNext = function () {\r\n if (this.resultType != XPathResult.UNORDERED_NODE_ITERATOR_TYPE\r\n && this.resultType != XPathResult.ORDERED_NODE_ITERATOR_TYPE) {\r\n throw new XPathException(XPathException.TYPE_ERR);\r\n }\r\n return this.nodes[this.iteratorIndex++];\r\n };\r\n\r\n XPathResult.prototype.snapshotItem = function (i) {\r\n if (this.resultType != XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE\r\n && this.resultType != XPathResult.ORDERED_NODE_SNAPSHOT_TYPE) {\r\n throw new XPathException(XPathException.TYPE_ERR);\r\n }\r\n return this.nodes[i];\r\n };\r\n\r\n XPathResult.ANY_TYPE = 0;\r\n XPathResult.NUMBER_TYPE = 1;\r\n XPathResult.STRING_TYPE = 2;\r\n XPathResult.BOOLEAN_TYPE = 3;\r\n XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;\r\n XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;\r\n XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;\r\n XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;\r\n XPathResult.ANY_UNORDERED_NODE_TYPE = 8;\r\n XPathResult.FIRST_ORDERED_NODE_TYPE = 9;\r\n\r\n // DOM 3 XPath support ///////////////////////////////////////////////////////\r\n\r\n function installDOM3XPathSupport(doc, p) {\r\n doc.createExpression = function (e, r) {\r\n try {\r\n return new XPathExpression(e, r, p);\r\n } catch (e) {\r\n throw new XPathException(XPathException.INVALID_EXPRESSION_ERR, e);\r\n }\r\n };\r\n doc.createNSResolver = function (n) {\r\n return new NodeXPathNSResolver(n);\r\n };\r\n doc.evaluate = function (e, cn, r, t, res) {\r\n if (t < 0 || t > 9) {\r\n throw { code: 0, toString: function () { return \"Request type not supported\"; } };\r\n }\r\n return doc.createExpression(e, r, p).evaluate(cn, t, res);\r\n };\r\n };\r\n\r\n // ---------------------------------------------------------------------------\r\n\r\n // Install DOM 3 XPath support for the current document.\r\n try {\r\n var shouldInstall = true;\r\n try {\r\n if (document.implementation\r\n && document.implementation.hasFeature\r\n && document.implementation.hasFeature(\"XPath\", null)) {\r\n shouldInstall = false;\r\n }\r\n } catch (e) {\r\n }\r\n if (shouldInstall) {\r\n installDOM3XPathSupport(document, new XPathParser());\r\n }\r\n } catch (e) {\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // exports for node.js\r\n\r\n installDOM3XPathSupport(exports, new XPathParser());\r\n\r\n (function () {\r\n var parser = new XPathParser();\r\n\r\n var defaultNSResolver = new NamespaceResolver();\r\n var defaultFunctionResolver = new FunctionResolver();\r\n var defaultVariableResolver = new VariableResolver();\r\n\r\n function makeNSResolverFromFunction(func) {\r\n return {\r\n getNamespace: function (prefix, node) {\r\n var ns = func(prefix, node);\r\n\r\n return ns || defaultNSResolver.getNamespace(prefix, node);\r\n }\r\n };\r\n }\r\n\r\n function makeNSResolverFromObject(obj) {\r\n return makeNSResolverFromFunction(obj.getNamespace.bind(obj));\r\n }\r\n\r\n function makeNSResolverFromMap(map) {\r\n return makeNSResolverFromFunction(function (prefix) {\r\n return map[prefix];\r\n });\r\n }\r\n\r\n function makeNSResolver(resolver) {\r\n if (resolver && typeof resolver.getNamespace === \"function\") {\r\n return makeNSResolverFromObject(resolver);\r\n }\r\n\r\n if (typeof resolver === \"function\") {\r\n return makeNSResolverFromFunction(resolver);\r\n }\r\n\r\n // assume prefix -> uri mapping\r\n if (typeof resolver === \"object\") {\r\n return makeNSResolverFromMap(resolver);\r\n }\r\n\r\n return defaultNSResolver;\r\n }\r\n\r\n /** Converts native JavaScript types to their XPath library equivalent */\r\n function convertValue(value) {\r\n if (value === null ||\r\n typeof value === \"undefined\" ||\r\n value instanceof XString ||\r\n value instanceof XBoolean ||\r\n value instanceof XNumber ||\r\n value instanceof XNodeSet) {\r\n return value;\r\n }\r\n\r\n switch (typeof value) {\r\n case \"string\": return new XString(value);\r\n case \"boolean\": return new XBoolean(value);\r\n case \"number\": return new XNumber(value);\r\n }\r\n\r\n // assume node(s)\r\n var ns = new XNodeSet();\r\n ns.addArray([].concat(value));\r\n return ns;\r\n }\r\n\r\n function makeEvaluator(func) {\r\n return function (context) {\r\n var args = Array.prototype.slice.call(arguments, 1).map(function (arg) {\r\n return arg.evaluate(context);\r\n });\r\n var result = func.apply(this, [].concat(context, args));\r\n return convertValue(result);\r\n };\r\n }\r\n\r\n function makeFunctionResolverFromFunction(func) {\r\n return {\r\n getFunction: function (name, namespace) {\r\n var found = func(name, namespace);\r\n if (found) {\r\n return makeEvaluator(found);\r\n }\r\n return defaultFunctionResolver.getFunction(name, namespace);\r\n }\r\n };\r\n }\r\n\r\n function makeFunctionResolverFromObject(obj) {\r\n return makeFunctionResolverFromFunction(obj.getFunction.bind(obj));\r\n }\r\n\r\n function makeFunctionResolverFromMap(map) {\r\n return makeFunctionResolverFromFunction(function (name) {\r\n return map[name];\r\n });\r\n }\r\n\r\n function makeFunctionResolver(resolver) {\r\n if (resolver && typeof resolver.getFunction === \"function\") {\r\n return makeFunctionResolverFromObject(resolver);\r\n }\r\n\r\n if (typeof resolver === \"function\") {\r\n return makeFunctionResolverFromFunction(resolver);\r\n }\r\n\r\n // assume map\r\n if (typeof resolver === \"object\") {\r\n return makeFunctionResolverFromMap(resolver);\r\n }\r\n\r\n return defaultFunctionResolver;\r\n }\r\n\r\n function makeVariableResolverFromFunction(func) {\r\n return {\r\n getVariable: function (name, namespace) {\r\n var value = func(name, namespace);\r\n return convertValue(value);\r\n }\r\n };\r\n }\r\n\r\n function makeVariableResolver(resolver) {\r\n if (resolver) {\r\n if (typeof resolver.getVariable === \"function\") {\r\n return makeVariableResolverFromFunction(resolver.getVariable.bind(resolver));\r\n }\r\n\r\n if (typeof resolver === \"function\") {\r\n return makeVariableResolverFromFunction(resolver);\r\n }\r\n\r\n // assume map\r\n if (typeof resolver === \"object\") {\r\n return makeVariableResolverFromFunction(function (name) {\r\n return resolver[name];\r\n });\r\n }\r\n }\r\n\r\n return defaultVariableResolver;\r\n }\r\n\r\n function copyIfPresent(prop, dest, source) {\r\n if (prop in source) { dest[prop] = source[prop]; }\r\n }\r\n\r\n function makeContext(options) {\r\n var context = new XPathContext();\r\n\r\n if (options) {\r\n context.namespaceResolver = makeNSResolver(options.namespaces);\r\n context.functionResolver = makeFunctionResolver(options.functions);\r\n context.variableResolver = makeVariableResolver(options.variables);\r\n context.expressionContextNode = options.node;\r\n copyIfPresent('allowAnyNamespaceForNoPrefix', context, options);\r\n copyIfPresent('isHtml', context, options);\r\n } else {\r\n context.namespaceResolver = defaultNSResolver;\r\n }\r\n\r\n return context;\r\n }\r\n\r\n function evaluate(parsedExpression, options) {\r\n var context = makeContext(options);\r\n\r\n return parsedExpression.evaluate(context);\r\n }\r\n\r\n var evaluatorPrototype = {\r\n evaluate: function (options) {\r\n return evaluate(this.expression, options);\r\n }\r\n\r\n , evaluateNumber: function (options) {\r\n return this.evaluate(options).numberValue();\r\n }\r\n\r\n , evaluateString: function (options) {\r\n return this.evaluate(options).stringValue();\r\n }\r\n\r\n , evaluateBoolean: function (options) {\r\n return this.evaluate(options).booleanValue();\r\n }\r\n\r\n , evaluateNodeSet: function (options) {\r\n return this.evaluate(options).nodeset();\r\n }\r\n\r\n , select: function (options) {\r\n return this.evaluateNodeSet(options).toArray()\r\n }\r\n\r\n , select1: function (options) {\r\n return this.select(options)[0];\r\n }\r\n };\r\n\r\n function parse(xpath) {\r\n var parsed = parser.parse(xpath);\r\n\r\n return Object.create(evaluatorPrototype, {\r\n expression: {\r\n value: parsed\r\n }\r\n });\r\n }\r\n\r\n exports.parse = parse;\r\n })();\r\n\r\n assign(\r\n exports,\r\n {\r\n XPath: XPath,\r\n XPathParser: XPathParser,\r\n XPathResult: XPathResult,\r\n\r\n Step: Step,\r\n PathExpr: PathExpr,\r\n NodeTest: NodeTest,\r\n LocationPath: LocationPath,\r\n\r\n OrOperation: OrOperation,\r\n AndOperation: AndOperation,\r\n\r\n BarOperation: BarOperation,\r\n\r\n EqualsOperation: EqualsOperation,\r\n NotEqualOperation: NotEqualOperation,\r\n LessThanOperation: LessThanOperation,\r\n GreaterThanOperation: GreaterThanOperation,\r\n LessThanOrEqualOperation: LessThanOrEqualOperation,\r\n GreaterThanOrEqualOperation: GreaterThanOrEqualOperation,\r\n\r\n PlusOperation: PlusOperation,\r\n MinusOperation: MinusOperation,\r\n MultiplyOperation: MultiplyOperation,\r\n DivOperation: DivOperation,\r\n ModOperation: ModOperation,\r\n UnaryMinusOperation: UnaryMinusOperation,\r\n\r\n FunctionCall: FunctionCall,\r\n VariableReference: VariableReference,\r\n\r\n XPathContext: XPathContext,\r\n\r\n XNodeSet: XNodeSet,\r\n XBoolean: XBoolean,\r\n XString: XString,\r\n XNumber: XNumber,\r\n\r\n NamespaceResolver: NamespaceResolver,\r\n FunctionResolver: FunctionResolver,\r\n VariableResolver: VariableResolver,\r\n\r\n Utilities: Utilities,\r\n }\r\n );\r\n\r\n // helper\r\n exports.select = function (e, doc, single) {\r\n return exports.selectWithResolver(e, doc, null, single);\r\n };\r\n\r\n exports.useNamespaces = function (mappings) {\r\n var resolver = {\r\n mappings: mappings || {},\r\n lookupNamespaceURI: function (prefix) {\r\n return this.mappings[prefix];\r\n }\r\n };\r\n\r\n return function (e, doc, single) {\r\n return exports.selectWithResolver(e, doc, resolver, single);\r\n };\r\n };\r\n\r\n exports.selectWithResolver = function (e, doc, resolver, single) {\r\n var expression = new XPathExpression(e, resolver, new XPathParser());\r\n var type = XPathResult.ANY_TYPE;\r\n\r\n var result = expression.evaluate(doc, type, null);\r\n\r\n if (result.resultType == XPathResult.STRING_TYPE) {\r\n result = result.stringValue;\r\n }\r\n else if (result.resultType == XPathResult.NUMBER_TYPE) {\r\n result = result.numberValue;\r\n }\r\n else if (result.resultType == XPathResult.BOOLEAN_TYPE) {\r\n result = result.booleanValue;\r\n }\r\n else {\r\n result = result.nodes;\r\n if (single) {\r\n result = result[0];\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n exports.select1 = function (e, doc) {\r\n return exports.select(e, doc, true);\r\n };\r\n\r\n var isArrayOfNodes = function (value) {\r\n return Array.isArray(value) && value.every(isNodeLike);\r\n };\r\n\r\n var isNodeOfType = function (type) {\r\n return function (value) {\r\n return isNodeLike(value) && value.nodeType === type;\r\n };\r\n };\r\n\r\n assign(\r\n exports,\r\n {\r\n isNodeLike: isNodeLike,\r\n isArrayOfNodes: isArrayOfNodes,\r\n isElement: isNodeOfType(NodeTypes.ELEMENT_NODE),\r\n isAttribute: isNodeOfType(NodeTypes.ATTRIBUTE_NODE),\r\n isTextNode: isNodeOfType(NodeTypes.TEXT_NODE),\r\n isCDATASection: isNodeOfType(NodeTypes.CDATA_SECTION_NODE),\r\n isProcessingInstruction: isNodeOfType(NodeTypes.PROCESSING_INSTRUCTION_NODE),\r\n isComment: isNodeOfType(NodeTypes.COMMENT_NODE),\r\n isDocumentNode: isNodeOfType(NodeTypes.DOCUMENT_NODE),\r\n isDocumentTypeNode: isNodeOfType(NodeTypes.DOCUMENT_TYPE_NODE),\r\n isDocumentFragment: isNodeOfType(NodeTypes.DOCUMENT_FRAGMENT_NODE),\r\n }\r\n );\r\n // end non-node wrapper\r\n})(xpath);\r\n","module.exports = require(\"assert\");","module.exports = require(\"async_hooks\");","module.exports = require(\"buffer\");","module.exports = require(\"child_process\");","module.exports = require(\"console\");","module.exports = require(\"crypto\");","module.exports = require(\"diagnostics_channel\");","module.exports = require(\"events\");","module.exports = require(\"fs\");","module.exports = require(\"http\");","module.exports = require(\"http2\");","module.exports = require(\"https\");","module.exports = require(\"net\");","module.exports = require(\"node:crypto\");","module.exports = require(\"node:events\");","module.exports = require(\"node:stream\");","module.exports = require(\"node:util\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = require(\"perf_hooks\");","module.exports = require(\"process\");","module.exports = require(\"querystring\");","module.exports = require(\"stream\");","module.exports = require(\"stream/web\");","module.exports = require(\"string_decoder\");","module.exports = require(\"timers\");","module.exports = require(\"tls\");","module.exports = require(\"url\");","module.exports = require(\"util\");","module.exports = require(\"util/types\");","module.exports = require(\"vm\");","module.exports = require(\"worker_threads\");","module.exports = require(\"zlib\");","'use strict'\n\nconst WritableStream = require('node:stream').Writable\nconst inherits = require('node:util').inherits\n\nconst StreamSearch = require('../../streamsearch/sbmh')\n\nconst PartStream = require('./PartStream')\nconst HeaderParser = require('./HeaderParser')\n\nconst DASH = 45\nconst B_ONEDASH = Buffer.from('-')\nconst B_CRLF = Buffer.from('\\r\\n')\nconst EMPTY_FN = function () {}\n\nfunction Dicer (cfg) {\n if (!(this instanceof Dicer)) { return new Dicer(cfg) }\n WritableStream.call(this, cfg)\n\n if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') }\n\n if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined }\n\n this._headerFirst = cfg.headerFirst\n\n this._dashes = 0\n this._parts = 0\n this._finished = false\n this._realFinish = false\n this._isPreamble = true\n this._justMatched = false\n this._firstWrite = true\n this._inHeader = true\n this._part = undefined\n this._cb = undefined\n this._ignoreData = false\n this._partOpts = { highWaterMark: cfg.partHwm }\n this._pause = false\n\n const self = this\n this._hparser = new HeaderParser(cfg)\n this._hparser.on('header', function (header) {\n self._inHeader = false\n self._part.emit('header', header)\n })\n}\ninherits(Dicer, WritableStream)\n\nDicer.prototype.emit = function (ev) {\n if (ev === 'finish' && !this._realFinish) {\n if (!this._finished) {\n const self = this\n process.nextTick(function () {\n self.emit('error', new Error('Unexpected end of multipart data'))\n if (self._part && !self._ignoreData) {\n const type = (self._isPreamble ? 'Preamble' : 'Part')\n self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'))\n self._part.push(null)\n process.nextTick(function () {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n })\n return\n }\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n })\n }\n } else { WritableStream.prototype.emit.apply(this, arguments) }\n}\n\nDicer.prototype._write = function (data, encoding, cb) {\n // ignore unexpected data (e.g. extra trailer data after finished)\n if (!this._hparser && !this._bparser) { return cb() }\n\n if (this._headerFirst && this._isPreamble) {\n if (!this._part) {\n this._part = new PartStream(this._partOpts)\n if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part) } else { this._ignore() }\n }\n const r = this._hparser.push(data)\n if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() }\n }\n\n // allows for \"easier\" testing\n if (this._firstWrite) {\n this._bparser.push(B_CRLF)\n this._firstWrite = false\n }\n\n this._bparser.push(data)\n\n if (this._pause) { this._cb = cb } else { cb() }\n}\n\nDicer.prototype.reset = function () {\n this._part = undefined\n this._bparser = undefined\n this._hparser = undefined\n}\n\nDicer.prototype.setBoundary = function (boundary) {\n const self = this\n this._bparser = new StreamSearch('\\r\\n--' + boundary)\n this._bparser.on('info', function (isMatch, data, start, end) {\n self._oninfo(isMatch, data, start, end)\n })\n}\n\nDicer.prototype._ignore = function () {\n if (this._part && !this._ignoreData) {\n this._ignoreData = true\n this._part.on('error', EMPTY_FN)\n // we must perform some kind of read on the stream even though we are\n // ignoring the data, otherwise node's Readable stream will not emit 'end'\n // after pushing null to the stream\n this._part.resume()\n }\n}\n\nDicer.prototype._oninfo = function (isMatch, data, start, end) {\n let buf; const self = this; let i = 0; let r; let shouldWriteMore = true\n\n if (!this._part && this._justMatched && data) {\n while (this._dashes < 2 && (start + i) < end) {\n if (data[start + i] === DASH) {\n ++i\n ++this._dashes\n } else {\n if (this._dashes) { buf = B_ONEDASH }\n this._dashes = 0\n break\n }\n }\n if (this._dashes === 2) {\n if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)) }\n this.reset()\n this._finished = true\n // no more parts will be added\n if (self._parts === 0) {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n }\n }\n if (this._dashes) { return }\n }\n if (this._justMatched) { this._justMatched = false }\n if (!this._part) {\n this._part = new PartStream(this._partOpts)\n this._part._read = function (n) {\n self._unpause()\n }\n if (this._isPreamble && this.listenerCount('preamble') !== 0) {\n this.emit('preamble', this._part)\n } else if (this._isPreamble !== true && this.listenerCount('part') !== 0) {\n this.emit('part', this._part)\n } else {\n this._ignore()\n }\n if (!this._isPreamble) { this._inHeader = true }\n }\n if (data && start < end && !this._ignoreData) {\n if (this._isPreamble || !this._inHeader) {\n if (buf) { shouldWriteMore = this._part.push(buf) }\n shouldWriteMore = this._part.push(data.slice(start, end))\n if (!shouldWriteMore) { this._pause = true }\n } else if (!this._isPreamble && this._inHeader) {\n if (buf) { this._hparser.push(buf) }\n r = this._hparser.push(data.slice(start, end))\n if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) }\n }\n }\n if (isMatch) {\n this._hparser.reset()\n if (this._isPreamble) { this._isPreamble = false } else {\n if (start !== end) {\n ++this._parts\n this._part.on('end', function () {\n if (--self._parts === 0) {\n if (self._finished) {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n } else {\n self._unpause()\n }\n }\n })\n }\n }\n this._part.push(null)\n this._part = undefined\n this._ignoreData = false\n this._justMatched = true\n this._dashes = 0\n }\n}\n\nDicer.prototype._unpause = function () {\n if (!this._pause) { return }\n\n this._pause = false\n if (this._cb) {\n const cb = this._cb\n this._cb = undefined\n cb()\n }\n}\n\nmodule.exports = Dicer\n","'use strict'\n\nconst EventEmitter = require('node:events').EventEmitter\nconst inherits = require('node:util').inherits\nconst getLimit = require('../../../lib/utils/getLimit')\n\nconst StreamSearch = require('../../streamsearch/sbmh')\n\nconst B_DCRLF = Buffer.from('\\r\\n\\r\\n')\nconst RE_CRLF = /\\r\\n/g\nconst RE_HDR = /^([^:]+):[ \\t]?([\\x00-\\xFF]+)?$/ // eslint-disable-line no-control-regex\n\nfunction HeaderParser (cfg) {\n EventEmitter.call(this)\n\n cfg = cfg || {}\n const self = this\n this.nread = 0\n this.maxed = false\n this.npairs = 0\n this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000)\n this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024)\n this.buffer = ''\n this.header = {}\n this.finished = false\n this.ss = new StreamSearch(B_DCRLF)\n this.ss.on('info', function (isMatch, data, start, end) {\n if (data && !self.maxed) {\n if (self.nread + end - start >= self.maxHeaderSize) {\n end = self.maxHeaderSize - self.nread + start\n self.nread = self.maxHeaderSize\n self.maxed = true\n } else { self.nread += (end - start) }\n\n self.buffer += data.toString('binary', start, end)\n }\n if (isMatch) { self._finish() }\n })\n}\ninherits(HeaderParser, EventEmitter)\n\nHeaderParser.prototype.push = function (data) {\n const r = this.ss.push(data)\n if (this.finished) { return r }\n}\n\nHeaderParser.prototype.reset = function () {\n this.finished = false\n this.buffer = ''\n this.header = {}\n this.ss.reset()\n}\n\nHeaderParser.prototype._finish = function () {\n if (this.buffer) { this._parseHeader() }\n this.ss.matches = this.ss.maxMatches\n const header = this.header\n this.header = {}\n this.buffer = ''\n this.finished = true\n this.nread = this.npairs = 0\n this.maxed = false\n this.emit('header', header)\n}\n\nHeaderParser.prototype._parseHeader = function () {\n if (this.npairs === this.maxHeaderPairs) { return }\n\n const lines = this.buffer.split(RE_CRLF)\n const len = lines.length\n let m, h\n\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n if (lines[i].length === 0) { continue }\n if (lines[i][0] === '\\t' || lines[i][0] === ' ') {\n // folded header content\n // RFC2822 says to just remove the CRLF and not the whitespace following\n // it, so we follow the RFC and include the leading whitespace ...\n if (h) {\n this.header[h][this.header[h].length - 1] += lines[i]\n continue\n }\n }\n\n const posColon = lines[i].indexOf(':')\n if (\n posColon === -1 ||\n posColon === 0\n ) {\n return\n }\n m = RE_HDR.exec(lines[i])\n h = m[1].toLowerCase()\n this.header[h] = this.header[h] || []\n this.header[h].push((m[2] || ''))\n if (++this.npairs === this.maxHeaderPairs) { break }\n }\n}\n\nmodule.exports = HeaderParser\n","'use strict'\n\nconst inherits = require('node:util').inherits\nconst ReadableStream = require('node:stream').Readable\n\nfunction PartStream (opts) {\n ReadableStream.call(this, opts)\n}\ninherits(PartStream, ReadableStream)\n\nPartStream.prototype._read = function (n) {}\n\nmodule.exports = PartStream\n","'use strict'\n\n/**\n * Copyright Brian White. All rights reserved.\n *\n * @see https://github.com/mscdex/streamsearch\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n *\n * Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation\n * by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool\n */\nconst EventEmitter = require('node:events').EventEmitter\nconst inherits = require('node:util').inherits\n\nfunction SBMH (needle) {\n if (typeof needle === 'string') {\n needle = Buffer.from(needle)\n }\n\n if (!Buffer.isBuffer(needle)) {\n throw new TypeError('The needle has to be a String or a Buffer.')\n }\n\n const needleLength = needle.length\n\n if (needleLength === 0) {\n throw new Error('The needle cannot be an empty String/Buffer.')\n }\n\n if (needleLength > 256) {\n throw new Error('The needle cannot have a length bigger than 256.')\n }\n\n this.maxMatches = Infinity\n this.matches = 0\n\n this._occ = new Array(256)\n .fill(needleLength) // Initialize occurrence table.\n this._lookbehind_size = 0\n this._needle = needle\n this._bufpos = 0\n\n this._lookbehind = Buffer.alloc(needleLength)\n\n // Populate occurrence table with analysis of the needle,\n // ignoring last letter.\n for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var\n this._occ[needle[i]] = needleLength - 1 - i\n }\n}\ninherits(SBMH, EventEmitter)\n\nSBMH.prototype.reset = function () {\n this._lookbehind_size = 0\n this.matches = 0\n this._bufpos = 0\n}\n\nSBMH.prototype.push = function (chunk, pos) {\n if (!Buffer.isBuffer(chunk)) {\n chunk = Buffer.from(chunk, 'binary')\n }\n const chlen = chunk.length\n this._bufpos = pos || 0\n let r\n while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) }\n return r\n}\n\nSBMH.prototype._sbmh_feed = function (data) {\n const len = data.length\n const needle = this._needle\n const needleLength = needle.length\n const lastNeedleChar = needle[needleLength - 1]\n\n // Positive: points to a position in `data`\n // pos == 3 points to data[3]\n // Negative: points to a position in the lookbehind buffer\n // pos == -2 points to lookbehind[lookbehind_size - 2]\n let pos = -this._lookbehind_size\n let ch\n\n if (pos < 0) {\n // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool\n // search with character lookup code that considers both the\n // lookbehind buffer and the current round's haystack data.\n //\n // Loop until\n // there is a match.\n // or until\n // we've moved past the position that requires the\n // lookbehind buffer. In this case we switch to the\n // optimized loop.\n // or until\n // the character to look at lies outside the haystack.\n while (pos < 0 && pos <= len - needleLength) {\n ch = this._sbmh_lookup_char(data, pos + needleLength - 1)\n\n if (\n ch === lastNeedleChar &&\n this._sbmh_memcmp(data, pos, needleLength - 1)\n ) {\n this._lookbehind_size = 0\n ++this.matches\n this.emit('info', true)\n\n return (this._bufpos = pos + needleLength)\n }\n pos += this._occ[ch]\n }\n\n // No match.\n\n if (pos < 0) {\n // There's too few data for Boyer-Moore-Horspool to run,\n // so let's use a different algorithm to skip as much as\n // we can.\n // Forward pos until\n // the trailing part of lookbehind + data\n // looks like the beginning of the needle\n // or until\n // pos == 0\n while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos }\n }\n\n if (pos >= 0) {\n // Discard lookbehind buffer.\n this.emit('info', false, this._lookbehind, 0, this._lookbehind_size)\n this._lookbehind_size = 0\n } else {\n // Cut off part of the lookbehind buffer that has\n // been processed and append the entire haystack\n // into it.\n const bytesToCutOff = this._lookbehind_size + pos\n if (bytesToCutOff > 0) {\n // The cut off data is guaranteed not to contain the needle.\n this.emit('info', false, this._lookbehind, 0, bytesToCutOff)\n }\n\n this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff,\n this._lookbehind_size - bytesToCutOff)\n this._lookbehind_size -= bytesToCutOff\n\n data.copy(this._lookbehind, this._lookbehind_size)\n this._lookbehind_size += len\n\n this._bufpos = len\n return len\n }\n }\n\n pos += (pos >= 0) * this._bufpos\n\n // Lookbehind buffer is now empty. We only need to check if the\n // needle is in the haystack.\n if (data.indexOf(needle, pos) !== -1) {\n pos = data.indexOf(needle, pos)\n ++this.matches\n if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) }\n\n return (this._bufpos = pos + needleLength)\n } else {\n pos = len - needleLength\n }\n\n // There was no match. If there's trailing haystack data that we cannot\n // match yet using the Boyer-Moore-Horspool algorithm (because the trailing\n // data is less than the needle size) then match using a modified\n // algorithm that starts matching from the beginning instead of the end.\n // Whatever trailing data is left after running this algorithm is added to\n // the lookbehind buffer.\n while (\n pos < len &&\n (\n data[pos] !== needle[0] ||\n (\n (Buffer.compare(\n data.subarray(pos, pos + len - pos),\n needle.subarray(0, len - pos)\n ) !== 0)\n )\n )\n ) {\n ++pos\n }\n if (pos < len) {\n data.copy(this._lookbehind, 0, pos, pos + (len - pos))\n this._lookbehind_size = len - pos\n }\n\n // Everything until pos is guaranteed not to contain needle data.\n if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) }\n\n this._bufpos = len\n return len\n}\n\nSBMH.prototype._sbmh_lookup_char = function (data, pos) {\n return (pos < 0)\n ? this._lookbehind[this._lookbehind_size + pos]\n : data[pos]\n}\n\nSBMH.prototype._sbmh_memcmp = function (data, pos, len) {\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false }\n }\n return true\n}\n\nmodule.exports = SBMH\n","'use strict'\n\nconst WritableStream = require('node:stream').Writable\nconst { inherits } = require('node:util')\nconst Dicer = require('../deps/dicer/lib/Dicer')\n\nconst MultipartParser = require('./types/multipart')\nconst UrlencodedParser = require('./types/urlencoded')\nconst parseParams = require('./utils/parseParams')\n\nfunction Busboy (opts) {\n if (!(this instanceof Busboy)) { return new Busboy(opts) }\n\n if (typeof opts !== 'object') {\n throw new TypeError('Busboy expected an options-Object.')\n }\n if (typeof opts.headers !== 'object') {\n throw new TypeError('Busboy expected an options-Object with headers-attribute.')\n }\n if (typeof opts.headers['content-type'] !== 'string') {\n throw new TypeError('Missing Content-Type-header.')\n }\n\n const {\n headers,\n ...streamOptions\n } = opts\n\n this.opts = {\n autoDestroy: false,\n ...streamOptions\n }\n WritableStream.call(this, this.opts)\n\n this._done = false\n this._parser = this.getParserByHeaders(headers)\n this._finished = false\n}\ninherits(Busboy, WritableStream)\n\nBusboy.prototype.emit = function (ev) {\n if (ev === 'finish') {\n if (!this._done) {\n this._parser?.end()\n return\n } else if (this._finished) {\n return\n }\n this._finished = true\n }\n WritableStream.prototype.emit.apply(this, arguments)\n}\n\nBusboy.prototype.getParserByHeaders = function (headers) {\n const parsed = parseParams(headers['content-type'])\n\n const cfg = {\n defCharset: this.opts.defCharset,\n fileHwm: this.opts.fileHwm,\n headers,\n highWaterMark: this.opts.highWaterMark,\n isPartAFile: this.opts.isPartAFile,\n limits: this.opts.limits,\n parsedConType: parsed,\n preservePath: this.opts.preservePath\n }\n\n if (MultipartParser.detect.test(parsed[0])) {\n return new MultipartParser(this, cfg)\n }\n if (UrlencodedParser.detect.test(parsed[0])) {\n return new UrlencodedParser(this, cfg)\n }\n throw new Error('Unsupported Content-Type.')\n}\n\nBusboy.prototype._write = function (chunk, encoding, cb) {\n this._parser.write(chunk, cb)\n}\n\nmodule.exports = Busboy\nmodule.exports.default = Busboy\nmodule.exports.Busboy = Busboy\n\nmodule.exports.Dicer = Dicer\n","'use strict'\n\n// TODO:\n// * support 1 nested multipart level\n// (see second multipart example here:\n// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data)\n// * support limits.fieldNameSize\n// -- this will require modifications to utils.parseParams\n\nconst { Readable } = require('node:stream')\nconst { inherits } = require('node:util')\n\nconst Dicer = require('../../deps/dicer/lib/Dicer')\n\nconst parseParams = require('../utils/parseParams')\nconst decodeText = require('../utils/decodeText')\nconst basename = require('../utils/basename')\nconst getLimit = require('../utils/getLimit')\n\nconst RE_BOUNDARY = /^boundary$/i\nconst RE_FIELD = /^form-data$/i\nconst RE_CHARSET = /^charset$/i\nconst RE_FILENAME = /^filename$/i\nconst RE_NAME = /^name$/i\n\nMultipart.detect = /^multipart\\/form-data/i\nfunction Multipart (boy, cfg) {\n let i\n let len\n const self = this\n let boundary\n const limits = cfg.limits\n const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined))\n const parsedConType = cfg.parsedConType || []\n const defCharset = cfg.defCharset || 'utf8'\n const preservePath = cfg.preservePath\n const fileOpts = { highWaterMark: cfg.fileHwm }\n\n for (i = 0, len = parsedConType.length; i < len; ++i) {\n if (Array.isArray(parsedConType[i]) &&\n RE_BOUNDARY.test(parsedConType[i][0])) {\n boundary = parsedConType[i][1]\n break\n }\n }\n\n function checkFinished () {\n if (nends === 0 && finished && !boy._done) {\n finished = false\n self.end()\n }\n }\n\n if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') }\n\n const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)\n const fileSizeLimit = getLimit(limits, 'fileSize', Infinity)\n const filesLimit = getLimit(limits, 'files', Infinity)\n const fieldsLimit = getLimit(limits, 'fields', Infinity)\n const partsLimit = getLimit(limits, 'parts', Infinity)\n const headerPairsLimit = getLimit(limits, 'headerPairs', 2000)\n const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024)\n\n let nfiles = 0\n let nfields = 0\n let nends = 0\n let curFile\n let curField\n let finished = false\n\n this._needDrain = false\n this._pause = false\n this._cb = undefined\n this._nparts = 0\n this._boy = boy\n\n const parserCfg = {\n boundary,\n maxHeaderPairs: headerPairsLimit,\n maxHeaderSize: headerSizeLimit,\n partHwm: fileOpts.highWaterMark,\n highWaterMark: cfg.highWaterMark\n }\n\n this.parser = new Dicer(parserCfg)\n this.parser.on('drain', function () {\n self._needDrain = false\n if (self._cb && !self._pause) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n }).on('part', function onPart (part) {\n if (++self._nparts > partsLimit) {\n self.parser.removeListener('part', onPart)\n self.parser.on('part', skipPart)\n boy.hitPartsLimit = true\n boy.emit('partsLimit')\n return skipPart(part)\n }\n\n // hack because streams2 _always_ doesn't emit 'end' until nextTick, so let\n // us emit 'end' early since we know the part has ended if we are already\n // seeing the next part\n if (curField) {\n const field = curField\n field.emit('end')\n field.removeAllListeners('end')\n }\n\n part.on('header', function (header) {\n let contype\n let fieldname\n let parsed\n let charset\n let encoding\n let filename\n let nsize = 0\n\n if (header['content-type']) {\n parsed = parseParams(header['content-type'][0])\n if (parsed[0]) {\n contype = parsed[0].toLowerCase()\n for (i = 0, len = parsed.length; i < len; ++i) {\n if (RE_CHARSET.test(parsed[i][0])) {\n charset = parsed[i][1].toLowerCase()\n break\n }\n }\n }\n }\n\n if (contype === undefined) { contype = 'text/plain' }\n if (charset === undefined) { charset = defCharset }\n\n if (header['content-disposition']) {\n parsed = parseParams(header['content-disposition'][0])\n if (!RE_FIELD.test(parsed[0])) { return skipPart(part) }\n for (i = 0, len = parsed.length; i < len; ++i) {\n if (RE_NAME.test(parsed[i][0])) {\n fieldname = parsed[i][1]\n } else if (RE_FILENAME.test(parsed[i][0])) {\n filename = parsed[i][1]\n if (!preservePath) { filename = basename(filename) }\n }\n }\n } else { return skipPart(part) }\n\n if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' }\n\n let onData,\n onEnd\n\n if (isPartAFile(fieldname, contype, filename)) {\n // file/binary field\n if (nfiles === filesLimit) {\n if (!boy.hitFilesLimit) {\n boy.hitFilesLimit = true\n boy.emit('filesLimit')\n }\n return skipPart(part)\n }\n\n ++nfiles\n\n if (boy.listenerCount('file') === 0) {\n self.parser._ignore()\n return\n }\n\n ++nends\n const file = new FileStream(fileOpts)\n curFile = file\n file.on('end', function () {\n --nends\n self._pause = false\n checkFinished()\n if (self._cb && !self._needDrain) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n })\n file._read = function (n) {\n if (!self._pause) { return }\n self._pause = false\n if (self._cb && !self._needDrain) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n }\n boy.emit('file', fieldname, file, filename, encoding, contype)\n\n onData = function (data) {\n if ((nsize += data.length) > fileSizeLimit) {\n const extralen = fileSizeLimit - nsize + data.length\n if (extralen > 0) { file.push(data.slice(0, extralen)) }\n file.truncated = true\n file.bytesRead = fileSizeLimit\n part.removeAllListeners('data')\n file.emit('limit')\n return\n } else if (!file.push(data)) { self._pause = true }\n\n file.bytesRead = nsize\n }\n\n onEnd = function () {\n curFile = undefined\n file.push(null)\n }\n } else {\n // non-file field\n if (nfields === fieldsLimit) {\n if (!boy.hitFieldsLimit) {\n boy.hitFieldsLimit = true\n boy.emit('fieldsLimit')\n }\n return skipPart(part)\n }\n\n ++nfields\n ++nends\n let buffer = ''\n let truncated = false\n curField = part\n\n onData = function (data) {\n if ((nsize += data.length) > fieldSizeLimit) {\n const extralen = (fieldSizeLimit - (nsize - data.length))\n buffer += data.toString('binary', 0, extralen)\n truncated = true\n part.removeAllListeners('data')\n } else { buffer += data.toString('binary') }\n }\n\n onEnd = function () {\n curField = undefined\n if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) }\n boy.emit('field', fieldname, buffer, false, truncated, encoding, contype)\n --nends\n checkFinished()\n }\n }\n\n /* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become\n broken. Streams2/streams3 is a huge black box of confusion, but\n somehow overriding the sync state seems to fix things again (and still\n seems to work for previous node versions).\n */\n part._readableState.sync = false\n\n part.on('data', onData)\n part.on('end', onEnd)\n }).on('error', function (err) {\n if (curFile) { curFile.emit('error', err) }\n })\n }).on('error', function (err) {\n boy.emit('error', err)\n }).on('finish', function () {\n finished = true\n checkFinished()\n })\n}\n\nMultipart.prototype.write = function (chunk, cb) {\n const r = this.parser.write(chunk)\n if (r && !this._pause) {\n cb()\n } else {\n this._needDrain = !r\n this._cb = cb\n }\n}\n\nMultipart.prototype.end = function () {\n const self = this\n\n if (self.parser.writable) {\n self.parser.end()\n } else if (!self._boy._done) {\n process.nextTick(function () {\n self._boy._done = true\n self._boy.emit('finish')\n })\n }\n}\n\nfunction skipPart (part) {\n part.resume()\n}\n\nfunction FileStream (opts) {\n Readable.call(this, opts)\n\n this.bytesRead = 0\n\n this.truncated = false\n}\n\ninherits(FileStream, Readable)\n\nFileStream.prototype._read = function (n) {}\n\nmodule.exports = Multipart\n","'use strict'\n\nconst Decoder = require('../utils/Decoder')\nconst decodeText = require('../utils/decodeText')\nconst getLimit = require('../utils/getLimit')\n\nconst RE_CHARSET = /^charset$/i\n\nUrlEncoded.detect = /^application\\/x-www-form-urlencoded/i\nfunction UrlEncoded (boy, cfg) {\n const limits = cfg.limits\n const parsedConType = cfg.parsedConType\n this.boy = boy\n\n this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)\n this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100)\n this.fieldsLimit = getLimit(limits, 'fields', Infinity)\n\n let charset\n for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var\n if (Array.isArray(parsedConType[i]) &&\n RE_CHARSET.test(parsedConType[i][0])) {\n charset = parsedConType[i][1].toLowerCase()\n break\n }\n }\n\n if (charset === undefined) { charset = cfg.defCharset || 'utf8' }\n\n this.decoder = new Decoder()\n this.charset = charset\n this._fields = 0\n this._state = 'key'\n this._checkingBytes = true\n this._bytesKey = 0\n this._bytesVal = 0\n this._key = ''\n this._val = ''\n this._keyTrunc = false\n this._valTrunc = false\n this._hitLimit = false\n}\n\nUrlEncoded.prototype.write = function (data, cb) {\n if (this._fields === this.fieldsLimit) {\n if (!this.boy.hitFieldsLimit) {\n this.boy.hitFieldsLimit = true\n this.boy.emit('fieldsLimit')\n }\n return cb()\n }\n\n let idxeq; let idxamp; let i; let p = 0; const len = data.length\n\n while (p < len) {\n if (this._state === 'key') {\n idxeq = idxamp = undefined\n for (i = p; i < len; ++i) {\n if (!this._checkingBytes) { ++p }\n if (data[i] === 0x3D/* = */) {\n idxeq = i\n break\n } else if (data[i] === 0x26/* & */) {\n idxamp = i\n break\n }\n if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {\n this._hitLimit = true\n break\n } else if (this._checkingBytes) { ++this._bytesKey }\n }\n\n if (idxeq !== undefined) {\n // key with assignment\n if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) }\n this._state = 'val'\n\n this._hitLimit = false\n this._checkingBytes = true\n this._val = ''\n this._bytesVal = 0\n this._valTrunc = false\n this.decoder.reset()\n\n p = idxeq + 1\n } else if (idxamp !== undefined) {\n // key with no assignment\n ++this._fields\n let key; const keyTrunc = this._keyTrunc\n if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key }\n\n this._hitLimit = false\n this._checkingBytes = true\n this._key = ''\n this._bytesKey = 0\n this._keyTrunc = false\n this.decoder.reset()\n\n if (key.length) {\n this.boy.emit('field', decodeText(key, 'binary', this.charset),\n '',\n keyTrunc,\n false)\n }\n\n p = idxamp + 1\n if (this._fields === this.fieldsLimit) { return cb() }\n } else if (this._hitLimit) {\n // we may not have hit the actual limit if there are encoded bytes...\n if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) }\n p = i\n if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {\n // yep, we actually did hit the limit\n this._checkingBytes = false\n this._keyTrunc = true\n }\n } else {\n if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) }\n p = len\n }\n } else {\n idxamp = undefined\n for (i = p; i < len; ++i) {\n if (!this._checkingBytes) { ++p }\n if (data[i] === 0x26/* & */) {\n idxamp = i\n break\n }\n if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {\n this._hitLimit = true\n break\n } else if (this._checkingBytes) { ++this._bytesVal }\n }\n\n if (idxamp !== undefined) {\n ++this._fields\n if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) }\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n decodeText(this._val, 'binary', this.charset),\n this._keyTrunc,\n this._valTrunc)\n this._state = 'key'\n\n this._hitLimit = false\n this._checkingBytes = true\n this._key = ''\n this._bytesKey = 0\n this._keyTrunc = false\n this.decoder.reset()\n\n p = idxamp + 1\n if (this._fields === this.fieldsLimit) { return cb() }\n } else if (this._hitLimit) {\n // we may not have hit the actual limit if there are encoded bytes...\n if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) }\n p = i\n if ((this._val === '' && this.fieldSizeLimit === 0) ||\n (this._bytesVal = this._val.length) === this.fieldSizeLimit) {\n // yep, we actually did hit the limit\n this._checkingBytes = false\n this._valTrunc = true\n }\n } else {\n if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) }\n p = len\n }\n }\n }\n cb()\n}\n\nUrlEncoded.prototype.end = function () {\n if (this.boy._done) { return }\n\n if (this._state === 'key' && this._key.length > 0) {\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n '',\n this._keyTrunc,\n false)\n } else if (this._state === 'val') {\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n decodeText(this._val, 'binary', this.charset),\n this._keyTrunc,\n this._valTrunc)\n }\n this.boy._done = true\n this.boy.emit('finish')\n}\n\nmodule.exports = UrlEncoded\n","'use strict'\n\nconst RE_PLUS = /\\+/g\n\nconst HEX = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,\n 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n]\n\nfunction Decoder () {\n this.buffer = undefined\n}\nDecoder.prototype.write = function (str) {\n // Replace '+' with ' ' before decoding\n str = str.replace(RE_PLUS, ' ')\n let res = ''\n let i = 0; let p = 0; const len = str.length\n for (; i < len; ++i) {\n if (this.buffer !== undefined) {\n if (!HEX[str.charCodeAt(i)]) {\n res += '%' + this.buffer\n this.buffer = undefined\n --i // retry character\n } else {\n this.buffer += str[i]\n ++p\n if (this.buffer.length === 2) {\n res += String.fromCharCode(parseInt(this.buffer, 16))\n this.buffer = undefined\n }\n }\n } else if (str[i] === '%') {\n if (i > p) {\n res += str.substring(p, i)\n p = i\n }\n this.buffer = ''\n ++p\n }\n }\n if (p < len && this.buffer === undefined) { res += str.substring(p) }\n return res\n}\nDecoder.prototype.reset = function () {\n this.buffer = undefined\n}\n\nmodule.exports = Decoder\n","'use strict'\n\nmodule.exports = function basename (path) {\n if (typeof path !== 'string') { return '' }\n for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var\n switch (path.charCodeAt(i)) {\n case 0x2F: // '/'\n case 0x5C: // '\\'\n path = path.slice(i + 1)\n return (path === '..' || path === '.' ? '' : path)\n }\n }\n return (path === '..' || path === '.' ? '' : path)\n}\n","'use strict'\n\n// Node has always utf-8\nconst utf8Decoder = new TextDecoder('utf-8')\nconst textDecoders = new Map([\n ['utf-8', utf8Decoder],\n ['utf8', utf8Decoder]\n])\n\nfunction getDecoder (charset) {\n let lc\n while (true) {\n switch (charset) {\n case 'utf-8':\n case 'utf8':\n return decoders.utf8\n case 'latin1':\n case 'ascii': // TODO: Make these a separate, strict decoder?\n case 'us-ascii':\n case 'iso-8859-1':\n case 'iso8859-1':\n case 'iso88591':\n case 'iso_8859-1':\n case 'windows-1252':\n case 'iso_8859-1:1987':\n case 'cp1252':\n case 'x-cp1252':\n return decoders.latin1\n case 'utf16le':\n case 'utf-16le':\n case 'ucs2':\n case 'ucs-2':\n return decoders.utf16le\n case 'base64':\n return decoders.base64\n default:\n if (lc === undefined) {\n lc = true\n charset = charset.toLowerCase()\n continue\n }\n return decoders.other.bind(charset)\n }\n }\n}\n\nconst decoders = {\n utf8: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n return data.utf8Slice(0, data.length)\n },\n\n latin1: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n return data\n }\n return data.latin1Slice(0, data.length)\n },\n\n utf16le: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n return data.ucs2Slice(0, data.length)\n },\n\n base64: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n return data.base64Slice(0, data.length)\n },\n\n other: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n\n if (textDecoders.has(this.toString())) {\n try {\n return textDecoders.get(this).decode(data)\n } catch {}\n }\n return typeof data === 'string'\n ? data\n : data.toString()\n }\n}\n\nfunction decodeText (text, sourceEncoding, destEncoding) {\n if (text) {\n return getDecoder(destEncoding)(text, sourceEncoding)\n }\n return text\n}\n\nmodule.exports = decodeText\n","'use strict'\n\nmodule.exports = function getLimit (limits, name, defaultLimit) {\n if (\n !limits ||\n limits[name] === undefined ||\n limits[name] === null\n ) { return defaultLimit }\n\n if (\n typeof limits[name] !== 'number' ||\n isNaN(limits[name])\n ) { throw new TypeError('Limit ' + name + ' is not a valid number') }\n\n return limits[name]\n}\n","/* eslint-disable object-property-newline */\n'use strict'\n\nconst decodeText = require('./decodeText')\n\nconst RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g\n\nconst EncodedLookup = {\n '%00': '\\x00', '%01': '\\x01', '%02': '\\x02', '%03': '\\x03', '%04': '\\x04',\n '%05': '\\x05', '%06': '\\x06', '%07': '\\x07', '%08': '\\x08', '%09': '\\x09',\n '%0a': '\\x0a', '%0A': '\\x0a', '%0b': '\\x0b', '%0B': '\\x0b', '%0c': '\\x0c',\n '%0C': '\\x0c', '%0d': '\\x0d', '%0D': '\\x0d', '%0e': '\\x0e', '%0E': '\\x0e',\n '%0f': '\\x0f', '%0F': '\\x0f', '%10': '\\x10', '%11': '\\x11', '%12': '\\x12',\n '%13': '\\x13', '%14': '\\x14', '%15': '\\x15', '%16': '\\x16', '%17': '\\x17',\n '%18': '\\x18', '%19': '\\x19', '%1a': '\\x1a', '%1A': '\\x1a', '%1b': '\\x1b',\n '%1B': '\\x1b', '%1c': '\\x1c', '%1C': '\\x1c', '%1d': '\\x1d', '%1D': '\\x1d',\n '%1e': '\\x1e', '%1E': '\\x1e', '%1f': '\\x1f', '%1F': '\\x1f', '%20': '\\x20',\n '%21': '\\x21', '%22': '\\x22', '%23': '\\x23', '%24': '\\x24', '%25': '\\x25',\n '%26': '\\x26', '%27': '\\x27', '%28': '\\x28', '%29': '\\x29', '%2a': '\\x2a',\n '%2A': '\\x2a', '%2b': '\\x2b', '%2B': '\\x2b', '%2c': '\\x2c', '%2C': '\\x2c',\n '%2d': '\\x2d', '%2D': '\\x2d', '%2e': '\\x2e', '%2E': '\\x2e', '%2f': '\\x2f',\n '%2F': '\\x2f', '%30': '\\x30', '%31': '\\x31', '%32': '\\x32', '%33': '\\x33',\n '%34': '\\x34', '%35': '\\x35', '%36': '\\x36', '%37': '\\x37', '%38': '\\x38',\n '%39': '\\x39', '%3a': '\\x3a', '%3A': '\\x3a', '%3b': '\\x3b', '%3B': '\\x3b',\n '%3c': '\\x3c', '%3C': '\\x3c', '%3d': '\\x3d', '%3D': '\\x3d', '%3e': '\\x3e',\n '%3E': '\\x3e', '%3f': '\\x3f', '%3F': '\\x3f', '%40': '\\x40', '%41': '\\x41',\n '%42': '\\x42', '%43': '\\x43', '%44': '\\x44', '%45': '\\x45', '%46': '\\x46',\n '%47': '\\x47', '%48': '\\x48', '%49': '\\x49', '%4a': '\\x4a', '%4A': '\\x4a',\n '%4b': '\\x4b', '%4B': '\\x4b', '%4c': '\\x4c', '%4C': '\\x4c', '%4d': '\\x4d',\n '%4D': '\\x4d', '%4e': '\\x4e', '%4E': '\\x4e', '%4f': '\\x4f', '%4F': '\\x4f',\n '%50': '\\x50', '%51': '\\x51', '%52': '\\x52', '%53': '\\x53', '%54': '\\x54',\n '%55': '\\x55', '%56': '\\x56', '%57': '\\x57', '%58': '\\x58', '%59': '\\x59',\n '%5a': '\\x5a', '%5A': '\\x5a', '%5b': '\\x5b', '%5B': '\\x5b', '%5c': '\\x5c',\n '%5C': '\\x5c', '%5d': '\\x5d', '%5D': '\\x5d', '%5e': '\\x5e', '%5E': '\\x5e',\n '%5f': '\\x5f', '%5F': '\\x5f', '%60': '\\x60', '%61': '\\x61', '%62': '\\x62',\n '%63': '\\x63', '%64': '\\x64', '%65': '\\x65', '%66': '\\x66', '%67': '\\x67',\n '%68': '\\x68', '%69': '\\x69', '%6a': '\\x6a', '%6A': '\\x6a', '%6b': '\\x6b',\n '%6B': '\\x6b', '%6c': '\\x6c', '%6C': '\\x6c', '%6d': '\\x6d', '%6D': '\\x6d',\n '%6e': '\\x6e', '%6E': '\\x6e', '%6f': '\\x6f', '%6F': '\\x6f', '%70': '\\x70',\n '%71': '\\x71', '%72': '\\x72', '%73': '\\x73', '%74': '\\x74', '%75': '\\x75',\n '%76': '\\x76', '%77': '\\x77', '%78': '\\x78', '%79': '\\x79', '%7a': '\\x7a',\n '%7A': '\\x7a', '%7b': '\\x7b', '%7B': '\\x7b', '%7c': '\\x7c', '%7C': '\\x7c',\n '%7d': '\\x7d', '%7D': '\\x7d', '%7e': '\\x7e', '%7E': '\\x7e', '%7f': '\\x7f',\n '%7F': '\\x7f', '%80': '\\x80', '%81': '\\x81', '%82': '\\x82', '%83': '\\x83',\n '%84': '\\x84', '%85': '\\x85', '%86': '\\x86', '%87': '\\x87', '%88': '\\x88',\n '%89': '\\x89', '%8a': '\\x8a', '%8A': '\\x8a', '%8b': '\\x8b', '%8B': '\\x8b',\n '%8c': '\\x8c', '%8C': '\\x8c', '%8d': '\\x8d', '%8D': '\\x8d', '%8e': '\\x8e',\n '%8E': '\\x8e', '%8f': '\\x8f', '%8F': '\\x8f', '%90': '\\x90', '%91': '\\x91',\n '%92': '\\x92', '%93': '\\x93', '%94': '\\x94', '%95': '\\x95', '%96': '\\x96',\n '%97': '\\x97', '%98': '\\x98', '%99': '\\x99', '%9a': '\\x9a', '%9A': '\\x9a',\n '%9b': '\\x9b', '%9B': '\\x9b', '%9c': '\\x9c', '%9C': '\\x9c', '%9d': '\\x9d',\n '%9D': '\\x9d', '%9e': '\\x9e', '%9E': '\\x9e', '%9f': '\\x9f', '%9F': '\\x9f',\n '%a0': '\\xa0', '%A0': '\\xa0', '%a1': '\\xa1', '%A1': '\\xa1', '%a2': '\\xa2',\n '%A2': '\\xa2', '%a3': '\\xa3', '%A3': '\\xa3', '%a4': '\\xa4', '%A4': '\\xa4',\n '%a5': '\\xa5', '%A5': '\\xa5', '%a6': '\\xa6', '%A6': '\\xa6', '%a7': '\\xa7',\n '%A7': '\\xa7', '%a8': '\\xa8', '%A8': '\\xa8', '%a9': '\\xa9', '%A9': '\\xa9',\n '%aa': '\\xaa', '%Aa': '\\xaa', '%aA': '\\xaa', '%AA': '\\xaa', '%ab': '\\xab',\n '%Ab': '\\xab', '%aB': '\\xab', '%AB': '\\xab', '%ac': '\\xac', '%Ac': '\\xac',\n '%aC': '\\xac', '%AC': '\\xac', '%ad': '\\xad', '%Ad': '\\xad', '%aD': '\\xad',\n '%AD': '\\xad', '%ae': '\\xae', '%Ae': '\\xae', '%aE': '\\xae', '%AE': '\\xae',\n '%af': '\\xaf', '%Af': '\\xaf', '%aF': '\\xaf', '%AF': '\\xaf', '%b0': '\\xb0',\n '%B0': '\\xb0', '%b1': '\\xb1', '%B1': '\\xb1', '%b2': '\\xb2', '%B2': '\\xb2',\n '%b3': '\\xb3', '%B3': '\\xb3', '%b4': '\\xb4', '%B4': '\\xb4', '%b5': '\\xb5',\n '%B5': '\\xb5', '%b6': '\\xb6', '%B6': '\\xb6', '%b7': '\\xb7', '%B7': '\\xb7',\n '%b8': '\\xb8', '%B8': '\\xb8', '%b9': '\\xb9', '%B9': '\\xb9', '%ba': '\\xba',\n '%Ba': '\\xba', '%bA': '\\xba', '%BA': '\\xba', '%bb': '\\xbb', '%Bb': '\\xbb',\n '%bB': '\\xbb', '%BB': '\\xbb', '%bc': '\\xbc', '%Bc': '\\xbc', '%bC': '\\xbc',\n '%BC': '\\xbc', '%bd': '\\xbd', '%Bd': '\\xbd', '%bD': '\\xbd', '%BD': '\\xbd',\n '%be': '\\xbe', '%Be': '\\xbe', '%bE': '\\xbe', '%BE': '\\xbe', '%bf': '\\xbf',\n '%Bf': '\\xbf', '%bF': '\\xbf', '%BF': '\\xbf', '%c0': '\\xc0', '%C0': '\\xc0',\n '%c1': '\\xc1', '%C1': '\\xc1', '%c2': '\\xc2', '%C2': '\\xc2', '%c3': '\\xc3',\n '%C3': '\\xc3', '%c4': '\\xc4', '%C4': '\\xc4', '%c5': '\\xc5', '%C5': '\\xc5',\n '%c6': '\\xc6', '%C6': '\\xc6', '%c7': '\\xc7', '%C7': '\\xc7', '%c8': '\\xc8',\n '%C8': '\\xc8', '%c9': '\\xc9', '%C9': '\\xc9', '%ca': '\\xca', '%Ca': '\\xca',\n '%cA': '\\xca', '%CA': '\\xca', '%cb': '\\xcb', '%Cb': '\\xcb', '%cB': '\\xcb',\n '%CB': '\\xcb', '%cc': '\\xcc', '%Cc': '\\xcc', '%cC': '\\xcc', '%CC': '\\xcc',\n '%cd': '\\xcd', '%Cd': '\\xcd', '%cD': '\\xcd', '%CD': '\\xcd', '%ce': '\\xce',\n '%Ce': '\\xce', '%cE': '\\xce', '%CE': '\\xce', '%cf': '\\xcf', '%Cf': '\\xcf',\n '%cF': '\\xcf', '%CF': '\\xcf', '%d0': '\\xd0', '%D0': '\\xd0', '%d1': '\\xd1',\n '%D1': '\\xd1', '%d2': '\\xd2', '%D2': '\\xd2', '%d3': '\\xd3', '%D3': '\\xd3',\n '%d4': '\\xd4', '%D4': '\\xd4', '%d5': '\\xd5', '%D5': '\\xd5', '%d6': '\\xd6',\n '%D6': '\\xd6', '%d7': '\\xd7', '%D7': '\\xd7', '%d8': '\\xd8', '%D8': '\\xd8',\n '%d9': '\\xd9', '%D9': '\\xd9', '%da': '\\xda', '%Da': '\\xda', '%dA': '\\xda',\n '%DA': '\\xda', '%db': '\\xdb', '%Db': '\\xdb', '%dB': '\\xdb', '%DB': '\\xdb',\n '%dc': '\\xdc', '%Dc': '\\xdc', '%dC': '\\xdc', '%DC': '\\xdc', '%dd': '\\xdd',\n '%Dd': '\\xdd', '%dD': '\\xdd', '%DD': '\\xdd', '%de': '\\xde', '%De': '\\xde',\n '%dE': '\\xde', '%DE': '\\xde', '%df': '\\xdf', '%Df': '\\xdf', '%dF': '\\xdf',\n '%DF': '\\xdf', '%e0': '\\xe0', '%E0': '\\xe0', '%e1': '\\xe1', '%E1': '\\xe1',\n '%e2': '\\xe2', '%E2': '\\xe2', '%e3': '\\xe3', '%E3': '\\xe3', '%e4': '\\xe4',\n '%E4': '\\xe4', '%e5': '\\xe5', '%E5': '\\xe5', '%e6': '\\xe6', '%E6': '\\xe6',\n '%e7': '\\xe7', '%E7': '\\xe7', '%e8': '\\xe8', '%E8': '\\xe8', '%e9': '\\xe9',\n '%E9': '\\xe9', '%ea': '\\xea', '%Ea': '\\xea', '%eA': '\\xea', '%EA': '\\xea',\n '%eb': '\\xeb', '%Eb': '\\xeb', '%eB': '\\xeb', '%EB': '\\xeb', '%ec': '\\xec',\n '%Ec': '\\xec', '%eC': '\\xec', '%EC': '\\xec', '%ed': '\\xed', '%Ed': '\\xed',\n '%eD': '\\xed', '%ED': '\\xed', '%ee': '\\xee', '%Ee': '\\xee', '%eE': '\\xee',\n '%EE': '\\xee', '%ef': '\\xef', '%Ef': '\\xef', '%eF': '\\xef', '%EF': '\\xef',\n '%f0': '\\xf0', '%F0': '\\xf0', '%f1': '\\xf1', '%F1': '\\xf1', '%f2': '\\xf2',\n '%F2': '\\xf2', '%f3': '\\xf3', '%F3': '\\xf3', '%f4': '\\xf4', '%F4': '\\xf4',\n '%f5': '\\xf5', '%F5': '\\xf5', '%f6': '\\xf6', '%F6': '\\xf6', '%f7': '\\xf7',\n '%F7': '\\xf7', '%f8': '\\xf8', '%F8': '\\xf8', '%f9': '\\xf9', '%F9': '\\xf9',\n '%fa': '\\xfa', '%Fa': '\\xfa', '%fA': '\\xfa', '%FA': '\\xfa', '%fb': '\\xfb',\n '%Fb': '\\xfb', '%fB': '\\xfb', '%FB': '\\xfb', '%fc': '\\xfc', '%Fc': '\\xfc',\n '%fC': '\\xfc', '%FC': '\\xfc', '%fd': '\\xfd', '%Fd': '\\xfd', '%fD': '\\xfd',\n '%FD': '\\xfd', '%fe': '\\xfe', '%Fe': '\\xfe', '%fE': '\\xfe', '%FE': '\\xfe',\n '%ff': '\\xff', '%Ff': '\\xff', '%fF': '\\xff', '%FF': '\\xff'\n}\n\nfunction encodedReplacer (match) {\n return EncodedLookup[match]\n}\n\nconst STATE_KEY = 0\nconst STATE_VALUE = 1\nconst STATE_CHARSET = 2\nconst STATE_LANG = 3\n\nfunction parseParams (str) {\n const res = []\n let state = STATE_KEY\n let charset = ''\n let inquote = false\n let escaping = false\n let p = 0\n let tmp = ''\n const len = str.length\n\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n const char = str[i]\n if (char === '\\\\' && inquote) {\n if (escaping) { escaping = false } else {\n escaping = true\n continue\n }\n } else if (char === '\"') {\n if (!escaping) {\n if (inquote) {\n inquote = false\n state = STATE_KEY\n } else { inquote = true }\n continue\n } else { escaping = false }\n } else {\n if (escaping && inquote) { tmp += '\\\\' }\n escaping = false\n if ((state === STATE_CHARSET || state === STATE_LANG) && char === \"'\") {\n if (state === STATE_CHARSET) {\n state = STATE_LANG\n charset = tmp.substring(1)\n } else { state = STATE_VALUE }\n tmp = ''\n continue\n } else if (state === STATE_KEY &&\n (char === '*' || char === '=') &&\n res.length) {\n state = char === '*'\n ? STATE_CHARSET\n : STATE_VALUE\n res[p] = [tmp, undefined]\n tmp = ''\n continue\n } else if (!inquote && char === ';') {\n state = STATE_KEY\n if (charset) {\n if (tmp.length) {\n tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),\n 'binary',\n charset)\n }\n charset = ''\n } else if (tmp.length) {\n tmp = decodeText(tmp, 'binary', 'utf8')\n }\n if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp }\n tmp = ''\n ++p\n continue\n } else if (!inquote && (char === ' ' || char === '\\t')) { continue }\n }\n tmp += char\n }\n if (charset && tmp.length) {\n tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),\n 'binary',\n charset)\n } else if (tmp) {\n tmp = decodeText(tmp, 'binary', 'utf8')\n }\n\n if (res[p] === undefined) {\n if (tmp) { res[p] = tmp }\n } else { res[p][1] = tmp }\n\n return res\n}\n\nmodule.exports = parseParams\n","'use strict';\n\nvar vm = require('vm');\n\n/**\n * @implements {IHooks}\n */\nclass Hooks {\n /**\n * @callback HookCallback\n * @this {*|Jsep} this\n * @param {Jsep} env\n * @returns: void\n */\n /**\n * Adds the given callback to the list of callbacks for the given hook.\n *\n * The callback will be invoked when the hook it is registered for is run.\n *\n * One callback function can be registered to multiple hooks and the same hook multiple times.\n *\n * @param {string|object} name The name of the hook, or an object of callbacks keyed by name\n * @param {HookCallback|boolean} callback The callback function which is given environment variables.\n * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)\n * @public\n */\n add(name, callback, first) {\n if (typeof arguments[0] != 'string') {\n // Multiple hook callbacks, keyed by name\n for (let name in arguments[0]) {\n this.add(name, arguments[0][name], arguments[1]);\n }\n } else {\n (Array.isArray(name) ? name : [name]).forEach(function (name) {\n this[name] = this[name] || [];\n if (callback) {\n this[name][first ? 'unshift' : 'push'](callback);\n }\n }, this);\n }\n }\n\n /**\n * Runs a hook invoking all registered callbacks with the given environment variables.\n *\n * Callbacks will be invoked synchronously and in the order in which they were registered.\n *\n * @param {string} name The name of the hook.\n * @param {Object} env The environment variables of the hook passed to all callbacks registered.\n * @public\n */\n run(name, env) {\n this[name] = this[name] || [];\n this[name].forEach(function (callback) {\n callback.call(env && env.context ? env.context : env, env);\n });\n }\n}\n\n/**\n * @implements {IPlugins}\n */\nclass Plugins {\n constructor(jsep) {\n this.jsep = jsep;\n this.registered = {};\n }\n\n /**\n * @callback PluginSetup\n * @this {Jsep} jsep\n * @returns: void\n */\n /**\n * Adds the given plugin(s) to the registry\n *\n * @param {object} plugins\n * @param {string} plugins.name The name of the plugin\n * @param {PluginSetup} plugins.init The init function\n * @public\n */\n register(...plugins) {\n plugins.forEach(plugin => {\n if (typeof plugin !== 'object' || !plugin.name || !plugin.init) {\n throw new Error('Invalid JSEP plugin format');\n }\n if (this.registered[plugin.name]) {\n // already registered. Ignore.\n return;\n }\n plugin.init(this.jsep);\n this.registered[plugin.name] = plugin;\n });\n }\n}\n\n// JavaScript Expression Parser (JSEP) 1.4.0\n\nclass Jsep {\n /**\n * @returns {string}\n */\n static get version() {\n // To be filled in by the template\n return '1.4.0';\n }\n\n /**\n * @returns {string}\n */\n static toString() {\n return 'JavaScript Expression Parser (JSEP) v' + Jsep.version;\n }\n // ==================== CONFIG ================================\n /**\n * @method addUnaryOp\n * @param {string} op_name The name of the unary op to add\n * @returns {Jsep}\n */\n static addUnaryOp(op_name) {\n Jsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);\n Jsep.unary_ops[op_name] = 1;\n return Jsep;\n }\n\n /**\n * @method jsep.addBinaryOp\n * @param {string} op_name The name of the binary op to add\n * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence\n * @param {boolean} [isRightAssociative=false] whether operator is right-associative\n * @returns {Jsep}\n */\n static addBinaryOp(op_name, precedence, isRightAssociative) {\n Jsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);\n Jsep.binary_ops[op_name] = precedence;\n if (isRightAssociative) {\n Jsep.right_associative.add(op_name);\n } else {\n Jsep.right_associative.delete(op_name);\n }\n return Jsep;\n }\n\n /**\n * @method addIdentifierChar\n * @param {string} char The additional character to treat as a valid part of an identifier\n * @returns {Jsep}\n */\n static addIdentifierChar(char) {\n Jsep.additional_identifier_chars.add(char);\n return Jsep;\n }\n\n /**\n * @method addLiteral\n * @param {string} literal_name The name of the literal to add\n * @param {*} literal_value The value of the literal\n * @returns {Jsep}\n */\n static addLiteral(literal_name, literal_value) {\n Jsep.literals[literal_name] = literal_value;\n return Jsep;\n }\n\n /**\n * @method removeUnaryOp\n * @param {string} op_name The name of the unary op to remove\n * @returns {Jsep}\n */\n static removeUnaryOp(op_name) {\n delete Jsep.unary_ops[op_name];\n if (op_name.length === Jsep.max_unop_len) {\n Jsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\n }\n return Jsep;\n }\n\n /**\n * @method removeAllUnaryOps\n * @returns {Jsep}\n */\n static removeAllUnaryOps() {\n Jsep.unary_ops = {};\n Jsep.max_unop_len = 0;\n return Jsep;\n }\n\n /**\n * @method removeIdentifierChar\n * @param {string} char The additional character to stop treating as a valid part of an identifier\n * @returns {Jsep}\n */\n static removeIdentifierChar(char) {\n Jsep.additional_identifier_chars.delete(char);\n return Jsep;\n }\n\n /**\n * @method removeBinaryOp\n * @param {string} op_name The name of the binary op to remove\n * @returns {Jsep}\n */\n static removeBinaryOp(op_name) {\n delete Jsep.binary_ops[op_name];\n if (op_name.length === Jsep.max_binop_len) {\n Jsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n }\n Jsep.right_associative.delete(op_name);\n return Jsep;\n }\n\n /**\n * @method removeAllBinaryOps\n * @returns {Jsep}\n */\n static removeAllBinaryOps() {\n Jsep.binary_ops = {};\n Jsep.max_binop_len = 0;\n return Jsep;\n }\n\n /**\n * @method removeLiteral\n * @param {string} literal_name The name of the literal to remove\n * @returns {Jsep}\n */\n static removeLiteral(literal_name) {\n delete Jsep.literals[literal_name];\n return Jsep;\n }\n\n /**\n * @method removeAllLiterals\n * @returns {Jsep}\n */\n static removeAllLiterals() {\n Jsep.literals = {};\n return Jsep;\n }\n // ==================== END CONFIG ============================\n\n /**\n * @returns {string}\n */\n get char() {\n return this.expr.charAt(this.index);\n }\n\n /**\n * @returns {number}\n */\n get code() {\n return this.expr.charCodeAt(this.index);\n }\n /**\n * @param {string} expr a string with the passed in express\n * @returns Jsep\n */\n constructor(expr) {\n // `index` stores the character number we are currently at\n // All of the gobbles below will modify `index` as we move along\n this.expr = expr;\n this.index = 0;\n }\n\n /**\n * static top-level parser\n * @returns {jsep.Expression}\n */\n static parse(expr) {\n return new Jsep(expr).parse();\n }\n\n /**\n * Get the longest key length of any object\n * @param {object} obj\n * @returns {number}\n */\n static getMaxKeyLen(obj) {\n return Math.max(0, ...Object.keys(obj).map(k => k.length));\n }\n\n /**\n * `ch` is a character code in the next three functions\n * @param {number} ch\n * @returns {boolean}\n */\n static isDecimalDigit(ch) {\n return ch >= 48 && ch <= 57; // 0...9\n }\n\n /**\n * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.\n * @param {string} op_val\n * @returns {number}\n */\n static binaryPrecedence(op_val) {\n return Jsep.binary_ops[op_val] || 0;\n }\n\n /**\n * Looks for start of identifier\n * @param {number} ch\n * @returns {boolean}\n */\n static isIdentifierStart(ch) {\n return ch >= 65 && ch <= 90 ||\n // A...Z\n ch >= 97 && ch <= 122 ||\n // a...z\n ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)] ||\n // any non-ASCII that is not an operator\n Jsep.additional_identifier_chars.has(String.fromCharCode(ch)); // additional characters\n }\n\n /**\n * @param {number} ch\n * @returns {boolean}\n */\n static isIdentifierPart(ch) {\n return Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);\n }\n\n /**\n * throw error at index of the expression\n * @param {string} message\n * @throws\n */\n throwError(message) {\n const error = new Error(message + ' at character ' + this.index);\n error.index = this.index;\n error.description = message;\n throw error;\n }\n\n /**\n * Run a given hook\n * @param {string} name\n * @param {jsep.Expression|false} [node]\n * @returns {?jsep.Expression}\n */\n runHook(name, node) {\n if (Jsep.hooks[name]) {\n const env = {\n context: this,\n node\n };\n Jsep.hooks.run(name, env);\n return env.node;\n }\n return node;\n }\n\n /**\n * Runs a given hook until one returns a node\n * @param {string} name\n * @returns {?jsep.Expression}\n */\n searchHook(name) {\n if (Jsep.hooks[name]) {\n const env = {\n context: this\n };\n Jsep.hooks[name].find(function (callback) {\n callback.call(env.context, env);\n return env.node;\n });\n return env.node;\n }\n }\n\n /**\n * Push `index` up to the next non-space character\n */\n gobbleSpaces() {\n let ch = this.code;\n // Whitespace\n while (ch === Jsep.SPACE_CODE || ch === Jsep.TAB_CODE || ch === Jsep.LF_CODE || ch === Jsep.CR_CODE) {\n ch = this.expr.charCodeAt(++this.index);\n }\n this.runHook('gobble-spaces');\n }\n\n /**\n * Top-level method to parse all expressions and returns compound or single node\n * @returns {jsep.Expression}\n */\n parse() {\n this.runHook('before-all');\n const nodes = this.gobbleExpressions();\n\n // If there's only one expression just try returning the expression\n const node = nodes.length === 1 ? nodes[0] : {\n type: Jsep.COMPOUND,\n body: nodes\n };\n return this.runHook('after-all', node);\n }\n\n /**\n * top-level parser (but can be reused within as well)\n * @param {number} [untilICode]\n * @returns {jsep.Expression[]}\n */\n gobbleExpressions(untilICode) {\n let nodes = [],\n ch_i,\n node;\n while (this.index < this.expr.length) {\n ch_i = this.code;\n\n // Expressions can be separated by semicolons, commas, or just inferred without any\n // separators\n if (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {\n this.index++; // ignore separators\n } else {\n // Try to gobble each expression individually\n if (node = this.gobbleExpression()) {\n nodes.push(node);\n // If we weren't able to find a binary expression and are out of room, then\n // the expression passed in probably has too much\n } else if (this.index < this.expr.length) {\n if (ch_i === untilICode) {\n break;\n }\n this.throwError('Unexpected \"' + this.char + '\"');\n }\n }\n }\n return nodes;\n }\n\n /**\n * The main parsing function.\n * @returns {?jsep.Expression}\n */\n gobbleExpression() {\n const node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();\n this.gobbleSpaces();\n return this.runHook('after-expression', node);\n }\n\n /**\n * Search for the operation portion of the string (e.g. `+`, `===`)\n * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n * and move down from 3 to 2 to 1 character until a matching binary operation is found\n * then, return that binary operation\n * @returns {string|boolean}\n */\n gobbleBinaryOp() {\n this.gobbleSpaces();\n let to_check = this.expr.substr(this.index, Jsep.max_binop_len);\n let tc_len = to_check.length;\n while (tc_len > 0) {\n // Don't accept a binary op when it is an identifier.\n // Binary ops that start with a identifier-valid character must be followed\n // by a non identifier-part valid character\n if (Jsep.binary_ops.hasOwnProperty(to_check) && (!Jsep.isIdentifierStart(this.code) || this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))) {\n this.index += tc_len;\n return to_check;\n }\n to_check = to_check.substr(0, --tc_len);\n }\n return false;\n }\n\n /**\n * This function is responsible for gobbling an individual expression,\n * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n * @returns {?jsep.BinaryExpression}\n */\n gobbleBinaryExpression() {\n let node, biop, prec, stack, biop_info, left, right, i, cur_biop;\n\n // First, try to get the leftmost thing\n // Then, check to see if there's a binary operator operating on that leftmost thing\n // Don't gobbleBinaryOp without a left-hand-side\n left = this.gobbleToken();\n if (!left) {\n return left;\n }\n biop = this.gobbleBinaryOp();\n\n // If there wasn't a binary operator, just return the leftmost node\n if (!biop) {\n return left;\n }\n\n // Otherwise, we need to start a stack to properly place the binary operations in their\n // precedence structure\n biop_info = {\n value: biop,\n prec: Jsep.binaryPrecedence(biop),\n right_a: Jsep.right_associative.has(biop)\n };\n right = this.gobbleToken();\n if (!right) {\n this.throwError(\"Expected expression after \" + biop);\n }\n stack = [left, biop_info, right];\n\n // Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n while (biop = this.gobbleBinaryOp()) {\n prec = Jsep.binaryPrecedence(biop);\n if (prec === 0) {\n this.index -= biop.length;\n break;\n }\n biop_info = {\n value: biop,\n prec,\n right_a: Jsep.right_associative.has(biop)\n };\n cur_biop = biop;\n\n // Reduce: make a binary expression from the three topmost entries.\n const comparePrev = prev => biop_info.right_a && prev.right_a ? prec > prev.prec : prec <= prev.prec;\n while (stack.length > 2 && comparePrev(stack[stack.length - 2])) {\n right = stack.pop();\n biop = stack.pop().value;\n left = stack.pop();\n node = {\n type: Jsep.BINARY_EXP,\n operator: biop,\n left,\n right\n };\n stack.push(node);\n }\n node = this.gobbleToken();\n if (!node) {\n this.throwError(\"Expected expression after \" + cur_biop);\n }\n stack.push(biop_info, node);\n }\n i = stack.length - 1;\n node = stack[i];\n while (i > 1) {\n node = {\n type: Jsep.BINARY_EXP,\n operator: stack[i - 1].value,\n left: stack[i - 2],\n right: node\n };\n i -= 2;\n }\n return node;\n }\n\n /**\n * An individual part of a binary expression:\n * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n * @returns {boolean|jsep.Expression}\n */\n gobbleToken() {\n let ch, to_check, tc_len, node;\n this.gobbleSpaces();\n node = this.searchHook('gobble-token');\n if (node) {\n return this.runHook('after-token', node);\n }\n ch = this.code;\n if (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {\n // Char code 46 is a dot `.` which can start off a numeric literal\n return this.gobbleNumericLiteral();\n }\n if (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {\n // Single or double quotes\n node = this.gobbleStringLiteral();\n } else if (ch === Jsep.OBRACK_CODE) {\n node = this.gobbleArray();\n } else {\n to_check = this.expr.substr(this.index, Jsep.max_unop_len);\n tc_len = to_check.length;\n while (tc_len > 0) {\n // Don't accept an unary op when it is an identifier.\n // Unary ops that start with a identifier-valid character must be followed\n // by a non identifier-part valid character\n if (Jsep.unary_ops.hasOwnProperty(to_check) && (!Jsep.isIdentifierStart(this.code) || this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))) {\n this.index += tc_len;\n const argument = this.gobbleToken();\n if (!argument) {\n this.throwError('missing unaryOp argument');\n }\n return this.runHook('after-token', {\n type: Jsep.UNARY_EXP,\n operator: to_check,\n argument,\n prefix: true\n });\n }\n to_check = to_check.substr(0, --tc_len);\n }\n if (Jsep.isIdentifierStart(ch)) {\n node = this.gobbleIdentifier();\n if (Jsep.literals.hasOwnProperty(node.name)) {\n node = {\n type: Jsep.LITERAL,\n value: Jsep.literals[node.name],\n raw: node.name\n };\n } else if (node.name === Jsep.this_str) {\n node = {\n type: Jsep.THIS_EXP\n };\n }\n } else if (ch === Jsep.OPAREN_CODE) {\n // open parenthesis\n node = this.gobbleGroup();\n }\n }\n if (!node) {\n return this.runHook('after-token', false);\n }\n node = this.gobbleTokenProperty(node);\n return this.runHook('after-token', node);\n }\n\n /**\n * Gobble properties of of identifiers/strings/arrays/groups.\n * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n * It also gobbles function calls:\n * e.g. `Math.acos(obj.angle)`\n * @param {jsep.Expression} node\n * @returns {jsep.Expression}\n */\n gobbleTokenProperty(node) {\n this.gobbleSpaces();\n let ch = this.code;\n while (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE || ch === Jsep.QUMARK_CODE) {\n let optional;\n if (ch === Jsep.QUMARK_CODE) {\n if (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) {\n break;\n }\n optional = true;\n this.index += 2;\n this.gobbleSpaces();\n ch = this.code;\n }\n this.index++;\n if (ch === Jsep.OBRACK_CODE) {\n node = {\n type: Jsep.MEMBER_EXP,\n computed: true,\n object: node,\n property: this.gobbleExpression()\n };\n if (!node.property) {\n this.throwError('Unexpected \"' + this.char + '\"');\n }\n this.gobbleSpaces();\n ch = this.code;\n if (ch !== Jsep.CBRACK_CODE) {\n this.throwError('Unclosed [');\n }\n this.index++;\n } else if (ch === Jsep.OPAREN_CODE) {\n // A function call is being made; gobble all the arguments\n node = {\n type: Jsep.CALL_EXP,\n 'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),\n callee: node\n };\n } else if (ch === Jsep.PERIOD_CODE || optional) {\n if (optional) {\n this.index--;\n }\n this.gobbleSpaces();\n node = {\n type: Jsep.MEMBER_EXP,\n computed: false,\n object: node,\n property: this.gobbleIdentifier()\n };\n }\n if (optional) {\n node.optional = true;\n } // else leave undefined for compatibility with esprima\n\n this.gobbleSpaces();\n ch = this.code;\n }\n return node;\n }\n\n /**\n * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n * @returns {jsep.Literal}\n */\n gobbleNumericLiteral() {\n let number = '',\n ch,\n chCode;\n while (Jsep.isDecimalDigit(this.code)) {\n number += this.expr.charAt(this.index++);\n }\n if (this.code === Jsep.PERIOD_CODE) {\n // can start with a decimal marker\n number += this.expr.charAt(this.index++);\n while (Jsep.isDecimalDigit(this.code)) {\n number += this.expr.charAt(this.index++);\n }\n }\n ch = this.char;\n if (ch === 'e' || ch === 'E') {\n // exponent marker\n number += this.expr.charAt(this.index++);\n ch = this.char;\n if (ch === '+' || ch === '-') {\n // exponent sign\n number += this.expr.charAt(this.index++);\n }\n while (Jsep.isDecimalDigit(this.code)) {\n // exponent itself\n number += this.expr.charAt(this.index++);\n }\n if (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1))) {\n this.throwError('Expected exponent (' + number + this.char + ')');\n }\n }\n chCode = this.code;\n\n // Check to make sure this isn't a variable name that start with a number (123abc)\n if (Jsep.isIdentifierStart(chCode)) {\n this.throwError('Variable names cannot start with a number (' + number + this.char + ')');\n } else if (chCode === Jsep.PERIOD_CODE || number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE) {\n this.throwError('Unexpected period');\n }\n return {\n type: Jsep.LITERAL,\n value: parseFloat(number),\n raw: number\n };\n }\n\n /**\n * Parses a string literal, staring with single or double quotes with basic support for escape codes\n * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n * @returns {jsep.Literal}\n */\n gobbleStringLiteral() {\n let str = '';\n const startIndex = this.index;\n const quote = this.expr.charAt(this.index++);\n let closed = false;\n while (this.index < this.expr.length) {\n let ch = this.expr.charAt(this.index++);\n if (ch === quote) {\n closed = true;\n break;\n } else if (ch === '\\\\') {\n // Check for all of the common escape codes\n ch = this.expr.charAt(this.index++);\n switch (ch) {\n case 'n':\n str += '\\n';\n break;\n case 'r':\n str += '\\r';\n break;\n case 't':\n str += '\\t';\n break;\n case 'b':\n str += '\\b';\n break;\n case 'f':\n str += '\\f';\n break;\n case 'v':\n str += '\\x0B';\n break;\n default:\n str += ch;\n }\n } else {\n str += ch;\n }\n }\n if (!closed) {\n this.throwError('Unclosed quote after \"' + str + '\"');\n }\n return {\n type: Jsep.LITERAL,\n value: str,\n raw: this.expr.substring(startIndex, this.index)\n };\n }\n\n /**\n * Gobbles only identifiers\n * e.g.: `foo`, `_value`, `$x1`\n * Also, this function checks if that identifier is a literal:\n * (e.g. `true`, `false`, `null`) or `this`\n * @returns {jsep.Identifier}\n */\n gobbleIdentifier() {\n let ch = this.code,\n start = this.index;\n if (Jsep.isIdentifierStart(ch)) {\n this.index++;\n } else {\n this.throwError('Unexpected ' + this.char);\n }\n while (this.index < this.expr.length) {\n ch = this.code;\n if (Jsep.isIdentifierPart(ch)) {\n this.index++;\n } else {\n break;\n }\n }\n return {\n type: Jsep.IDENTIFIER,\n name: this.expr.slice(start, this.index)\n };\n }\n\n /**\n * Gobbles a list of arguments within the context of a function call\n * or array literal. This function also assumes that the opening character\n * `(` or `[` has already been gobbled, and gobbles expressions and commas\n * until the terminator character `)` or `]` is encountered.\n * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n * @param {number} termination\n * @returns {jsep.Expression[]}\n */\n gobbleArguments(termination) {\n const args = [];\n let closed = false;\n let separator_count = 0;\n while (this.index < this.expr.length) {\n this.gobbleSpaces();\n let ch_i = this.code;\n if (ch_i === termination) {\n // done parsing\n closed = true;\n this.index++;\n if (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length) {\n this.throwError('Unexpected token ' + String.fromCharCode(termination));\n }\n break;\n } else if (ch_i === Jsep.COMMA_CODE) {\n // between expressions\n this.index++;\n separator_count++;\n if (separator_count !== args.length) {\n // missing argument\n if (termination === Jsep.CPAREN_CODE) {\n this.throwError('Unexpected token ,');\n } else if (termination === Jsep.CBRACK_CODE) {\n for (let arg = args.length; arg < separator_count; arg++) {\n args.push(null);\n }\n }\n }\n } else if (args.length !== separator_count && separator_count !== 0) {\n // NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments\n this.throwError('Expected comma');\n } else {\n const node = this.gobbleExpression();\n if (!node || node.type === Jsep.COMPOUND) {\n this.throwError('Expected comma');\n }\n args.push(node);\n }\n }\n if (!closed) {\n this.throwError('Expected ' + String.fromCharCode(termination));\n }\n return args;\n }\n\n /**\n * Responsible for parsing a group of things within parentheses `()`\n * that have no identifier in front (so not a function call)\n * This function assumes that it needs to gobble the opening parenthesis\n * and then tries to gobble everything within that parenthesis, assuming\n * that the next thing it should see is the close parenthesis. If not,\n * then the expression probably doesn't have a `)`\n * @returns {boolean|jsep.Expression}\n */\n gobbleGroup() {\n this.index++;\n let nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);\n if (this.code === Jsep.CPAREN_CODE) {\n this.index++;\n if (nodes.length === 1) {\n return nodes[0];\n } else if (!nodes.length) {\n return false;\n } else {\n return {\n type: Jsep.SEQUENCE_EXP,\n expressions: nodes\n };\n }\n } else {\n this.throwError('Unclosed (');\n }\n }\n\n /**\n * Responsible for parsing Array literals `[1, 2, 3]`\n * This function assumes that it needs to gobble the opening bracket\n * and then tries to gobble the expressions as arguments.\n * @returns {jsep.ArrayExpression}\n */\n gobbleArray() {\n this.index++;\n return {\n type: Jsep.ARRAY_EXP,\n elements: this.gobbleArguments(Jsep.CBRACK_CODE)\n };\n }\n}\n\n// Static fields:\nconst hooks = new Hooks();\nObject.assign(Jsep, {\n hooks,\n plugins: new Plugins(Jsep),\n // Node Types\n // ----------\n // This is the full set of types that any JSEP node can be.\n // Store them here to save space when minified\n COMPOUND: 'Compound',\n SEQUENCE_EXP: 'SequenceExpression',\n IDENTIFIER: 'Identifier',\n MEMBER_EXP: 'MemberExpression',\n LITERAL: 'Literal',\n THIS_EXP: 'ThisExpression',\n CALL_EXP: 'CallExpression',\n UNARY_EXP: 'UnaryExpression',\n BINARY_EXP: 'BinaryExpression',\n ARRAY_EXP: 'ArrayExpression',\n TAB_CODE: 9,\n LF_CODE: 10,\n CR_CODE: 13,\n SPACE_CODE: 32,\n PERIOD_CODE: 46,\n // '.'\n COMMA_CODE: 44,\n // ','\n SQUOTE_CODE: 39,\n // single quote\n DQUOTE_CODE: 34,\n // double quotes\n OPAREN_CODE: 40,\n // (\n CPAREN_CODE: 41,\n // )\n OBRACK_CODE: 91,\n // [\n CBRACK_CODE: 93,\n // ]\n QUMARK_CODE: 63,\n // ?\n SEMCOL_CODE: 59,\n // ;\n COLON_CODE: 58,\n // :\n\n // Operations\n // ----------\n // Use a quickly-accessible map to store all of the unary operators\n // Values are set to `1` (it really doesn't matter)\n unary_ops: {\n '-': 1,\n '!': 1,\n '~': 1,\n '+': 1\n },\n // Also use a map for the binary operations but set their values to their\n // binary precedence for quick reference (higher number = higher precedence)\n // see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\n binary_ops: {\n '||': 1,\n '??': 1,\n '&&': 2,\n '|': 3,\n '^': 4,\n '&': 5,\n '==': 6,\n '!=': 6,\n '===': 6,\n '!==': 6,\n '<': 7,\n '>': 7,\n '<=': 7,\n '>=': 7,\n '<<': 8,\n '>>': 8,\n '>>>': 8,\n '+': 9,\n '-': 9,\n '*': 10,\n '/': 10,\n '%': 10,\n '**': 11\n },\n // sets specific binary_ops as right-associative\n right_associative: new Set(['**']),\n // Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)\n additional_identifier_chars: new Set(['$', '_']),\n // Literals\n // ----------\n // Store the values to return for the various literals we may encounter\n literals: {\n 'true': true,\n 'false': false,\n 'null': null\n },\n // Except for `this`, which is special. This could be changed to something like `'self'` as well\n this_str: 'this'\n});\nJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\nJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\n// Backward Compatibility:\nconst jsep = expr => new Jsep(expr).parse();\nconst stdClassProps = Object.getOwnPropertyNames(class Test {});\nObject.getOwnPropertyNames(Jsep).filter(prop => !stdClassProps.includes(prop) && jsep[prop] === undefined).forEach(m => {\n jsep[m] = Jsep[m];\n});\njsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');\n\nconst CONDITIONAL_EXP = 'ConditionalExpression';\nvar ternary = {\n name: 'ternary',\n init(jsep) {\n // Ternary expression: test ? consequent : alternate\n jsep.hooks.add('after-expression', function gobbleTernary(env) {\n if (env.node && this.code === jsep.QUMARK_CODE) {\n this.index++;\n const test = env.node;\n const consequent = this.gobbleExpression();\n if (!consequent) {\n this.throwError('Expected expression');\n }\n this.gobbleSpaces();\n if (this.code === jsep.COLON_CODE) {\n this.index++;\n const alternate = this.gobbleExpression();\n if (!alternate) {\n this.throwError('Expected expression');\n }\n env.node = {\n type: CONDITIONAL_EXP,\n test,\n consequent,\n alternate\n };\n\n // check for operators of higher priority than ternary (i.e. assignment)\n // jsep sets || at 1, and assignment at 0.9, and conditional should be between them\n if (test.operator && jsep.binary_ops[test.operator] <= 0.9) {\n let newTest = test;\n while (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {\n newTest = newTest.right;\n }\n env.node.test = newTest.right;\n newTest.right = env.node;\n env.node = test;\n }\n } else {\n this.throwError('Expected :');\n }\n }\n });\n }\n};\n\n// Add default plugins:\n\njsep.plugins.register(ternary);\n\nconst FSLASH_CODE = 47; // '/'\nconst BSLASH_CODE = 92; // '\\\\'\n\nvar index = {\n name: 'regex',\n init(jsep) {\n // Regex literal: /abc123/ig\n jsep.hooks.add('gobble-token', function gobbleRegexLiteral(env) {\n if (this.code === FSLASH_CODE) {\n const patternIndex = ++this.index;\n let inCharSet = false;\n while (this.index < this.expr.length) {\n if (this.code === FSLASH_CODE && !inCharSet) {\n const pattern = this.expr.slice(patternIndex, this.index);\n let flags = '';\n while (++this.index < this.expr.length) {\n const code = this.code;\n if (code >= 97 && code <= 122 // a...z\n || code >= 65 && code <= 90 // A...Z\n || code >= 48 && code <= 57) {\n // 0-9\n flags += this.char;\n } else {\n break;\n }\n }\n let value;\n try {\n value = new RegExp(pattern, flags);\n } catch (e) {\n this.throwError(e.message);\n }\n env.node = {\n type: jsep.LITERAL,\n value,\n raw: this.expr.slice(patternIndex - 1, this.index)\n };\n\n // allow . [] and () after regex: /regex/.test(a)\n env.node = this.gobbleTokenProperty(env.node);\n return env.node;\n }\n if (this.code === jsep.OBRACK_CODE) {\n inCharSet = true;\n } else if (inCharSet && this.code === jsep.CBRACK_CODE) {\n inCharSet = false;\n }\n this.index += this.code === BSLASH_CODE ? 2 : 1;\n }\n this.throwError('Unclosed Regex');\n }\n });\n }\n};\n\nconst PLUS_CODE = 43; // +\nconst MINUS_CODE = 45; // -\n\nconst plugin = {\n name: 'assignment',\n assignmentOperators: new Set(['=', '*=', '**=', '/=', '%=', '+=', '-=', '<<=', '>>=', '>>>=', '&=', '^=', '|=', '||=', '&&=', '??=']),\n updateOperators: [PLUS_CODE, MINUS_CODE],\n assignmentPrecedence: 0.9,\n init(jsep) {\n const updateNodeTypes = [jsep.IDENTIFIER, jsep.MEMBER_EXP];\n plugin.assignmentOperators.forEach(op => jsep.addBinaryOp(op, plugin.assignmentPrecedence, true));\n jsep.hooks.add('gobble-token', function gobbleUpdatePrefix(env) {\n const code = this.code;\n if (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n this.index += 2;\n env.node = {\n type: 'UpdateExpression',\n operator: code === PLUS_CODE ? '++' : '--',\n argument: this.gobbleTokenProperty(this.gobbleIdentifier()),\n prefix: true\n };\n if (!env.node.argument || !updateNodeTypes.includes(env.node.argument.type)) {\n this.throwError(`Unexpected ${env.node.operator}`);\n }\n }\n });\n jsep.hooks.add('after-token', function gobbleUpdatePostfix(env) {\n if (env.node) {\n const code = this.code;\n if (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n if (!updateNodeTypes.includes(env.node.type)) {\n this.throwError(`Unexpected ${env.node.operator}`);\n }\n this.index += 2;\n env.node = {\n type: 'UpdateExpression',\n operator: code === PLUS_CODE ? '++' : '--',\n argument: env.node,\n prefix: false\n };\n }\n }\n });\n jsep.hooks.add('after-expression', function gobbleAssignment(env) {\n if (env.node) {\n // Note: Binaries can be chained in a single expression to respect\n // operator precedence (i.e. a = b = 1 + 2 + 3)\n // Update all binary assignment nodes in the tree\n updateBinariesToAssignments(env.node);\n }\n });\n function updateBinariesToAssignments(node) {\n if (plugin.assignmentOperators.has(node.operator)) {\n node.type = 'AssignmentExpression';\n updateBinariesToAssignments(node.left);\n updateBinariesToAssignments(node.right);\n } else if (!node.operator) {\n Object.values(node).forEach(val => {\n if (val && typeof val === 'object') {\n updateBinariesToAssignments(val);\n }\n });\n }\n }\n }\n};\n\n/* eslint-disable no-bitwise -- Convenient */\n\n// register plugins\njsep.plugins.register(index, plugin);\njsep.addUnaryOp('typeof');\njsep.addLiteral('null', null);\njsep.addLiteral('undefined', undefined);\nconst BLOCKED_PROTO_PROPERTIES = new Set(['constructor', '__proto__', '__defineGetter__', '__defineSetter__']);\nconst SafeEval = {\n /**\n * @param {jsep.Expression} ast\n * @param {Record} subs\n */\n evalAst(ast, subs) {\n switch (ast.type) {\n case 'BinaryExpression':\n case 'LogicalExpression':\n return SafeEval.evalBinaryExpression(ast, subs);\n case 'Compound':\n return SafeEval.evalCompound(ast, subs);\n case 'ConditionalExpression':\n return SafeEval.evalConditionalExpression(ast, subs);\n case 'Identifier':\n return SafeEval.evalIdentifier(ast, subs);\n case 'Literal':\n return SafeEval.evalLiteral(ast, subs);\n case 'MemberExpression':\n return SafeEval.evalMemberExpression(ast, subs);\n case 'UnaryExpression':\n return SafeEval.evalUnaryExpression(ast, subs);\n case 'ArrayExpression':\n return SafeEval.evalArrayExpression(ast, subs);\n case 'CallExpression':\n return SafeEval.evalCallExpression(ast, subs);\n case 'AssignmentExpression':\n return SafeEval.evalAssignmentExpression(ast, subs);\n default:\n throw SyntaxError('Unexpected expression', ast);\n }\n },\n evalBinaryExpression(ast, subs) {\n const result = {\n '||': (a, b) => a || b(),\n '&&': (a, b) => a && b(),\n '|': (a, b) => a | b(),\n '^': (a, b) => a ^ b(),\n '&': (a, b) => a & b(),\n // eslint-disable-next-line eqeqeq -- API\n '==': (a, b) => a == b(),\n // eslint-disable-next-line eqeqeq -- API\n '!=': (a, b) => a != b(),\n '===': (a, b) => a === b(),\n '!==': (a, b) => a !== b(),\n '<': (a, b) => a < b(),\n '>': (a, b) => a > b(),\n '<=': (a, b) => a <= b(),\n '>=': (a, b) => a >= b(),\n '<<': (a, b) => a << b(),\n '>>': (a, b) => a >> b(),\n '>>>': (a, b) => a >>> b(),\n '+': (a, b) => a + b(),\n '-': (a, b) => a - b(),\n '*': (a, b) => a * b(),\n '/': (a, b) => a / b(),\n '%': (a, b) => a % b()\n }[ast.operator](SafeEval.evalAst(ast.left, subs), () => SafeEval.evalAst(ast.right, subs));\n return result;\n },\n evalCompound(ast, subs) {\n let last;\n for (let i = 0; i < ast.body.length; i++) {\n if (ast.body[i].type === 'Identifier' && ['var', 'let', 'const'].includes(ast.body[i].name) && ast.body[i + 1] && ast.body[i + 1].type === 'AssignmentExpression') {\n // var x=2; is detected as\n // [{Identifier var}, {AssignmentExpression x=2}]\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient\n i += 1;\n }\n const expr = ast.body[i];\n last = SafeEval.evalAst(expr, subs);\n }\n return last;\n },\n evalConditionalExpression(ast, subs) {\n if (SafeEval.evalAst(ast.test, subs)) {\n return SafeEval.evalAst(ast.consequent, subs);\n }\n return SafeEval.evalAst(ast.alternate, subs);\n },\n evalIdentifier(ast, subs) {\n if (Object.hasOwn(subs, ast.name)) {\n return subs[ast.name];\n }\n throw ReferenceError(`${ast.name} is not defined`);\n },\n evalLiteral(ast) {\n return ast.value;\n },\n evalMemberExpression(ast, subs) {\n const prop = String(\n // NOTE: `String(value)` throws error when\n // value has overwritten the toString method to return non-string\n // i.e. `value = {toString: () => []}`\n ast.computed ? SafeEval.evalAst(ast.property) // `object[property]`\n : ast.property.name // `object.property` property is Identifier\n );\n const obj = SafeEval.evalAst(ast.object, subs);\n if (obj === undefined || obj === null) {\n throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`);\n }\n if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) {\n throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`);\n }\n const result = obj[prop];\n if (typeof result === 'function') {\n return result.bind(obj); // arrow functions aren't affected by bind.\n }\n return result;\n },\n evalUnaryExpression(ast, subs) {\n const result = {\n '-': a => -SafeEval.evalAst(a, subs),\n '!': a => !SafeEval.evalAst(a, subs),\n '~': a => ~SafeEval.evalAst(a, subs),\n // eslint-disable-next-line no-implicit-coercion -- API\n '+': a => +SafeEval.evalAst(a, subs),\n typeof: a => typeof SafeEval.evalAst(a, subs)\n }[ast.operator](ast.argument);\n return result;\n },\n evalArrayExpression(ast, subs) {\n return ast.elements.map(el => SafeEval.evalAst(el, subs));\n },\n evalCallExpression(ast, subs) {\n const args = ast.arguments.map(arg => SafeEval.evalAst(arg, subs));\n const func = SafeEval.evalAst(ast.callee, subs);\n // if (func === Function) {\n // throw new Error('Function constructor is disabled');\n // }\n return func(...args);\n },\n evalAssignmentExpression(ast, subs) {\n if (ast.left.type !== 'Identifier') {\n throw SyntaxError('Invalid left-hand side in assignment');\n }\n const id = ast.left.name;\n const value = SafeEval.evalAst(ast.right, subs);\n subs[id] = value;\n return subs[id];\n }\n};\n\n/**\n * A replacement for NodeJS' VM.Script which is also {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP | Content Security Policy} friendly.\n */\nclass SafeScript {\n /**\n * @param {string} expr Expression to evaluate\n */\n constructor(expr) {\n this.code = expr;\n this.ast = jsep(this.code);\n }\n\n /**\n * @param {object} context Object whose items will be added\n * to evaluation\n * @returns {EvaluatedResult} Result of evaluated code\n */\n runInNewContext(context) {\n // `Object.create(null)` creates a prototypeless object\n const keyMap = Object.assign(Object.create(null), context);\n return SafeEval.evalAst(this.ast, keyMap);\n }\n}\n\n/* eslint-disable camelcase -- Convenient for escaping */\n\n\n/**\n * @typedef {null|boolean|number|string|object|GenericArray} JSONObject\n */\n\n/**\n * @typedef {any} AnyItem\n */\n\n/**\n * @typedef {any} AnyResult\n */\n\n/**\n * Copies array and then pushes item into it.\n * @param {GenericArray} arr Array to copy and into which to push\n * @param {AnyItem} item Array item to add (to end)\n * @returns {GenericArray} Copy of the original array\n */\nfunction push(arr, item) {\n arr = arr.slice();\n arr.push(item);\n return arr;\n}\n/**\n * Copies array and then unshifts item into it.\n * @param {AnyItem} item Array item to add (to beginning)\n * @param {GenericArray} arr Array to copy and into which to unshift\n * @returns {GenericArray} Copy of the original array\n */\nfunction unshift(item, arr) {\n arr = arr.slice();\n arr.unshift(item);\n return arr;\n}\n\n/**\n * Caught when JSONPath is used without `new` but rethrown if with `new`\n * @extends Error\n */\nclass NewError extends Error {\n /**\n * @param {AnyResult} value The evaluated scalar value\n */\n constructor(value) {\n super('JSONPath should not be called with \"new\" (it prevents return ' + 'of (unwrapped) scalar values)');\n this.avoidNew = true;\n this.value = value;\n this.name = 'NewError';\n }\n}\n\n/**\n* @typedef {object} ReturnObject\n* @property {string} path\n* @property {JSONObject} value\n* @property {object|GenericArray} parent\n* @property {string} parentProperty\n*/\n\n/**\n* @callback JSONPathCallback\n* @param {string|object} preferredOutput\n* @param {\"value\"|\"property\"} type\n* @param {ReturnObject} fullRetObj\n* @returns {void}\n*/\n\n/**\n* @callback OtherTypeCallback\n* @param {JSONObject} val\n* @param {string} path\n* @param {object|GenericArray} parent\n* @param {string} parentPropName\n* @returns {boolean}\n*/\n\n/**\n * @typedef {any} ContextItem\n */\n\n/**\n * @typedef {any} EvaluatedResult\n */\n\n/**\n* @callback EvalCallback\n* @param {string} code\n* @param {ContextItem} context\n* @returns {EvaluatedResult}\n*/\n\n/**\n * @typedef {typeof SafeScript} EvalClass\n */\n\n/**\n * @typedef {object} JSONPathOptions\n * @property {JSON} json\n * @property {string|string[]} path\n * @property {\"value\"|\"path\"|\"pointer\"|\"parent\"|\"parentProperty\"|\n * \"all\"} [resultType=\"value\"]\n * @property {boolean} [flatten=false]\n * @property {boolean} [wrap=true]\n * @property {object} [sandbox={}]\n * @property {EvalCallback|EvalClass|'safe'|'native'|\n * boolean} [eval = 'safe']\n * @property {object|GenericArray|null} [parent=null]\n * @property {string|null} [parentProperty=null]\n * @property {JSONPathCallback} [callback]\n * @property {OtherTypeCallback} [otherTypeCallback] Defaults to\n * function which throws on encountering `@other`\n * @property {boolean} [autostart=true]\n */\n\n/**\n * @param {string|JSONPathOptions} opts If a string, will be treated as `expr`\n * @param {string} [expr] JSON path to evaluate\n * @param {JSON} [obj] JSON object to evaluate against\n * @param {JSONPathCallback} [callback] Passed 3 arguments: 1) desired payload\n * per `resultType`, 2) `\"value\"|\"property\"`, 3) Full returned object with\n * all payloads\n * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end\n * of one's query, this will be invoked with the value of the item, its\n * path, its parent, and its parent's property name, and it should return\n * a boolean indicating whether the supplied value belongs to the \"other\"\n * type or not (or it may handle transformations and return `false`).\n * @returns {JSONPath}\n * @class\n */\nfunction JSONPath(opts, expr, obj, callback, otherTypeCallback) {\n // eslint-disable-next-line no-restricted-syntax -- Allow for pseudo-class\n if (!(this instanceof JSONPath)) {\n try {\n return new JSONPath(opts, expr, obj, callback, otherTypeCallback);\n } catch (e) {\n if (!e.avoidNew) {\n throw e;\n }\n return e.value;\n }\n }\n if (typeof opts === 'string') {\n otherTypeCallback = callback;\n callback = obj;\n obj = expr;\n expr = opts;\n opts = null;\n }\n const optObj = opts && typeof opts === 'object';\n opts = opts || {};\n this.json = opts.json || obj;\n this.path = opts.path || expr;\n this.resultType = opts.resultType || 'value';\n this.flatten = opts.flatten || false;\n this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true;\n this.sandbox = opts.sandbox || {};\n this.eval = opts.eval === undefined ? 'safe' : opts.eval;\n this.ignoreEvalErrors = typeof opts.ignoreEvalErrors === 'undefined' ? false : opts.ignoreEvalErrors;\n this.parent = opts.parent || null;\n this.parentProperty = opts.parentProperty || null;\n this.callback = opts.callback || callback || null;\n this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function () {\n throw new TypeError('You must supply an otherTypeCallback callback option ' + 'with the @other() operator.');\n };\n if (opts.autostart !== false) {\n const args = {\n path: optObj ? opts.path : expr\n };\n if (!optObj) {\n args.json = obj;\n } else if ('json' in opts) {\n args.json = opts.json;\n }\n const ret = this.evaluate(args);\n if (!ret || typeof ret !== 'object') {\n throw new NewError(ret);\n }\n return ret;\n }\n}\n\n// PUBLIC METHODS\nJSONPath.prototype.evaluate = function (expr, json, callback, otherTypeCallback) {\n let currParent = this.parent,\n currParentProperty = this.parentProperty;\n let {\n flatten,\n wrap\n } = this;\n this.currResultType = this.resultType;\n this.currEval = this.eval;\n this.currSandbox = this.sandbox;\n callback = callback || this.callback;\n this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback;\n json = json || this.json;\n expr = expr || this.path;\n if (expr && typeof expr === 'object' && !Array.isArray(expr)) {\n if (!expr.path && expr.path !== '') {\n throw new TypeError('You must supply a \"path\" property when providing an object ' + 'argument to JSONPath.evaluate().');\n }\n if (!Object.hasOwn(expr, 'json')) {\n throw new TypeError('You must supply a \"json\" property when providing an object ' + 'argument to JSONPath.evaluate().');\n }\n ({\n json\n } = expr);\n flatten = Object.hasOwn(expr, 'flatten') ? expr.flatten : flatten;\n this.currResultType = Object.hasOwn(expr, 'resultType') ? expr.resultType : this.currResultType;\n this.currSandbox = Object.hasOwn(expr, 'sandbox') ? expr.sandbox : this.currSandbox;\n wrap = Object.hasOwn(expr, 'wrap') ? expr.wrap : wrap;\n this.currEval = Object.hasOwn(expr, 'eval') ? expr.eval : this.currEval;\n callback = Object.hasOwn(expr, 'callback') ? expr.callback : callback;\n this.currOtherTypeCallback = Object.hasOwn(expr, 'otherTypeCallback') ? expr.otherTypeCallback : this.currOtherTypeCallback;\n currParent = Object.hasOwn(expr, 'parent') ? expr.parent : currParent;\n currParentProperty = Object.hasOwn(expr, 'parentProperty') ? expr.parentProperty : currParentProperty;\n expr = expr.path;\n }\n currParent = currParent || null;\n currParentProperty = currParentProperty || null;\n if (Array.isArray(expr)) {\n expr = JSONPath.toPathString(expr);\n }\n if (!expr && expr !== '' || !json) {\n return undefined;\n }\n const exprList = JSONPath.toPathArray(expr);\n if (exprList[0] === '$' && exprList.length > 1) {\n exprList.shift();\n }\n this._hasParentSelector = null;\n const result = this._trace(exprList, json, ['$'], currParent, currParentProperty, callback).filter(function (ea) {\n return ea && !ea.isParentSelector;\n });\n if (!result.length) {\n return wrap ? [] : undefined;\n }\n if (!wrap && result.length === 1 && !result[0].hasArrExpr) {\n return this._getPreferredOutput(result[0]);\n }\n return result.reduce((rslt, ea) => {\n const valOrPath = this._getPreferredOutput(ea);\n if (flatten && Array.isArray(valOrPath)) {\n rslt = rslt.concat(valOrPath);\n } else {\n rslt.push(valOrPath);\n }\n return rslt;\n }, []);\n};\n\n// PRIVATE METHODS\n\nJSONPath.prototype._getPreferredOutput = function (ea) {\n const resultType = this.currResultType;\n switch (resultType) {\n case 'all':\n {\n const path = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path);\n ea.pointer = JSONPath.toPointer(path);\n ea.path = typeof ea.path === 'string' ? ea.path : JSONPath.toPathString(ea.path);\n return ea;\n }\n case 'value':\n case 'parent':\n case 'parentProperty':\n return ea[resultType];\n case 'path':\n return JSONPath.toPathString(ea[resultType]);\n case 'pointer':\n return JSONPath.toPointer(ea.path);\n default:\n throw new TypeError('Unknown result type');\n }\n};\nJSONPath.prototype._handleCallback = function (fullRetObj, callback, type) {\n if (callback) {\n const preferredOutput = this._getPreferredOutput(fullRetObj);\n fullRetObj.path = typeof fullRetObj.path === 'string' ? fullRetObj.path : JSONPath.toPathString(fullRetObj.path);\n // eslint-disable-next-line n/callback-return -- No need to return\n callback(preferredOutput, type, fullRetObj);\n }\n};\n\n/**\n *\n * @param {string} expr\n * @param {JSONObject} val\n * @param {string} path\n * @param {object|GenericArray} parent\n * @param {string} parentPropName\n * @param {JSONPathCallback} callback\n * @param {boolean} hasArrExpr\n * @param {boolean} literalPriority\n * @returns {ReturnObject|ReturnObject[]}\n */\nJSONPath.prototype._trace = function (expr, val, path, parent, parentPropName, callback, hasArrExpr, literalPriority) {\n // No expr to follow? return path and value as the result of\n // this trace branch\n let retObj;\n if (!expr.length) {\n retObj = {\n path,\n value: val,\n parent,\n parentProperty: parentPropName,\n hasArrExpr\n };\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n const loc = expr[0],\n x = expr.slice(1);\n\n // We need to gather the return value of recursive trace calls in order to\n // do the parent sel computation.\n const ret = [];\n /**\n *\n * @param {ReturnObject|ReturnObject[]} elems\n * @returns {void}\n */\n function addRet(elems) {\n if (Array.isArray(elems)) {\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test:\n // `ret.push(...elems);`\n elems.forEach(t => {\n ret.push(t);\n });\n } else {\n ret.push(elems);\n }\n }\n if ((typeof loc !== 'string' || literalPriority) && val && Object.hasOwn(val, loc)) {\n // simple case--directly follow property\n addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr));\n // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if`\n } else if (loc === '*') {\n // all child properties\n this._walk(val, m => {\n addRet(this._trace(x, val[m], push(path, m), val, m, callback, true, true));\n });\n } else if (loc === '..') {\n // all descendent parent properties\n // Check remaining expression with val's immediate children\n addRet(this._trace(x, val, path, parent, parentPropName, callback, hasArrExpr));\n this._walk(val, m => {\n // We don't join m and x here because we only want parents,\n // not scalar values\n if (typeof val[m] === 'object') {\n // Keep going with recursive descent on val's\n // object children\n addRet(this._trace(expr.slice(), val[m], push(path, m), val, m, callback, true));\n }\n });\n // The parent sel computation is handled in the frame above using the\n // ancestor object of val\n } else if (loc === '^') {\n // This is not a final endpoint, so we do not invoke the callback here\n this._hasParentSelector = true;\n return {\n path: path.slice(0, -1),\n expr: x,\n isParentSelector: true\n };\n } else if (loc === '~') {\n // property name\n retObj = {\n path: push(path, loc),\n value: parentPropName,\n parent,\n parentProperty: null\n };\n this._handleCallback(retObj, callback, 'property');\n return retObj;\n } else if (loc === '$') {\n // root only\n addRet(this._trace(x, val, path, null, null, callback, hasArrExpr));\n } else if (/^(-?\\d*):(-?\\d*):?(\\d*)$/u.test(loc)) {\n // [start:end:step] Python slice syntax\n addRet(this._slice(loc, x, val, path, parent, parentPropName, callback));\n } else if (loc.indexOf('?(') === 0) {\n // [?(expr)] (filtering)\n if (this.currEval === false) {\n throw new Error('Eval [?(expr)] prevented in JSONPath expression.');\n }\n const safeLoc = loc.replace(/^\\?\\((.*?)\\)$/u, '$1');\n // check for a nested filter expression\n const nested = /@.?([^?]*)[['](\\??\\(.*?\\))(?!.\\)\\])[\\]']/gu.exec(safeLoc);\n if (nested) {\n // find if there are matches in the nested expression\n // add them to the result set if there is at least one match\n this._walk(val, m => {\n const npath = [nested[2]];\n const nvalue = nested[1] ? val[m][nested[1]] : val[m];\n const filterResults = this._trace(npath, nvalue, path, parent, parentPropName, callback, true);\n if (filterResults.length > 0) {\n addRet(this._trace(x, val[m], push(path, m), val, m, callback, true));\n }\n });\n } else {\n this._walk(val, m => {\n if (this._eval(safeLoc, val[m], m, path, parent, parentPropName)) {\n addRet(this._trace(x, val[m], push(path, m), val, m, callback, true));\n }\n });\n }\n } else if (loc[0] === '(') {\n // [(expr)] (dynamic property/index)\n if (this.currEval === false) {\n throw new Error('Eval [(expr)] prevented in JSONPath expression.');\n }\n // As this will resolve to a property name (but we don't know it\n // yet), property and parent information is relative to the\n // parent of the property to which this expression will resolve\n addRet(this._trace(unshift(this._eval(loc, val, path.at(-1), path.slice(0, -1), parent, parentPropName), x), val, path, parent, parentPropName, callback, hasArrExpr));\n } else if (loc[0] === '@') {\n // value type: @boolean(), etc.\n let addType = false;\n const valueType = loc.slice(1, -2);\n switch (valueType) {\n case 'scalar':\n if (!val || !['object', 'function'].includes(typeof val)) {\n addType = true;\n }\n break;\n case 'boolean':\n case 'string':\n case 'undefined':\n case 'function':\n if (typeof val === valueType) {\n addType = true;\n }\n break;\n case 'integer':\n if (Number.isFinite(val) && !(val % 1)) {\n addType = true;\n }\n break;\n case 'number':\n if (Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'nonFinite':\n if (typeof val === 'number' && !Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'object':\n if (val && typeof val === valueType) {\n addType = true;\n }\n break;\n case 'array':\n if (Array.isArray(val)) {\n addType = true;\n }\n break;\n case 'other':\n addType = this.currOtherTypeCallback(val, path, parent, parentPropName);\n break;\n case 'null':\n if (val === null) {\n addType = true;\n }\n break;\n /* c8 ignore next 2 */\n default:\n throw new TypeError('Unknown value type ' + valueType);\n }\n if (addType) {\n retObj = {\n path,\n value: val,\n parent,\n parentProperty: parentPropName\n };\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n // `-escaped property\n } else if (loc[0] === '`' && val && Object.hasOwn(val, loc.slice(1))) {\n const locProp = loc.slice(1);\n addRet(this._trace(x, val[locProp], push(path, locProp), val, locProp, callback, hasArrExpr, true));\n } else if (loc.includes(',')) {\n // [name1,name2,...]\n const parts = loc.split(',');\n for (const part of parts) {\n addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback, true));\n }\n // simple case--directly follow property\n } else if (!literalPriority && val && Object.hasOwn(val, loc)) {\n addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr, true));\n }\n\n // We check the resulting values for parent selections. For parent\n // selections we discard the value object and continue the trace with the\n // current val object\n if (this._hasParentSelector) {\n for (let t = 0; t < ret.length; t++) {\n const rett = ret[t];\n if (rett && rett.isParentSelector) {\n const tmp = this._trace(rett.expr, val, rett.path, parent, parentPropName, callback, hasArrExpr);\n if (Array.isArray(tmp)) {\n ret[t] = tmp[0];\n const tl = tmp.length;\n for (let tt = 1; tt < tl; tt++) {\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient\n t++;\n ret.splice(t, 0, tmp[tt]);\n }\n } else {\n ret[t] = tmp;\n }\n }\n }\n }\n return ret;\n};\nJSONPath.prototype._walk = function (val, f) {\n if (Array.isArray(val)) {\n const n = val.length;\n for (let i = 0; i < n; i++) {\n f(i);\n }\n } else if (val && typeof val === 'object') {\n Object.keys(val).forEach(m => {\n f(m);\n });\n }\n};\nJSONPath.prototype._slice = function (loc, expr, val, path, parent, parentPropName, callback) {\n if (!Array.isArray(val)) {\n return undefined;\n }\n const len = val.length,\n parts = loc.split(':'),\n step = parts[2] && Number.parseInt(parts[2]) || 1;\n let start = parts[0] && Number.parseInt(parts[0]) || 0,\n end = parts[1] && Number.parseInt(parts[1]) || len;\n start = start < 0 ? Math.max(0, start + len) : Math.min(len, start);\n end = end < 0 ? Math.max(0, end + len) : Math.min(len, end);\n const ret = [];\n for (let i = start; i < end; i += step) {\n const tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback, true);\n // Should only be possible to be an array here since first part of\n // ``unshift(i, expr)` passed in above would not be empty, nor `~`,\n // nor begin with `@` (as could return objects)\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test: `ret.push(...tmp);`\n tmp.forEach(t => {\n ret.push(t);\n });\n }\n return ret;\n};\nJSONPath.prototype._eval = function (code, _v, _vname, path, parent, parentPropName) {\n this.currSandbox._$_parentProperty = parentPropName;\n this.currSandbox._$_parent = parent;\n this.currSandbox._$_property = _vname;\n this.currSandbox._$_root = this.json;\n this.currSandbox._$_v = _v;\n const containsPath = code.includes('@path');\n if (containsPath) {\n this.currSandbox._$_path = JSONPath.toPathString(path.concat([_vname]));\n }\n const scriptCacheKey = this.currEval + 'Script:' + code;\n if (!JSONPath.cache[scriptCacheKey]) {\n let script = code.replaceAll('@parentProperty', '_$_parentProperty').replaceAll('@parent', '_$_parent').replaceAll('@property', '_$_property').replaceAll('@root', '_$_root').replaceAll(/@([.\\s)[])/gu, '_$_v$1');\n if (containsPath) {\n script = script.replaceAll('@path', '_$_path');\n }\n if (this.currEval === 'safe' || this.currEval === true || this.currEval === undefined) {\n JSONPath.cache[scriptCacheKey] = new this.safeVm.Script(script);\n } else if (this.currEval === 'native') {\n JSONPath.cache[scriptCacheKey] = new this.vm.Script(script);\n } else if (typeof this.currEval === 'function' && this.currEval.prototype && Object.hasOwn(this.currEval.prototype, 'runInNewContext')) {\n const CurrEval = this.currEval;\n JSONPath.cache[scriptCacheKey] = new CurrEval(script);\n } else if (typeof this.currEval === 'function') {\n JSONPath.cache[scriptCacheKey] = {\n runInNewContext: context => this.currEval(script, context)\n };\n } else {\n throw new TypeError(`Unknown \"eval\" property \"${this.currEval}\"`);\n }\n }\n try {\n return JSONPath.cache[scriptCacheKey].runInNewContext(this.currSandbox);\n } catch (e) {\n if (this.ignoreEvalErrors) {\n return false;\n }\n throw new Error('jsonPath: ' + e.message + ': ' + code);\n }\n};\n\n// PUBLIC CLASS PROPERTIES AND METHODS\n\n// Could store the cache object itself\nJSONPath.cache = {};\n\n/**\n * @param {string[]} pathArr Array to convert\n * @returns {string} The path string\n */\nJSONPath.toPathString = function (pathArr) {\n const x = pathArr,\n n = x.length;\n let p = '$';\n for (let i = 1; i < n; i++) {\n if (!/^(~|\\^|@.*?\\(\\))$/u.test(x[i])) {\n p += /^[0-9*]+$/u.test(x[i]) ? '[' + x[i] + ']' : \"['\" + x[i] + \"']\";\n }\n }\n return p;\n};\n\n/**\n * @param {string} pointer JSON Path\n * @returns {string} JSON Pointer\n */\nJSONPath.toPointer = function (pointer) {\n const x = pointer,\n n = x.length;\n let p = '';\n for (let i = 1; i < n; i++) {\n if (!/^(~|\\^|@.*?\\(\\))$/u.test(x[i])) {\n p += '/' + x[i].toString().replaceAll('~', '~0').replaceAll('/', '~1');\n }\n }\n return p;\n};\n\n/**\n * @param {string} expr Expression to convert\n * @returns {string[]}\n */\nJSONPath.toPathArray = function (expr) {\n const {\n cache\n } = JSONPath;\n if (cache[expr]) {\n return cache[expr].concat();\n }\n const subx = [];\n const normalized = expr\n // Properties\n .replaceAll(/@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\\(\\)/gu, ';$&;')\n // Parenthetical evaluations (filtering and otherwise), directly\n // within brackets or single quotes\n .replaceAll(/[['](\\??\\(.*?\\))[\\]'](?!.\\])/gu, function ($0, $1) {\n return '[#' + (subx.push($1) - 1) + ']';\n })\n // Escape periods and tildes within properties\n .replaceAll(/\\[['\"]([^'\\]]*)['\"]\\]/gu, function ($0, prop) {\n return \"['\" + prop.replaceAll('.', '%@%').replaceAll('~', '%%@@%%') + \"']\";\n })\n // Properties operator\n .replaceAll('~', ';~;')\n // Split by property boundaries\n .replaceAll(/['\"]?\\.['\"]?(?![^[]*\\])|\\[['\"]?/gu, ';')\n // Reinsert periods within properties\n .replaceAll('%@%', '.')\n // Reinsert tildes within properties\n .replaceAll('%%@@%%', '~')\n // Parent\n .replaceAll(/(?:;)?(\\^+)(?:;)?/gu, function ($0, ups) {\n return ';' + ups.split('').join(';') + ';';\n })\n // Descendents\n .replaceAll(/;;;|;;/gu, ';..;')\n // Remove trailing\n .replaceAll(/;$|'?\\]|'$/gu, '');\n const exprList = normalized.split(';').map(function (exp) {\n const match = exp.match(/#(\\d+)/u);\n return !match || !match[1] ? exp : subx[match[1]];\n });\n cache[expr] = exprList;\n return cache[expr].concat();\n};\nJSONPath.prototype.safeVm = {\n Script: SafeScript\n};\n\nJSONPath.prototype.vm = vm;\n\nexports.JSONPath = JSONPath;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tvar threw = true;\n\ttry {\n\t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\t\tthrew = false;\n\t} finally {\n\t\tif(threw) delete __webpack_module_cache__[moduleId];\n\t}\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","\nif (typeof __webpack_require__ !== 'undefined') __webpack_require__.ab = __dirname + \"/\";","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(5915);\n",""],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"index.js","mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC/NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACt1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrnEA;AACA;AACA;AACA;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACrpBA;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACr0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/IA;AACA;AACA;AACA;AACA;;;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1uEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AClfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACj7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACroBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC/UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrRA;;;;;;;;ACAA;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC9SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACh7JA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACrhEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7BA;AACA;;;;AEDA;AACA;AACA;AACA","sources":[".././lib/main.js",".././lib/utils.js",".././node_modules/@actions/core/lib/command.js",".././node_modules/@actions/core/lib/core.js",".././node_modules/@actions/core/lib/file-command.js",".././node_modules/@actions/core/lib/oidc-utils.js",".././node_modules/@actions/core/lib/path-utils.js",".././node_modules/@actions/core/lib/platform.js",".././node_modules/@actions/core/lib/summary.js",".././node_modules/@actions/core/lib/utils.js",".././node_modules/@actions/exec/lib/exec.js",".././node_modules/@actions/exec/lib/toolrunner.js",".././node_modules/@actions/http-client/lib/auth.js",".././node_modules/@actions/http-client/lib/index.js",".././node_modules/@actions/http-client/lib/proxy.js",".././node_modules/@actions/io/lib/io-util.js",".././node_modules/@actions/io/lib/io.js",".././node_modules/@xmldom/xmldom/lib/conventions.js",".././node_modules/@xmldom/xmldom/lib/dom-parser.js",".././node_modules/@xmldom/xmldom/lib/dom.js",".././node_modules/@xmldom/xmldom/lib/entities.js",".././node_modules/@xmldom/xmldom/lib/index.js",".././node_modules/@xmldom/xmldom/lib/sax.js",".././node_modules/tunnel/index.js",".././node_modules/tunnel/lib/tunnel.js",".././node_modules/undici/index.js",".././node_modules/undici/lib/agent.js",".././node_modules/undici/lib/api/abort-signal.js",".././node_modules/undici/lib/api/api-connect.js",".././node_modules/undici/lib/api/api-pipeline.js",".././node_modules/undici/lib/api/api-request.js",".././node_modules/undici/lib/api/api-stream.js",".././node_modules/undici/lib/api/api-upgrade.js",".././node_modules/undici/lib/api/index.js",".././node_modules/undici/lib/api/readable.js",".././node_modules/undici/lib/api/util.js",".././node_modules/undici/lib/balanced-pool.js",".././node_modules/undici/lib/cache/cache.js",".././node_modules/undici/lib/cache/cachestorage.js",".././node_modules/undici/lib/cache/symbols.js",".././node_modules/undici/lib/cache/util.js",".././node_modules/undici/lib/client.js",".././node_modules/undici/lib/compat/dispatcher-weakref.js",".././node_modules/undici/lib/cookies/constants.js",".././node_modules/undici/lib/cookies/index.js",".././node_modules/undici/lib/cookies/parse.js",".././node_modules/undici/lib/cookies/util.js",".././node_modules/undici/lib/core/connect.js",".././node_modules/undici/lib/core/constants.js",".././node_modules/undici/lib/core/errors.js",".././node_modules/undici/lib/core/request.js",".././node_modules/undici/lib/core/symbols.js",".././node_modules/undici/lib/core/util.js",".././node_modules/undici/lib/dispatcher-base.js",".././node_modules/undici/lib/dispatcher.js",".././node_modules/undici/lib/fetch/body.js",".././node_modules/undici/lib/fetch/constants.js",".././node_modules/undici/lib/fetch/dataURL.js",".././node_modules/undici/lib/fetch/file.js",".././node_modules/undici/lib/fetch/formdata.js",".././node_modules/undici/lib/fetch/global.js",".././node_modules/undici/lib/fetch/headers.js",".././node_modules/undici/lib/fetch/index.js",".././node_modules/undici/lib/fetch/request.js",".././node_modules/undici/lib/fetch/response.js",".././node_modules/undici/lib/fetch/symbols.js",".././node_modules/undici/lib/fetch/util.js",".././node_modules/undici/lib/fetch/webidl.js",".././node_modules/undici/lib/fileapi/encoding.js",".././node_modules/undici/lib/fileapi/filereader.js",".././node_modules/undici/lib/fileapi/progressevent.js",".././node_modules/undici/lib/fileapi/symbols.js",".././node_modules/undici/lib/fileapi/util.js",".././node_modules/undici/lib/global.js",".././node_modules/undici/lib/handler/DecoratorHandler.js",".././node_modules/undici/lib/handler/RedirectHandler.js",".././node_modules/undici/lib/handler/RetryHandler.js",".././node_modules/undici/lib/interceptor/redirectInterceptor.js",".././node_modules/undici/lib/llhttp/constants.js",".././node_modules/undici/lib/llhttp/llhttp-wasm.js",".././node_modules/undici/lib/llhttp/llhttp_simd-wasm.js",".././node_modules/undici/lib/llhttp/utils.js",".././node_modules/undici/lib/mock/mock-agent.js",".././node_modules/undici/lib/mock/mock-client.js",".././node_modules/undici/lib/mock/mock-errors.js",".././node_modules/undici/lib/mock/mock-interceptor.js",".././node_modules/undici/lib/mock/mock-pool.js",".././node_modules/undici/lib/mock/mock-symbols.js",".././node_modules/undici/lib/mock/mock-utils.js",".././node_modules/undici/lib/mock/pending-interceptors-formatter.js",".././node_modules/undici/lib/mock/pluralizer.js",".././node_modules/undici/lib/node/fixed-queue.js",".././node_modules/undici/lib/pool-base.js",".././node_modules/undici/lib/pool-stats.js",".././node_modules/undici/lib/pool.js",".././node_modules/undici/lib/proxy-agent.js",".././node_modules/undici/lib/timers.js",".././node_modules/undici/lib/websocket/connection.js",".././node_modules/undici/lib/websocket/constants.js",".././node_modules/undici/lib/websocket/events.js",".././node_modules/undici/lib/websocket/frame.js",".././node_modules/undici/lib/websocket/receiver.js",".././node_modules/undici/lib/websocket/symbols.js",".././node_modules/undici/lib/websocket/util.js",".././node_modules/undici/lib/websocket/websocket.js",".././node_modules/xpath/xpath.js","../external node-commonjs \"assert\"","../external node-commonjs \"async_hooks\"","../external node-commonjs \"buffer\"","../external node-commonjs \"child_process\"","../external node-commonjs \"console\"","../external node-commonjs \"crypto\"","../external node-commonjs \"diagnostics_channel\"","../external node-commonjs \"events\"","../external node-commonjs \"fs\"","../external node-commonjs \"http\"","../external node-commonjs \"http2\"","../external node-commonjs \"https\"","../external node-commonjs \"net\"","../external node-commonjs \"node:crypto\"","../external node-commonjs \"node:events\"","../external node-commonjs \"node:stream\"","../external node-commonjs \"node:util\"","../external node-commonjs \"os\"","../external node-commonjs \"path\"","../external node-commonjs \"perf_hooks\"","../external node-commonjs \"process\"","../external node-commonjs \"querystring\"","../external node-commonjs \"stream\"","../external node-commonjs \"stream/web\"","../external node-commonjs \"string_decoder\"","../external node-commonjs \"timers\"","../external node-commonjs \"tls\"","../external node-commonjs \"url\"","../external node-commonjs \"util\"","../external node-commonjs \"util/types\"","../external node-commonjs \"vm\"","../external node-commonjs \"worker_threads\"","../external node-commonjs \"zlib\"",".././node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js",".././node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js",".././node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js",".././node_modules/@fastify/busboy/deps/streamsearch/sbmh.js",".././node_modules/@fastify/busboy/lib/main.js",".././node_modules/@fastify/busboy/lib/types/multipart.js",".././node_modules/@fastify/busboy/lib/types/urlencoded.js",".././node_modules/@fastify/busboy/lib/utils/Decoder.js",".././node_modules/@fastify/busboy/lib/utils/basename.js",".././node_modules/@fastify/busboy/lib/utils/decodeText.js",".././node_modules/@fastify/busboy/lib/utils/getLimit.js",".././node_modules/@fastify/busboy/lib/utils/parseParams.js",".././node_modules/jsonpath-plus/dist/index-node-cjs.cjs","../webpack/bootstrap","../webpack/runtime/compat","../webpack/before-startup","../webpack/startup","../webpack/after-startup"],"sourcesContent":["\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path_1 = require(\"path\");\nconst process_1 = require(\"process\");\nconst fs_1 = require(\"fs\");\nconst core = __importStar(require(\"@actions/core\"));\nconst xmldom_1 = require(\"@xmldom/xmldom\");\nconst xpath = __importStar(require(\"xpath\"));\nconst jsonpath_plus_1 = require(\"jsonpath-plus\");\nconst utils_1 = require(\"./utils\");\nlet sarifFilePath;\nlet outputFilePath;\nlet sarifResults;\nlet cweXml;\nlet cweFilePath = (0, path_1.resolve)((0, path_1.dirname)(process.argv[1]), '..//security-standards/owasp-top10-2021.xml');\nconst cweFileXmlNs = { cwe: 'http://cwe.mitre.org/cwe-6' };\nlet cweIdXpath = '/cwe:Weakness_Catalog/cwe:Weaknesses/cwe:Weakness/@ID';\nlet categoryXpath = '/cwe:Weakness_Catalog/cwe:Categories/cwe:Category[contains(@Name, \"OWASP Top Ten 2021\")]';\nconst categoryMembersXpath = 'cwe:Relationships/cwe:Has_Member/@CWE_ID';\nconst categoryNameAttr = '@Name';\nconst categoryNameReplaceSearch = 'OWASP Top Ten 2021 Category ';\nconst codeQlCweTagPrefix = 'external/cwe/cwe-';\nlet securityStandardTag = 'owasp-top10-2021';\nconst codeQlTagsJsonPath = '$.runs[*].tool.extensions[*].rules[*].properties.tags';\n// Simple CLI argument parser for non-GitHub Actions use\nfunction parseCliArgs() {\n const args = {};\n for (let i = 2; i < process.argv.length; i++) {\n const arg = process.argv[i];\n if (arg.startsWith('--')) {\n const key = arg.substring(2);\n const value = process.argv[i + 1];\n if (value && !value.startsWith('--')) {\n args[key] = value;\n i++;\n }\n }\n }\n return args;\n}\n// Parse Actions or CLI inputs\nif (process_1.env.GITHUB_ACTIONS === 'true') {\n sarifFilePath = (0, path_1.resolve)(core.getInput('sarifFile'));\n cweFilePath = (0, path_1.resolve)(core.getInput('cweFile') || cweFilePath);\n cweIdXpath = core.getInput('cweIdXpath') || cweIdXpath;\n categoryXpath = core.getInput('cweCategoryXpath') || categoryXpath;\n securityStandardTag = core.getInput('securityStandardTag') || securityStandardTag;\n outputFilePath = (0, path_1.resolve)(core.getInput('outputFile') || sarifFilePath);\n}\nelse {\n const argv = parseCliArgs();\n if (!argv.sarifFile) {\n (0, utils_1.log)('Error: --sarifFile is required', utils_1.LogLevel.Error);\n process.exit(1);\n }\n sarifFilePath = (0, path_1.resolve)(argv.sarifFile);\n cweFilePath = (0, path_1.resolve)(argv.cweFile || cweFilePath);\n cweIdXpath = argv.cweIdXpath || cweIdXpath;\n categoryXpath = argv.cweCategoryXpath || categoryXpath;\n securityStandardTag = argv.securityStandardTag || securityStandardTag;\n outputFilePath = (0, path_1.resolve)(argv.outputFile || sarifFilePath);\n}\n(0, utils_1.log)(`Using ${sarifFilePath} for SARIF file`);\n(0, utils_1.log)(`Using ${cweFilePath} for CWE file`);\n(0, utils_1.log)(`Using ${outputFilePath} for output file`);\n// Load SARIF file\ntry {\n sarifResults = JSON.parse((0, fs_1.readFileSync)(sarifFilePath, 'utf8'));\n}\ncatch (err) {\n (0, utils_1.log)(`Unable to load SARIF file`, utils_1.LogLevel.Error);\n core.setFailed(err);\n throw err;\n}\n// Load security standard CWE XML file\ntry {\n cweXml = new xmldom_1.DOMParser().parseFromString((0, fs_1.readFileSync)(cweFilePath, 'utf8'));\n}\ncatch (err) {\n (0, utils_1.log)(`Unable to load CWE file`, utils_1.LogLevel.Error);\n core.setFailed(err);\n throw err;\n}\nconst select = xpath.useNamespaces(cweFileXmlNs);\nconst cweIds = select(cweIdXpath, cweXml).map(attribute => attribute.value);\nconst cweCategoryNodes = select(categoryXpath, cweXml);\nconst cweCategories = {};\nfor (const cweCategoryNode of cweCategoryNodes) {\n const memberCweIds = select(categoryMembersXpath, cweCategoryNode).map(attr => attr.value);\n const categoryName = select(categoryNameAttr, cweCategoryNode, true).value.replace(categoryNameReplaceSearch, '');\n for (const cweId of memberCweIds) {\n cweCategories[cweId] = [...(cweCategories[cweId] || []), categoryName];\n }\n}\n// Add tag to SARIF file\n(0, jsonpath_plus_1.JSONPath)({\n path: codeQlTagsJsonPath,\n json: sarifResults,\n callback: (tags) => {\n for (const tag of tags) {\n if (tag.startsWith(codeQlCweTagPrefix)) {\n const cweId = tag.replace(codeQlCweTagPrefix, '');\n // Normalize CWE ID by converting to integer to remove leading zeros\n const normalizedCweId = (0, utils_1.normalizeCweId)(cweId);\n // Skip if the CWE ID is not a valid number\n if (normalizedCweId === null) {\n continue;\n }\n if (cweIds.includes(normalizedCweId)) {\n tags.push(securityStandardTag);\n tags.push(...cweCategories[normalizedCweId]);\n return;\n }\n }\n }\n }\n});\n// Output SARIF file with tag added\ntry {\n (0, fs_1.writeFileSync)(outputFilePath, JSON.stringify(sarifResults));\n}\ncatch (err) {\n (0, utils_1.log)(`Unable to write SARIF file`, utils_1.LogLevel.Error);\n core.setFailed(err);\n throw err;\n}\n//# sourceMappingURL=main.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LogLevel = void 0;\nexports.log = log;\nexports.normalizeCweId = normalizeCweId;\n/* eslint-disable no-console */\nconst process_1 = require(\"process\");\nconst core = __importStar(require(\"@actions/core\"));\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[\"Info\"] = \"Info\";\n LogLevel[\"Warn\"] = \"Warn\";\n LogLevel[\"Error\"] = \"Error\";\n})(LogLevel || (exports.LogLevel = LogLevel = {}));\nfunction log(message, level = LogLevel.Info) {\n if (process_1.env.GITHUB_ACTIONS === 'true') {\n switch (level) {\n case LogLevel.Info: {\n core.info(message);\n break;\n }\n case LogLevel.Warn: {\n core.warning(message);\n break;\n }\n case LogLevel.Error: {\n core.error(message);\n break;\n }\n }\n }\n else {\n switch (level) {\n case LogLevel.Info: {\n console.info(message);\n break;\n }\n case LogLevel.Warn: {\n console.warn(message);\n break;\n }\n case LogLevel.Error: {\n console.error(message);\n break;\n }\n }\n }\n}\n/**\n * Normalize a CWE ID by removing leading zeros\n * @param cweId - The CWE ID string (e.g., \"099\", \"020\", \"89\")\n * @returns The normalized CWE ID string (e.g., \"99\", \"20\", \"89\") or null if invalid\n */\nfunction normalizeCweId(cweId) {\n const parsedCweId = parseInt(cweId, 10);\n if (Number.isNaN(parsedCweId) || parsedCweId < 0) {\n return null;\n }\n return String(parsedCweId);\n}\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.issueCommand = issueCommand;\nexports.issue = issue;\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\n/**\n * Issues a command to the GitHub Actions runner\n *\n * @param command - The command name to issue\n * @param properties - Additional properties for the command (key-value pairs)\n * @param message - The message to include with the command\n * @remarks\n * This function outputs a specially formatted string to stdout that the Actions\n * runner interprets as a command. These commands can control workflow behavior,\n * set outputs, create annotations, mask values, and more.\n *\n * Command Format:\n * ::name key=value,key=value::message\n *\n * @example\n * ```typescript\n * // Issue a warning annotation\n * issueCommand('warning', {}, 'This is a warning message');\n * // Output: ::warning::This is a warning message\n *\n * // Set an environment variable\n * issueCommand('set-env', { name: 'MY_VAR' }, 'some value');\n * // Output: ::set-env name=MY_VAR::some value\n *\n * // Add a secret mask\n * issueCommand('add-mask', {}, 'secretValue123');\n * // Output: ::add-mask::secretValue123\n * ```\n *\n * @internal\n * This is an internal utility function that powers the public API functions\n * such as setSecret, warning, error, and exportVariable.\n */\nfunction issueCommand(command, properties, message) {\n const cmd = new Command(command, properties, message);\n process.stdout.write(cmd.toString() + os.EOL);\n}\nfunction issue(name, message = '') {\n issueCommand(name, {}, message);\n}\nconst CMD_STRING = '::';\nclass Command {\n constructor(command, properties, message) {\n if (!command) {\n command = 'missing.command';\n }\n this.command = command;\n this.properties = properties;\n this.message = message;\n }\n toString() {\n let cmdStr = CMD_STRING + this.command;\n if (this.properties && Object.keys(this.properties).length > 0) {\n cmdStr += ' ';\n let first = true;\n for (const key in this.properties) {\n if (this.properties.hasOwnProperty(key)) {\n const val = this.properties[key];\n if (val) {\n if (first) {\n first = false;\n }\n else {\n cmdStr += ',';\n }\n cmdStr += `${key}=${escapeProperty(val)}`;\n }\n }\n }\n }\n cmdStr += `${CMD_STRING}${escapeData(this.message)}`;\n return cmdStr;\n }\n}\nfunction escapeData(s) {\n return (0, utils_1.toCommandValue)(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A');\n}\nfunction escapeProperty(s) {\n return (0, utils_1.toCommandValue)(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n//# sourceMappingURL=command.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.platform = exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = exports.markdownSummary = exports.summary = exports.ExitCode = void 0;\nexports.exportVariable = exportVariable;\nexports.setSecret = setSecret;\nexports.addPath = addPath;\nexports.getInput = getInput;\nexports.getMultilineInput = getMultilineInput;\nexports.getBooleanInput = getBooleanInput;\nexports.setOutput = setOutput;\nexports.setCommandEcho = setCommandEcho;\nexports.setFailed = setFailed;\nexports.isDebug = isDebug;\nexports.debug = debug;\nexports.error = error;\nexports.warning = warning;\nexports.notice = notice;\nexports.info = info;\nexports.startGroup = startGroup;\nexports.endGroup = endGroup;\nexports.group = group;\nexports.saveState = saveState;\nexports.getState = getState;\nexports.getIDToken = getIDToken;\nconst command_1 = require(\"./command\");\nconst file_command_1 = require(\"./file-command\");\nconst utils_1 = require(\"./utils\");\nconst os = __importStar(require(\"os\"));\nconst path = __importStar(require(\"path\"));\nconst oidc_utils_1 = require(\"./oidc-utils\");\n/**\n * The code to exit an action\n */\nvar ExitCode;\n(function (ExitCode) {\n /**\n * A code indicating that the action was successful\n */\n ExitCode[ExitCode[\"Success\"] = 0] = \"Success\";\n /**\n * A code indicating that the action was a failure\n */\n ExitCode[ExitCode[\"Failure\"] = 1] = \"Failure\";\n})(ExitCode || (exports.ExitCode = ExitCode = {}));\n//-----------------------------------------------------------------------\n// Variables\n//-----------------------------------------------------------------------\n/**\n * Sets env variable for this action and future actions in the job\n * @param name the name of the variable to set\n * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction exportVariable(name, val) {\n const convertedVal = (0, utils_1.toCommandValue)(val);\n process.env[name] = convertedVal;\n const filePath = process.env['GITHUB_ENV'] || '';\n if (filePath) {\n return (0, file_command_1.issueFileCommand)('ENV', (0, file_command_1.prepareKeyValueMessage)(name, val));\n }\n (0, command_1.issueCommand)('set-env', { name }, convertedVal);\n}\n/**\n * Registers a secret which will get masked from logs\n *\n * @param secret - Value of the secret to be masked\n * @remarks\n * This function instructs the Actions runner to mask the specified value in any\n * logs produced during the workflow run. Once registered, the secret value will\n * be replaced with asterisks (***) whenever it appears in console output, logs,\n * or error messages.\n *\n * This is useful for protecting sensitive information such as:\n * - API keys\n * - Access tokens\n * - Authentication credentials\n * - URL parameters containing signatures (SAS tokens)\n *\n * Note that masking only affects future logs; any previous appearances of the\n * secret in logs before calling this function will remain unmasked.\n *\n * @example\n * ```typescript\n * // Register an API token as a secret\n * const apiToken = \"abc123xyz456\";\n * setSecret(apiToken);\n *\n * // Now any logs containing this value will show *** instead\n * console.log(`Using token: ${apiToken}`); // Outputs: \"Using token: ***\"\n * ```\n */\nfunction setSecret(secret) {\n (0, command_1.issueCommand)('add-mask', {}, secret);\n}\n/**\n * Prepends inputPath to the PATH (for this action and future actions)\n * @param inputPath\n */\nfunction addPath(inputPath) {\n const filePath = process.env['GITHUB_PATH'] || '';\n if (filePath) {\n (0, file_command_1.issueFileCommand)('PATH', inputPath);\n }\n else {\n (0, command_1.issueCommand)('add-path', {}, inputPath);\n }\n process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;\n}\n/**\n * Gets the value of an input.\n * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.\n * Returns an empty string if the value is not defined.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string\n */\nfunction getInput(name, options) {\n const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';\n if (options && options.required && !val) {\n throw new Error(`Input required and not supplied: ${name}`);\n }\n if (options && options.trimWhitespace === false) {\n return val;\n }\n return val.trim();\n}\n/**\n * Gets the values of an multiline input. Each value is also trimmed.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string[]\n *\n */\nfunction getMultilineInput(name, options) {\n const inputs = getInput(name, options)\n .split('\\n')\n .filter(x => x !== '');\n if (options && options.trimWhitespace === false) {\n return inputs;\n }\n return inputs.map(input => input.trim());\n}\n/**\n * Gets the input value of the boolean type in the YAML 1.2 \"core schema\" specification.\n * Support boolean input list: `true | True | TRUE | false | False | FALSE` .\n * The return value is also in boolean type.\n * ref: https://yaml.org/spec/1.2/spec.html#id2804923\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns boolean\n */\nfunction getBooleanInput(name, options) {\n const trueValue = ['true', 'True', 'TRUE'];\n const falseValue = ['false', 'False', 'FALSE'];\n const val = getInput(name, options);\n if (trueValue.includes(val))\n return true;\n if (falseValue.includes(val))\n return false;\n throw new TypeError(`Input does not meet YAML 1.2 \"Core Schema\" specification: ${name}\\n` +\n `Support boolean input list: \\`true | True | TRUE | false | False | FALSE\\``);\n}\n/**\n * Sets the value of an output.\n *\n * @param name name of the output to set\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setOutput(name, value) {\n const filePath = process.env['GITHUB_OUTPUT'] || '';\n if (filePath) {\n return (0, file_command_1.issueFileCommand)('OUTPUT', (0, file_command_1.prepareKeyValueMessage)(name, value));\n }\n process.stdout.write(os.EOL);\n (0, command_1.issueCommand)('set-output', { name }, (0, utils_1.toCommandValue)(value));\n}\n/**\n * Enables or disables the echoing of commands into stdout for the rest of the step.\n * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.\n *\n */\nfunction setCommandEcho(enabled) {\n (0, command_1.issue)('echo', enabled ? 'on' : 'off');\n}\n//-----------------------------------------------------------------------\n// Results\n//-----------------------------------------------------------------------\n/**\n * Sets the action status to failed.\n * When the action exits it will be with an exit code of 1\n * @param message add error issue message\n */\nfunction setFailed(message) {\n process.exitCode = ExitCode.Failure;\n error(message);\n}\n//-----------------------------------------------------------------------\n// Logging Commands\n//-----------------------------------------------------------------------\n/**\n * Gets whether Actions Step Debug is on or not\n */\nfunction isDebug() {\n return process.env['RUNNER_DEBUG'] === '1';\n}\n/**\n * Writes debug message to user log\n * @param message debug message\n */\nfunction debug(message) {\n (0, command_1.issueCommand)('debug', {}, message);\n}\n/**\n * Adds an error issue\n * @param message error issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction error(message, properties = {}) {\n (0, command_1.issueCommand)('error', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);\n}\n/**\n * Adds a warning issue\n * @param message warning issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction warning(message, properties = {}) {\n (0, command_1.issueCommand)('warning', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);\n}\n/**\n * Adds a notice issue\n * @param message notice issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction notice(message, properties = {}) {\n (0, command_1.issueCommand)('notice', (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);\n}\n/**\n * Writes info to log with console.log.\n * @param message info message\n */\nfunction info(message) {\n process.stdout.write(message + os.EOL);\n}\n/**\n * Begin an output group.\n *\n * Output until the next `groupEnd` will be foldable in this group\n *\n * @param name The name of the output group\n */\nfunction startGroup(name) {\n (0, command_1.issue)('group', name);\n}\n/**\n * End an output group.\n */\nfunction endGroup() {\n (0, command_1.issue)('endgroup');\n}\n/**\n * Wrap an asynchronous function call in a group.\n *\n * Returns the same type as the function itself.\n *\n * @param name The name of the group\n * @param fn The function to wrap in the group\n */\nfunction group(name, fn) {\n return __awaiter(this, void 0, void 0, function* () {\n startGroup(name);\n let result;\n try {\n result = yield fn();\n }\n finally {\n endGroup();\n }\n return result;\n });\n}\n//-----------------------------------------------------------------------\n// Wrapper action state\n//-----------------------------------------------------------------------\n/**\n * Saves state for current action, the state can only be retrieved by this action's post job execution.\n *\n * @param name name of the state to store\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction saveState(name, value) {\n const filePath = process.env['GITHUB_STATE'] || '';\n if (filePath) {\n return (0, file_command_1.issueFileCommand)('STATE', (0, file_command_1.prepareKeyValueMessage)(name, value));\n }\n (0, command_1.issueCommand)('save-state', { name }, (0, utils_1.toCommandValue)(value));\n}\n/**\n * Gets the value of an state set by this action's main execution.\n *\n * @param name name of the state to get\n * @returns string\n */\nfunction getState(name) {\n return process.env[`STATE_${name}`] || '';\n}\nfunction getIDToken(aud) {\n return __awaiter(this, void 0, void 0, function* () {\n return yield oidc_utils_1.OidcClient.getIDToken(aud);\n });\n}\n/**\n * Summary exports\n */\nvar summary_1 = require(\"./summary\");\nObject.defineProperty(exports, \"summary\", { enumerable: true, get: function () { return summary_1.summary; } });\n/**\n * @deprecated use core.summary\n */\nvar summary_2 = require(\"./summary\");\nObject.defineProperty(exports, \"markdownSummary\", { enumerable: true, get: function () { return summary_2.markdownSummary; } });\n/**\n * Path exports\n */\nvar path_utils_1 = require(\"./path-utils\");\nObject.defineProperty(exports, \"toPosixPath\", { enumerable: true, get: function () { return path_utils_1.toPosixPath; } });\nObject.defineProperty(exports, \"toWin32Path\", { enumerable: true, get: function () { return path_utils_1.toWin32Path; } });\nObject.defineProperty(exports, \"toPlatformPath\", { enumerable: true, get: function () { return path_utils_1.toPlatformPath; } });\n/**\n * Platform utilities exports\n */\nexports.platform = __importStar(require(\"./platform\"));\n//# sourceMappingURL=core.js.map","\"use strict\";\n// For internal use, subject to change.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.issueFileCommand = issueFileCommand;\nexports.prepareKeyValueMessage = prepareKeyValueMessage;\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst crypto = __importStar(require(\"crypto\"));\nconst fs = __importStar(require(\"fs\"));\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\nfunction issueFileCommand(command, message) {\n const filePath = process.env[`GITHUB_${command}`];\n if (!filePath) {\n throw new Error(`Unable to find environment variable for file command ${command}`);\n }\n if (!fs.existsSync(filePath)) {\n throw new Error(`Missing file at path: ${filePath}`);\n }\n fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, {\n encoding: 'utf8'\n });\n}\nfunction prepareKeyValueMessage(key, value) {\n const delimiter = `ghadelimiter_${crypto.randomUUID()}`;\n const convertedValue = (0, utils_1.toCommandValue)(value);\n // These should realistically never happen, but just in case someone finds a\n // way to exploit uuid generation let's not allow keys or values that contain\n // the delimiter.\n if (key.includes(delimiter)) {\n throw new Error(`Unexpected input: name should not contain the delimiter \"${delimiter}\"`);\n }\n if (convertedValue.includes(delimiter)) {\n throw new Error(`Unexpected input: value should not contain the delimiter \"${delimiter}\"`);\n }\n return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;\n}\n//# sourceMappingURL=file-command.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OidcClient = void 0;\nconst http_client_1 = require(\"@actions/http-client\");\nconst auth_1 = require(\"@actions/http-client/lib/auth\");\nconst core_1 = require(\"./core\");\nclass OidcClient {\n static createHttpClient(allowRetry = true, maxRetry = 10) {\n const requestOptions = {\n allowRetries: allowRetry,\n maxRetries: maxRetry\n };\n return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions);\n }\n static getRequestToken() {\n const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'];\n if (!token) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable');\n }\n return token;\n }\n static getIDTokenUrl() {\n const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL'];\n if (!runtimeUrl) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable');\n }\n return runtimeUrl;\n }\n static getCall(id_token_url) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const httpclient = OidcClient.createHttpClient();\n const res = yield httpclient\n .getJson(id_token_url)\n .catch(error => {\n throw new Error(`Failed to get ID Token. \\n \n Error Code : ${error.statusCode}\\n \n Error Message: ${error.message}`);\n });\n const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;\n if (!id_token) {\n throw new Error('Response json body do not have ID Token field');\n }\n return id_token;\n });\n }\n static getIDToken(audience) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n // New ID Token is requested from action service\n let id_token_url = OidcClient.getIDTokenUrl();\n if (audience) {\n const encodedAudience = encodeURIComponent(audience);\n id_token_url = `${id_token_url}&audience=${encodedAudience}`;\n }\n (0, core_1.debug)(`ID token url is ${id_token_url}`);\n const id_token = yield OidcClient.getCall(id_token_url);\n (0, core_1.setSecret)(id_token);\n return id_token;\n }\n catch (error) {\n throw new Error(`Error message: ${error.message}`);\n }\n });\n }\n}\nexports.OidcClient = OidcClient;\n//# sourceMappingURL=oidc-utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toPosixPath = toPosixPath;\nexports.toWin32Path = toWin32Path;\nexports.toPlatformPath = toPlatformPath;\nconst path = __importStar(require(\"path\"));\n/**\n * toPosixPath converts the given path to the posix form. On Windows, \\\\ will be\n * replaced with /.\n *\n * @param pth. Path to transform.\n * @return string Posix path.\n */\nfunction toPosixPath(pth) {\n return pth.replace(/[\\\\]/g, '/');\n}\n/**\n * toWin32Path converts the given path to the win32 form. On Linux, / will be\n * replaced with \\\\.\n *\n * @param pth. Path to transform.\n * @return string Win32 path.\n */\nfunction toWin32Path(pth) {\n return pth.replace(/[/]/g, '\\\\');\n}\n/**\n * toPlatformPath converts the given path to a platform-specific path. It does\n * this by replacing instances of / and \\ with the platform-specific path\n * separator.\n *\n * @param pth The path to platformize.\n * @return string The platform-specific path.\n */\nfunction toPlatformPath(pth) {\n return pth.replace(/[/\\\\]/g, path.sep);\n}\n//# sourceMappingURL=path-utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isLinux = exports.isMacOS = exports.isWindows = exports.arch = exports.platform = void 0;\nexports.getDetails = getDetails;\nconst os_1 = __importDefault(require(\"os\"));\nconst exec = __importStar(require(\"@actions/exec\"));\nconst getWindowsInfo = () => __awaiter(void 0, void 0, void 0, function* () {\n const { stdout: version } = yield exec.getExecOutput('powershell -command \"(Get-CimInstance -ClassName Win32_OperatingSystem).Version\"', undefined, {\n silent: true\n });\n const { stdout: name } = yield exec.getExecOutput('powershell -command \"(Get-CimInstance -ClassName Win32_OperatingSystem).Caption\"', undefined, {\n silent: true\n });\n return {\n name: name.trim(),\n version: version.trim()\n };\n});\nconst getMacOsInfo = () => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b, _c, _d;\n const { stdout } = yield exec.getExecOutput('sw_vers', undefined, {\n silent: true\n });\n const version = (_b = (_a = stdout.match(/ProductVersion:\\s*(.+)/)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : '';\n const name = (_d = (_c = stdout.match(/ProductName:\\s*(.+)/)) === null || _c === void 0 ? void 0 : _c[1]) !== null && _d !== void 0 ? _d : '';\n return {\n name,\n version\n };\n});\nconst getLinuxInfo = () => __awaiter(void 0, void 0, void 0, function* () {\n const { stdout } = yield exec.getExecOutput('lsb_release', ['-i', '-r', '-s'], {\n silent: true\n });\n const [name, version] = stdout.trim().split('\\n');\n return {\n name,\n version\n };\n});\nexports.platform = os_1.default.platform();\nexports.arch = os_1.default.arch();\nexports.isWindows = exports.platform === 'win32';\nexports.isMacOS = exports.platform === 'darwin';\nexports.isLinux = exports.platform === 'linux';\nfunction getDetails() {\n return __awaiter(this, void 0, void 0, function* () {\n return Object.assign(Object.assign({}, (yield (exports.isWindows\n ? getWindowsInfo()\n : exports.isMacOS\n ? getMacOsInfo()\n : getLinuxInfo()))), { platform: exports.platform,\n arch: exports.arch,\n isWindows: exports.isWindows,\n isMacOS: exports.isMacOS,\n isLinux: exports.isLinux });\n });\n}\n//# sourceMappingURL=platform.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0;\nconst os_1 = require(\"os\");\nconst fs_1 = require(\"fs\");\nconst { access, appendFile, writeFile } = fs_1.promises;\nexports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY';\nexports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary';\nclass Summary {\n constructor() {\n this._buffer = '';\n }\n /**\n * Finds the summary file path from the environment, rejects if env var is not found or file does not exist\n * Also checks r/w permissions.\n *\n * @returns step summary file path\n */\n filePath() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._filePath) {\n return this._filePath;\n }\n const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR];\n if (!pathFromEnv) {\n throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`);\n }\n try {\n yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK);\n }\n catch (_a) {\n throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`);\n }\n this._filePath = pathFromEnv;\n return this._filePath;\n });\n }\n /**\n * Wraps content in an HTML tag, adding any HTML attributes\n *\n * @param {string} tag HTML tag to wrap\n * @param {string | null} content content within the tag\n * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add\n *\n * @returns {string} content wrapped in HTML element\n */\n wrap(tag, content, attrs = {}) {\n const htmlAttrs = Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${value}\"`)\n .join('');\n if (!content) {\n return `<${tag}${htmlAttrs}>`;\n }\n return `<${tag}${htmlAttrs}>${content}`;\n }\n /**\n * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default.\n *\n * @param {SummaryWriteOptions} [options] (optional) options for write operation\n *\n * @returns {Promise} summary instance\n */\n write(options) {\n return __awaiter(this, void 0, void 0, function* () {\n const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite);\n const filePath = yield this.filePath();\n const writeFunc = overwrite ? writeFile : appendFile;\n yield writeFunc(filePath, this._buffer, { encoding: 'utf8' });\n return this.emptyBuffer();\n });\n }\n /**\n * Clears the summary buffer and wipes the summary file\n *\n * @returns {Summary} summary instance\n */\n clear() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.emptyBuffer().write({ overwrite: true });\n });\n }\n /**\n * Returns the current summary buffer as a string\n *\n * @returns {string} string of summary buffer\n */\n stringify() {\n return this._buffer;\n }\n /**\n * If the summary buffer is empty\n *\n * @returns {boolen} true if the buffer is empty\n */\n isEmptyBuffer() {\n return this._buffer.length === 0;\n }\n /**\n * Resets the summary buffer without writing to summary file\n *\n * @returns {Summary} summary instance\n */\n emptyBuffer() {\n this._buffer = '';\n return this;\n }\n /**\n * Adds raw text to the summary buffer\n *\n * @param {string} text content to add\n * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false)\n *\n * @returns {Summary} summary instance\n */\n addRaw(text, addEOL = false) {\n this._buffer += text;\n return addEOL ? this.addEOL() : this;\n }\n /**\n * Adds the operating system-specific end-of-line marker to the buffer\n *\n * @returns {Summary} summary instance\n */\n addEOL() {\n return this.addRaw(os_1.EOL);\n }\n /**\n * Adds an HTML codeblock to the summary buffer\n *\n * @param {string} code content to render within fenced code block\n * @param {string} lang (optional) language to syntax highlight code\n *\n * @returns {Summary} summary instance\n */\n addCodeBlock(code, lang) {\n const attrs = Object.assign({}, (lang && { lang }));\n const element = this.wrap('pre', this.wrap('code', code), attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML list to the summary buffer\n *\n * @param {string[]} items list of items to render\n * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false)\n *\n * @returns {Summary} summary instance\n */\n addList(items, ordered = false) {\n const tag = ordered ? 'ol' : 'ul';\n const listItems = items.map(item => this.wrap('li', item)).join('');\n const element = this.wrap(tag, listItems);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML table to the summary buffer\n *\n * @param {SummaryTableCell[]} rows table rows\n *\n * @returns {Summary} summary instance\n */\n addTable(rows) {\n const tableBody = rows\n .map(row => {\n const cells = row\n .map(cell => {\n if (typeof cell === 'string') {\n return this.wrap('td', cell);\n }\n const { header, data, colspan, rowspan } = cell;\n const tag = header ? 'th' : 'td';\n const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan }));\n return this.wrap(tag, data, attrs);\n })\n .join('');\n return this.wrap('tr', cells);\n })\n .join('');\n const element = this.wrap('table', tableBody);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds a collapsable HTML details element to the summary buffer\n *\n * @param {string} label text for the closed state\n * @param {string} content collapsable content\n *\n * @returns {Summary} summary instance\n */\n addDetails(label, content) {\n const element = this.wrap('details', this.wrap('summary', label) + content);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML image tag to the summary buffer\n *\n * @param {string} src path to the image you to embed\n * @param {string} alt text description of the image\n * @param {SummaryImageOptions} options (optional) addition image attributes\n *\n * @returns {Summary} summary instance\n */\n addImage(src, alt, options) {\n const { width, height } = options || {};\n const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height }));\n const element = this.wrap('img', null, Object.assign({ src, alt }, attrs));\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML section heading element\n *\n * @param {string} text heading text\n * @param {number | string} [level=1] (optional) the heading level, default: 1\n *\n * @returns {Summary} summary instance\n */\n addHeading(text, level) {\n const tag = `h${level}`;\n const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag)\n ? tag\n : 'h1';\n const element = this.wrap(allowedTag, text);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML thematic break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addSeparator() {\n const element = this.wrap('hr', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML line break (
) to the summary buffer\n *\n * @returns {Summary} summary instance\n */\n addBreak() {\n const element = this.wrap('br', null);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML blockquote to the summary buffer\n *\n * @param {string} text quote text\n * @param {string} cite (optional) citation url\n *\n * @returns {Summary} summary instance\n */\n addQuote(text, cite) {\n const attrs = Object.assign({}, (cite && { cite }));\n const element = this.wrap('blockquote', text, attrs);\n return this.addRaw(element).addEOL();\n }\n /**\n * Adds an HTML anchor tag to the summary buffer\n *\n * @param {string} text link text/content\n * @param {string} href hyperlink\n *\n * @returns {Summary} summary instance\n */\n addLink(text, href) {\n const element = this.wrap('a', text, { href });\n return this.addRaw(element).addEOL();\n }\n}\nconst _summary = new Summary();\n/**\n * @deprecated use `core.summary`\n */\nexports.markdownSummary = _summary;\nexports.summary = _summary;\n//# sourceMappingURL=summary.js.map","\"use strict\";\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toCommandValue = toCommandValue;\nexports.toCommandProperties = toCommandProperties;\n/**\n * Sanitizes an input into a string so it can be passed into issueCommand safely\n * @param input input to sanitize into a string\n */\nfunction toCommandValue(input) {\n if (input === null || input === undefined) {\n return '';\n }\n else if (typeof input === 'string' || input instanceof String) {\n return input;\n }\n return JSON.stringify(input);\n}\n/**\n *\n * @param annotationProperties\n * @returns The command properties to send with the actual annotation command\n * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646\n */\nfunction toCommandProperties(annotationProperties) {\n if (!Object.keys(annotationProperties).length) {\n return {};\n }\n return {\n title: annotationProperties.title,\n file: annotationProperties.file,\n line: annotationProperties.startLine,\n endLine: annotationProperties.endLine,\n col: annotationProperties.startColumn,\n endColumn: annotationProperties.endColumn\n };\n}\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.exec = exec;\nexports.getExecOutput = getExecOutput;\nconst string_decoder_1 = require(\"string_decoder\");\nconst tr = __importStar(require(\"./toolrunner\"));\n/**\n * Exec a command.\n * Output will be streamed to the live console.\n * Returns promise with return code\n *\n * @param commandLine command to execute (can include additional args). Must be correctly escaped.\n * @param args optional arguments for tool. Escaping is handled by the lib.\n * @param options optional exec options. See ExecOptions\n * @returns Promise exit code\n */\nfunction exec(commandLine, args, options) {\n return __awaiter(this, void 0, void 0, function* () {\n const commandArgs = tr.argStringToArray(commandLine);\n if (commandArgs.length === 0) {\n throw new Error(`Parameter 'commandLine' cannot be null or empty.`);\n }\n // Path to tool to execute should be first arg\n const toolPath = commandArgs[0];\n args = commandArgs.slice(1).concat(args || []);\n const runner = new tr.ToolRunner(toolPath, args, options);\n return runner.exec();\n });\n}\n/**\n * Exec a command and get the output.\n * Output will be streamed to the live console.\n * Returns promise with the exit code and collected stdout and stderr\n *\n * @param commandLine command to execute (can include additional args). Must be correctly escaped.\n * @param args optional arguments for tool. Escaping is handled by the lib.\n * @param options optional exec options. See ExecOptions\n * @returns Promise exit code, stdout, and stderr\n */\nfunction getExecOutput(commandLine, args, options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n let stdout = '';\n let stderr = '';\n //Using string decoder covers the case where a mult-byte character is split\n const stdoutDecoder = new string_decoder_1.StringDecoder('utf8');\n const stderrDecoder = new string_decoder_1.StringDecoder('utf8');\n const originalStdoutListener = (_a = options === null || options === void 0 ? void 0 : options.listeners) === null || _a === void 0 ? void 0 : _a.stdout;\n const originalStdErrListener = (_b = options === null || options === void 0 ? void 0 : options.listeners) === null || _b === void 0 ? void 0 : _b.stderr;\n const stdErrListener = (data) => {\n stderr += stderrDecoder.write(data);\n if (originalStdErrListener) {\n originalStdErrListener(data);\n }\n };\n const stdOutListener = (data) => {\n stdout += stdoutDecoder.write(data);\n if (originalStdoutListener) {\n originalStdoutListener(data);\n }\n };\n const listeners = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.listeners), { stdout: stdOutListener, stderr: stdErrListener });\n const exitCode = yield exec(commandLine, args, Object.assign(Object.assign({}, options), { listeners }));\n //flush any remaining characters\n stdout += stdoutDecoder.end();\n stderr += stderrDecoder.end();\n return {\n exitCode,\n stdout,\n stderr\n };\n });\n}\n//# sourceMappingURL=exec.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ToolRunner = void 0;\nexports.argStringToArray = argStringToArray;\nconst os = __importStar(require(\"os\"));\nconst events = __importStar(require(\"events\"));\nconst child = __importStar(require(\"child_process\"));\nconst path = __importStar(require(\"path\"));\nconst io = __importStar(require(\"@actions/io\"));\nconst ioUtil = __importStar(require(\"@actions/io/lib/io-util\"));\nconst timers_1 = require(\"timers\");\n/* eslint-disable @typescript-eslint/unbound-method */\nconst IS_WINDOWS = process.platform === 'win32';\n/*\n * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way.\n */\nclass ToolRunner extends events.EventEmitter {\n constructor(toolPath, args, options) {\n super();\n if (!toolPath) {\n throw new Error(\"Parameter 'toolPath' cannot be null or empty.\");\n }\n this.toolPath = toolPath;\n this.args = args || [];\n this.options = options || {};\n }\n _debug(message) {\n if (this.options.listeners && this.options.listeners.debug) {\n this.options.listeners.debug(message);\n }\n }\n _getCommandString(options, noPrefix) {\n const toolPath = this._getSpawnFileName();\n const args = this._getSpawnArgs(options);\n let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool\n if (IS_WINDOWS) {\n // Windows + cmd file\n if (this._isCmdFile()) {\n cmd += toolPath;\n for (const a of args) {\n cmd += ` ${a}`;\n }\n }\n // Windows + verbatim\n else if (options.windowsVerbatimArguments) {\n cmd += `\"${toolPath}\"`;\n for (const a of args) {\n cmd += ` ${a}`;\n }\n }\n // Windows (regular)\n else {\n cmd += this._windowsQuoteCmdArg(toolPath);\n for (const a of args) {\n cmd += ` ${this._windowsQuoteCmdArg(a)}`;\n }\n }\n }\n else {\n // OSX/Linux - this can likely be improved with some form of quoting.\n // creating processes on Unix is fundamentally different than Windows.\n // on Unix, execvp() takes an arg array.\n cmd += toolPath;\n for (const a of args) {\n cmd += ` ${a}`;\n }\n }\n return cmd;\n }\n _processLineBuffer(data, strBuffer, onLine) {\n try {\n let s = strBuffer + data.toString();\n let n = s.indexOf(os.EOL);\n while (n > -1) {\n const line = s.substring(0, n);\n onLine(line);\n // the rest of the string ...\n s = s.substring(n + os.EOL.length);\n n = s.indexOf(os.EOL);\n }\n return s;\n }\n catch (err) {\n // streaming lines to console is best effort. Don't fail a build.\n this._debug(`error processing line. Failed with error ${err}`);\n return '';\n }\n }\n _getSpawnFileName() {\n if (IS_WINDOWS) {\n if (this._isCmdFile()) {\n return process.env['COMSPEC'] || 'cmd.exe';\n }\n }\n return this.toolPath;\n }\n _getSpawnArgs(options) {\n if (IS_WINDOWS) {\n if (this._isCmdFile()) {\n let argline = `/D /S /C \"${this._windowsQuoteCmdArg(this.toolPath)}`;\n for (const a of this.args) {\n argline += ' ';\n argline += options.windowsVerbatimArguments\n ? a\n : this._windowsQuoteCmdArg(a);\n }\n argline += '\"';\n return [argline];\n }\n }\n return this.args;\n }\n _endsWith(str, end) {\n return str.endsWith(end);\n }\n _isCmdFile() {\n const upperToolPath = this.toolPath.toUpperCase();\n return (this._endsWith(upperToolPath, '.CMD') ||\n this._endsWith(upperToolPath, '.BAT'));\n }\n _windowsQuoteCmdArg(arg) {\n // for .exe, apply the normal quoting rules that libuv applies\n if (!this._isCmdFile()) {\n return this._uvQuoteCmdArg(arg);\n }\n // otherwise apply quoting rules specific to the cmd.exe command line parser.\n // the libuv rules are generic and are not designed specifically for cmd.exe\n // command line parser.\n //\n // for a detailed description of the cmd.exe command line parser, refer to\n // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912\n // need quotes for empty arg\n if (!arg) {\n return '\"\"';\n }\n // determine whether the arg needs to be quoted\n const cmdSpecialChars = [\n ' ',\n '\\t',\n '&',\n '(',\n ')',\n '[',\n ']',\n '{',\n '}',\n '^',\n '=',\n ';',\n '!',\n \"'\",\n '+',\n ',',\n '`',\n '~',\n '|',\n '<',\n '>',\n '\"'\n ];\n let needsQuotes = false;\n for (const char of arg) {\n if (cmdSpecialChars.some(x => x === char)) {\n needsQuotes = true;\n break;\n }\n }\n // short-circuit if quotes not needed\n if (!needsQuotes) {\n return arg;\n }\n // the following quoting rules are very similar to the rules that by libuv applies.\n //\n // 1) wrap the string in quotes\n //\n // 2) double-up quotes - i.e. \" => \"\"\n //\n // this is different from the libuv quoting rules. libuv replaces \" with \\\", which unfortunately\n // doesn't work well with a cmd.exe command line.\n //\n // note, replacing \" with \"\" also works well if the arg is passed to a downstream .NET console app.\n // for example, the command line:\n // foo.exe \"myarg:\"\"my val\"\"\"\n // is parsed by a .NET console app into an arg array:\n // [ \"myarg:\\\"my val\\\"\" ]\n // which is the same end result when applying libuv quoting rules. although the actual\n // command line from libuv quoting rules would look like:\n // foo.exe \"myarg:\\\"my val\\\"\"\n //\n // 3) double-up slashes that precede a quote,\n // e.g. hello \\world => \"hello \\world\"\n // hello\\\"world => \"hello\\\\\"\"world\"\n // hello\\\\\"world => \"hello\\\\\\\\\"\"world\"\n // hello world\\ => \"hello world\\\\\"\n //\n // technically this is not required for a cmd.exe command line, or the batch argument parser.\n // the reasons for including this as a .cmd quoting rule are:\n //\n // a) this is optimized for the scenario where the argument is passed from the .cmd file to an\n // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule.\n //\n // b) it's what we've been doing previously (by deferring to node default behavior) and we\n // haven't heard any complaints about that aspect.\n //\n // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be\n // escaped when used on the command line directly - even though within a .cmd file % can be escaped\n // by using %%.\n //\n // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts\n // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing.\n //\n // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would\n // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the\n // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args\n // to an external program.\n //\n // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file.\n // % can be escaped within a .cmd file.\n let reverse = '\"';\n let quoteHit = true;\n for (let i = arg.length; i > 0; i--) {\n // walk the string in reverse\n reverse += arg[i - 1];\n if (quoteHit && arg[i - 1] === '\\\\') {\n reverse += '\\\\'; // double the slash\n }\n else if (arg[i - 1] === '\"') {\n quoteHit = true;\n reverse += '\"'; // double the quote\n }\n else {\n quoteHit = false;\n }\n }\n reverse += '\"';\n return reverse.split('').reverse().join('');\n }\n _uvQuoteCmdArg(arg) {\n // Tool runner wraps child_process.spawn() and needs to apply the same quoting as\n // Node in certain cases where the undocumented spawn option windowsVerbatimArguments\n // is used.\n //\n // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV,\n // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details),\n // pasting copyright notice from Node within this function:\n //\n // Copyright Joyent, Inc. and other Node contributors. All rights reserved.\n //\n // Permission is hereby granted, free of charge, to any person obtaining a copy\n // of this software and associated documentation files (the \"Software\"), to\n // deal in the Software without restriction, including without limitation the\n // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n // sell copies of the Software, and to permit persons to whom the Software is\n // furnished to do so, subject to the following conditions:\n //\n // The above copyright notice and this permission notice shall be included in\n // all copies or substantial portions of the Software.\n //\n // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n // IN THE SOFTWARE.\n if (!arg) {\n // Need double quotation for empty argument\n return '\"\"';\n }\n if (!arg.includes(' ') && !arg.includes('\\t') && !arg.includes('\"')) {\n // No quotation needed\n return arg;\n }\n if (!arg.includes('\"') && !arg.includes('\\\\')) {\n // No embedded double quotes or backslashes, so I can just wrap\n // quote marks around the whole thing.\n return `\"${arg}\"`;\n }\n // Expected input/output:\n // input : hello\"world\n // output: \"hello\\\"world\"\n // input : hello\"\"world\n // output: \"hello\\\"\\\"world\"\n // input : hello\\world\n // output: hello\\world\n // input : hello\\\\world\n // output: hello\\\\world\n // input : hello\\\"world\n // output: \"hello\\\\\\\"world\"\n // input : hello\\\\\"world\n // output: \"hello\\\\\\\\\\\"world\"\n // input : hello world\\\n // output: \"hello world\\\\\" - note the comment in libuv actually reads \"hello world\\\"\n // but it appears the comment is wrong, it should be \"hello world\\\\\"\n let reverse = '\"';\n let quoteHit = true;\n for (let i = arg.length; i > 0; i--) {\n // walk the string in reverse\n reverse += arg[i - 1];\n if (quoteHit && arg[i - 1] === '\\\\') {\n reverse += '\\\\';\n }\n else if (arg[i - 1] === '\"') {\n quoteHit = true;\n reverse += '\\\\';\n }\n else {\n quoteHit = false;\n }\n }\n reverse += '\"';\n return reverse.split('').reverse().join('');\n }\n _cloneExecOptions(options) {\n options = options || {};\n const result = {\n cwd: options.cwd || process.cwd(),\n env: options.env || process.env,\n silent: options.silent || false,\n windowsVerbatimArguments: options.windowsVerbatimArguments || false,\n failOnStdErr: options.failOnStdErr || false,\n ignoreReturnCode: options.ignoreReturnCode || false,\n delay: options.delay || 10000\n };\n result.outStream = options.outStream || process.stdout;\n result.errStream = options.errStream || process.stderr;\n return result;\n }\n _getSpawnOptions(options, toolPath) {\n options = options || {};\n const result = {};\n result.cwd = options.cwd;\n result.env = options.env;\n result['windowsVerbatimArguments'] =\n options.windowsVerbatimArguments || this._isCmdFile();\n if (options.windowsVerbatimArguments) {\n result.argv0 = `\"${toolPath}\"`;\n }\n return result;\n }\n /**\n * Exec a tool.\n * Output will be streamed to the live console.\n * Returns promise with return code\n *\n * @param tool path to tool to exec\n * @param options optional exec options. See ExecOptions\n * @returns number\n */\n exec() {\n return __awaiter(this, void 0, void 0, function* () {\n // root the tool path if it is unrooted and contains relative pathing\n if (!ioUtil.isRooted(this.toolPath) &&\n (this.toolPath.includes('/') ||\n (IS_WINDOWS && this.toolPath.includes('\\\\')))) {\n // prefer options.cwd if it is specified, however options.cwd may also need to be rooted\n this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath);\n }\n // if the tool is only a file name, then resolve it from the PATH\n // otherwise verify it exists (add extension on Windows if necessary)\n this.toolPath = yield io.which(this.toolPath, true);\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n this._debug(`exec tool: ${this.toolPath}`);\n this._debug('arguments:');\n for (const arg of this.args) {\n this._debug(` ${arg}`);\n }\n const optionsNonNull = this._cloneExecOptions(this.options);\n if (!optionsNonNull.silent && optionsNonNull.outStream) {\n optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL);\n }\n const state = new ExecState(optionsNonNull, this.toolPath);\n state.on('debug', (message) => {\n this._debug(message);\n });\n if (this.options.cwd && !(yield ioUtil.exists(this.options.cwd))) {\n return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`));\n }\n const fileName = this._getSpawnFileName();\n const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName));\n let stdbuffer = '';\n if (cp.stdout) {\n cp.stdout.on('data', (data) => {\n if (this.options.listeners && this.options.listeners.stdout) {\n this.options.listeners.stdout(data);\n }\n if (!optionsNonNull.silent && optionsNonNull.outStream) {\n optionsNonNull.outStream.write(data);\n }\n stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => {\n if (this.options.listeners && this.options.listeners.stdline) {\n this.options.listeners.stdline(line);\n }\n });\n });\n }\n let errbuffer = '';\n if (cp.stderr) {\n cp.stderr.on('data', (data) => {\n state.processStderr = true;\n if (this.options.listeners && this.options.listeners.stderr) {\n this.options.listeners.stderr(data);\n }\n if (!optionsNonNull.silent &&\n optionsNonNull.errStream &&\n optionsNonNull.outStream) {\n const s = optionsNonNull.failOnStdErr\n ? optionsNonNull.errStream\n : optionsNonNull.outStream;\n s.write(data);\n }\n errbuffer = this._processLineBuffer(data, errbuffer, (line) => {\n if (this.options.listeners && this.options.listeners.errline) {\n this.options.listeners.errline(line);\n }\n });\n });\n }\n cp.on('error', (err) => {\n state.processError = err.message;\n state.processExited = true;\n state.processClosed = true;\n state.CheckComplete();\n });\n cp.on('exit', (code) => {\n state.processExitCode = code;\n state.processExited = true;\n this._debug(`Exit code ${code} received from tool '${this.toolPath}'`);\n state.CheckComplete();\n });\n cp.on('close', (code) => {\n state.processExitCode = code;\n state.processExited = true;\n state.processClosed = true;\n this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);\n state.CheckComplete();\n });\n state.on('done', (error, exitCode) => {\n if (stdbuffer.length > 0) {\n this.emit('stdline', stdbuffer);\n }\n if (errbuffer.length > 0) {\n this.emit('errline', errbuffer);\n }\n cp.removeAllListeners();\n if (error) {\n reject(error);\n }\n else {\n resolve(exitCode);\n }\n });\n if (this.options.input) {\n if (!cp.stdin) {\n throw new Error('child process missing stdin');\n }\n cp.stdin.end(this.options.input);\n }\n }));\n });\n }\n}\nexports.ToolRunner = ToolRunner;\n/**\n * Convert an arg string to an array of args. Handles escaping\n *\n * @param argString string of arguments\n * @returns string[] array of arguments\n */\nfunction argStringToArray(argString) {\n const args = [];\n let inQuotes = false;\n let escaped = false;\n let arg = '';\n function append(c) {\n // we only escape double quotes.\n if (escaped && c !== '\"') {\n arg += '\\\\';\n }\n arg += c;\n escaped = false;\n }\n for (let i = 0; i < argString.length; i++) {\n const c = argString.charAt(i);\n if (c === '\"') {\n if (!escaped) {\n inQuotes = !inQuotes;\n }\n else {\n append(c);\n }\n continue;\n }\n if (c === '\\\\' && escaped) {\n append(c);\n continue;\n }\n if (c === '\\\\' && inQuotes) {\n escaped = true;\n continue;\n }\n if (c === ' ' && !inQuotes) {\n if (arg.length > 0) {\n args.push(arg);\n arg = '';\n }\n continue;\n }\n append(c);\n }\n if (arg.length > 0) {\n args.push(arg.trim());\n }\n return args;\n}\nclass ExecState extends events.EventEmitter {\n constructor(options, toolPath) {\n super();\n this.processClosed = false; // tracks whether the process has exited and stdio is closed\n this.processError = '';\n this.processExitCode = 0;\n this.processExited = false; // tracks whether the process has exited\n this.processStderr = false; // tracks whether stderr was written to\n this.delay = 10000; // 10 seconds\n this.done = false;\n this.timeout = null;\n if (!toolPath) {\n throw new Error('toolPath must not be empty');\n }\n this.options = options;\n this.toolPath = toolPath;\n if (options.delay) {\n this.delay = options.delay;\n }\n }\n CheckComplete() {\n if (this.done) {\n return;\n }\n if (this.processClosed) {\n this._setResult();\n }\n else if (this.processExited) {\n this.timeout = (0, timers_1.setTimeout)(ExecState.HandleTimeout, this.delay, this);\n }\n }\n _debug(message) {\n this.emit('debug', message);\n }\n _setResult() {\n // determine whether there is an error\n let error;\n if (this.processExited) {\n if (this.processError) {\n error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`);\n }\n else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) {\n error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`);\n }\n else if (this.processStderr && this.options.failOnStdErr) {\n error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`);\n }\n }\n // clear the timeout\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n this.done = true;\n this.emit('done', error, this.processExitCode);\n }\n static HandleTimeout(state) {\n if (state.done) {\n return;\n }\n if (!state.processClosed && state.processExited) {\n const message = `The STDIO streams did not close within ${state.delay / 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;\n state._debug(message);\n }\n state._setResult();\n }\n}\n//# sourceMappingURL=toolrunner.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0;\nclass BasicCredentialHandler {\n constructor(username, password) {\n this.username = username;\n this.password = password;\n }\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BasicCredentialHandler = BasicCredentialHandler;\nclass BearerCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Bearer ${this.token}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.BearerCredentialHandler = BearerCredentialHandler;\nclass PersonalAccessTokenCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n if (!options.headers) {\n throw Error('The request has no headers');\n }\n options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`;\n }\n // This handler cannot handle 401\n canHandleAuthentication() {\n return false;\n }\n handleAuthentication() {\n return __awaiter(this, void 0, void 0, function* () {\n throw new Error('not implemented');\n });\n }\n}\nexports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;\n//# sourceMappingURL=auth.js.map","\"use strict\";\n/* eslint-disable @typescript-eslint/no-explicit-any */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpClient = exports.HttpClientResponse = exports.HttpClientError = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0;\nexports.getProxyUrl = getProxyUrl;\nexports.isHttps = isHttps;\nconst http = __importStar(require(\"http\"));\nconst https = __importStar(require(\"https\"));\nconst pm = __importStar(require(\"./proxy\"));\nconst tunnel = __importStar(require(\"tunnel\"));\nconst undici_1 = require(\"undici\");\nvar HttpCodes;\n(function (HttpCodes) {\n HttpCodes[HttpCodes[\"OK\"] = 200] = \"OK\";\n HttpCodes[HttpCodes[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n HttpCodes[HttpCodes[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n HttpCodes[HttpCodes[\"ResourceMoved\"] = 302] = \"ResourceMoved\";\n HttpCodes[HttpCodes[\"SeeOther\"] = 303] = \"SeeOther\";\n HttpCodes[HttpCodes[\"NotModified\"] = 304] = \"NotModified\";\n HttpCodes[HttpCodes[\"UseProxy\"] = 305] = \"UseProxy\";\n HttpCodes[HttpCodes[\"SwitchProxy\"] = 306] = \"SwitchProxy\";\n HttpCodes[HttpCodes[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n HttpCodes[HttpCodes[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n HttpCodes[HttpCodes[\"BadRequest\"] = 400] = \"BadRequest\";\n HttpCodes[HttpCodes[\"Unauthorized\"] = 401] = \"Unauthorized\";\n HttpCodes[HttpCodes[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n HttpCodes[HttpCodes[\"Forbidden\"] = 403] = \"Forbidden\";\n HttpCodes[HttpCodes[\"NotFound\"] = 404] = \"NotFound\";\n HttpCodes[HttpCodes[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n HttpCodes[HttpCodes[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n HttpCodes[HttpCodes[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n HttpCodes[HttpCodes[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n HttpCodes[HttpCodes[\"Conflict\"] = 409] = \"Conflict\";\n HttpCodes[HttpCodes[\"Gone\"] = 410] = \"Gone\";\n HttpCodes[HttpCodes[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n HttpCodes[HttpCodes[\"InternalServerError\"] = 500] = \"InternalServerError\";\n HttpCodes[HttpCodes[\"NotImplemented\"] = 501] = \"NotImplemented\";\n HttpCodes[HttpCodes[\"BadGateway\"] = 502] = \"BadGateway\";\n HttpCodes[HttpCodes[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n HttpCodes[HttpCodes[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n})(HttpCodes || (exports.HttpCodes = HttpCodes = {}));\nvar Headers;\n(function (Headers) {\n Headers[\"Accept\"] = \"accept\";\n Headers[\"ContentType\"] = \"content-type\";\n})(Headers || (exports.Headers = Headers = {}));\nvar MediaTypes;\n(function (MediaTypes) {\n MediaTypes[\"ApplicationJson\"] = \"application/json\";\n})(MediaTypes || (exports.MediaTypes = MediaTypes = {}));\n/**\n * Returns the proxy URL, depending upon the supplied url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\nfunction getProxyUrl(serverUrl) {\n const proxyUrl = pm.getProxyUrl(new URL(serverUrl));\n return proxyUrl ? proxyUrl.href : '';\n}\nconst HttpRedirectCodes = [\n HttpCodes.MovedPermanently,\n HttpCodes.ResourceMoved,\n HttpCodes.SeeOther,\n HttpCodes.TemporaryRedirect,\n HttpCodes.PermanentRedirect\n];\nconst HttpResponseRetryCodes = [\n HttpCodes.BadGateway,\n HttpCodes.ServiceUnavailable,\n HttpCodes.GatewayTimeout\n];\nconst RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];\nconst ExponentialBackoffCeiling = 10;\nconst ExponentialBackoffTimeSlice = 5;\nclass HttpClientError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.name = 'HttpClientError';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, HttpClientError.prototype);\n }\n}\nexports.HttpClientError = HttpClientError;\nclass HttpClientResponse {\n constructor(message) {\n this.message = message;\n }\n readBody() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n let output = Buffer.alloc(0);\n this.message.on('data', (chunk) => {\n output = Buffer.concat([output, chunk]);\n });\n this.message.on('end', () => {\n resolve(output.toString());\n });\n }));\n });\n }\n readBodyBuffer() {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\n const chunks = [];\n this.message.on('data', (chunk) => {\n chunks.push(chunk);\n });\n this.message.on('end', () => {\n resolve(Buffer.concat(chunks));\n });\n }));\n });\n }\n}\nexports.HttpClientResponse = HttpClientResponse;\nfunction isHttps(requestUrl) {\n const parsedUrl = new URL(requestUrl);\n return parsedUrl.protocol === 'https:';\n}\nclass HttpClient {\n constructor(userAgent, handlers, requestOptions) {\n this._ignoreSslError = false;\n this._allowRedirects = true;\n this._allowRedirectDowngrade = false;\n this._maxRedirects = 50;\n this._allowRetries = false;\n this._maxRetries = 1;\n this._keepAlive = false;\n this._disposed = false;\n this.userAgent = this._getUserAgentWithOrchestrationId(userAgent);\n this.handlers = handlers || [];\n this.requestOptions = requestOptions;\n if (requestOptions) {\n if (requestOptions.ignoreSslError != null) {\n this._ignoreSslError = requestOptions.ignoreSslError;\n }\n this._socketTimeout = requestOptions.socketTimeout;\n if (requestOptions.allowRedirects != null) {\n this._allowRedirects = requestOptions.allowRedirects;\n }\n if (requestOptions.allowRedirectDowngrade != null) {\n this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;\n }\n if (requestOptions.maxRedirects != null) {\n this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);\n }\n if (requestOptions.keepAlive != null) {\n this._keepAlive = requestOptions.keepAlive;\n }\n if (requestOptions.allowRetries != null) {\n this._allowRetries = requestOptions.allowRetries;\n }\n if (requestOptions.maxRetries != null) {\n this._maxRetries = requestOptions.maxRetries;\n }\n }\n }\n options(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});\n });\n }\n get(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('GET', requestUrl, null, additionalHeaders || {});\n });\n }\n del(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('DELETE', requestUrl, null, additionalHeaders || {});\n });\n }\n post(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('POST', requestUrl, data, additionalHeaders || {});\n });\n }\n patch(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('PATCH', requestUrl, data, additionalHeaders || {});\n });\n }\n put(requestUrl, data, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('PUT', requestUrl, data, additionalHeaders || {});\n });\n }\n head(requestUrl, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request('HEAD', requestUrl, null, additionalHeaders || {});\n });\n }\n sendStream(verb, requestUrl, stream, additionalHeaders) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.request(verb, requestUrl, stream, additionalHeaders);\n });\n }\n /**\n * Gets a typed object from an endpoint\n * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise\n */\n getJson(requestUrl_1) {\n return __awaiter(this, arguments, void 0, function* (requestUrl, additionalHeaders = {}) {\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n const res = yield this.get(requestUrl, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n postJson(requestUrl_1, obj_1) {\n return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] =\n this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson);\n const res = yield this.post(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n putJson(requestUrl_1, obj_1) {\n return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] =\n this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson);\n const res = yield this.put(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n patchJson(requestUrl_1, obj_1) {\n return __awaiter(this, arguments, void 0, function* (requestUrl, obj, additionalHeaders = {}) {\n const data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] =\n this._getExistingOrDefaultContentTypeHeader(additionalHeaders, MediaTypes.ApplicationJson);\n const res = yield this.patch(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n });\n }\n /**\n * Makes a raw http request.\n * All other methods such as get, post, patch, and request ultimately call this.\n * Prefer get, del, post and patch\n */\n request(verb, requestUrl, data, headers) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._disposed) {\n throw new Error('Client has already been disposed.');\n }\n const parsedUrl = new URL(requestUrl);\n let info = this._prepareRequest(verb, parsedUrl, headers);\n // Only perform retries on reads since writes may not be idempotent.\n const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb)\n ? this._maxRetries + 1\n : 1;\n let numTries = 0;\n let response;\n do {\n response = yield this.requestRaw(info, data);\n // Check if it's an authentication challenge\n if (response &&\n response.message &&\n response.message.statusCode === HttpCodes.Unauthorized) {\n let authenticationHandler;\n for (const handler of this.handlers) {\n if (handler.canHandleAuthentication(response)) {\n authenticationHandler = handler;\n break;\n }\n }\n if (authenticationHandler) {\n return authenticationHandler.handleAuthentication(this, info, data);\n }\n else {\n // We have received an unauthorized response but have no handlers to handle it.\n // Let the response return to the caller.\n return response;\n }\n }\n let redirectsRemaining = this._maxRedirects;\n while (response.message.statusCode &&\n HttpRedirectCodes.includes(response.message.statusCode) &&\n this._allowRedirects &&\n redirectsRemaining > 0) {\n const redirectUrl = response.message.headers['location'];\n if (!redirectUrl) {\n // if there's no location to redirect to, we won't\n break;\n }\n const parsedRedirectUrl = new URL(redirectUrl);\n if (parsedUrl.protocol === 'https:' &&\n parsedUrl.protocol !== parsedRedirectUrl.protocol &&\n !this._allowRedirectDowngrade) {\n throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');\n }\n // we need to finish reading the response before reassigning response\n // which will leak the open socket.\n yield response.readBody();\n // strip authorization header if redirected to a different hostname\n if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {\n for (const header in headers) {\n // header names are case insensitive\n if (header.toLowerCase() === 'authorization') {\n delete headers[header];\n }\n }\n }\n // let's make the request with the new redirectUrl\n info = this._prepareRequest(verb, parsedRedirectUrl, headers);\n response = yield this.requestRaw(info, data);\n redirectsRemaining--;\n }\n if (!response.message.statusCode ||\n !HttpResponseRetryCodes.includes(response.message.statusCode)) {\n // If not a retry code, return immediately instead of retrying\n return response;\n }\n numTries += 1;\n if (numTries < maxTries) {\n yield response.readBody();\n yield this._performExponentialBackoff(numTries);\n }\n } while (numTries < maxTries);\n return response;\n });\n }\n /**\n * Needs to be called if keepAlive is set to true in request options.\n */\n dispose() {\n if (this._agent) {\n this._agent.destroy();\n }\n this._disposed = true;\n }\n /**\n * Raw request.\n * @param info\n * @param data\n */\n requestRaw(info, data) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n function callbackForResult(err, res) {\n if (err) {\n reject(err);\n }\n else if (!res) {\n // If `err` is not passed, then `res` must be passed.\n reject(new Error('Unknown error'));\n }\n else {\n resolve(res);\n }\n }\n this.requestRawWithCallback(info, data, callbackForResult);\n });\n });\n }\n /**\n * Raw request with callback.\n * @param info\n * @param data\n * @param onResult\n */\n requestRawWithCallback(info, data, onResult) {\n if (typeof data === 'string') {\n if (!info.options.headers) {\n info.options.headers = {};\n }\n info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');\n }\n let callbackCalled = false;\n function handleResult(err, res) {\n if (!callbackCalled) {\n callbackCalled = true;\n onResult(err, res);\n }\n }\n const req = info.httpModule.request(info.options, (msg) => {\n const res = new HttpClientResponse(msg);\n handleResult(undefined, res);\n });\n let socket;\n req.on('socket', sock => {\n socket = sock;\n });\n // If we ever get disconnected, we want the socket to timeout eventually\n req.setTimeout(this._socketTimeout || 3 * 60000, () => {\n if (socket) {\n socket.end();\n }\n handleResult(new Error(`Request timeout: ${info.options.path}`));\n });\n req.on('error', function (err) {\n // err has statusCode property\n // res should have headers\n handleResult(err);\n });\n if (data && typeof data === 'string') {\n req.write(data, 'utf8');\n }\n if (data && typeof data !== 'string') {\n data.on('close', function () {\n req.end();\n });\n data.pipe(req);\n }\n else {\n req.end();\n }\n }\n /**\n * Gets an http agent. This function is useful when you need an http agent that handles\n * routing through a proxy server - depending upon the url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\n getAgent(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n return this._getAgent(parsedUrl);\n }\n getAgentDispatcher(serverUrl) {\n const parsedUrl = new URL(serverUrl);\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (!useProxy) {\n return;\n }\n return this._getProxyAgentDispatcher(parsedUrl, proxyUrl);\n }\n _prepareRequest(method, requestUrl, headers) {\n const info = {};\n info.parsedUrl = requestUrl;\n const usingSsl = info.parsedUrl.protocol === 'https:';\n info.httpModule = usingSsl ? https : http;\n const defaultPort = usingSsl ? 443 : 80;\n info.options = {};\n info.options.host = info.parsedUrl.hostname;\n info.options.port = info.parsedUrl.port\n ? parseInt(info.parsedUrl.port)\n : defaultPort;\n info.options.path =\n (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');\n info.options.method = method;\n info.options.headers = this._mergeHeaders(headers);\n if (this.userAgent != null) {\n info.options.headers['user-agent'] = this.userAgent;\n }\n info.options.agent = this._getAgent(info.parsedUrl);\n // gives handlers an opportunity to participate\n if (this.handlers) {\n for (const handler of this.handlers) {\n handler.prepareRequest(info.options);\n }\n }\n return info;\n }\n _mergeHeaders(headers) {\n if (this.requestOptions && this.requestOptions.headers) {\n return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {}));\n }\n return lowercaseKeys(headers || {});\n }\n /**\n * Gets an existing header value or returns a default.\n * Handles converting number header values to strings since HTTP headers must be strings.\n * Note: This returns string | string[] since some headers can have multiple values.\n * For headers that must always be a single string (like Content-Type), use the\n * specialized _getExistingOrDefaultContentTypeHeader method instead.\n */\n _getExistingOrDefaultHeader(additionalHeaders, header, _default) {\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n const headerValue = lowercaseKeys(this.requestOptions.headers)[header];\n if (headerValue) {\n clientHeader =\n typeof headerValue === 'number' ? headerValue.toString() : headerValue;\n }\n }\n const additionalValue = additionalHeaders[header];\n if (additionalValue !== undefined) {\n return typeof additionalValue === 'number'\n ? additionalValue.toString()\n : additionalValue;\n }\n if (clientHeader !== undefined) {\n return clientHeader;\n }\n return _default;\n }\n /**\n * Specialized version of _getExistingOrDefaultHeader for Content-Type header.\n * Always returns a single string (not an array) since Content-Type should be a single value.\n * Converts arrays to comma-separated strings and numbers to strings to ensure type safety.\n * This was split from _getExistingOrDefaultHeader to provide stricter typing for callers\n * that assign the result to places expecting a string (e.g., additionalHeaders[Headers.ContentType]).\n */\n _getExistingOrDefaultContentTypeHeader(additionalHeaders, _default) {\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n const headerValue = lowercaseKeys(this.requestOptions.headers)[Headers.ContentType];\n if (headerValue) {\n if (typeof headerValue === 'number') {\n clientHeader = String(headerValue);\n }\n else if (Array.isArray(headerValue)) {\n clientHeader = headerValue.join(', ');\n }\n else {\n clientHeader = headerValue;\n }\n }\n }\n const additionalValue = additionalHeaders[Headers.ContentType];\n // Return the first non-undefined value, converting numbers or arrays to strings if necessary\n if (additionalValue !== undefined) {\n if (typeof additionalValue === 'number') {\n return String(additionalValue);\n }\n else if (Array.isArray(additionalValue)) {\n return additionalValue.join(', ');\n }\n else {\n return additionalValue;\n }\n }\n if (clientHeader !== undefined) {\n return clientHeader;\n }\n return _default;\n }\n _getAgent(parsedUrl) {\n let agent;\n const proxyUrl = pm.getProxyUrl(parsedUrl);\n const useProxy = proxyUrl && proxyUrl.hostname;\n if (this._keepAlive && useProxy) {\n agent = this._proxyAgent;\n }\n if (!useProxy) {\n agent = this._agent;\n }\n // if agent is already assigned use that agent.\n if (agent) {\n return agent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n let maxSockets = 100;\n if (this.requestOptions) {\n maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;\n }\n // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis.\n if (proxyUrl && proxyUrl.hostname) {\n const agentOptions = {\n maxSockets,\n keepAlive: this._keepAlive,\n proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && {\n proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`\n })), { host: proxyUrl.hostname, port: proxyUrl.port })\n };\n let tunnelAgent;\n const overHttps = proxyUrl.protocol === 'https:';\n if (usingSsl) {\n tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;\n }\n else {\n tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;\n }\n agent = tunnelAgent(agentOptions);\n this._proxyAgent = agent;\n }\n // if tunneling agent isn't assigned create a new agent\n if (!agent) {\n const options = { keepAlive: this._keepAlive, maxSockets };\n agent = usingSsl ? new https.Agent(options) : new http.Agent(options);\n this._agent = agent;\n }\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n agent.options = Object.assign(agent.options || {}, {\n rejectUnauthorized: false\n });\n }\n return agent;\n }\n _getProxyAgentDispatcher(parsedUrl, proxyUrl) {\n let proxyAgent;\n if (this._keepAlive) {\n proxyAgent = this._proxyAgentDispatcher;\n }\n // if agent is already assigned use that agent.\n if (proxyAgent) {\n return proxyAgent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && {\n token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString('base64')}`\n })));\n this._proxyAgentDispatcher = proxyAgent;\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, {\n rejectUnauthorized: false\n });\n }\n return proxyAgent;\n }\n _getUserAgentWithOrchestrationId(userAgent) {\n const baseUserAgent = userAgent || 'actions/http-client';\n const orchId = process.env['ACTIONS_ORCHESTRATION_ID'];\n if (orchId) {\n // Sanitize the orchestration ID to ensure it contains only valid characters\n // Valid characters: 0-9, a-z, _, -, .\n const sanitizedId = orchId.replace(/[^a-z0-9_.-]/gi, '_');\n return `${baseUserAgent} actions_orchestration_id/${sanitizedId}`;\n }\n return baseUserAgent;\n }\n _performExponentialBackoff(retryNumber) {\n return __awaiter(this, void 0, void 0, function* () {\n retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);\n const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);\n return new Promise(resolve => setTimeout(() => resolve(), ms));\n });\n }\n _processResponse(res, options) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n const statusCode = res.message.statusCode || 0;\n const response = {\n statusCode,\n result: null,\n headers: {}\n };\n // not found leads to null obj returned\n if (statusCode === HttpCodes.NotFound) {\n resolve(response);\n }\n // get the result from the body\n function dateTimeDeserializer(key, value) {\n if (typeof value === 'string') {\n const a = new Date(value);\n if (!isNaN(a.valueOf())) {\n return a;\n }\n }\n return value;\n }\n let obj;\n let contents;\n try {\n contents = yield res.readBody();\n if (contents && contents.length > 0) {\n if (options && options.deserializeDates) {\n obj = JSON.parse(contents, dateTimeDeserializer);\n }\n else {\n obj = JSON.parse(contents);\n }\n response.result = obj;\n }\n response.headers = res.message.headers;\n }\n catch (err) {\n // Invalid resource (contents not json); leaving result obj null\n }\n // note that 3xx redirects are handled by the http layer.\n if (statusCode > 299) {\n let msg;\n // if exception/error in body, attempt to get better error\n if (obj && obj.message) {\n msg = obj.message;\n }\n else if (contents && contents.length > 0) {\n // it may be the case that the exception is in the body message as string\n msg = contents;\n }\n else {\n msg = `Failed request: (${statusCode})`;\n }\n const err = new HttpClientError(msg, statusCode);\n err.result = response.result;\n reject(err);\n }\n else {\n resolve(response);\n }\n }));\n });\n }\n}\nexports.HttpClient = HttpClient;\nconst lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getProxyUrl = getProxyUrl;\nexports.checkBypass = checkBypass;\nfunction getProxyUrl(reqUrl) {\n const usingSsl = reqUrl.protocol === 'https:';\n if (checkBypass(reqUrl)) {\n return undefined;\n }\n const proxyVar = (() => {\n if (usingSsl) {\n return process.env['https_proxy'] || process.env['HTTPS_PROXY'];\n }\n else {\n return process.env['http_proxy'] || process.env['HTTP_PROXY'];\n }\n })();\n if (proxyVar) {\n try {\n return new DecodedURL(proxyVar);\n }\n catch (_a) {\n if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://'))\n return new DecodedURL(`http://${proxyVar}`);\n }\n }\n else {\n return undefined;\n }\n}\nfunction checkBypass(reqUrl) {\n if (!reqUrl.hostname) {\n return false;\n }\n const reqHost = reqUrl.hostname;\n if (isLoopbackAddress(reqHost)) {\n return true;\n }\n const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';\n if (!noProxy) {\n return false;\n }\n // Determine the request port\n let reqPort;\n if (reqUrl.port) {\n reqPort = Number(reqUrl.port);\n }\n else if (reqUrl.protocol === 'http:') {\n reqPort = 80;\n }\n else if (reqUrl.protocol === 'https:') {\n reqPort = 443;\n }\n // Format the request hostname and hostname with port\n const upperReqHosts = [reqUrl.hostname.toUpperCase()];\n if (typeof reqPort === 'number') {\n upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);\n }\n // Compare request host against noproxy\n for (const upperNoProxyItem of noProxy\n .split(',')\n .map(x => x.trim().toUpperCase())\n .filter(x => x)) {\n if (upperNoProxyItem === '*' ||\n upperReqHosts.some(x => x === upperNoProxyItem ||\n x.endsWith(`.${upperNoProxyItem}`) ||\n (upperNoProxyItem.startsWith('.') &&\n x.endsWith(`${upperNoProxyItem}`)))) {\n return true;\n }\n }\n return false;\n}\nfunction isLoopbackAddress(host) {\n const hostLower = host.toLowerCase();\n return (hostLower === 'localhost' ||\n hostLower.startsWith('127.') ||\n hostLower.startsWith('[::1]') ||\n hostLower.startsWith('[0:0:0:0:0:0:0:1]'));\n}\nclass DecodedURL extends URL {\n constructor(url, base) {\n super(url, base);\n this._decodedUsername = decodeURIComponent(super.username);\n this._decodedPassword = decodeURIComponent(super.password);\n }\n get username() {\n return this._decodedUsername;\n }\n get password() {\n return this._decodedPassword;\n }\n}\n//# sourceMappingURL=proxy.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar _a;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.READONLY = exports.UV_FS_O_EXLOCK = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rm = exports.rename = exports.readdir = exports.open = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = void 0;\nexports.readlink = readlink;\nexports.exists = exists;\nexports.isDirectory = isDirectory;\nexports.isRooted = isRooted;\nexports.tryGetExecutablePath = tryGetExecutablePath;\nexports.getCmdPath = getCmdPath;\nconst fs = __importStar(require(\"fs\"));\nconst path = __importStar(require(\"path\"));\n_a = fs.promises\n// export const {open} = 'fs'\n, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.open = _a.open, exports.readdir = _a.readdir, exports.rename = _a.rename, exports.rm = _a.rm, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink;\n// export const {open} = 'fs'\nexports.IS_WINDOWS = process.platform === 'win32';\n/**\n * Custom implementation of readlink to ensure Windows junctions\n * maintain trailing backslash for backward compatibility with Node.js < 24\n *\n * In Node.js 20, Windows junctions (directory symlinks) always returned paths\n * with trailing backslashes. Node.js 24 removed this behavior, which breaks\n * code that relied on this format for path operations.\n *\n * This implementation restores the Node 20 behavior by adding a trailing\n * backslash to all junction results on Windows.\n */\nfunction readlink(fsPath) {\n return __awaiter(this, void 0, void 0, function* () {\n const result = yield fs.promises.readlink(fsPath);\n // On Windows, restore Node 20 behavior: add trailing backslash to all results\n // since junctions on Windows are always directory links\n if (exports.IS_WINDOWS && !result.endsWith('\\\\')) {\n return `${result}\\\\`;\n }\n return result;\n });\n}\n// See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691\nexports.UV_FS_O_EXLOCK = 0x10000000;\nexports.READONLY = fs.constants.O_RDONLY;\nfunction exists(fsPath) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield (0, exports.stat)(fsPath);\n }\n catch (err) {\n if (err.code === 'ENOENT') {\n return false;\n }\n throw err;\n }\n return true;\n });\n}\nfunction isDirectory(fsPath_1) {\n return __awaiter(this, arguments, void 0, function* (fsPath, useStat = false) {\n const stats = useStat ? yield (0, exports.stat)(fsPath) : yield (0, exports.lstat)(fsPath);\n return stats.isDirectory();\n });\n}\n/**\n * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like:\n * \\, \\hello, \\\\hello\\share, C:, and C:\\hello (and corresponding alternate separator cases).\n */\nfunction isRooted(p) {\n p = normalizeSeparators(p);\n if (!p) {\n throw new Error('isRooted() parameter \"p\" cannot be empty');\n }\n if (exports.IS_WINDOWS) {\n return (p.startsWith('\\\\') || /^[A-Z]:/i.test(p) // e.g. \\ or \\hello or \\\\hello\n ); // e.g. C: or C:\\hello\n }\n return p.startsWith('/');\n}\n/**\n * Best effort attempt to determine whether a file exists and is executable.\n * @param filePath file path to check\n * @param extensions additional file extensions to try\n * @return if file exists and is executable, returns the file path. otherwise empty string.\n */\nfunction tryGetExecutablePath(filePath, extensions) {\n return __awaiter(this, void 0, void 0, function* () {\n let stats = undefined;\n try {\n // test file exists\n stats = yield (0, exports.stat)(filePath);\n }\n catch (err) {\n if (err.code !== 'ENOENT') {\n // eslint-disable-next-line no-console\n console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);\n }\n }\n if (stats && stats.isFile()) {\n if (exports.IS_WINDOWS) {\n // on Windows, test for valid extension\n const upperExt = path.extname(filePath).toUpperCase();\n if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) {\n return filePath;\n }\n }\n else {\n if (isUnixExecutable(stats)) {\n return filePath;\n }\n }\n }\n // try each extension\n const originalFilePath = filePath;\n for (const extension of extensions) {\n filePath = originalFilePath + extension;\n stats = undefined;\n try {\n stats = yield (0, exports.stat)(filePath);\n }\n catch (err) {\n if (err.code !== 'ENOENT') {\n // eslint-disable-next-line no-console\n console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);\n }\n }\n if (stats && stats.isFile()) {\n if (exports.IS_WINDOWS) {\n // preserve the case of the actual file (since an extension was appended)\n try {\n const directory = path.dirname(filePath);\n const upperName = path.basename(filePath).toUpperCase();\n for (const actualName of yield (0, exports.readdir)(directory)) {\n if (upperName === actualName.toUpperCase()) {\n filePath = path.join(directory, actualName);\n break;\n }\n }\n }\n catch (err) {\n // eslint-disable-next-line no-console\n console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`);\n }\n return filePath;\n }\n else {\n if (isUnixExecutable(stats)) {\n return filePath;\n }\n }\n }\n }\n return '';\n });\n}\nfunction normalizeSeparators(p) {\n p = p || '';\n if (exports.IS_WINDOWS) {\n // convert slashes on Windows\n p = p.replace(/\\//g, '\\\\');\n // remove redundant slashes\n return p.replace(/\\\\\\\\+/g, '\\\\');\n }\n // remove redundant slashes\n return p.replace(/\\/\\/+/g, '/');\n}\n// on Mac/Linux, test the execute bit\n// R W X R W X R W X\n// 256 128 64 32 16 8 4 2 1\nfunction isUnixExecutable(stats) {\n return ((stats.mode & 1) > 0 ||\n ((stats.mode & 8) > 0 &&\n process.getgid !== undefined &&\n stats.gid === process.getgid()) ||\n ((stats.mode & 64) > 0 &&\n process.getuid !== undefined &&\n stats.uid === process.getuid()));\n}\n// Get the path of cmd.exe in windows\nfunction getCmdPath() {\n var _a;\n return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`;\n}\n//# sourceMappingURL=io-util.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.cp = cp;\nexports.mv = mv;\nexports.rmRF = rmRF;\nexports.mkdirP = mkdirP;\nexports.which = which;\nexports.findInPath = findInPath;\nconst assert_1 = require(\"assert\");\nconst path = __importStar(require(\"path\"));\nconst ioUtil = __importStar(require(\"./io-util\"));\n/**\n * Copies a file or folder.\n * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js\n *\n * @param source source path\n * @param dest destination path\n * @param options optional. See CopyOptions.\n */\nfunction cp(source_1, dest_1) {\n return __awaiter(this, arguments, void 0, function* (source, dest, options = {}) {\n const { force, recursive, copySourceDirectory } = readCopyOptions(options);\n const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null;\n // Dest is an existing file, but not forcing\n if (destStat && destStat.isFile() && !force) {\n return;\n }\n // If dest is an existing directory, should copy inside.\n const newDest = destStat && destStat.isDirectory() && copySourceDirectory\n ? path.join(dest, path.basename(source))\n : dest;\n if (!(yield ioUtil.exists(source))) {\n throw new Error(`no such file or directory: ${source}`);\n }\n const sourceStat = yield ioUtil.stat(source);\n if (sourceStat.isDirectory()) {\n if (!recursive) {\n throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`);\n }\n else {\n yield cpDirRecursive(source, newDest, 0, force);\n }\n }\n else {\n if (path.relative(source, newDest) === '') {\n // a file cannot be copied to itself\n throw new Error(`'${newDest}' and '${source}' are the same file`);\n }\n yield copyFile(source, newDest, force);\n }\n });\n}\n/**\n * Moves a path.\n *\n * @param source source path\n * @param dest destination path\n * @param options optional. See MoveOptions.\n */\nfunction mv(source_1, dest_1) {\n return __awaiter(this, arguments, void 0, function* (source, dest, options = {}) {\n if (yield ioUtil.exists(dest)) {\n let destExists = true;\n if (yield ioUtil.isDirectory(dest)) {\n // If dest is directory copy src into dest\n dest = path.join(dest, path.basename(source));\n destExists = yield ioUtil.exists(dest);\n }\n if (destExists) {\n if (options.force == null || options.force) {\n yield rmRF(dest);\n }\n else {\n throw new Error('Destination already exists');\n }\n }\n }\n yield mkdirP(path.dirname(dest));\n yield ioUtil.rename(source, dest);\n });\n}\n/**\n * Remove a path recursively with force\n *\n * @param inputPath path to remove\n */\nfunction rmRF(inputPath) {\n return __awaiter(this, void 0, void 0, function* () {\n if (ioUtil.IS_WINDOWS) {\n // Check for invalid characters\n // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file\n if (/[*\"<>|]/.test(inputPath)) {\n throw new Error('File path must not contain `*`, `\"`, `<`, `>` or `|` on Windows');\n }\n }\n try {\n // note if path does not exist, error is silent\n yield ioUtil.rm(inputPath, {\n force: true,\n maxRetries: 3,\n recursive: true,\n retryDelay: 300\n });\n }\n catch (err) {\n throw new Error(`File was unable to be removed ${err}`);\n }\n });\n}\n/**\n * Make a directory. Creates the full path with folders in between\n * Will throw if it fails\n *\n * @param fsPath path to create\n * @returns Promise\n */\nfunction mkdirP(fsPath) {\n return __awaiter(this, void 0, void 0, function* () {\n (0, assert_1.ok)(fsPath, 'a path argument must be provided');\n yield ioUtil.mkdir(fsPath, { recursive: true });\n });\n}\n/**\n * Returns path of a tool had the tool actually been invoked. Resolves via paths.\n * If you check and the tool does not exist, it will throw.\n *\n * @param tool name of the tool\n * @param check whether to check if tool exists\n * @returns Promise path to tool\n */\nfunction which(tool, check) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!tool) {\n throw new Error(\"parameter 'tool' is required\");\n }\n // recursive when check=true\n if (check) {\n const result = yield which(tool, false);\n if (!result) {\n if (ioUtil.IS_WINDOWS) {\n throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`);\n }\n else {\n throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`);\n }\n }\n return result;\n }\n const matches = yield findInPath(tool);\n if (matches && matches.length > 0) {\n return matches[0];\n }\n return '';\n });\n}\n/**\n * Returns a list of all occurrences of the given tool on the system path.\n *\n * @returns Promise the paths of the tool\n */\nfunction findInPath(tool) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!tool) {\n throw new Error(\"parameter 'tool' is required\");\n }\n // build the list of extensions to try\n const extensions = [];\n if (ioUtil.IS_WINDOWS && process.env['PATHEXT']) {\n for (const extension of process.env['PATHEXT'].split(path.delimiter)) {\n if (extension) {\n extensions.push(extension);\n }\n }\n }\n // if it's rooted, return it if exists. otherwise return empty.\n if (ioUtil.isRooted(tool)) {\n const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions);\n if (filePath) {\n return [filePath];\n }\n return [];\n }\n // if any path separators, return empty\n if (tool.includes(path.sep)) {\n return [];\n }\n // build the list of directories\n //\n // Note, technically \"where\" checks the current directory on Windows. From a toolkit perspective,\n // it feels like we should not do this. Checking the current directory seems like more of a use\n // case of a shell, and the which() function exposed by the toolkit should strive for consistency\n // across platforms.\n const directories = [];\n if (process.env.PATH) {\n for (const p of process.env.PATH.split(path.delimiter)) {\n if (p) {\n directories.push(p);\n }\n }\n }\n // find all matches\n const matches = [];\n for (const directory of directories) {\n const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions);\n if (filePath) {\n matches.push(filePath);\n }\n }\n return matches;\n });\n}\nfunction readCopyOptions(options) {\n const force = options.force == null ? true : options.force;\n const recursive = Boolean(options.recursive);\n const copySourceDirectory = options.copySourceDirectory == null\n ? true\n : Boolean(options.copySourceDirectory);\n return { force, recursive, copySourceDirectory };\n}\nfunction cpDirRecursive(sourceDir, destDir, currentDepth, force) {\n return __awaiter(this, void 0, void 0, function* () {\n // Ensure there is not a run away recursive copy\n if (currentDepth >= 255)\n return;\n currentDepth++;\n yield mkdirP(destDir);\n const files = yield ioUtil.readdir(sourceDir);\n for (const fileName of files) {\n const srcFile = `${sourceDir}/${fileName}`;\n const destFile = `${destDir}/${fileName}`;\n const srcFileStat = yield ioUtil.lstat(srcFile);\n if (srcFileStat.isDirectory()) {\n // Recurse\n yield cpDirRecursive(srcFile, destFile, currentDepth, force);\n }\n else {\n yield copyFile(srcFile, destFile, force);\n }\n }\n // Change the mode for the newly created directory\n yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode);\n });\n}\n// Buffered file copy\nfunction copyFile(srcFile, destFile, force) {\n return __awaiter(this, void 0, void 0, function* () {\n if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) {\n // unlink/re-link it\n try {\n yield ioUtil.lstat(destFile);\n yield ioUtil.unlink(destFile);\n }\n catch (e) {\n // Try to override file permission\n if (e.code === 'EPERM') {\n yield ioUtil.chmod(destFile, '0666');\n yield ioUtil.unlink(destFile);\n }\n // other errors = it doesn't exist, no work to do\n }\n // Copy over symlink\n const symlinkFull = yield ioUtil.readlink(srcFile);\n yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null);\n }\n else if (!(yield ioUtil.exists(destFile)) || force) {\n yield ioUtil.copyFile(srcFile, destFile);\n }\n });\n}\n//# sourceMappingURL=io.js.map","'use strict'\n\n/**\n * Ponyfill for `Array.prototype.find` which is only available in ES6 runtimes.\n *\n * Works with anything that has a `length` property and index access properties, including NodeList.\n *\n * @template {unknown} T\n * @param {Array | ({length:number, [number]: T})} list\n * @param {function (item: T, index: number, list:Array | ({length:number, [number]: T})):boolean} predicate\n * @param {Partial>?} ac `Array.prototype` by default,\n * \t\t\t\tallows injecting a custom implementation in tests\n * @returns {T | undefined}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find\n * @see https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find\n */\nfunction find(list, predicate, ac) {\n\tif (ac === undefined) {\n\t\tac = Array.prototype;\n\t}\n\tif (list && typeof ac.find === 'function') {\n\t\treturn ac.find.call(list, predicate);\n\t}\n\tfor (var i = 0; i < list.length; i++) {\n\t\tif (Object.prototype.hasOwnProperty.call(list, i)) {\n\t\t\tvar item = list[i];\n\t\t\tif (predicate.call(undefined, item, i, list)) {\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * \"Shallow freezes\" an object to render it immutable.\n * Uses `Object.freeze` if available,\n * otherwise the immutability is only in the type.\n *\n * Is used to create \"enum like\" objects.\n *\n * @template T\n * @param {T} object the object to freeze\n * @param {Pick = Object} oc `Object` by default,\n * \t\t\t\tallows to inject custom object constructor for tests\n * @returns {Readonly}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\n */\nfunction freeze(object, oc) {\n\tif (oc === undefined) {\n\t\toc = Object\n\t}\n\treturn oc && typeof oc.freeze === 'function' ? oc.freeze(object) : object\n}\n\n/**\n * Since we can not rely on `Object.assign` we provide a simplified version\n * that is sufficient for our needs.\n *\n * @param {Object} target\n * @param {Object | null | undefined} source\n *\n * @returns {Object} target\n * @throws TypeError if target is not an object\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n * @see https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign\n */\nfunction assign(target, source) {\n\tif (target === null || typeof target !== 'object') {\n\t\tthrow new TypeError('target is not an object')\n\t}\n\tfor (var key in source) {\n\t\tif (Object.prototype.hasOwnProperty.call(source, key)) {\n\t\t\ttarget[key] = source[key]\n\t\t}\n\t}\n\treturn target\n}\n\n/**\n * All mime types that are allowed as input to `DOMParser.parseFromString`\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec\n * @see DOMParser.prototype.parseFromString\n */\nvar MIME_TYPE = freeze({\n\t/**\n\t * `text/html`, the only mime type that triggers treating an XML document as HTML.\n\t *\n\t * @see DOMParser.SupportedType.isHTML\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec\n\t */\n\tHTML: 'text/html',\n\n\t/**\n\t * Helper method to check a mime type if it indicates an HTML document\n\t *\n\t * @param {string} [value]\n\t * @returns {boolean}\n\t *\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring \t */\n\tisHTML: function (value) {\n\t\treturn value === MIME_TYPE.HTML\n\t},\n\n\t/**\n\t * `application/xml`, the standard mime type for XML documents.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_APPLICATION: 'application/xml',\n\n\t/**\n\t * `text/html`, an alias for `application/xml`.\n\t *\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303\n\t * @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_TEXT: 'text/xml',\n\n\t/**\n\t * `application/xhtml+xml`, indicates an XML document that has the default HTML namespace,\n\t * but is parsed as an XML document.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec\n\t * @see https://en.wikipedia.org/wiki/XHTML Wikipedia\n\t */\n\tXML_XHTML_APPLICATION: 'application/xhtml+xml',\n\n\t/**\n\t * `image/svg+xml`,\n\t *\n\t * @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration\n\t * @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1\n\t * @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia\n\t */\n\tXML_SVG_IMAGE: 'image/svg+xml',\n})\n\n/**\n * Namespaces that are used in this code base.\n *\n * @see http://www.w3.org/TR/REC-xml-names\n */\nvar NAMESPACE = freeze({\n\t/**\n\t * The XHTML namespace.\n\t *\n\t * @see http://www.w3.org/1999/xhtml\n\t */\n\tHTML: 'http://www.w3.org/1999/xhtml',\n\n\t/**\n\t * Checks if `uri` equals `NAMESPACE.HTML`.\n\t *\n\t * @param {string} [uri]\n\t *\n\t * @see NAMESPACE.HTML\n\t */\n\tisHTML: function (uri) {\n\t\treturn uri === NAMESPACE.HTML\n\t},\n\n\t/**\n\t * The SVG namespace.\n\t *\n\t * @see http://www.w3.org/2000/svg\n\t */\n\tSVG: 'http://www.w3.org/2000/svg',\n\n\t/**\n\t * The `xml:` namespace.\n\t *\n\t * @see http://www.w3.org/XML/1998/namespace\n\t */\n\tXML: 'http://www.w3.org/XML/1998/namespace',\n\n\t/**\n\t * The `xmlns:` namespace\n\t *\n\t * @see https://www.w3.org/2000/xmlns/\n\t */\n\tXMLNS: 'http://www.w3.org/2000/xmlns/',\n})\n\nexports.assign = assign;\nexports.find = find;\nexports.freeze = freeze;\nexports.MIME_TYPE = MIME_TYPE;\nexports.NAMESPACE = NAMESPACE;\n","var conventions = require(\"./conventions\");\nvar dom = require('./dom')\nvar entities = require('./entities');\nvar sax = require('./sax');\n\nvar DOMImplementation = dom.DOMImplementation;\n\nvar NAMESPACE = conventions.NAMESPACE;\n\nvar ParseError = sax.ParseError;\nvar XMLReader = sax.XMLReader;\n\n/**\n * Normalizes line ending according to https://www.w3.org/TR/xml11/#sec-line-ends:\n *\n * > XML parsed entities are often stored in computer files which,\n * > for editing convenience, are organized into lines.\n * > These lines are typically separated by some combination\n * > of the characters CARRIAGE RETURN (#xD) and LINE FEED (#xA).\n * >\n * > To simplify the tasks of applications, the XML processor must behave\n * > as if it normalized all line breaks in external parsed entities (including the document entity)\n * > on input, before parsing, by translating all of the following to a single #xA character:\n * >\n * > 1. the two-character sequence #xD #xA\n * > 2. the two-character sequence #xD #x85\n * > 3. the single character #x85\n * > 4. the single character #x2028\n * > 5. any #xD character that is not immediately followed by #xA or #x85.\n *\n * @param {string} input\n * @returns {string}\n */\nfunction normalizeLineEndings(input) {\n\treturn input\n\t\t.replace(/\\r[\\n\\u0085]/g, '\\n')\n\t\t.replace(/[\\r\\u0085\\u2028]/g, '\\n')\n}\n\n/**\n * @typedef Locator\n * @property {number} [columnNumber]\n * @property {number} [lineNumber]\n */\n\n/**\n * @typedef DOMParserOptions\n * @property {DOMHandler} [domBuilder]\n * @property {Function} [errorHandler]\n * @property {(string) => string} [normalizeLineEndings] used to replace line endings before parsing\n * \t\t\t\t\t\tdefaults to `normalizeLineEndings`\n * @property {Locator} [locator]\n * @property {Record} [xmlns]\n *\n * @see normalizeLineEndings\n */\n\n/**\n * The DOMParser interface provides the ability to parse XML or HTML source code\n * from a string into a DOM `Document`.\n *\n * _xmldom is different from the spec in that it allows an `options` parameter,\n * to override the default behavior._\n *\n * @param {DOMParserOptions} [options]\n * @constructor\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-parsing-and-serialization\n */\nfunction DOMParser(options){\n\tthis.options = options ||{locator:{}};\n}\n\nDOMParser.prototype.parseFromString = function(source,mimeType){\n\tvar options = this.options;\n\tvar sax = new XMLReader();\n\tvar domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler\n\tvar errorHandler = options.errorHandler;\n\tvar locator = options.locator;\n\tvar defaultNSMap = options.xmlns||{};\n\tvar isHTML = /\\/x?html?$/.test(mimeType);//mimeType.toLowerCase().indexOf('html') > -1;\n \tvar entityMap = isHTML ? entities.HTML_ENTITIES : entities.XML_ENTITIES;\n\tif(locator){\n\t\tdomBuilder.setDocumentLocator(locator)\n\t}\n\n\tsax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);\n\tsax.domBuilder = options.domBuilder || domBuilder;\n\tif(isHTML){\n\t\tdefaultNSMap[''] = NAMESPACE.HTML;\n\t}\n\tdefaultNSMap.xml = defaultNSMap.xml || NAMESPACE.XML;\n\tvar normalize = options.normalizeLineEndings || normalizeLineEndings;\n\tif (source && typeof source === 'string') {\n\t\tsax.parse(\n\t\t\tnormalize(source),\n\t\t\tdefaultNSMap,\n\t\t\tentityMap\n\t\t)\n\t} else {\n\t\tsax.errorHandler.error('invalid doc source')\n\t}\n\treturn domBuilder.doc;\n}\nfunction buildErrorHandler(errorImpl,domBuilder,locator){\n\tif(!errorImpl){\n\t\tif(domBuilder instanceof DOMHandler){\n\t\t\treturn domBuilder;\n\t\t}\n\t\terrorImpl = domBuilder ;\n\t}\n\tvar errorHandler = {}\n\tvar isCallback = errorImpl instanceof Function;\n\tlocator = locator||{}\n\tfunction build(key){\n\t\tvar fn = errorImpl[key];\n\t\tif(!fn && isCallback){\n\t\t\tfn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;\n\t\t}\n\t\terrorHandler[key] = fn && function(msg){\n\t\t\tfn('[xmldom '+key+']\\t'+msg+_locator(locator));\n\t\t}||function(){};\n\t}\n\tbuild('warning');\n\tbuild('error');\n\tbuild('fatalError');\n\treturn errorHandler;\n}\n\n//console.log('#\\n\\n\\n\\n\\n\\n\\n####')\n/**\n * +ContentHandler+ErrorHandler\n * +LexicalHandler+EntityResolver2\n * -DeclHandler-DTDHandler\n *\n * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler\n * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2\n * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html\n */\nfunction DOMHandler() {\n this.cdata = false;\n}\nfunction position(locator,node){\n\tnode.lineNumber = locator.lineNumber;\n\tnode.columnNumber = locator.columnNumber;\n}\n/**\n * @see org.xml.sax.ContentHandler#startDocument\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html\n */\nDOMHandler.prototype = {\n\tstartDocument : function() {\n \tthis.doc = new DOMImplementation().createDocument(null, null, null);\n \tif (this.locator) {\n \tthis.doc.documentURI = this.locator.systemId;\n \t}\n\t},\n\tstartElement:function(namespaceURI, localName, qName, attrs) {\n\t\tvar doc = this.doc;\n\t var el = doc.createElementNS(namespaceURI, qName||localName);\n\t var len = attrs.length;\n\t appendElement(this, el);\n\t this.currentElement = el;\n\n\t\tthis.locator && position(this.locator,el)\n\t for (var i = 0 ; i < len; i++) {\n\t var namespaceURI = attrs.getURI(i);\n\t var value = attrs.getValue(i);\n\t var qName = attrs.getQName(i);\n\t\t\tvar attr = doc.createAttributeNS(namespaceURI, qName);\n\t\t\tthis.locator &&position(attrs.getLocator(i),attr);\n\t\t\tattr.value = attr.nodeValue = value;\n\t\t\tel.setAttributeNode(attr)\n\t }\n\t},\n\tendElement:function(namespaceURI, localName, qName) {\n\t\tvar current = this.currentElement\n\t\tvar tagName = current.tagName;\n\t\tthis.currentElement = current.parentNode;\n\t},\n\tstartPrefixMapping:function(prefix, uri) {\n\t},\n\tendPrefixMapping:function(prefix) {\n\t},\n\tprocessingInstruction:function(target, data) {\n\t var ins = this.doc.createProcessingInstruction(target, data);\n\t this.locator && position(this.locator,ins)\n\t appendElement(this, ins);\n\t},\n\tignorableWhitespace:function(ch, start, length) {\n\t},\n\tcharacters:function(chars, start, length) {\n\t\tchars = _toString.apply(this,arguments)\n\t\t//console.log(chars)\n\t\tif(chars){\n\t\t\tif (this.cdata) {\n\t\t\t\tvar charNode = this.doc.createCDATASection(chars);\n\t\t\t} else {\n\t\t\t\tvar charNode = this.doc.createTextNode(chars);\n\t\t\t}\n\t\t\tif(this.currentElement){\n\t\t\t\tthis.currentElement.appendChild(charNode);\n\t\t\t}else if(/^\\s*$/.test(chars)){\n\t\t\t\tthis.doc.appendChild(charNode);\n\t\t\t\t//process xml\n\t\t\t}\n\t\t\tthis.locator && position(this.locator,charNode)\n\t\t}\n\t},\n\tskippedEntity:function(name) {\n\t},\n\tendDocument:function() {\n\t\tthis.doc.normalize();\n\t},\n\tsetDocumentLocator:function (locator) {\n\t if(this.locator = locator){// && !('lineNumber' in locator)){\n\t \tlocator.lineNumber = 0;\n\t }\n\t},\n\t//LexicalHandler\n\tcomment:function(chars, start, length) {\n\t\tchars = _toString.apply(this,arguments)\n\t var comm = this.doc.createComment(chars);\n\t this.locator && position(this.locator,comm)\n\t appendElement(this, comm);\n\t},\n\n\tstartCDATA:function() {\n\t //used in characters() methods\n\t this.cdata = true;\n\t},\n\tendCDATA:function() {\n\t this.cdata = false;\n\t},\n\n\tstartDTD:function(name, publicId, systemId) {\n\t\tvar impl = this.doc.implementation;\n\t if (impl && impl.createDocumentType) {\n\t var dt = impl.createDocumentType(name, publicId, systemId);\n\t this.locator && position(this.locator,dt)\n\t appendElement(this, dt);\n\t\t\t\t\tthis.doc.doctype = dt;\n\t }\n\t},\n\t/**\n\t * @see org.xml.sax.ErrorHandler\n\t * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html\n\t */\n\twarning:function(error) {\n\t\tconsole.warn('[xmldom warning]\\t'+error,_locator(this.locator));\n\t},\n\terror:function(error) {\n\t\tconsole.error('[xmldom error]\\t'+error,_locator(this.locator));\n\t},\n\tfatalError:function(error) {\n\t\tthrow new ParseError(error, this.locator);\n\t}\n}\nfunction _locator(l){\n\tif(l){\n\t\treturn '\\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'\n\t}\n}\nfunction _toString(chars,start,length){\n\tif(typeof chars == 'string'){\n\t\treturn chars.substr(start,length)\n\t}else{//java sax connect width xmldom on rhino(what about: \"? && !(chars instanceof String)\")\n\t\tif(chars.length >= start+length || start){\n\t\t\treturn new java.lang.String(chars,start,length)+'';\n\t\t}\n\t\treturn chars;\n\t}\n}\n\n/*\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html\n * used method of org.xml.sax.ext.LexicalHandler:\n * #comment(chars, start, length)\n * #startCDATA()\n * #endCDATA()\n * #startDTD(name, publicId, systemId)\n *\n *\n * IGNORED method of org.xml.sax.ext.LexicalHandler:\n * #endDTD()\n * #startEntity(name)\n * #endEntity(name)\n *\n *\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html\n * IGNORED method of org.xml.sax.ext.DeclHandler\n * \t#attributeDecl(eName, aName, type, mode, value)\n * #elementDecl(name, model)\n * #externalEntityDecl(name, publicId, systemId)\n * #internalEntityDecl(name, value)\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html\n * IGNORED method of org.xml.sax.EntityResolver2\n * #resolveEntity(String name,String publicId,String baseURI,String systemId)\n * #resolveEntity(publicId, systemId)\n * #getExternalSubset(name, baseURI)\n * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html\n * IGNORED method of org.xml.sax.DTDHandler\n * #notationDecl(name, publicId, systemId) {};\n * #unparsedEntityDecl(name, publicId, systemId, notationName) {};\n */\n\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){\n\tDOMHandler.prototype[key] = function(){return null}\n})\n\n/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */\nfunction appendElement (hander,node) {\n if (!hander.currentElement) {\n hander.doc.appendChild(node);\n } else {\n hander.currentElement.appendChild(node);\n }\n}//appendChild and setAttributeNS are preformance key\n\nexports.__DOMHandler = DOMHandler;\nexports.normalizeLineEndings = normalizeLineEndings;\nexports.DOMParser = DOMParser;\n","var conventions = require(\"./conventions\");\n\nvar find = conventions.find;\nvar NAMESPACE = conventions.NAMESPACE;\n\n/**\n * A prerequisite for `[].filter`, to drop elements that are empty\n * @param {string} input\n * @returns {boolean}\n */\nfunction notEmptyString (input) {\n\treturn input !== ''\n}\n/**\n * @see https://infra.spec.whatwg.org/#split-on-ascii-whitespace\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n *\n * @param {string} input\n * @returns {string[]} (can be empty)\n */\nfunction splitOnASCIIWhitespace(input) {\n\t// U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, U+0020 SPACE\n\treturn input ? input.split(/[\\t\\n\\f\\r ]+/).filter(notEmptyString) : []\n}\n\n/**\n * Adds element as a key to current if it is not already present.\n *\n * @param {Record} current\n * @param {string} element\n * @returns {Record}\n */\nfunction orderedSetReducer (current, element) {\n\tif (!current.hasOwnProperty(element)) {\n\t\tcurrent[element] = true;\n\t}\n\treturn current;\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#ordered-set\n * @param {string} input\n * @returns {string[]}\n */\nfunction toOrderedSet(input) {\n\tif (!input) return [];\n\tvar list = splitOnASCIIWhitespace(input);\n\treturn Object.keys(list.reduce(orderedSetReducer, {}))\n}\n\n/**\n * Uses `list.indexOf` to implement something like `Array.prototype.includes`,\n * which we can not rely on being available.\n *\n * @param {any[]} list\n * @returns {function(any): boolean}\n */\nfunction arrayIncludes (list) {\n\treturn function(element) {\n\t\treturn list && list.indexOf(element) !== -1;\n\t}\n}\n\nfunction copy(src,dest){\n\tfor(var p in src){\n\t\tif (Object.prototype.hasOwnProperty.call(src, p)) {\n\t\t\tdest[p] = src[p];\n\t\t}\n\t}\n}\n\n/**\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*((?:.*\\{\\s*?[\\r\\n][\\s\\S]*?^})|\\S.*?(?=[;\\r\\n]));?\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*(\\S.*?(?=[;\\r\\n]));?\n */\nfunction _extends(Class,Super){\n\tvar pt = Class.prototype;\n\tif(!(pt instanceof Super)){\n\t\tfunction t(){};\n\t\tt.prototype = Super.prototype;\n\t\tt = new t();\n\t\tcopy(pt,t);\n\t\tClass.prototype = pt = t;\n\t}\n\tif(pt.constructor != Class){\n\t\tif(typeof Class != 'function'){\n\t\t\tconsole.error(\"unknown Class:\"+Class)\n\t\t}\n\t\tpt.constructor = Class\n\t}\n}\n\n// Node Types\nvar NodeType = {}\nvar ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;\nvar ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;\nvar TEXT_NODE = NodeType.TEXT_NODE = 3;\nvar CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;\nvar ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;\nvar ENTITY_NODE = NodeType.ENTITY_NODE = 6;\nvar PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;\nvar COMMENT_NODE = NodeType.COMMENT_NODE = 8;\nvar DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;\nvar DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;\nvar DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;\nvar NOTATION_NODE = NodeType.NOTATION_NODE = 12;\n\n// ExceptionCode\nvar ExceptionCode = {}\nvar ExceptionMessage = {};\nvar INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]=\"Index size error\"),1);\nvar DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]=\"DOMString size error\"),2);\nvar HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]=\"Hierarchy request error\"),3);\nvar WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]=\"Wrong document\"),4);\nvar INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]=\"Invalid character\"),5);\nvar NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]=\"No data allowed\"),6);\nvar NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]=\"No modification allowed\"),7);\nvar NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]=\"Not found\"),8);\nvar NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]=\"Not supported\"),9);\nvar INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]=\"Attribute in use\"),10);\n//level2\nvar INVALID_STATE_ERR \t= ExceptionCode.INVALID_STATE_ERR \t= ((ExceptionMessage[11]=\"Invalid state\"),11);\nvar SYNTAX_ERR \t= ExceptionCode.SYNTAX_ERR \t= ((ExceptionMessage[12]=\"Syntax error\"),12);\nvar INVALID_MODIFICATION_ERR \t= ExceptionCode.INVALID_MODIFICATION_ERR \t= ((ExceptionMessage[13]=\"Invalid modification\"),13);\nvar NAMESPACE_ERR \t= ExceptionCode.NAMESPACE_ERR \t= ((ExceptionMessage[14]=\"Invalid namespace\"),14);\nvar INVALID_ACCESS_ERR \t= ExceptionCode.INVALID_ACCESS_ERR \t= ((ExceptionMessage[15]=\"Invalid access\"),15);\n\n/**\n * DOM Level 2\n * Object DOMException\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html\n * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n */\nfunction DOMException(code, message) {\n\tif(message instanceof Error){\n\t\tvar error = message;\n\t}else{\n\t\terror = this;\n\t\tError.call(this, ExceptionMessage[code]);\n\t\tthis.message = ExceptionMessage[code];\n\t\tif(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);\n\t}\n\terror.code = code;\n\tif(message) this.message = this.message + \": \" + message;\n\treturn error;\n};\nDOMException.prototype = Error.prototype;\ncopy(ExceptionCode,DOMException)\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177\n * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.\n * The items in the NodeList are accessible via an integral index, starting from 0.\n */\nfunction NodeList() {\n};\nNodeList.prototype = {\n\t/**\n\t * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.\n\t * @standard level1\n\t */\n\tlength:0,\n\t/**\n\t * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.\n\t * @standard level1\n\t * @param index unsigned long\n\t * Index into the collection.\n\t * @return Node\n\t * \tThe node at the indexth position in the NodeList, or null if that is not a valid index.\n\t */\n\titem: function(index) {\n\t\treturn index >= 0 && index < this.length ? this[index] : null;\n\t},\n\ttoString:function(isHTML,nodeFilter){\n\t\tfor(var buf = [], i = 0;i=0){\n\t\tvar lastIndex = list.length-1\n\t\twhile(i0 || key == 'xmlns'){\n//\t\t\treturn null;\n//\t\t}\n\t\t//console.log()\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar attr = this[i];\n\t\t\t//console.log(attr.nodeName,key)\n\t\t\tif(attr.nodeName == key){\n\t\t\t\treturn attr;\n\t\t\t}\n\t\t}\n\t},\n\tsetNamedItem: function(attr) {\n\t\tvar el = attr.ownerElement;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\tvar oldAttr = this.getNamedItem(attr.nodeName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\t/* returns Node */\n\tsetNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR\n\t\tvar el = attr.ownerElement, oldAttr;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\toldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\n\t/* returns Node */\n\tremoveNamedItem: function(key) {\n\t\tvar attr = this.getNamedItem(key);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\n\n\t},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR\n\n\t//for level2\n\tremoveNamedItemNS:function(namespaceURI,localName){\n\t\tvar attr = this.getNamedItemNS(namespaceURI,localName);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t},\n\tgetNamedItemNS: function(namespaceURI, localName) {\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar node = this[i];\n\t\t\tif(node.localName == localName && node.namespaceURI == namespaceURI){\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n};\n\n/**\n * The DOMImplementation interface represents an object providing methods\n * which are not dependent on any particular document.\n * Such an object is returned by the `Document.implementation` property.\n *\n * __The individual methods describe the differences compared to the specs.__\n *\n * @constructor\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation MDN\n * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 DOM Level 1 Core (Initial)\n * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-102161490 DOM Level 2 Core\n * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490 DOM Level 3 Core\n * @see https://dom.spec.whatwg.org/#domimplementation DOM Living Standard\n */\nfunction DOMImplementation() {\n}\n\nDOMImplementation.prototype = {\n\t/**\n\t * The DOMImplementation.hasFeature() method returns a Boolean flag indicating if a given feature is supported.\n\t * The different implementations fairly diverged in what kind of features were reported.\n\t * The latest version of the spec settled to force this method to always return true, where the functionality was accurate and in use.\n\t *\n\t * @deprecated It is deprecated and modern browsers return true in all cases.\n\t *\n\t * @param {string} feature\n\t * @param {string} [version]\n\t * @returns {boolean} always true\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature MDN\n\t * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-5CED94D7 DOM Level 1 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature DOM Living Standard\n\t */\n\thasFeature: function(feature, version) {\n\t\t\treturn true;\n\t},\n\t/**\n\t * Creates an XML Document object of the specified type with its document element.\n\t *\n\t * __It behaves slightly different from the description in the living standard__:\n\t * - There is no interface/class `XMLDocument`, it returns a `Document` instance.\n\t * - `contentType`, `encoding`, `mode`, `origin`, `url` fields are currently not declared.\n\t * - this implementation is not validating names or qualified names\n\t * (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string|null} namespaceURI\n\t * @param {string} qualifiedName\n\t * @param {DocumentType=null} doctype\n\t * @returns {Document}\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocument DOM Level 2 Core (initial)\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument DOM Level 2 Core\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocument: function(namespaceURI, qualifiedName, doctype){\n\t\tvar doc = new Document();\n\t\tdoc.implementation = this;\n\t\tdoc.childNodes = new NodeList();\n\t\tdoc.doctype = doctype || null;\n\t\tif (doctype){\n\t\t\tdoc.appendChild(doctype);\n\t\t}\n\t\tif (qualifiedName){\n\t\t\tvar root = doc.createElementNS(namespaceURI, qualifiedName);\n\t\t\tdoc.appendChild(root);\n\t\t}\n\t\treturn doc;\n\t},\n\t/**\n\t * Returns a doctype, with the given `qualifiedName`, `publicId`, and `systemId`.\n\t *\n\t * __This behavior is slightly different from the in the specs__:\n\t * - this implementation is not validating names or qualified names\n\t * (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string} qualifiedName\n\t * @param {string} [publicId]\n\t * @param {string} [systemId]\n\t * @returns {DocumentType} which can either be used with `DOMImplementation.createDocument` upon document creation\n\t * \t\t\t\t or can be put into the document via methods like `Node.insertBefore()` or `Node.replaceChild()`\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocumentType MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocType DOM Level 2 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype DOM Living Standard\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocumentType: function(qualifiedName, publicId, systemId){\n\t\tvar node = new DocumentType();\n\t\tnode.name = qualifiedName;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.publicId = publicId || '';\n\t\tnode.systemId = systemId || '';\n\n\t\treturn node;\n\t}\n};\n\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247\n */\n\nfunction Node() {\n};\n\nNode.prototype = {\n\tfirstChild : null,\n\tlastChild : null,\n\tpreviousSibling : null,\n\tnextSibling : null,\n\tattributes : null,\n\tparentNode : null,\n\tchildNodes : null,\n\townerDocument : null,\n\tnodeValue : null,\n\tnamespaceURI : null,\n\tprefix : null,\n\tlocalName : null,\n\t// Modified in DOM Level 2:\n\tinsertBefore:function(newChild, refChild){//raises\n\t\treturn _insertBefore(this,newChild,refChild);\n\t},\n\treplaceChild:function(newChild, oldChild){//raises\n\t\t_insertBefore(this, newChild,oldChild, assertPreReplacementValidityInDocument);\n\t\tif(oldChild){\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t},\n\tremoveChild:function(oldChild){\n\t\treturn _removeChild(this,oldChild);\n\t},\n\tappendChild:function(newChild){\n\t\treturn this.insertBefore(newChild,null);\n\t},\n\thasChildNodes:function(){\n\t\treturn this.firstChild != null;\n\t},\n\tcloneNode:function(deep){\n\t\treturn cloneNode(this.ownerDocument||this,this,deep);\n\t},\n\t// Modified in DOM Level 2:\n\tnormalize:function(){\n\t\tvar child = this.firstChild;\n\t\twhile(child){\n\t\t\tvar next = child.nextSibling;\n\t\t\tif(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){\n\t\t\t\tthis.removeChild(next);\n\t\t\t\tchild.appendData(next.data);\n\t\t\t}else{\n\t\t\t\tchild.normalize();\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t}\n\t},\n \t// Introduced in DOM Level 2:\n\tisSupported:function(feature, version){\n\t\treturn this.ownerDocument.implementation.hasFeature(feature,version);\n\t},\n // Introduced in DOM Level 2:\n hasAttributes:function(){\n \treturn this.attributes.length>0;\n },\n\t/**\n\t * Look up the prefix associated to the given namespace URI, starting from this node.\n\t * **The default namespace declarations are ignored by this method.**\n\t * See Namespace Prefix Lookup for details on the algorithm used by this method.\n\t *\n\t * _Note: The implementation seems to be incomplete when compared to the algorithm described in the specs._\n\t *\n\t * @param {string | null} namespaceURI\n\t * @returns {string | null}\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html#lookupNamespacePrefixAlgo\n\t * @see https://dom.spec.whatwg.org/#dom-node-lookupprefix\n\t * @see https://github.com/xmldom/xmldom/issues/322\n\t */\n lookupPrefix:function(namespaceURI){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tfor(var n in map){\n\t\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(map, n) && map[n] === namespaceURI) {\n\t\t\t\t\t\t\treturn n;\n\t\t\t\t\t\t}\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n lookupNamespaceURI:function(prefix){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tif(Object.prototype.hasOwnProperty.call(map, prefix)){\n \t\t\t\treturn map[prefix] ;\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n isDefaultNamespace:function(namespaceURI){\n \tvar prefix = this.lookupPrefix(namespaceURI);\n \treturn prefix == null;\n }\n};\n\n\nfunction _xmlEncoder(c){\n\treturn c == '<' && '<' ||\n c == '>' && '>' ||\n c == '&' && '&' ||\n c == '\"' && '"' ||\n '&#'+c.charCodeAt()+';'\n}\n\n\ncopy(NodeType,Node);\ncopy(NodeType,Node.prototype);\n\n/**\n * @param callback return true for continue,false for break\n * @return boolean true: break visit;\n */\nfunction _visitNode(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tif(node = node.firstChild){\n\t\tdo{\n\t\t\tif(_visitNode(node,callback)){return true}\n }while(node=node.nextSibling)\n }\n}\n\n\n\nfunction Document(){\n\tthis.ownerDocument = this;\n}\n\nfunction _onAddAttribute(doc,el,newAttr){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tel._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value\n\t}\n}\n\nfunction _onRemoveAttribute(doc,el,newAttr,remove){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tdelete el._nsMap[newAttr.prefix?newAttr.localName:'']\n\t}\n}\n\n/**\n * Updates `el.childNodes`, updating the indexed items and it's `length`.\n * Passing `newChild` means it will be appended.\n * Otherwise it's assumed that an item has been removed,\n * and `el.firstNode` and it's `.nextSibling` are used\n * to walk the current list of child nodes.\n *\n * @param {Document} doc\n * @param {Node} el\n * @param {Node} [newChild]\n * @private\n */\nfunction _onUpdateChild (doc, el, newChild) {\n\tif(doc && doc._inc){\n\t\tdoc._inc++;\n\t\t//update childNodes\n\t\tvar cs = el.childNodes;\n\t\tif (newChild) {\n\t\t\tcs[cs.length++] = newChild;\n\t\t} else {\n\t\t\tvar child = el.firstChild;\n\t\t\tvar i = 0;\n\t\t\twhile (child) {\n\t\t\t\tcs[i++] = child;\n\t\t\t\tchild = child.nextSibling;\n\t\t\t}\n\t\t\tcs.length = i;\n\t\t\tdelete cs[cs.length];\n\t\t}\n\t}\n}\n\n/**\n * Removes the connections between `parentNode` and `child`\n * and any existing `child.previousSibling` or `child.nextSibling`.\n *\n * @see https://github.com/xmldom/xmldom/issues/135\n * @see https://github.com/xmldom/xmldom/issues/145\n *\n * @param {Node} parentNode\n * @param {Node} child\n * @returns {Node} the child that was removed.\n * @private\n */\nfunction _removeChild (parentNode, child) {\n\tvar previous = child.previousSibling;\n\tvar next = child.nextSibling;\n\tif (previous) {\n\t\tprevious.nextSibling = next;\n\t} else {\n\t\tparentNode.firstChild = next;\n\t}\n\tif (next) {\n\t\tnext.previousSibling = previous;\n\t} else {\n\t\tparentNode.lastChild = previous;\n\t}\n\tchild.parentNode = null;\n\tchild.previousSibling = null;\n\tchild.nextSibling = null;\n\t_onUpdateChild(parentNode.ownerDocument, parentNode);\n\treturn child;\n}\n\n/**\n * Returns `true` if `node` can be a parent for insertion.\n * @param {Node} node\n * @returns {boolean}\n */\nfunction hasValidParentNodeType(node) {\n\treturn (\n\t\tnode &&\n\t\t(node.nodeType === Node.DOCUMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || node.nodeType === Node.ELEMENT_NODE)\n\t);\n}\n\n/**\n * Returns `true` if `node` can be inserted according to it's `nodeType`.\n * @param {Node} node\n * @returns {boolean}\n */\nfunction hasInsertableNodeType(node) {\n\treturn (\n\t\tnode &&\n\t\t(isElementNode(node) ||\n\t\t\tisTextNode(node) ||\n\t\t\tisDocTypeNode(node) ||\n\t\t\tnode.nodeType === Node.DOCUMENT_FRAGMENT_NODE ||\n\t\t\tnode.nodeType === Node.COMMENT_NODE ||\n\t\t\tnode.nodeType === Node.PROCESSING_INSTRUCTION_NODE)\n\t);\n}\n\n/**\n * Returns true if `node` is a DOCTYPE node\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isDocTypeNode(node) {\n\treturn node && node.nodeType === Node.DOCUMENT_TYPE_NODE;\n}\n\n/**\n * Returns true if the node is an element\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isElementNode(node) {\n\treturn node && node.nodeType === Node.ELEMENT_NODE;\n}\n/**\n * Returns true if `node` is a text node\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isTextNode(node) {\n\treturn node && node.nodeType === Node.TEXT_NODE;\n}\n\n/**\n * Check if en element node can be inserted before `child`, or at the end if child is falsy,\n * according to the presence and position of a doctype node on the same level.\n *\n * @param {Document} doc The document node\n * @param {Node} child the node that would become the nextSibling if the element would be inserted\n * @returns {boolean} `true` if an element can be inserted before child\n * @private\n * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction isElementInsertionPossible(doc, child) {\n\tvar parentChildNodes = doc.childNodes || [];\n\tif (find(parentChildNodes, isElementNode) || isDocTypeNode(child)) {\n\t\treturn false;\n\t}\n\tvar docTypeNode = find(parentChildNodes, isDocTypeNode);\n\treturn !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));\n}\n\n/**\n * Check if en element node can be inserted before `child`, or at the end if child is falsy,\n * according to the presence and position of a doctype node on the same level.\n *\n * @param {Node} doc The document node\n * @param {Node} child the node that would become the nextSibling if the element would be inserted\n * @returns {boolean} `true` if an element can be inserted before child\n * @private\n * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction isElementReplacementPossible(doc, child) {\n\tvar parentChildNodes = doc.childNodes || [];\n\n\tfunction hasElementChildThatIsNotChild(node) {\n\t\treturn isElementNode(node) && node !== child;\n\t}\n\n\tif (find(parentChildNodes, hasElementChildThatIsNotChild)) {\n\t\treturn false;\n\t}\n\tvar docTypeNode = find(parentChildNodes, isDocTypeNode);\n\treturn !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));\n}\n\n/**\n * @private\n * Steps 1-5 of the checks before inserting and before replacing a child are the same.\n *\n * @param {Node} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node=} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreInsertionValidity1to5(parent, node, child) {\n\t// 1. If `parent` is not a Document, DocumentFragment, or Element node, then throw a \"HierarchyRequestError\" DOMException.\n\tif (!hasValidParentNodeType(parent)) {\n\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Unexpected parent node type ' + parent.nodeType);\n\t}\n\t// 2. If `node` is a host-including inclusive ancestor of `parent`, then throw a \"HierarchyRequestError\" DOMException.\n\t// not implemented!\n\t// 3. If `child` is non-null and its parent is not `parent`, then throw a \"NotFoundError\" DOMException.\n\tif (child && child.parentNode !== parent) {\n\t\tthrow new DOMException(NOT_FOUND_ERR, 'child not in parent');\n\t}\n\tif (\n\t\t// 4. If `node` is not a DocumentFragment, DocumentType, Element, or CharacterData node, then throw a \"HierarchyRequestError\" DOMException.\n\t\t!hasInsertableNodeType(node) ||\n\t\t// 5. If either `node` is a Text node and `parent` is a document,\n\t\t// the sax parser currently adds top level text nodes, this will be fixed in 0.9.0\n\t\t// || (node.nodeType === Node.TEXT_NODE && parent.nodeType === Node.DOCUMENT_NODE)\n\t\t// or `node` is a doctype and `parent` is not a document, then throw a \"HierarchyRequestError\" DOMException.\n\t\t(isDocTypeNode(node) && parent.nodeType !== Node.DOCUMENT_NODE)\n\t) {\n\t\tthrow new DOMException(\n\t\t\tHIERARCHY_REQUEST_ERR,\n\t\t\t'Unexpected node type ' + node.nodeType + ' for parent node type ' + parent.nodeType\n\t\t);\n\t}\n}\n\n/**\n * @private\n * Step 6 of the checks before inserting and before replacing a child are different.\n *\n * @param {Document} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node | undefined} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreInsertionValidityInDocument(parent, node, child) {\n\tvar parentChildNodes = parent.childNodes || [];\n\tvar nodeChildNodes = node.childNodes || [];\n\n\t// DocumentFragment\n\tif (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t\tvar nodeChildElements = nodeChildNodes.filter(isElementNode);\n\t\t// If node has more than one element child or has a Text node child.\n\t\tif (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');\n\t\t}\n\t\t// Otherwise, if `node` has one element child and either `parent` has an element child,\n\t\t// `child` is a doctype, or `child` is non-null and a doctype is following `child`.\n\t\tif (nodeChildElements.length === 1 && !isElementInsertionPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');\n\t\t}\n\t}\n\t// Element\n\tif (isElementNode(node)) {\n\t\t// `parent` has an element child, `child` is a doctype,\n\t\t// or `child` is non-null and a doctype is following `child`.\n\t\tif (!isElementInsertionPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');\n\t\t}\n\t}\n\t// DocumentType\n\tif (isDocTypeNode(node)) {\n\t\t// `parent` has a doctype child,\n\t\tif (find(parentChildNodes, isDocTypeNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');\n\t\t}\n\t\tvar parentElementChild = find(parentChildNodes, isElementNode);\n\t\t// `child` is non-null and an element is preceding `child`,\n\t\tif (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');\n\t\t}\n\t\t// or `child` is null and `parent` has an element child.\n\t\tif (!child && parentElementChild) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can not be appended since element is present');\n\t\t}\n\t}\n}\n\n/**\n * @private\n * Step 6 of the checks before inserting and before replacing a child are different.\n *\n * @param {Document} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node | undefined} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreReplacementValidityInDocument(parent, node, child) {\n\tvar parentChildNodes = parent.childNodes || [];\n\tvar nodeChildNodes = node.childNodes || [];\n\n\t// DocumentFragment\n\tif (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t\tvar nodeChildElements = nodeChildNodes.filter(isElementNode);\n\t\t// If `node` has more than one element child or has a Text node child.\n\t\tif (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');\n\t\t}\n\t\t// Otherwise, if `node` has one element child and either `parent` has an element child that is not `child` or a doctype is following `child`.\n\t\tif (nodeChildElements.length === 1 && !isElementReplacementPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');\n\t\t}\n\t}\n\t// Element\n\tif (isElementNode(node)) {\n\t\t// `parent` has an element child that is not `child` or a doctype is following `child`.\n\t\tif (!isElementReplacementPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');\n\t\t}\n\t}\n\t// DocumentType\n\tif (isDocTypeNode(node)) {\n\t\tfunction hasDoctypeChildThatIsNotChild(node) {\n\t\t\treturn isDocTypeNode(node) && node !== child;\n\t\t}\n\n\t\t// `parent` has a doctype child that is not `child`,\n\t\tif (find(parentChildNodes, hasDoctypeChildThatIsNotChild)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');\n\t\t}\n\t\tvar parentElementChild = find(parentChildNodes, isElementNode);\n\t\t// or an element is preceding `child`.\n\t\tif (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');\n\t\t}\n\t}\n}\n\n/**\n * @private\n * @param {Node} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node=} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction _insertBefore(parent, node, child, _inDocumentAssertion) {\n\t// To ensure pre-insertion validity of a node into a parent before a child, run these steps:\n\tassertPreInsertionValidity1to5(parent, node, child);\n\n\t// If parent is a document, and any of the statements below, switched on the interface node implements,\n\t// are true, then throw a \"HierarchyRequestError\" DOMException.\n\tif (parent.nodeType === Node.DOCUMENT_NODE) {\n\t\t(_inDocumentAssertion || assertPreInsertionValidityInDocument)(parent, node, child);\n\t}\n\n\tvar cp = node.parentNode;\n\tif(cp){\n\t\tcp.removeChild(node);//remove and update\n\t}\n\tif(node.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\tvar newFirst = node.firstChild;\n\t\tif (newFirst == null) {\n\t\t\treturn node;\n\t\t}\n\t\tvar newLast = node.lastChild;\n\t}else{\n\t\tnewFirst = newLast = node;\n\t}\n\tvar pre = child ? child.previousSibling : parent.lastChild;\n\n\tnewFirst.previousSibling = pre;\n\tnewLast.nextSibling = child;\n\n\n\tif(pre){\n\t\tpre.nextSibling = newFirst;\n\t}else{\n\t\tparent.firstChild = newFirst;\n\t}\n\tif(child == null){\n\t\tparent.lastChild = newLast;\n\t}else{\n\t\tchild.previousSibling = newLast;\n\t}\n\tdo{\n\t\tnewFirst.parentNode = parent;\n\t\t// Update ownerDocument for each node being inserted\n\t\tvar targetDoc = parent.ownerDocument || parent;\n\t\t_updateOwnerDocument(newFirst, targetDoc);\n\t}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))\n\t_onUpdateChild(parent.ownerDocument||parent, parent);\n\t//console.log(parent.lastChild.nextSibling == null)\n\tif (node.nodeType == DOCUMENT_FRAGMENT_NODE) {\n\t\tnode.firstChild = node.lastChild = null;\n\t}\n\treturn node;\n}\n\n/**\n * Recursively updates the ownerDocument property for a node and all its descendants\n * @param {Node} node\n * @param {Document} newOwnerDocument\n * @private\n */\nfunction _updateOwnerDocument(node, newOwnerDocument) {\n\tif (node.ownerDocument === newOwnerDocument) {\n\t\treturn;\n\t}\n\t\n\tnode.ownerDocument = newOwnerDocument;\n\t\n\t// Update attributes if this is an element\n\tif (node.nodeType === ELEMENT_NODE && node.attributes) {\n\t\tfor (var i = 0; i < node.attributes.length; i++) {\n\t\t\tvar attr = node.attributes.item(i);\n\t\t\tif (attr) {\n\t\t\t\tattr.ownerDocument = newOwnerDocument;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// Recursively update child nodes\n\tvar child = node.firstChild;\n\twhile (child) {\n\t\t_updateOwnerDocument(child, newOwnerDocument);\n\t\tchild = child.nextSibling;\n\t}\n}\n\n/**\n * Appends `newChild` to `parentNode`.\n * If `newChild` is already connected to a `parentNode` it is first removed from it.\n *\n * @see https://github.com/xmldom/xmldom/issues/135\n * @see https://github.com/xmldom/xmldom/issues/145\n * @param {Node} parentNode\n * @param {Node} newChild\n * @returns {Node}\n * @private\n */\nfunction _appendSingleChild (parentNode, newChild) {\n\tif (newChild.parentNode) {\n\t\tnewChild.parentNode.removeChild(newChild);\n\t}\n\tnewChild.parentNode = parentNode;\n\tnewChild.previousSibling = parentNode.lastChild;\n\tnewChild.nextSibling = null;\n\tif (newChild.previousSibling) {\n\t\tnewChild.previousSibling.nextSibling = newChild;\n\t} else {\n\t\tparentNode.firstChild = newChild;\n\t}\n\tparentNode.lastChild = newChild;\n\t_onUpdateChild(parentNode.ownerDocument, parentNode, newChild);\n\t\n\t// Update ownerDocument for the new child and all its descendants\n\tvar targetDoc = parentNode.ownerDocument || parentNode;\n\t_updateOwnerDocument(newChild, targetDoc);\n\t\n\treturn newChild;\n}\n\nDocument.prototype = {\n\t//implementation : null,\n\tnodeName : '#document',\n\tnodeType : DOCUMENT_NODE,\n\t/**\n\t * The DocumentType node of the document.\n\t *\n\t * @readonly\n\t * @type DocumentType\n\t */\n\tdoctype : null,\n\tdocumentElement : null,\n\t_inc : 1,\n\n\tinsertBefore : function(newChild, refChild){//raises\n\t\tif(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){\n\t\t\tvar child = newChild.firstChild;\n\t\t\twhile(child){\n\t\t\t\tvar next = child.nextSibling;\n\t\t\t\tthis.insertBefore(child,refChild);\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t\treturn newChild;\n\t\t}\n\t\t_insertBefore(this, newChild, refChild);\n\t\t_updateOwnerDocument(newChild, this);\n\t\tif (this.documentElement === null && newChild.nodeType === ELEMENT_NODE) {\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\n\t\treturn newChild;\n\t},\n\tremoveChild : function(oldChild){\n\t\tif(this.documentElement == oldChild){\n\t\t\tthis.documentElement = null;\n\t\t}\n\t\treturn _removeChild(this,oldChild);\n\t},\n\treplaceChild: function (newChild, oldChild) {\n\t\t//raises\n\t\t_insertBefore(this, newChild, oldChild, assertPreReplacementValidityInDocument);\n\t\t_updateOwnerDocument(newChild, this);\n\t\tif (oldChild) {\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t\tif (isElementNode(newChild)) {\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\t},\n\t// Introduced in DOM Level 2:\n\timportNode : function(importedNode,deep){\n\t\treturn importNode(this,importedNode,deep);\n\t},\n\t// Introduced in DOM Level 2:\n\tgetElementById :\tfunction(id){\n\t\tvar rtv = null;\n\t\t_visitNode(this.documentElement,function(node){\n\t\t\tif(node.nodeType == ELEMENT_NODE){\n\t\t\t\tif(node.getAttribute('id') == id){\n\t\t\t\t\trtv = node;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\treturn rtv;\n\t},\n\n\t/**\n\t * The `getElementsByClassName` method of `Document` interface returns an array-like object\n\t * of all child elements which have **all** of the given class name(s).\n\t *\n\t * Returns an empty list if `classeNames` is an empty string or only contains HTML white space characters.\n\t *\n\t *\n\t * Warning: This is a live LiveNodeList.\n\t * Changes in the DOM will reflect in the array as the changes occur.\n\t * If an element selected by this array no longer qualifies for the selector,\n\t * it will automatically be removed. Be aware of this for iteration purposes.\n\t *\n\t * @param {string} classNames is a string representing the class name(s) to match; multiple class names are separated by (ASCII-)whitespace\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName\n\t * @see https://dom.spec.whatwg.org/#concept-getelementsbyclassname\n\t */\n\tgetElementsByClassName: function(classNames) {\n\t\tvar classNamesSet = toOrderedSet(classNames)\n\t\treturn new LiveNodeList(this, function(base) {\n\t\t\tvar ls = [];\n\t\t\tif (classNamesSet.length > 0) {\n\t\t\t\t_visitNode(base.documentElement, function(node) {\n\t\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE) {\n\t\t\t\t\t\tvar nodeClassNames = node.getAttribute('class')\n\t\t\t\t\t\t// can be null if the attribute does not exist\n\t\t\t\t\t\tif (nodeClassNames) {\n\t\t\t\t\t\t\t// before splitting and iterating just compare them for the most common case\n\t\t\t\t\t\t\tvar matches = classNames === nodeClassNames;\n\t\t\t\t\t\t\tif (!matches) {\n\t\t\t\t\t\t\t\tvar nodeClassNamesSet = toOrderedSet(nodeClassNames)\n\t\t\t\t\t\t\t\tmatches = classNamesSet.every(arrayIncludes(nodeClassNamesSet))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(matches) {\n\t\t\t\t\t\t\t\tls.push(node);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ls;\n\t\t});\n\t},\n\n\t//document factory method:\n\tcreateElement :\tfunction(tagName){\n\t\tvar node = new Element();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = tagName;\n\t\tnode.tagName = tagName;\n\t\tnode.localName = tagName;\n\t\tnode.childNodes = new NodeList();\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\tcreateDocumentFragment :\tfunction(){\n\t\tvar node = new DocumentFragment();\n\t\tnode.ownerDocument = this;\n\t\tnode.childNodes = new NodeList();\n\t\treturn node;\n\t},\n\tcreateTextNode :\tfunction(data){\n\t\tvar node = new Text();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateComment :\tfunction(data){\n\t\tvar node = new Comment();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateCDATASection :\tfunction(data){\n\t\tvar node = new CDATASection();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateProcessingInstruction :\tfunction(target,data){\n\t\tvar node = new ProcessingInstruction();\n\t\tnode.ownerDocument = this;\n\t\tnode.tagName = node.nodeName = node.target = target;\n\t\tnode.nodeValue = node.data = data;\n\t\treturn node;\n\t},\n\tcreateAttribute :\tfunction(name){\n\t\tvar node = new Attr();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.name = name;\n\t\tnode.nodeName\t= name;\n\t\tnode.localName = name;\n\t\tnode.specified = true;\n\t\treturn node;\n\t},\n\tcreateEntityReference :\tfunction(name){\n\t\tvar node = new EntityReference();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.nodeName\t= name;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateElementNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Element();\n\t\tvar pl = qualifiedName.split(':');\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tnode.childNodes = new NodeList();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.tagName = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateAttributeNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Attr();\n\t\tvar pl = qualifiedName.split(':');\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.name = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tnode.specified = true;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\treturn node;\n\t}\n};\n_extends(Document,Node);\n\n\nfunction Element() {\n\tthis._nsMap = {};\n};\nElement.prototype = {\n\tnodeType : ELEMENT_NODE,\n\thasAttribute : function(name){\n\t\treturn this.getAttributeNode(name)!=null;\n\t},\n\tgetAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name);\n\t\treturn attr && attr.value || '';\n\t},\n\tgetAttributeNode : function(name){\n\t\treturn this.attributes.getNamedItem(name);\n\t},\n\tsetAttribute : function(name, value){\n\t\tvar attr = this.ownerDocument.createAttribute(name);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tremoveAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name)\n\t\tattr && this.removeAttributeNode(attr);\n\t},\n\n\t//four real opeartion method\n\tappendChild:function(newChild){\n\t\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\t\treturn this.insertBefore(newChild,null);\n\t\t}else{\n\t\t\treturn _appendSingleChild(this,newChild);\n\t\t}\n\t},\n\tsetAttributeNode : function(newAttr){\n\t\treturn this.attributes.setNamedItem(newAttr);\n\t},\n\tsetAttributeNodeNS : function(newAttr){\n\t\treturn this.attributes.setNamedItemNS(newAttr);\n\t},\n\tremoveAttributeNode : function(oldAttr){\n\t\t//console.log(this == oldAttr.ownerElement)\n\t\treturn this.attributes.removeNamedItem(oldAttr.nodeName);\n\t},\n\t//get real attribute name,and remove it by removeAttributeNode\n\tremoveAttributeNS : function(namespaceURI, localName){\n\t\tvar old = this.getAttributeNodeNS(namespaceURI, localName);\n\t\told && this.removeAttributeNode(old);\n\t},\n\n\thasAttributeNS : function(namespaceURI, localName){\n\t\treturn this.getAttributeNodeNS(namespaceURI, localName)!=null;\n\t},\n\tgetAttributeNS : function(namespaceURI, localName){\n\t\tvar attr = this.getAttributeNodeNS(namespaceURI, localName);\n\t\treturn attr && attr.value || '';\n\t},\n\tsetAttributeNS : function(namespaceURI, qualifiedName, value){\n\t\tvar attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tgetAttributeNodeNS : function(namespaceURI, localName){\n\t\treturn this.attributes.getNamedItemNS(namespaceURI, localName);\n\t},\n\n\tgetElementsByTagName : function(tagName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t});\n\t},\n\tgetElementsByTagNameNS : function(namespaceURI, localName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\n\t\t});\n\t}\n};\nDocument.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;\nDocument.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;\n\n\n_extends(Element,Node);\nfunction Attr() {\n};\nAttr.prototype.nodeType = ATTRIBUTE_NODE;\n_extends(Attr,Node);\n\n\nfunction CharacterData() {\n};\nCharacterData.prototype = {\n\tdata : '',\n\tsubstringData : function(offset, count) {\n\t\treturn this.data.substring(offset, offset+count);\n\t},\n\tappendData: function(text) {\n\t\ttext = this.data+text;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t},\n\tinsertData: function(offset,text) {\n\t\tthis.replaceData(offset,0,text);\n\n\t},\n\tappendChild:function(newChild){\n\t\tthrow new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])\n\t},\n\tdeleteData: function(offset, count) {\n\t\tthis.replaceData(offset,count,\"\");\n\t},\n\treplaceData: function(offset, count, text) {\n\t\tvar start = this.data.substring(0,offset);\n\t\tvar end = this.data.substring(offset+count);\n\t\ttext = start + text + end;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t}\n}\n_extends(CharacterData,Node);\nfunction Text() {\n};\nText.prototype = {\n\tnodeName : \"#text\",\n\tnodeType : TEXT_NODE,\n\tsplitText : function(offset) {\n\t\tvar text = this.data;\n\t\tvar newText = text.substring(offset);\n\t\ttext = text.substring(0, offset);\n\t\tthis.data = this.nodeValue = text;\n\t\tthis.length = text.length;\n\t\tvar newNode = this.ownerDocument.createTextNode(newText);\n\t\tif(this.parentNode){\n\t\t\tthis.parentNode.insertBefore(newNode, this.nextSibling);\n\t\t}\n\t\treturn newNode;\n\t}\n}\n_extends(Text,CharacterData);\nfunction Comment() {\n};\nComment.prototype = {\n\tnodeName : \"#comment\",\n\tnodeType : COMMENT_NODE\n}\n_extends(Comment,CharacterData);\n\nfunction CDATASection() {\n};\nCDATASection.prototype = {\n\tnodeName : \"#cdata-section\",\n\tnodeType : CDATA_SECTION_NODE\n}\n_extends(CDATASection,CharacterData);\n\n\nfunction DocumentType() {\n};\nDocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;\n_extends(DocumentType,Node);\n\nfunction Notation() {\n};\nNotation.prototype.nodeType = NOTATION_NODE;\n_extends(Notation,Node);\n\nfunction Entity() {\n};\nEntity.prototype.nodeType = ENTITY_NODE;\n_extends(Entity,Node);\n\nfunction EntityReference() {\n};\nEntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;\n_extends(EntityReference,Node);\n\nfunction DocumentFragment() {\n};\nDocumentFragment.prototype.nodeName =\t\"#document-fragment\";\nDocumentFragment.prototype.nodeType =\tDOCUMENT_FRAGMENT_NODE;\n_extends(DocumentFragment,Node);\n\n\nfunction ProcessingInstruction() {\n}\nProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;\n_extends(ProcessingInstruction,Node);\nfunction XMLSerializer(){}\nXMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){\n\treturn nodeSerializeToString.call(node,isHtml,nodeFilter);\n}\nNode.prototype.toString = nodeSerializeToString;\nfunction nodeSerializeToString(isHtml,nodeFilter){\n\tvar buf = [];\n\tvar refNode = this.nodeType == 9 && this.documentElement || this;\n\tvar prefix = refNode.prefix;\n\tvar uri = refNode.namespaceURI;\n\n\tif(uri && prefix == null){\n\t\t//console.log(prefix)\n\t\tvar prefix = refNode.lookupPrefix(uri);\n\t\tif(prefix == null){\n\t\t\t//isHTML = true;\n\t\t\tvar visibleNamespaces=[\n\t\t\t{namespace:uri,prefix:null}\n\t\t\t//{namespace:uri,prefix:''}\n\t\t\t]\n\t\t}\n\t}\n\tserializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);\n\t//console.log('###',this.nodeType,uri,prefix,buf.join(''))\n\treturn buf.join('');\n}\n\nfunction needNamespaceDefine(node, isHTML, visibleNamespaces) {\n\tvar prefix = node.prefix || '';\n\tvar uri = node.namespaceURI;\n\t// According to [Namespaces in XML 1.0](https://www.w3.org/TR/REC-xml-names/#ns-using) ,\n\t// and more specifically https://www.w3.org/TR/REC-xml-names/#nsc-NoPrefixUndecl :\n\t// > In a namespace declaration for a prefix [...], the attribute value MUST NOT be empty.\n\t// in a similar manner [Namespaces in XML 1.1](https://www.w3.org/TR/xml-names11/#ns-using)\n\t// and more specifically https://www.w3.org/TR/xml-names11/#nsc-NSDeclared :\n\t// > [...] Furthermore, the attribute value [...] must not be an empty string.\n\t// so serializing empty namespace value like xmlns:ds=\"\" would produce an invalid XML document.\n\tif (!uri) {\n\t\treturn false;\n\t}\n\tif (prefix === \"xml\" && uri === NAMESPACE.XML || uri === NAMESPACE.XMLNS) {\n\t\treturn false;\n\t}\n\n\tvar i = visibleNamespaces.length\n\twhile (i--) {\n\t\tvar ns = visibleNamespaces[i];\n\t\t// get namespace prefix\n\t\tif (ns.prefix === prefix) {\n\t\t\treturn ns.namespace !== uri;\n\t\t}\n\t}\n\treturn true;\n}\n/**\n * Well-formed constraint: No < in Attribute Values\n * > The replacement text of any entity referred to directly or indirectly\n * > in an attribute value must not contain a <.\n * @see https://www.w3.org/TR/xml11/#CleanAttrVals\n * @see https://www.w3.org/TR/xml11/#NT-AttValue\n *\n * Literal whitespace other than space that appear in attribute values\n * are serialized as their entity references, so they will be preserved.\n * (In contrast to whitespace literals in the input which are normalized to spaces)\n * @see https://www.w3.org/TR/xml11/#AVNormalize\n * @see https://w3c.github.io/DOM-Parsing/#serializing-an-element-s-attributes\n */\nfunction addSerializedAttribute(buf, qualifiedName, value) {\n\tbuf.push(' ', qualifiedName, '=\"', value.replace(/[<>&\"\\t\\n\\r]/g, _xmlEncoder), '\"')\n}\n\nfunction serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){\n\tif (!visibleNamespaces) {\n\t\tvisibleNamespaces = [];\n\t}\n\n\tif(nodeFilter){\n\t\tnode = nodeFilter(node);\n\t\tif(node){\n\t\t\tif(typeof node == 'string'){\n\t\t\t\tbuf.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\treturn;\n\t\t}\n\t\t//buf.sort.apply(attrs, attributeSorter);\n\t}\n\n\tswitch(node.nodeType){\n\tcase ELEMENT_NODE:\n\t\tvar attrs = node.attributes;\n\t\tvar len = attrs.length;\n\t\tvar child = node.firstChild;\n\t\tvar nodeName = node.tagName;\n\n\t\tisHTML = NAMESPACE.isHTML(node.namespaceURI) || isHTML\n\n\t\tvar prefixedNodeName = nodeName\n\t\tif (!isHTML && !node.prefix && node.namespaceURI) {\n\t\t\tvar defaultNS\n\t\t\t// lookup current default ns from `xmlns` attribute\n\t\t\tfor (var ai = 0; ai < attrs.length; ai++) {\n\t\t\t\tif (attrs.item(ai).name === 'xmlns') {\n\t\t\t\t\tdefaultNS = attrs.item(ai).value\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!defaultNS) {\n\t\t\t\t// lookup current default ns in visibleNamespaces\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.prefix === '' && namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tdefaultNS = namespace.namespace\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (defaultNS !== node.namespaceURI) {\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tif (namespace.prefix) {\n\t\t\t\t\t\t\tprefixedNodeName = namespace.prefix + ':' + nodeName\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbuf.push('<', prefixedNodeName);\n\n\t\tfor(var i=0;i');\n\t\t\t//if is cdata child node\n\t\t\tif(isHTML && /^script$/i.test(nodeName)){\n\t\t\t\twhile(child){\n\t\t\t\t\tif(child.data){\n\t\t\t\t\t\tbuf.push(child.data);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\t}\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\twhile(child){\n\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuf.push('');\n\t\t}else{\n\t\t\tbuf.push('/>');\n\t\t}\n\t\t// remove added visible namespaces\n\t\t//visibleNamespaces.length = startVisibleNamespaces;\n\t\treturn;\n\tcase DOCUMENT_NODE:\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t\treturn;\n\tcase ATTRIBUTE_NODE:\n\t\treturn addSerializedAttribute(buf, node.name, node.value);\n\tcase TEXT_NODE:\n\t\t/**\n\t\t * The ampersand character (&) and the left angle bracket (<) must not appear in their literal form,\n\t\t * except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section.\n\t\t * If they are needed elsewhere, they must be escaped using either numeric character references or the strings\n\t\t * `&` and `<` respectively.\n\t\t * The right angle bracket (>) may be represented using the string \" > \", and must, for compatibility,\n\t\t * be escaped using either `>` or a character reference when it appears in the string `]]>` in content,\n\t\t * when that string is not marking the end of a CDATA section.\n\t\t *\n\t\t * In the content of elements, character data is any string of characters\n\t\t * which does not contain the start-delimiter of any markup\n\t\t * and does not include the CDATA-section-close delimiter, `]]>`.\n\t\t *\n\t\t * @see https://www.w3.org/TR/xml/#NT-CharData\n\t\t * @see https://w3c.github.io/DOM-Parsing/#xml-serializing-a-text-node\n\t\t */\n\t\treturn buf.push(node.data\n\t\t\t.replace(/[<&>]/g,_xmlEncoder)\n\t\t);\n\tcase CDATA_SECTION_NODE:\n\t\treturn buf.push( '');\n\tcase COMMENT_NODE:\n\t\treturn buf.push( \"\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM ', sysid, '>');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i',\n\tlt: '<',\n\tquot: '\"',\n});\n\n/**\n * A map of all entities that are detected in an HTML document.\n * They contain all entries from `XML_ENTITIES`.\n *\n * @see XML_ENTITIES\n * @see DOMParser.parseFromString\n * @see DOMImplementation.prototype.createHTMLDocument\n * @see https://html.spec.whatwg.org/#named-character-references WHATWG HTML(5) Spec\n * @see https://html.spec.whatwg.org/entities.json JSON\n * @see https://www.w3.org/TR/xml-entity-names/ W3C XML Entity Names\n * @see https://www.w3.org/TR/html4/sgml/entities.html W3C HTML4/SGML\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML Wikipedia (HTML)\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML Wikpedia (XHTML)\n */\nexports.HTML_ENTITIES = freeze({\n\tAacute: '\\u00C1',\n\taacute: '\\u00E1',\n\tAbreve: '\\u0102',\n\tabreve: '\\u0103',\n\tac: '\\u223E',\n\tacd: '\\u223F',\n\tacE: '\\u223E\\u0333',\n\tAcirc: '\\u00C2',\n\tacirc: '\\u00E2',\n\tacute: '\\u00B4',\n\tAcy: '\\u0410',\n\tacy: '\\u0430',\n\tAElig: '\\u00C6',\n\taelig: '\\u00E6',\n\taf: '\\u2061',\n\tAfr: '\\uD835\\uDD04',\n\tafr: '\\uD835\\uDD1E',\n\tAgrave: '\\u00C0',\n\tagrave: '\\u00E0',\n\talefsym: '\\u2135',\n\taleph: '\\u2135',\n\tAlpha: '\\u0391',\n\talpha: '\\u03B1',\n\tAmacr: '\\u0100',\n\tamacr: '\\u0101',\n\tamalg: '\\u2A3F',\n\tAMP: '\\u0026',\n\tamp: '\\u0026',\n\tAnd: '\\u2A53',\n\tand: '\\u2227',\n\tandand: '\\u2A55',\n\tandd: '\\u2A5C',\n\tandslope: '\\u2A58',\n\tandv: '\\u2A5A',\n\tang: '\\u2220',\n\tange: '\\u29A4',\n\tangle: '\\u2220',\n\tangmsd: '\\u2221',\n\tangmsdaa: '\\u29A8',\n\tangmsdab: '\\u29A9',\n\tangmsdac: '\\u29AA',\n\tangmsdad: '\\u29AB',\n\tangmsdae: '\\u29AC',\n\tangmsdaf: '\\u29AD',\n\tangmsdag: '\\u29AE',\n\tangmsdah: '\\u29AF',\n\tangrt: '\\u221F',\n\tangrtvb: '\\u22BE',\n\tangrtvbd: '\\u299D',\n\tangsph: '\\u2222',\n\tangst: '\\u00C5',\n\tangzarr: '\\u237C',\n\tAogon: '\\u0104',\n\taogon: '\\u0105',\n\tAopf: '\\uD835\\uDD38',\n\taopf: '\\uD835\\uDD52',\n\tap: '\\u2248',\n\tapacir: '\\u2A6F',\n\tapE: '\\u2A70',\n\tape: '\\u224A',\n\tapid: '\\u224B',\n\tapos: '\\u0027',\n\tApplyFunction: '\\u2061',\n\tapprox: '\\u2248',\n\tapproxeq: '\\u224A',\n\tAring: '\\u00C5',\n\taring: '\\u00E5',\n\tAscr: '\\uD835\\uDC9C',\n\tascr: '\\uD835\\uDCB6',\n\tAssign: '\\u2254',\n\tast: '\\u002A',\n\tasymp: '\\u2248',\n\tasympeq: '\\u224D',\n\tAtilde: '\\u00C3',\n\tatilde: '\\u00E3',\n\tAuml: '\\u00C4',\n\tauml: '\\u00E4',\n\tawconint: '\\u2233',\n\tawint: '\\u2A11',\n\tbackcong: '\\u224C',\n\tbackepsilon: '\\u03F6',\n\tbackprime: '\\u2035',\n\tbacksim: '\\u223D',\n\tbacksimeq: '\\u22CD',\n\tBackslash: '\\u2216',\n\tBarv: '\\u2AE7',\n\tbarvee: '\\u22BD',\n\tBarwed: '\\u2306',\n\tbarwed: '\\u2305',\n\tbarwedge: '\\u2305',\n\tbbrk: '\\u23B5',\n\tbbrktbrk: '\\u23B6',\n\tbcong: '\\u224C',\n\tBcy: '\\u0411',\n\tbcy: '\\u0431',\n\tbdquo: '\\u201E',\n\tbecaus: '\\u2235',\n\tBecause: '\\u2235',\n\tbecause: '\\u2235',\n\tbemptyv: '\\u29B0',\n\tbepsi: '\\u03F6',\n\tbernou: '\\u212C',\n\tBernoullis: '\\u212C',\n\tBeta: '\\u0392',\n\tbeta: '\\u03B2',\n\tbeth: '\\u2136',\n\tbetween: '\\u226C',\n\tBfr: '\\uD835\\uDD05',\n\tbfr: '\\uD835\\uDD1F',\n\tbigcap: '\\u22C2',\n\tbigcirc: '\\u25EF',\n\tbigcup: '\\u22C3',\n\tbigodot: '\\u2A00',\n\tbigoplus: '\\u2A01',\n\tbigotimes: '\\u2A02',\n\tbigsqcup: '\\u2A06',\n\tbigstar: '\\u2605',\n\tbigtriangledown: '\\u25BD',\n\tbigtriangleup: '\\u25B3',\n\tbiguplus: '\\u2A04',\n\tbigvee: '\\u22C1',\n\tbigwedge: '\\u22C0',\n\tbkarow: '\\u290D',\n\tblacklozenge: '\\u29EB',\n\tblacksquare: '\\u25AA',\n\tblacktriangle: '\\u25B4',\n\tblacktriangledown: '\\u25BE',\n\tblacktriangleleft: '\\u25C2',\n\tblacktriangleright: '\\u25B8',\n\tblank: '\\u2423',\n\tblk12: '\\u2592',\n\tblk14: '\\u2591',\n\tblk34: '\\u2593',\n\tblock: '\\u2588',\n\tbne: '\\u003D\\u20E5',\n\tbnequiv: '\\u2261\\u20E5',\n\tbNot: '\\u2AED',\n\tbnot: '\\u2310',\n\tBopf: '\\uD835\\uDD39',\n\tbopf: '\\uD835\\uDD53',\n\tbot: '\\u22A5',\n\tbottom: '\\u22A5',\n\tbowtie: '\\u22C8',\n\tboxbox: '\\u29C9',\n\tboxDL: '\\u2557',\n\tboxDl: '\\u2556',\n\tboxdL: '\\u2555',\n\tboxdl: '\\u2510',\n\tboxDR: '\\u2554',\n\tboxDr: '\\u2553',\n\tboxdR: '\\u2552',\n\tboxdr: '\\u250C',\n\tboxH: '\\u2550',\n\tboxh: '\\u2500',\n\tboxHD: '\\u2566',\n\tboxHd: '\\u2564',\n\tboxhD: '\\u2565',\n\tboxhd: '\\u252C',\n\tboxHU: '\\u2569',\n\tboxHu: '\\u2567',\n\tboxhU: '\\u2568',\n\tboxhu: '\\u2534',\n\tboxminus: '\\u229F',\n\tboxplus: '\\u229E',\n\tboxtimes: '\\u22A0',\n\tboxUL: '\\u255D',\n\tboxUl: '\\u255C',\n\tboxuL: '\\u255B',\n\tboxul: '\\u2518',\n\tboxUR: '\\u255A',\n\tboxUr: '\\u2559',\n\tboxuR: '\\u2558',\n\tboxur: '\\u2514',\n\tboxV: '\\u2551',\n\tboxv: '\\u2502',\n\tboxVH: '\\u256C',\n\tboxVh: '\\u256B',\n\tboxvH: '\\u256A',\n\tboxvh: '\\u253C',\n\tboxVL: '\\u2563',\n\tboxVl: '\\u2562',\n\tboxvL: '\\u2561',\n\tboxvl: '\\u2524',\n\tboxVR: '\\u2560',\n\tboxVr: '\\u255F',\n\tboxvR: '\\u255E',\n\tboxvr: '\\u251C',\n\tbprime: '\\u2035',\n\tBreve: '\\u02D8',\n\tbreve: '\\u02D8',\n\tbrvbar: '\\u00A6',\n\tBscr: '\\u212C',\n\tbscr: '\\uD835\\uDCB7',\n\tbsemi: '\\u204F',\n\tbsim: '\\u223D',\n\tbsime: '\\u22CD',\n\tbsol: '\\u005C',\n\tbsolb: '\\u29C5',\n\tbsolhsub: '\\u27C8',\n\tbull: '\\u2022',\n\tbullet: '\\u2022',\n\tbump: '\\u224E',\n\tbumpE: '\\u2AAE',\n\tbumpe: '\\u224F',\n\tBumpeq: '\\u224E',\n\tbumpeq: '\\u224F',\n\tCacute: '\\u0106',\n\tcacute: '\\u0107',\n\tCap: '\\u22D2',\n\tcap: '\\u2229',\n\tcapand: '\\u2A44',\n\tcapbrcup: '\\u2A49',\n\tcapcap: '\\u2A4B',\n\tcapcup: '\\u2A47',\n\tcapdot: '\\u2A40',\n\tCapitalDifferentialD: '\\u2145',\n\tcaps: '\\u2229\\uFE00',\n\tcaret: '\\u2041',\n\tcaron: '\\u02C7',\n\tCayleys: '\\u212D',\n\tccaps: '\\u2A4D',\n\tCcaron: '\\u010C',\n\tccaron: '\\u010D',\n\tCcedil: '\\u00C7',\n\tccedil: '\\u00E7',\n\tCcirc: '\\u0108',\n\tccirc: '\\u0109',\n\tCconint: '\\u2230',\n\tccups: '\\u2A4C',\n\tccupssm: '\\u2A50',\n\tCdot: '\\u010A',\n\tcdot: '\\u010B',\n\tcedil: '\\u00B8',\n\tCedilla: '\\u00B8',\n\tcemptyv: '\\u29B2',\n\tcent: '\\u00A2',\n\tCenterDot: '\\u00B7',\n\tcenterdot: '\\u00B7',\n\tCfr: '\\u212D',\n\tcfr: '\\uD835\\uDD20',\n\tCHcy: '\\u0427',\n\tchcy: '\\u0447',\n\tcheck: '\\u2713',\n\tcheckmark: '\\u2713',\n\tChi: '\\u03A7',\n\tchi: '\\u03C7',\n\tcir: '\\u25CB',\n\tcirc: '\\u02C6',\n\tcirceq: '\\u2257',\n\tcirclearrowleft: '\\u21BA',\n\tcirclearrowright: '\\u21BB',\n\tcircledast: '\\u229B',\n\tcircledcirc: '\\u229A',\n\tcircleddash: '\\u229D',\n\tCircleDot: '\\u2299',\n\tcircledR: '\\u00AE',\n\tcircledS: '\\u24C8',\n\tCircleMinus: '\\u2296',\n\tCirclePlus: '\\u2295',\n\tCircleTimes: '\\u2297',\n\tcirE: '\\u29C3',\n\tcire: '\\u2257',\n\tcirfnint: '\\u2A10',\n\tcirmid: '\\u2AEF',\n\tcirscir: '\\u29C2',\n\tClockwiseContourIntegral: '\\u2232',\n\tCloseCurlyDoubleQuote: '\\u201D',\n\tCloseCurlyQuote: '\\u2019',\n\tclubs: '\\u2663',\n\tclubsuit: '\\u2663',\n\tColon: '\\u2237',\n\tcolon: '\\u003A',\n\tColone: '\\u2A74',\n\tcolone: '\\u2254',\n\tcoloneq: '\\u2254',\n\tcomma: '\\u002C',\n\tcommat: '\\u0040',\n\tcomp: '\\u2201',\n\tcompfn: '\\u2218',\n\tcomplement: '\\u2201',\n\tcomplexes: '\\u2102',\n\tcong: '\\u2245',\n\tcongdot: '\\u2A6D',\n\tCongruent: '\\u2261',\n\tConint: '\\u222F',\n\tconint: '\\u222E',\n\tContourIntegral: '\\u222E',\n\tCopf: '\\u2102',\n\tcopf: '\\uD835\\uDD54',\n\tcoprod: '\\u2210',\n\tCoproduct: '\\u2210',\n\tCOPY: '\\u00A9',\n\tcopy: '\\u00A9',\n\tcopysr: '\\u2117',\n\tCounterClockwiseContourIntegral: '\\u2233',\n\tcrarr: '\\u21B5',\n\tCross: '\\u2A2F',\n\tcross: '\\u2717',\n\tCscr: '\\uD835\\uDC9E',\n\tcscr: '\\uD835\\uDCB8',\n\tcsub: '\\u2ACF',\n\tcsube: '\\u2AD1',\n\tcsup: '\\u2AD0',\n\tcsupe: '\\u2AD2',\n\tctdot: '\\u22EF',\n\tcudarrl: '\\u2938',\n\tcudarrr: '\\u2935',\n\tcuepr: '\\u22DE',\n\tcuesc: '\\u22DF',\n\tcularr: '\\u21B6',\n\tcularrp: '\\u293D',\n\tCup: '\\u22D3',\n\tcup: '\\u222A',\n\tcupbrcap: '\\u2A48',\n\tCupCap: '\\u224D',\n\tcupcap: '\\u2A46',\n\tcupcup: '\\u2A4A',\n\tcupdot: '\\u228D',\n\tcupor: '\\u2A45',\n\tcups: '\\u222A\\uFE00',\n\tcurarr: '\\u21B7',\n\tcurarrm: '\\u293C',\n\tcurlyeqprec: '\\u22DE',\n\tcurlyeqsucc: '\\u22DF',\n\tcurlyvee: '\\u22CE',\n\tcurlywedge: '\\u22CF',\n\tcurren: '\\u00A4',\n\tcurvearrowleft: '\\u21B6',\n\tcurvearrowright: '\\u21B7',\n\tcuvee: '\\u22CE',\n\tcuwed: '\\u22CF',\n\tcwconint: '\\u2232',\n\tcwint: '\\u2231',\n\tcylcty: '\\u232D',\n\tDagger: '\\u2021',\n\tdagger: '\\u2020',\n\tdaleth: '\\u2138',\n\tDarr: '\\u21A1',\n\tdArr: '\\u21D3',\n\tdarr: '\\u2193',\n\tdash: '\\u2010',\n\tDashv: '\\u2AE4',\n\tdashv: '\\u22A3',\n\tdbkarow: '\\u290F',\n\tdblac: '\\u02DD',\n\tDcaron: '\\u010E',\n\tdcaron: '\\u010F',\n\tDcy: '\\u0414',\n\tdcy: '\\u0434',\n\tDD: '\\u2145',\n\tdd: '\\u2146',\n\tddagger: '\\u2021',\n\tddarr: '\\u21CA',\n\tDDotrahd: '\\u2911',\n\tddotseq: '\\u2A77',\n\tdeg: '\\u00B0',\n\tDel: '\\u2207',\n\tDelta: '\\u0394',\n\tdelta: '\\u03B4',\n\tdemptyv: '\\u29B1',\n\tdfisht: '\\u297F',\n\tDfr: '\\uD835\\uDD07',\n\tdfr: '\\uD835\\uDD21',\n\tdHar: '\\u2965',\n\tdharl: '\\u21C3',\n\tdharr: '\\u21C2',\n\tDiacriticalAcute: '\\u00B4',\n\tDiacriticalDot: '\\u02D9',\n\tDiacriticalDoubleAcute: '\\u02DD',\n\tDiacriticalGrave: '\\u0060',\n\tDiacriticalTilde: '\\u02DC',\n\tdiam: '\\u22C4',\n\tDiamond: '\\u22C4',\n\tdiamond: '\\u22C4',\n\tdiamondsuit: '\\u2666',\n\tdiams: '\\u2666',\n\tdie: '\\u00A8',\n\tDifferentialD: '\\u2146',\n\tdigamma: '\\u03DD',\n\tdisin: '\\u22F2',\n\tdiv: '\\u00F7',\n\tdivide: '\\u00F7',\n\tdivideontimes: '\\u22C7',\n\tdivonx: '\\u22C7',\n\tDJcy: '\\u0402',\n\tdjcy: '\\u0452',\n\tdlcorn: '\\u231E',\n\tdlcrop: '\\u230D',\n\tdollar: '\\u0024',\n\tDopf: '\\uD835\\uDD3B',\n\tdopf: '\\uD835\\uDD55',\n\tDot: '\\u00A8',\n\tdot: '\\u02D9',\n\tDotDot: '\\u20DC',\n\tdoteq: '\\u2250',\n\tdoteqdot: '\\u2251',\n\tDotEqual: '\\u2250',\n\tdotminus: '\\u2238',\n\tdotplus: '\\u2214',\n\tdotsquare: '\\u22A1',\n\tdoublebarwedge: '\\u2306',\n\tDoubleContourIntegral: '\\u222F',\n\tDoubleDot: '\\u00A8',\n\tDoubleDownArrow: '\\u21D3',\n\tDoubleLeftArrow: '\\u21D0',\n\tDoubleLeftRightArrow: '\\u21D4',\n\tDoubleLeftTee: '\\u2AE4',\n\tDoubleLongLeftArrow: '\\u27F8',\n\tDoubleLongLeftRightArrow: '\\u27FA',\n\tDoubleLongRightArrow: '\\u27F9',\n\tDoubleRightArrow: '\\u21D2',\n\tDoubleRightTee: '\\u22A8',\n\tDoubleUpArrow: '\\u21D1',\n\tDoubleUpDownArrow: '\\u21D5',\n\tDoubleVerticalBar: '\\u2225',\n\tDownArrow: '\\u2193',\n\tDownarrow: '\\u21D3',\n\tdownarrow: '\\u2193',\n\tDownArrowBar: '\\u2913',\n\tDownArrowUpArrow: '\\u21F5',\n\tDownBreve: '\\u0311',\n\tdowndownarrows: '\\u21CA',\n\tdownharpoonleft: '\\u21C3',\n\tdownharpoonright: '\\u21C2',\n\tDownLeftRightVector: '\\u2950',\n\tDownLeftTeeVector: '\\u295E',\n\tDownLeftVector: '\\u21BD',\n\tDownLeftVectorBar: '\\u2956',\n\tDownRightTeeVector: '\\u295F',\n\tDownRightVector: '\\u21C1',\n\tDownRightVectorBar: '\\u2957',\n\tDownTee: '\\u22A4',\n\tDownTeeArrow: '\\u21A7',\n\tdrbkarow: '\\u2910',\n\tdrcorn: '\\u231F',\n\tdrcrop: '\\u230C',\n\tDscr: '\\uD835\\uDC9F',\n\tdscr: '\\uD835\\uDCB9',\n\tDScy: '\\u0405',\n\tdscy: '\\u0455',\n\tdsol: '\\u29F6',\n\tDstrok: '\\u0110',\n\tdstrok: '\\u0111',\n\tdtdot: '\\u22F1',\n\tdtri: '\\u25BF',\n\tdtrif: '\\u25BE',\n\tduarr: '\\u21F5',\n\tduhar: '\\u296F',\n\tdwangle: '\\u29A6',\n\tDZcy: '\\u040F',\n\tdzcy: '\\u045F',\n\tdzigrarr: '\\u27FF',\n\tEacute: '\\u00C9',\n\teacute: '\\u00E9',\n\teaster: '\\u2A6E',\n\tEcaron: '\\u011A',\n\tecaron: '\\u011B',\n\tecir: '\\u2256',\n\tEcirc: '\\u00CA',\n\tecirc: '\\u00EA',\n\tecolon: '\\u2255',\n\tEcy: '\\u042D',\n\tecy: '\\u044D',\n\teDDot: '\\u2A77',\n\tEdot: '\\u0116',\n\teDot: '\\u2251',\n\tedot: '\\u0117',\n\tee: '\\u2147',\n\tefDot: '\\u2252',\n\tEfr: '\\uD835\\uDD08',\n\tefr: '\\uD835\\uDD22',\n\teg: '\\u2A9A',\n\tEgrave: '\\u00C8',\n\tegrave: '\\u00E8',\n\tegs: '\\u2A96',\n\tegsdot: '\\u2A98',\n\tel: '\\u2A99',\n\tElement: '\\u2208',\n\telinters: '\\u23E7',\n\tell: '\\u2113',\n\tels: '\\u2A95',\n\telsdot: '\\u2A97',\n\tEmacr: '\\u0112',\n\temacr: '\\u0113',\n\tempty: '\\u2205',\n\temptyset: '\\u2205',\n\tEmptySmallSquare: '\\u25FB',\n\temptyv: '\\u2205',\n\tEmptyVerySmallSquare: '\\u25AB',\n\temsp: '\\u2003',\n\temsp13: '\\u2004',\n\temsp14: '\\u2005',\n\tENG: '\\u014A',\n\teng: '\\u014B',\n\tensp: '\\u2002',\n\tEogon: '\\u0118',\n\teogon: '\\u0119',\n\tEopf: '\\uD835\\uDD3C',\n\teopf: '\\uD835\\uDD56',\n\tepar: '\\u22D5',\n\teparsl: '\\u29E3',\n\teplus: '\\u2A71',\n\tepsi: '\\u03B5',\n\tEpsilon: '\\u0395',\n\tepsilon: '\\u03B5',\n\tepsiv: '\\u03F5',\n\teqcirc: '\\u2256',\n\teqcolon: '\\u2255',\n\teqsim: '\\u2242',\n\teqslantgtr: '\\u2A96',\n\teqslantless: '\\u2A95',\n\tEqual: '\\u2A75',\n\tequals: '\\u003D',\n\tEqualTilde: '\\u2242',\n\tequest: '\\u225F',\n\tEquilibrium: '\\u21CC',\n\tequiv: '\\u2261',\n\tequivDD: '\\u2A78',\n\teqvparsl: '\\u29E5',\n\terarr: '\\u2971',\n\terDot: '\\u2253',\n\tEscr: '\\u2130',\n\tescr: '\\u212F',\n\tesdot: '\\u2250',\n\tEsim: '\\u2A73',\n\tesim: '\\u2242',\n\tEta: '\\u0397',\n\teta: '\\u03B7',\n\tETH: '\\u00D0',\n\teth: '\\u00F0',\n\tEuml: '\\u00CB',\n\teuml: '\\u00EB',\n\teuro: '\\u20AC',\n\texcl: '\\u0021',\n\texist: '\\u2203',\n\tExists: '\\u2203',\n\texpectation: '\\u2130',\n\tExponentialE: '\\u2147',\n\texponentiale: '\\u2147',\n\tfallingdotseq: '\\u2252',\n\tFcy: '\\u0424',\n\tfcy: '\\u0444',\n\tfemale: '\\u2640',\n\tffilig: '\\uFB03',\n\tfflig: '\\uFB00',\n\tffllig: '\\uFB04',\n\tFfr: '\\uD835\\uDD09',\n\tffr: '\\uD835\\uDD23',\n\tfilig: '\\uFB01',\n\tFilledSmallSquare: '\\u25FC',\n\tFilledVerySmallSquare: '\\u25AA',\n\tfjlig: '\\u0066\\u006A',\n\tflat: '\\u266D',\n\tfllig: '\\uFB02',\n\tfltns: '\\u25B1',\n\tfnof: '\\u0192',\n\tFopf: '\\uD835\\uDD3D',\n\tfopf: '\\uD835\\uDD57',\n\tForAll: '\\u2200',\n\tforall: '\\u2200',\n\tfork: '\\u22D4',\n\tforkv: '\\u2AD9',\n\tFouriertrf: '\\u2131',\n\tfpartint: '\\u2A0D',\n\tfrac12: '\\u00BD',\n\tfrac13: '\\u2153',\n\tfrac14: '\\u00BC',\n\tfrac15: '\\u2155',\n\tfrac16: '\\u2159',\n\tfrac18: '\\u215B',\n\tfrac23: '\\u2154',\n\tfrac25: '\\u2156',\n\tfrac34: '\\u00BE',\n\tfrac35: '\\u2157',\n\tfrac38: '\\u215C',\n\tfrac45: '\\u2158',\n\tfrac56: '\\u215A',\n\tfrac58: '\\u215D',\n\tfrac78: '\\u215E',\n\tfrasl: '\\u2044',\n\tfrown: '\\u2322',\n\tFscr: '\\u2131',\n\tfscr: '\\uD835\\uDCBB',\n\tgacute: '\\u01F5',\n\tGamma: '\\u0393',\n\tgamma: '\\u03B3',\n\tGammad: '\\u03DC',\n\tgammad: '\\u03DD',\n\tgap: '\\u2A86',\n\tGbreve: '\\u011E',\n\tgbreve: '\\u011F',\n\tGcedil: '\\u0122',\n\tGcirc: '\\u011C',\n\tgcirc: '\\u011D',\n\tGcy: '\\u0413',\n\tgcy: '\\u0433',\n\tGdot: '\\u0120',\n\tgdot: '\\u0121',\n\tgE: '\\u2267',\n\tge: '\\u2265',\n\tgEl: '\\u2A8C',\n\tgel: '\\u22DB',\n\tgeq: '\\u2265',\n\tgeqq: '\\u2267',\n\tgeqslant: '\\u2A7E',\n\tges: '\\u2A7E',\n\tgescc: '\\u2AA9',\n\tgesdot: '\\u2A80',\n\tgesdoto: '\\u2A82',\n\tgesdotol: '\\u2A84',\n\tgesl: '\\u22DB\\uFE00',\n\tgesles: '\\u2A94',\n\tGfr: '\\uD835\\uDD0A',\n\tgfr: '\\uD835\\uDD24',\n\tGg: '\\u22D9',\n\tgg: '\\u226B',\n\tggg: '\\u22D9',\n\tgimel: '\\u2137',\n\tGJcy: '\\u0403',\n\tgjcy: '\\u0453',\n\tgl: '\\u2277',\n\tgla: '\\u2AA5',\n\tglE: '\\u2A92',\n\tglj: '\\u2AA4',\n\tgnap: '\\u2A8A',\n\tgnapprox: '\\u2A8A',\n\tgnE: '\\u2269',\n\tgne: '\\u2A88',\n\tgneq: '\\u2A88',\n\tgneqq: '\\u2269',\n\tgnsim: '\\u22E7',\n\tGopf: '\\uD835\\uDD3E',\n\tgopf: '\\uD835\\uDD58',\n\tgrave: '\\u0060',\n\tGreaterEqual: '\\u2265',\n\tGreaterEqualLess: '\\u22DB',\n\tGreaterFullEqual: '\\u2267',\n\tGreaterGreater: '\\u2AA2',\n\tGreaterLess: '\\u2277',\n\tGreaterSlantEqual: '\\u2A7E',\n\tGreaterTilde: '\\u2273',\n\tGscr: '\\uD835\\uDCA2',\n\tgscr: '\\u210A',\n\tgsim: '\\u2273',\n\tgsime: '\\u2A8E',\n\tgsiml: '\\u2A90',\n\tGt: '\\u226B',\n\tGT: '\\u003E',\n\tgt: '\\u003E',\n\tgtcc: '\\u2AA7',\n\tgtcir: '\\u2A7A',\n\tgtdot: '\\u22D7',\n\tgtlPar: '\\u2995',\n\tgtquest: '\\u2A7C',\n\tgtrapprox: '\\u2A86',\n\tgtrarr: '\\u2978',\n\tgtrdot: '\\u22D7',\n\tgtreqless: '\\u22DB',\n\tgtreqqless: '\\u2A8C',\n\tgtrless: '\\u2277',\n\tgtrsim: '\\u2273',\n\tgvertneqq: '\\u2269\\uFE00',\n\tgvnE: '\\u2269\\uFE00',\n\tHacek: '\\u02C7',\n\thairsp: '\\u200A',\n\thalf: '\\u00BD',\n\thamilt: '\\u210B',\n\tHARDcy: '\\u042A',\n\thardcy: '\\u044A',\n\thArr: '\\u21D4',\n\tharr: '\\u2194',\n\tharrcir: '\\u2948',\n\tharrw: '\\u21AD',\n\tHat: '\\u005E',\n\thbar: '\\u210F',\n\tHcirc: '\\u0124',\n\thcirc: '\\u0125',\n\thearts: '\\u2665',\n\theartsuit: '\\u2665',\n\thellip: '\\u2026',\n\thercon: '\\u22B9',\n\tHfr: '\\u210C',\n\thfr: '\\uD835\\uDD25',\n\tHilbertSpace: '\\u210B',\n\thksearow: '\\u2925',\n\thkswarow: '\\u2926',\n\thoarr: '\\u21FF',\n\thomtht: '\\u223B',\n\thookleftarrow: '\\u21A9',\n\thookrightarrow: '\\u21AA',\n\tHopf: '\\u210D',\n\thopf: '\\uD835\\uDD59',\n\thorbar: '\\u2015',\n\tHorizontalLine: '\\u2500',\n\tHscr: '\\u210B',\n\thscr: '\\uD835\\uDCBD',\n\thslash: '\\u210F',\n\tHstrok: '\\u0126',\n\thstrok: '\\u0127',\n\tHumpDownHump: '\\u224E',\n\tHumpEqual: '\\u224F',\n\thybull: '\\u2043',\n\thyphen: '\\u2010',\n\tIacute: '\\u00CD',\n\tiacute: '\\u00ED',\n\tic: '\\u2063',\n\tIcirc: '\\u00CE',\n\ticirc: '\\u00EE',\n\tIcy: '\\u0418',\n\ticy: '\\u0438',\n\tIdot: '\\u0130',\n\tIEcy: '\\u0415',\n\tiecy: '\\u0435',\n\tiexcl: '\\u00A1',\n\tiff: '\\u21D4',\n\tIfr: '\\u2111',\n\tifr: '\\uD835\\uDD26',\n\tIgrave: '\\u00CC',\n\tigrave: '\\u00EC',\n\tii: '\\u2148',\n\tiiiint: '\\u2A0C',\n\tiiint: '\\u222D',\n\tiinfin: '\\u29DC',\n\tiiota: '\\u2129',\n\tIJlig: '\\u0132',\n\tijlig: '\\u0133',\n\tIm: '\\u2111',\n\tImacr: '\\u012A',\n\timacr: '\\u012B',\n\timage: '\\u2111',\n\tImaginaryI: '\\u2148',\n\timagline: '\\u2110',\n\timagpart: '\\u2111',\n\timath: '\\u0131',\n\timof: '\\u22B7',\n\timped: '\\u01B5',\n\tImplies: '\\u21D2',\n\tin: '\\u2208',\n\tincare: '\\u2105',\n\tinfin: '\\u221E',\n\tinfintie: '\\u29DD',\n\tinodot: '\\u0131',\n\tInt: '\\u222C',\n\tint: '\\u222B',\n\tintcal: '\\u22BA',\n\tintegers: '\\u2124',\n\tIntegral: '\\u222B',\n\tintercal: '\\u22BA',\n\tIntersection: '\\u22C2',\n\tintlarhk: '\\u2A17',\n\tintprod: '\\u2A3C',\n\tInvisibleComma: '\\u2063',\n\tInvisibleTimes: '\\u2062',\n\tIOcy: '\\u0401',\n\tiocy: '\\u0451',\n\tIogon: '\\u012E',\n\tiogon: '\\u012F',\n\tIopf: '\\uD835\\uDD40',\n\tiopf: '\\uD835\\uDD5A',\n\tIota: '\\u0399',\n\tiota: '\\u03B9',\n\tiprod: '\\u2A3C',\n\tiquest: '\\u00BF',\n\tIscr: '\\u2110',\n\tiscr: '\\uD835\\uDCBE',\n\tisin: '\\u2208',\n\tisindot: '\\u22F5',\n\tisinE: '\\u22F9',\n\tisins: '\\u22F4',\n\tisinsv: '\\u22F3',\n\tisinv: '\\u2208',\n\tit: '\\u2062',\n\tItilde: '\\u0128',\n\titilde: '\\u0129',\n\tIukcy: '\\u0406',\n\tiukcy: '\\u0456',\n\tIuml: '\\u00CF',\n\tiuml: '\\u00EF',\n\tJcirc: '\\u0134',\n\tjcirc: '\\u0135',\n\tJcy: '\\u0419',\n\tjcy: '\\u0439',\n\tJfr: '\\uD835\\uDD0D',\n\tjfr: '\\uD835\\uDD27',\n\tjmath: '\\u0237',\n\tJopf: '\\uD835\\uDD41',\n\tjopf: '\\uD835\\uDD5B',\n\tJscr: '\\uD835\\uDCA5',\n\tjscr: '\\uD835\\uDCBF',\n\tJsercy: '\\u0408',\n\tjsercy: '\\u0458',\n\tJukcy: '\\u0404',\n\tjukcy: '\\u0454',\n\tKappa: '\\u039A',\n\tkappa: '\\u03BA',\n\tkappav: '\\u03F0',\n\tKcedil: '\\u0136',\n\tkcedil: '\\u0137',\n\tKcy: '\\u041A',\n\tkcy: '\\u043A',\n\tKfr: '\\uD835\\uDD0E',\n\tkfr: '\\uD835\\uDD28',\n\tkgreen: '\\u0138',\n\tKHcy: '\\u0425',\n\tkhcy: '\\u0445',\n\tKJcy: '\\u040C',\n\tkjcy: '\\u045C',\n\tKopf: '\\uD835\\uDD42',\n\tkopf: '\\uD835\\uDD5C',\n\tKscr: '\\uD835\\uDCA6',\n\tkscr: '\\uD835\\uDCC0',\n\tlAarr: '\\u21DA',\n\tLacute: '\\u0139',\n\tlacute: '\\u013A',\n\tlaemptyv: '\\u29B4',\n\tlagran: '\\u2112',\n\tLambda: '\\u039B',\n\tlambda: '\\u03BB',\n\tLang: '\\u27EA',\n\tlang: '\\u27E8',\n\tlangd: '\\u2991',\n\tlangle: '\\u27E8',\n\tlap: '\\u2A85',\n\tLaplacetrf: '\\u2112',\n\tlaquo: '\\u00AB',\n\tLarr: '\\u219E',\n\tlArr: '\\u21D0',\n\tlarr: '\\u2190',\n\tlarrb: '\\u21E4',\n\tlarrbfs: '\\u291F',\n\tlarrfs: '\\u291D',\n\tlarrhk: '\\u21A9',\n\tlarrlp: '\\u21AB',\n\tlarrpl: '\\u2939',\n\tlarrsim: '\\u2973',\n\tlarrtl: '\\u21A2',\n\tlat: '\\u2AAB',\n\tlAtail: '\\u291B',\n\tlatail: '\\u2919',\n\tlate: '\\u2AAD',\n\tlates: '\\u2AAD\\uFE00',\n\tlBarr: '\\u290E',\n\tlbarr: '\\u290C',\n\tlbbrk: '\\u2772',\n\tlbrace: '\\u007B',\n\tlbrack: '\\u005B',\n\tlbrke: '\\u298B',\n\tlbrksld: '\\u298F',\n\tlbrkslu: '\\u298D',\n\tLcaron: '\\u013D',\n\tlcaron: '\\u013E',\n\tLcedil: '\\u013B',\n\tlcedil: '\\u013C',\n\tlceil: '\\u2308',\n\tlcub: '\\u007B',\n\tLcy: '\\u041B',\n\tlcy: '\\u043B',\n\tldca: '\\u2936',\n\tldquo: '\\u201C',\n\tldquor: '\\u201E',\n\tldrdhar: '\\u2967',\n\tldrushar: '\\u294B',\n\tldsh: '\\u21B2',\n\tlE: '\\u2266',\n\tle: '\\u2264',\n\tLeftAngleBracket: '\\u27E8',\n\tLeftArrow: '\\u2190',\n\tLeftarrow: '\\u21D0',\n\tleftarrow: '\\u2190',\n\tLeftArrowBar: '\\u21E4',\n\tLeftArrowRightArrow: '\\u21C6',\n\tleftarrowtail: '\\u21A2',\n\tLeftCeiling: '\\u2308',\n\tLeftDoubleBracket: '\\u27E6',\n\tLeftDownTeeVector: '\\u2961',\n\tLeftDownVector: '\\u21C3',\n\tLeftDownVectorBar: '\\u2959',\n\tLeftFloor: '\\u230A',\n\tleftharpoondown: '\\u21BD',\n\tleftharpoonup: '\\u21BC',\n\tleftleftarrows: '\\u21C7',\n\tLeftRightArrow: '\\u2194',\n\tLeftrightarrow: '\\u21D4',\n\tleftrightarrow: '\\u2194',\n\tleftrightarrows: '\\u21C6',\n\tleftrightharpoons: '\\u21CB',\n\tleftrightsquigarrow: '\\u21AD',\n\tLeftRightVector: '\\u294E',\n\tLeftTee: '\\u22A3',\n\tLeftTeeArrow: '\\u21A4',\n\tLeftTeeVector: '\\u295A',\n\tleftthreetimes: '\\u22CB',\n\tLeftTriangle: '\\u22B2',\n\tLeftTriangleBar: '\\u29CF',\n\tLeftTriangleEqual: '\\u22B4',\n\tLeftUpDownVector: '\\u2951',\n\tLeftUpTeeVector: '\\u2960',\n\tLeftUpVector: '\\u21BF',\n\tLeftUpVectorBar: '\\u2958',\n\tLeftVector: '\\u21BC',\n\tLeftVectorBar: '\\u2952',\n\tlEg: '\\u2A8B',\n\tleg: '\\u22DA',\n\tleq: '\\u2264',\n\tleqq: '\\u2266',\n\tleqslant: '\\u2A7D',\n\tles: '\\u2A7D',\n\tlescc: '\\u2AA8',\n\tlesdot: '\\u2A7F',\n\tlesdoto: '\\u2A81',\n\tlesdotor: '\\u2A83',\n\tlesg: '\\u22DA\\uFE00',\n\tlesges: '\\u2A93',\n\tlessapprox: '\\u2A85',\n\tlessdot: '\\u22D6',\n\tlesseqgtr: '\\u22DA',\n\tlesseqqgtr: '\\u2A8B',\n\tLessEqualGreater: '\\u22DA',\n\tLessFullEqual: '\\u2266',\n\tLessGreater: '\\u2276',\n\tlessgtr: '\\u2276',\n\tLessLess: '\\u2AA1',\n\tlesssim: '\\u2272',\n\tLessSlantEqual: '\\u2A7D',\n\tLessTilde: '\\u2272',\n\tlfisht: '\\u297C',\n\tlfloor: '\\u230A',\n\tLfr: '\\uD835\\uDD0F',\n\tlfr: '\\uD835\\uDD29',\n\tlg: '\\u2276',\n\tlgE: '\\u2A91',\n\tlHar: '\\u2962',\n\tlhard: '\\u21BD',\n\tlharu: '\\u21BC',\n\tlharul: '\\u296A',\n\tlhblk: '\\u2584',\n\tLJcy: '\\u0409',\n\tljcy: '\\u0459',\n\tLl: '\\u22D8',\n\tll: '\\u226A',\n\tllarr: '\\u21C7',\n\tllcorner: '\\u231E',\n\tLleftarrow: '\\u21DA',\n\tllhard: '\\u296B',\n\tlltri: '\\u25FA',\n\tLmidot: '\\u013F',\n\tlmidot: '\\u0140',\n\tlmoust: '\\u23B0',\n\tlmoustache: '\\u23B0',\n\tlnap: '\\u2A89',\n\tlnapprox: '\\u2A89',\n\tlnE: '\\u2268',\n\tlne: '\\u2A87',\n\tlneq: '\\u2A87',\n\tlneqq: '\\u2268',\n\tlnsim: '\\u22E6',\n\tloang: '\\u27EC',\n\tloarr: '\\u21FD',\n\tlobrk: '\\u27E6',\n\tLongLeftArrow: '\\u27F5',\n\tLongleftarrow: '\\u27F8',\n\tlongleftarrow: '\\u27F5',\n\tLongLeftRightArrow: '\\u27F7',\n\tLongleftrightarrow: '\\u27FA',\n\tlongleftrightarrow: '\\u27F7',\n\tlongmapsto: '\\u27FC',\n\tLongRightArrow: '\\u27F6',\n\tLongrightarrow: '\\u27F9',\n\tlongrightarrow: '\\u27F6',\n\tlooparrowleft: '\\u21AB',\n\tlooparrowright: '\\u21AC',\n\tlopar: '\\u2985',\n\tLopf: '\\uD835\\uDD43',\n\tlopf: '\\uD835\\uDD5D',\n\tloplus: '\\u2A2D',\n\tlotimes: '\\u2A34',\n\tlowast: '\\u2217',\n\tlowbar: '\\u005F',\n\tLowerLeftArrow: '\\u2199',\n\tLowerRightArrow: '\\u2198',\n\tloz: '\\u25CA',\n\tlozenge: '\\u25CA',\n\tlozf: '\\u29EB',\n\tlpar: '\\u0028',\n\tlparlt: '\\u2993',\n\tlrarr: '\\u21C6',\n\tlrcorner: '\\u231F',\n\tlrhar: '\\u21CB',\n\tlrhard: '\\u296D',\n\tlrm: '\\u200E',\n\tlrtri: '\\u22BF',\n\tlsaquo: '\\u2039',\n\tLscr: '\\u2112',\n\tlscr: '\\uD835\\uDCC1',\n\tLsh: '\\u21B0',\n\tlsh: '\\u21B0',\n\tlsim: '\\u2272',\n\tlsime: '\\u2A8D',\n\tlsimg: '\\u2A8F',\n\tlsqb: '\\u005B',\n\tlsquo: '\\u2018',\n\tlsquor: '\\u201A',\n\tLstrok: '\\u0141',\n\tlstrok: '\\u0142',\n\tLt: '\\u226A',\n\tLT: '\\u003C',\n\tlt: '\\u003C',\n\tltcc: '\\u2AA6',\n\tltcir: '\\u2A79',\n\tltdot: '\\u22D6',\n\tlthree: '\\u22CB',\n\tltimes: '\\u22C9',\n\tltlarr: '\\u2976',\n\tltquest: '\\u2A7B',\n\tltri: '\\u25C3',\n\tltrie: '\\u22B4',\n\tltrif: '\\u25C2',\n\tltrPar: '\\u2996',\n\tlurdshar: '\\u294A',\n\tluruhar: '\\u2966',\n\tlvertneqq: '\\u2268\\uFE00',\n\tlvnE: '\\u2268\\uFE00',\n\tmacr: '\\u00AF',\n\tmale: '\\u2642',\n\tmalt: '\\u2720',\n\tmaltese: '\\u2720',\n\tMap: '\\u2905',\n\tmap: '\\u21A6',\n\tmapsto: '\\u21A6',\n\tmapstodown: '\\u21A7',\n\tmapstoleft: '\\u21A4',\n\tmapstoup: '\\u21A5',\n\tmarker: '\\u25AE',\n\tmcomma: '\\u2A29',\n\tMcy: '\\u041C',\n\tmcy: '\\u043C',\n\tmdash: '\\u2014',\n\tmDDot: '\\u223A',\n\tmeasuredangle: '\\u2221',\n\tMediumSpace: '\\u205F',\n\tMellintrf: '\\u2133',\n\tMfr: '\\uD835\\uDD10',\n\tmfr: '\\uD835\\uDD2A',\n\tmho: '\\u2127',\n\tmicro: '\\u00B5',\n\tmid: '\\u2223',\n\tmidast: '\\u002A',\n\tmidcir: '\\u2AF0',\n\tmiddot: '\\u00B7',\n\tminus: '\\u2212',\n\tminusb: '\\u229F',\n\tminusd: '\\u2238',\n\tminusdu: '\\u2A2A',\n\tMinusPlus: '\\u2213',\n\tmlcp: '\\u2ADB',\n\tmldr: '\\u2026',\n\tmnplus: '\\u2213',\n\tmodels: '\\u22A7',\n\tMopf: '\\uD835\\uDD44',\n\tmopf: '\\uD835\\uDD5E',\n\tmp: '\\u2213',\n\tMscr: '\\u2133',\n\tmscr: '\\uD835\\uDCC2',\n\tmstpos: '\\u223E',\n\tMu: '\\u039C',\n\tmu: '\\u03BC',\n\tmultimap: '\\u22B8',\n\tmumap: '\\u22B8',\n\tnabla: '\\u2207',\n\tNacute: '\\u0143',\n\tnacute: '\\u0144',\n\tnang: '\\u2220\\u20D2',\n\tnap: '\\u2249',\n\tnapE: '\\u2A70\\u0338',\n\tnapid: '\\u224B\\u0338',\n\tnapos: '\\u0149',\n\tnapprox: '\\u2249',\n\tnatur: '\\u266E',\n\tnatural: '\\u266E',\n\tnaturals: '\\u2115',\n\tnbsp: '\\u00A0',\n\tnbump: '\\u224E\\u0338',\n\tnbumpe: '\\u224F\\u0338',\n\tncap: '\\u2A43',\n\tNcaron: '\\u0147',\n\tncaron: '\\u0148',\n\tNcedil: '\\u0145',\n\tncedil: '\\u0146',\n\tncong: '\\u2247',\n\tncongdot: '\\u2A6D\\u0338',\n\tncup: '\\u2A42',\n\tNcy: '\\u041D',\n\tncy: '\\u043D',\n\tndash: '\\u2013',\n\tne: '\\u2260',\n\tnearhk: '\\u2924',\n\tneArr: '\\u21D7',\n\tnearr: '\\u2197',\n\tnearrow: '\\u2197',\n\tnedot: '\\u2250\\u0338',\n\tNegativeMediumSpace: '\\u200B',\n\tNegativeThickSpace: '\\u200B',\n\tNegativeThinSpace: '\\u200B',\n\tNegativeVeryThinSpace: '\\u200B',\n\tnequiv: '\\u2262',\n\tnesear: '\\u2928',\n\tnesim: '\\u2242\\u0338',\n\tNestedGreaterGreater: '\\u226B',\n\tNestedLessLess: '\\u226A',\n\tNewLine: '\\u000A',\n\tnexist: '\\u2204',\n\tnexists: '\\u2204',\n\tNfr: '\\uD835\\uDD11',\n\tnfr: '\\uD835\\uDD2B',\n\tngE: '\\u2267\\u0338',\n\tnge: '\\u2271',\n\tngeq: '\\u2271',\n\tngeqq: '\\u2267\\u0338',\n\tngeqslant: '\\u2A7E\\u0338',\n\tnges: '\\u2A7E\\u0338',\n\tnGg: '\\u22D9\\u0338',\n\tngsim: '\\u2275',\n\tnGt: '\\u226B\\u20D2',\n\tngt: '\\u226F',\n\tngtr: '\\u226F',\n\tnGtv: '\\u226B\\u0338',\n\tnhArr: '\\u21CE',\n\tnharr: '\\u21AE',\n\tnhpar: '\\u2AF2',\n\tni: '\\u220B',\n\tnis: '\\u22FC',\n\tnisd: '\\u22FA',\n\tniv: '\\u220B',\n\tNJcy: '\\u040A',\n\tnjcy: '\\u045A',\n\tnlArr: '\\u21CD',\n\tnlarr: '\\u219A',\n\tnldr: '\\u2025',\n\tnlE: '\\u2266\\u0338',\n\tnle: '\\u2270',\n\tnLeftarrow: '\\u21CD',\n\tnleftarrow: '\\u219A',\n\tnLeftrightarrow: '\\u21CE',\n\tnleftrightarrow: '\\u21AE',\n\tnleq: '\\u2270',\n\tnleqq: '\\u2266\\u0338',\n\tnleqslant: '\\u2A7D\\u0338',\n\tnles: '\\u2A7D\\u0338',\n\tnless: '\\u226E',\n\tnLl: '\\u22D8\\u0338',\n\tnlsim: '\\u2274',\n\tnLt: '\\u226A\\u20D2',\n\tnlt: '\\u226E',\n\tnltri: '\\u22EA',\n\tnltrie: '\\u22EC',\n\tnLtv: '\\u226A\\u0338',\n\tnmid: '\\u2224',\n\tNoBreak: '\\u2060',\n\tNonBreakingSpace: '\\u00A0',\n\tNopf: '\\u2115',\n\tnopf: '\\uD835\\uDD5F',\n\tNot: '\\u2AEC',\n\tnot: '\\u00AC',\n\tNotCongruent: '\\u2262',\n\tNotCupCap: '\\u226D',\n\tNotDoubleVerticalBar: '\\u2226',\n\tNotElement: '\\u2209',\n\tNotEqual: '\\u2260',\n\tNotEqualTilde: '\\u2242\\u0338',\n\tNotExists: '\\u2204',\n\tNotGreater: '\\u226F',\n\tNotGreaterEqual: '\\u2271',\n\tNotGreaterFullEqual: '\\u2267\\u0338',\n\tNotGreaterGreater: '\\u226B\\u0338',\n\tNotGreaterLess: '\\u2279',\n\tNotGreaterSlantEqual: '\\u2A7E\\u0338',\n\tNotGreaterTilde: '\\u2275',\n\tNotHumpDownHump: '\\u224E\\u0338',\n\tNotHumpEqual: '\\u224F\\u0338',\n\tnotin: '\\u2209',\n\tnotindot: '\\u22F5\\u0338',\n\tnotinE: '\\u22F9\\u0338',\n\tnotinva: '\\u2209',\n\tnotinvb: '\\u22F7',\n\tnotinvc: '\\u22F6',\n\tNotLeftTriangle: '\\u22EA',\n\tNotLeftTriangleBar: '\\u29CF\\u0338',\n\tNotLeftTriangleEqual: '\\u22EC',\n\tNotLess: '\\u226E',\n\tNotLessEqual: '\\u2270',\n\tNotLessGreater: '\\u2278',\n\tNotLessLess: '\\u226A\\u0338',\n\tNotLessSlantEqual: '\\u2A7D\\u0338',\n\tNotLessTilde: '\\u2274',\n\tNotNestedGreaterGreater: '\\u2AA2\\u0338',\n\tNotNestedLessLess: '\\u2AA1\\u0338',\n\tnotni: '\\u220C',\n\tnotniva: '\\u220C',\n\tnotnivb: '\\u22FE',\n\tnotnivc: '\\u22FD',\n\tNotPrecedes: '\\u2280',\n\tNotPrecedesEqual: '\\u2AAF\\u0338',\n\tNotPrecedesSlantEqual: '\\u22E0',\n\tNotReverseElement: '\\u220C',\n\tNotRightTriangle: '\\u22EB',\n\tNotRightTriangleBar: '\\u29D0\\u0338',\n\tNotRightTriangleEqual: '\\u22ED',\n\tNotSquareSubset: '\\u228F\\u0338',\n\tNotSquareSubsetEqual: '\\u22E2',\n\tNotSquareSuperset: '\\u2290\\u0338',\n\tNotSquareSupersetEqual: '\\u22E3',\n\tNotSubset: '\\u2282\\u20D2',\n\tNotSubsetEqual: '\\u2288',\n\tNotSucceeds: '\\u2281',\n\tNotSucceedsEqual: '\\u2AB0\\u0338',\n\tNotSucceedsSlantEqual: '\\u22E1',\n\tNotSucceedsTilde: '\\u227F\\u0338',\n\tNotSuperset: '\\u2283\\u20D2',\n\tNotSupersetEqual: '\\u2289',\n\tNotTilde: '\\u2241',\n\tNotTildeEqual: '\\u2244',\n\tNotTildeFullEqual: '\\u2247',\n\tNotTildeTilde: '\\u2249',\n\tNotVerticalBar: '\\u2224',\n\tnpar: '\\u2226',\n\tnparallel: '\\u2226',\n\tnparsl: '\\u2AFD\\u20E5',\n\tnpart: '\\u2202\\u0338',\n\tnpolint: '\\u2A14',\n\tnpr: '\\u2280',\n\tnprcue: '\\u22E0',\n\tnpre: '\\u2AAF\\u0338',\n\tnprec: '\\u2280',\n\tnpreceq: '\\u2AAF\\u0338',\n\tnrArr: '\\u21CF',\n\tnrarr: '\\u219B',\n\tnrarrc: '\\u2933\\u0338',\n\tnrarrw: '\\u219D\\u0338',\n\tnRightarrow: '\\u21CF',\n\tnrightarrow: '\\u219B',\n\tnrtri: '\\u22EB',\n\tnrtrie: '\\u22ED',\n\tnsc: '\\u2281',\n\tnsccue: '\\u22E1',\n\tnsce: '\\u2AB0\\u0338',\n\tNscr: '\\uD835\\uDCA9',\n\tnscr: '\\uD835\\uDCC3',\n\tnshortmid: '\\u2224',\n\tnshortparallel: '\\u2226',\n\tnsim: '\\u2241',\n\tnsime: '\\u2244',\n\tnsimeq: '\\u2244',\n\tnsmid: '\\u2224',\n\tnspar: '\\u2226',\n\tnsqsube: '\\u22E2',\n\tnsqsupe: '\\u22E3',\n\tnsub: '\\u2284',\n\tnsubE: '\\u2AC5\\u0338',\n\tnsube: '\\u2288',\n\tnsubset: '\\u2282\\u20D2',\n\tnsubseteq: '\\u2288',\n\tnsubseteqq: '\\u2AC5\\u0338',\n\tnsucc: '\\u2281',\n\tnsucceq: '\\u2AB0\\u0338',\n\tnsup: '\\u2285',\n\tnsupE: '\\u2AC6\\u0338',\n\tnsupe: '\\u2289',\n\tnsupset: '\\u2283\\u20D2',\n\tnsupseteq: '\\u2289',\n\tnsupseteqq: '\\u2AC6\\u0338',\n\tntgl: '\\u2279',\n\tNtilde: '\\u00D1',\n\tntilde: '\\u00F1',\n\tntlg: '\\u2278',\n\tntriangleleft: '\\u22EA',\n\tntrianglelefteq: '\\u22EC',\n\tntriangleright: '\\u22EB',\n\tntrianglerighteq: '\\u22ED',\n\tNu: '\\u039D',\n\tnu: '\\u03BD',\n\tnum: '\\u0023',\n\tnumero: '\\u2116',\n\tnumsp: '\\u2007',\n\tnvap: '\\u224D\\u20D2',\n\tnVDash: '\\u22AF',\n\tnVdash: '\\u22AE',\n\tnvDash: '\\u22AD',\n\tnvdash: '\\u22AC',\n\tnvge: '\\u2265\\u20D2',\n\tnvgt: '\\u003E\\u20D2',\n\tnvHarr: '\\u2904',\n\tnvinfin: '\\u29DE',\n\tnvlArr: '\\u2902',\n\tnvle: '\\u2264\\u20D2',\n\tnvlt: '\\u003C\\u20D2',\n\tnvltrie: '\\u22B4\\u20D2',\n\tnvrArr: '\\u2903',\n\tnvrtrie: '\\u22B5\\u20D2',\n\tnvsim: '\\u223C\\u20D2',\n\tnwarhk: '\\u2923',\n\tnwArr: '\\u21D6',\n\tnwarr: '\\u2196',\n\tnwarrow: '\\u2196',\n\tnwnear: '\\u2927',\n\tOacute: '\\u00D3',\n\toacute: '\\u00F3',\n\toast: '\\u229B',\n\tocir: '\\u229A',\n\tOcirc: '\\u00D4',\n\tocirc: '\\u00F4',\n\tOcy: '\\u041E',\n\tocy: '\\u043E',\n\todash: '\\u229D',\n\tOdblac: '\\u0150',\n\todblac: '\\u0151',\n\todiv: '\\u2A38',\n\todot: '\\u2299',\n\todsold: '\\u29BC',\n\tOElig: '\\u0152',\n\toelig: '\\u0153',\n\tofcir: '\\u29BF',\n\tOfr: '\\uD835\\uDD12',\n\tofr: '\\uD835\\uDD2C',\n\togon: '\\u02DB',\n\tOgrave: '\\u00D2',\n\tograve: '\\u00F2',\n\togt: '\\u29C1',\n\tohbar: '\\u29B5',\n\tohm: '\\u03A9',\n\toint: '\\u222E',\n\tolarr: '\\u21BA',\n\tolcir: '\\u29BE',\n\tolcross: '\\u29BB',\n\toline: '\\u203E',\n\tolt: '\\u29C0',\n\tOmacr: '\\u014C',\n\tomacr: '\\u014D',\n\tOmega: '\\u03A9',\n\tomega: '\\u03C9',\n\tOmicron: '\\u039F',\n\tomicron: '\\u03BF',\n\tomid: '\\u29B6',\n\tominus: '\\u2296',\n\tOopf: '\\uD835\\uDD46',\n\toopf: '\\uD835\\uDD60',\n\topar: '\\u29B7',\n\tOpenCurlyDoubleQuote: '\\u201C',\n\tOpenCurlyQuote: '\\u2018',\n\toperp: '\\u29B9',\n\toplus: '\\u2295',\n\tOr: '\\u2A54',\n\tor: '\\u2228',\n\torarr: '\\u21BB',\n\tord: '\\u2A5D',\n\torder: '\\u2134',\n\torderof: '\\u2134',\n\tordf: '\\u00AA',\n\tordm: '\\u00BA',\n\torigof: '\\u22B6',\n\toror: '\\u2A56',\n\torslope: '\\u2A57',\n\torv: '\\u2A5B',\n\toS: '\\u24C8',\n\tOscr: '\\uD835\\uDCAA',\n\toscr: '\\u2134',\n\tOslash: '\\u00D8',\n\toslash: '\\u00F8',\n\tosol: '\\u2298',\n\tOtilde: '\\u00D5',\n\totilde: '\\u00F5',\n\tOtimes: '\\u2A37',\n\totimes: '\\u2297',\n\totimesas: '\\u2A36',\n\tOuml: '\\u00D6',\n\touml: '\\u00F6',\n\tovbar: '\\u233D',\n\tOverBar: '\\u203E',\n\tOverBrace: '\\u23DE',\n\tOverBracket: '\\u23B4',\n\tOverParenthesis: '\\u23DC',\n\tpar: '\\u2225',\n\tpara: '\\u00B6',\n\tparallel: '\\u2225',\n\tparsim: '\\u2AF3',\n\tparsl: '\\u2AFD',\n\tpart: '\\u2202',\n\tPartialD: '\\u2202',\n\tPcy: '\\u041F',\n\tpcy: '\\u043F',\n\tpercnt: '\\u0025',\n\tperiod: '\\u002E',\n\tpermil: '\\u2030',\n\tperp: '\\u22A5',\n\tpertenk: '\\u2031',\n\tPfr: '\\uD835\\uDD13',\n\tpfr: '\\uD835\\uDD2D',\n\tPhi: '\\u03A6',\n\tphi: '\\u03C6',\n\tphiv: '\\u03D5',\n\tphmmat: '\\u2133',\n\tphone: '\\u260E',\n\tPi: '\\u03A0',\n\tpi: '\\u03C0',\n\tpitchfork: '\\u22D4',\n\tpiv: '\\u03D6',\n\tplanck: '\\u210F',\n\tplanckh: '\\u210E',\n\tplankv: '\\u210F',\n\tplus: '\\u002B',\n\tplusacir: '\\u2A23',\n\tplusb: '\\u229E',\n\tpluscir: '\\u2A22',\n\tplusdo: '\\u2214',\n\tplusdu: '\\u2A25',\n\tpluse: '\\u2A72',\n\tPlusMinus: '\\u00B1',\n\tplusmn: '\\u00B1',\n\tplussim: '\\u2A26',\n\tplustwo: '\\u2A27',\n\tpm: '\\u00B1',\n\tPoincareplane: '\\u210C',\n\tpointint: '\\u2A15',\n\tPopf: '\\u2119',\n\tpopf: '\\uD835\\uDD61',\n\tpound: '\\u00A3',\n\tPr: '\\u2ABB',\n\tpr: '\\u227A',\n\tprap: '\\u2AB7',\n\tprcue: '\\u227C',\n\tprE: '\\u2AB3',\n\tpre: '\\u2AAF',\n\tprec: '\\u227A',\n\tprecapprox: '\\u2AB7',\n\tpreccurlyeq: '\\u227C',\n\tPrecedes: '\\u227A',\n\tPrecedesEqual: '\\u2AAF',\n\tPrecedesSlantEqual: '\\u227C',\n\tPrecedesTilde: '\\u227E',\n\tpreceq: '\\u2AAF',\n\tprecnapprox: '\\u2AB9',\n\tprecneqq: '\\u2AB5',\n\tprecnsim: '\\u22E8',\n\tprecsim: '\\u227E',\n\tPrime: '\\u2033',\n\tprime: '\\u2032',\n\tprimes: '\\u2119',\n\tprnap: '\\u2AB9',\n\tprnE: '\\u2AB5',\n\tprnsim: '\\u22E8',\n\tprod: '\\u220F',\n\tProduct: '\\u220F',\n\tprofalar: '\\u232E',\n\tprofline: '\\u2312',\n\tprofsurf: '\\u2313',\n\tprop: '\\u221D',\n\tProportion: '\\u2237',\n\tProportional: '\\u221D',\n\tpropto: '\\u221D',\n\tprsim: '\\u227E',\n\tprurel: '\\u22B0',\n\tPscr: '\\uD835\\uDCAB',\n\tpscr: '\\uD835\\uDCC5',\n\tPsi: '\\u03A8',\n\tpsi: '\\u03C8',\n\tpuncsp: '\\u2008',\n\tQfr: '\\uD835\\uDD14',\n\tqfr: '\\uD835\\uDD2E',\n\tqint: '\\u2A0C',\n\tQopf: '\\u211A',\n\tqopf: '\\uD835\\uDD62',\n\tqprime: '\\u2057',\n\tQscr: '\\uD835\\uDCAC',\n\tqscr: '\\uD835\\uDCC6',\n\tquaternions: '\\u210D',\n\tquatint: '\\u2A16',\n\tquest: '\\u003F',\n\tquesteq: '\\u225F',\n\tQUOT: '\\u0022',\n\tquot: '\\u0022',\n\trAarr: '\\u21DB',\n\trace: '\\u223D\\u0331',\n\tRacute: '\\u0154',\n\tracute: '\\u0155',\n\tradic: '\\u221A',\n\traemptyv: '\\u29B3',\n\tRang: '\\u27EB',\n\trang: '\\u27E9',\n\trangd: '\\u2992',\n\trange: '\\u29A5',\n\trangle: '\\u27E9',\n\traquo: '\\u00BB',\n\tRarr: '\\u21A0',\n\trArr: '\\u21D2',\n\trarr: '\\u2192',\n\trarrap: '\\u2975',\n\trarrb: '\\u21E5',\n\trarrbfs: '\\u2920',\n\trarrc: '\\u2933',\n\trarrfs: '\\u291E',\n\trarrhk: '\\u21AA',\n\trarrlp: '\\u21AC',\n\trarrpl: '\\u2945',\n\trarrsim: '\\u2974',\n\tRarrtl: '\\u2916',\n\trarrtl: '\\u21A3',\n\trarrw: '\\u219D',\n\trAtail: '\\u291C',\n\tratail: '\\u291A',\n\tratio: '\\u2236',\n\trationals: '\\u211A',\n\tRBarr: '\\u2910',\n\trBarr: '\\u290F',\n\trbarr: '\\u290D',\n\trbbrk: '\\u2773',\n\trbrace: '\\u007D',\n\trbrack: '\\u005D',\n\trbrke: '\\u298C',\n\trbrksld: '\\u298E',\n\trbrkslu: '\\u2990',\n\tRcaron: '\\u0158',\n\trcaron: '\\u0159',\n\tRcedil: '\\u0156',\n\trcedil: '\\u0157',\n\trceil: '\\u2309',\n\trcub: '\\u007D',\n\tRcy: '\\u0420',\n\trcy: '\\u0440',\n\trdca: '\\u2937',\n\trdldhar: '\\u2969',\n\trdquo: '\\u201D',\n\trdquor: '\\u201D',\n\trdsh: '\\u21B3',\n\tRe: '\\u211C',\n\treal: '\\u211C',\n\trealine: '\\u211B',\n\trealpart: '\\u211C',\n\treals: '\\u211D',\n\trect: '\\u25AD',\n\tREG: '\\u00AE',\n\treg: '\\u00AE',\n\tReverseElement: '\\u220B',\n\tReverseEquilibrium: '\\u21CB',\n\tReverseUpEquilibrium: '\\u296F',\n\trfisht: '\\u297D',\n\trfloor: '\\u230B',\n\tRfr: '\\u211C',\n\trfr: '\\uD835\\uDD2F',\n\trHar: '\\u2964',\n\trhard: '\\u21C1',\n\trharu: '\\u21C0',\n\trharul: '\\u296C',\n\tRho: '\\u03A1',\n\trho: '\\u03C1',\n\trhov: '\\u03F1',\n\tRightAngleBracket: '\\u27E9',\n\tRightArrow: '\\u2192',\n\tRightarrow: '\\u21D2',\n\trightarrow: '\\u2192',\n\tRightArrowBar: '\\u21E5',\n\tRightArrowLeftArrow: '\\u21C4',\n\trightarrowtail: '\\u21A3',\n\tRightCeiling: '\\u2309',\n\tRightDoubleBracket: '\\u27E7',\n\tRightDownTeeVector: '\\u295D',\n\tRightDownVector: '\\u21C2',\n\tRightDownVectorBar: '\\u2955',\n\tRightFloor: '\\u230B',\n\trightharpoondown: '\\u21C1',\n\trightharpoonup: '\\u21C0',\n\trightleftarrows: '\\u21C4',\n\trightleftharpoons: '\\u21CC',\n\trightrightarrows: '\\u21C9',\n\trightsquigarrow: '\\u219D',\n\tRightTee: '\\u22A2',\n\tRightTeeArrow: '\\u21A6',\n\tRightTeeVector: '\\u295B',\n\trightthreetimes: '\\u22CC',\n\tRightTriangle: '\\u22B3',\n\tRightTriangleBar: '\\u29D0',\n\tRightTriangleEqual: '\\u22B5',\n\tRightUpDownVector: '\\u294F',\n\tRightUpTeeVector: '\\u295C',\n\tRightUpVector: '\\u21BE',\n\tRightUpVectorBar: '\\u2954',\n\tRightVector: '\\u21C0',\n\tRightVectorBar: '\\u2953',\n\tring: '\\u02DA',\n\trisingdotseq: '\\u2253',\n\trlarr: '\\u21C4',\n\trlhar: '\\u21CC',\n\trlm: '\\u200F',\n\trmoust: '\\u23B1',\n\trmoustache: '\\u23B1',\n\trnmid: '\\u2AEE',\n\troang: '\\u27ED',\n\troarr: '\\u21FE',\n\trobrk: '\\u27E7',\n\tropar: '\\u2986',\n\tRopf: '\\u211D',\n\tropf: '\\uD835\\uDD63',\n\troplus: '\\u2A2E',\n\trotimes: '\\u2A35',\n\tRoundImplies: '\\u2970',\n\trpar: '\\u0029',\n\trpargt: '\\u2994',\n\trppolint: '\\u2A12',\n\trrarr: '\\u21C9',\n\tRrightarrow: '\\u21DB',\n\trsaquo: '\\u203A',\n\tRscr: '\\u211B',\n\trscr: '\\uD835\\uDCC7',\n\tRsh: '\\u21B1',\n\trsh: '\\u21B1',\n\trsqb: '\\u005D',\n\trsquo: '\\u2019',\n\trsquor: '\\u2019',\n\trthree: '\\u22CC',\n\trtimes: '\\u22CA',\n\trtri: '\\u25B9',\n\trtrie: '\\u22B5',\n\trtrif: '\\u25B8',\n\trtriltri: '\\u29CE',\n\tRuleDelayed: '\\u29F4',\n\truluhar: '\\u2968',\n\trx: '\\u211E',\n\tSacute: '\\u015A',\n\tsacute: '\\u015B',\n\tsbquo: '\\u201A',\n\tSc: '\\u2ABC',\n\tsc: '\\u227B',\n\tscap: '\\u2AB8',\n\tScaron: '\\u0160',\n\tscaron: '\\u0161',\n\tsccue: '\\u227D',\n\tscE: '\\u2AB4',\n\tsce: '\\u2AB0',\n\tScedil: '\\u015E',\n\tscedil: '\\u015F',\n\tScirc: '\\u015C',\n\tscirc: '\\u015D',\n\tscnap: '\\u2ABA',\n\tscnE: '\\u2AB6',\n\tscnsim: '\\u22E9',\n\tscpolint: '\\u2A13',\n\tscsim: '\\u227F',\n\tScy: '\\u0421',\n\tscy: '\\u0441',\n\tsdot: '\\u22C5',\n\tsdotb: '\\u22A1',\n\tsdote: '\\u2A66',\n\tsearhk: '\\u2925',\n\tseArr: '\\u21D8',\n\tsearr: '\\u2198',\n\tsearrow: '\\u2198',\n\tsect: '\\u00A7',\n\tsemi: '\\u003B',\n\tseswar: '\\u2929',\n\tsetminus: '\\u2216',\n\tsetmn: '\\u2216',\n\tsext: '\\u2736',\n\tSfr: '\\uD835\\uDD16',\n\tsfr: '\\uD835\\uDD30',\n\tsfrown: '\\u2322',\n\tsharp: '\\u266F',\n\tSHCHcy: '\\u0429',\n\tshchcy: '\\u0449',\n\tSHcy: '\\u0428',\n\tshcy: '\\u0448',\n\tShortDownArrow: '\\u2193',\n\tShortLeftArrow: '\\u2190',\n\tshortmid: '\\u2223',\n\tshortparallel: '\\u2225',\n\tShortRightArrow: '\\u2192',\n\tShortUpArrow: '\\u2191',\n\tshy: '\\u00AD',\n\tSigma: '\\u03A3',\n\tsigma: '\\u03C3',\n\tsigmaf: '\\u03C2',\n\tsigmav: '\\u03C2',\n\tsim: '\\u223C',\n\tsimdot: '\\u2A6A',\n\tsime: '\\u2243',\n\tsimeq: '\\u2243',\n\tsimg: '\\u2A9E',\n\tsimgE: '\\u2AA0',\n\tsiml: '\\u2A9D',\n\tsimlE: '\\u2A9F',\n\tsimne: '\\u2246',\n\tsimplus: '\\u2A24',\n\tsimrarr: '\\u2972',\n\tslarr: '\\u2190',\n\tSmallCircle: '\\u2218',\n\tsmallsetminus: '\\u2216',\n\tsmashp: '\\u2A33',\n\tsmeparsl: '\\u29E4',\n\tsmid: '\\u2223',\n\tsmile: '\\u2323',\n\tsmt: '\\u2AAA',\n\tsmte: '\\u2AAC',\n\tsmtes: '\\u2AAC\\uFE00',\n\tSOFTcy: '\\u042C',\n\tsoftcy: '\\u044C',\n\tsol: '\\u002F',\n\tsolb: '\\u29C4',\n\tsolbar: '\\u233F',\n\tSopf: '\\uD835\\uDD4A',\n\tsopf: '\\uD835\\uDD64',\n\tspades: '\\u2660',\n\tspadesuit: '\\u2660',\n\tspar: '\\u2225',\n\tsqcap: '\\u2293',\n\tsqcaps: '\\u2293\\uFE00',\n\tsqcup: '\\u2294',\n\tsqcups: '\\u2294\\uFE00',\n\tSqrt: '\\u221A',\n\tsqsub: '\\u228F',\n\tsqsube: '\\u2291',\n\tsqsubset: '\\u228F',\n\tsqsubseteq: '\\u2291',\n\tsqsup: '\\u2290',\n\tsqsupe: '\\u2292',\n\tsqsupset: '\\u2290',\n\tsqsupseteq: '\\u2292',\n\tsqu: '\\u25A1',\n\tSquare: '\\u25A1',\n\tsquare: '\\u25A1',\n\tSquareIntersection: '\\u2293',\n\tSquareSubset: '\\u228F',\n\tSquareSubsetEqual: '\\u2291',\n\tSquareSuperset: '\\u2290',\n\tSquareSupersetEqual: '\\u2292',\n\tSquareUnion: '\\u2294',\n\tsquarf: '\\u25AA',\n\tsquf: '\\u25AA',\n\tsrarr: '\\u2192',\n\tSscr: '\\uD835\\uDCAE',\n\tsscr: '\\uD835\\uDCC8',\n\tssetmn: '\\u2216',\n\tssmile: '\\u2323',\n\tsstarf: '\\u22C6',\n\tStar: '\\u22C6',\n\tstar: '\\u2606',\n\tstarf: '\\u2605',\n\tstraightepsilon: '\\u03F5',\n\tstraightphi: '\\u03D5',\n\tstrns: '\\u00AF',\n\tSub: '\\u22D0',\n\tsub: '\\u2282',\n\tsubdot: '\\u2ABD',\n\tsubE: '\\u2AC5',\n\tsube: '\\u2286',\n\tsubedot: '\\u2AC3',\n\tsubmult: '\\u2AC1',\n\tsubnE: '\\u2ACB',\n\tsubne: '\\u228A',\n\tsubplus: '\\u2ABF',\n\tsubrarr: '\\u2979',\n\tSubset: '\\u22D0',\n\tsubset: '\\u2282',\n\tsubseteq: '\\u2286',\n\tsubseteqq: '\\u2AC5',\n\tSubsetEqual: '\\u2286',\n\tsubsetneq: '\\u228A',\n\tsubsetneqq: '\\u2ACB',\n\tsubsim: '\\u2AC7',\n\tsubsub: '\\u2AD5',\n\tsubsup: '\\u2AD3',\n\tsucc: '\\u227B',\n\tsuccapprox: '\\u2AB8',\n\tsucccurlyeq: '\\u227D',\n\tSucceeds: '\\u227B',\n\tSucceedsEqual: '\\u2AB0',\n\tSucceedsSlantEqual: '\\u227D',\n\tSucceedsTilde: '\\u227F',\n\tsucceq: '\\u2AB0',\n\tsuccnapprox: '\\u2ABA',\n\tsuccneqq: '\\u2AB6',\n\tsuccnsim: '\\u22E9',\n\tsuccsim: '\\u227F',\n\tSuchThat: '\\u220B',\n\tSum: '\\u2211',\n\tsum: '\\u2211',\n\tsung: '\\u266A',\n\tSup: '\\u22D1',\n\tsup: '\\u2283',\n\tsup1: '\\u00B9',\n\tsup2: '\\u00B2',\n\tsup3: '\\u00B3',\n\tsupdot: '\\u2ABE',\n\tsupdsub: '\\u2AD8',\n\tsupE: '\\u2AC6',\n\tsupe: '\\u2287',\n\tsupedot: '\\u2AC4',\n\tSuperset: '\\u2283',\n\tSupersetEqual: '\\u2287',\n\tsuphsol: '\\u27C9',\n\tsuphsub: '\\u2AD7',\n\tsuplarr: '\\u297B',\n\tsupmult: '\\u2AC2',\n\tsupnE: '\\u2ACC',\n\tsupne: '\\u228B',\n\tsupplus: '\\u2AC0',\n\tSupset: '\\u22D1',\n\tsupset: '\\u2283',\n\tsupseteq: '\\u2287',\n\tsupseteqq: '\\u2AC6',\n\tsupsetneq: '\\u228B',\n\tsupsetneqq: '\\u2ACC',\n\tsupsim: '\\u2AC8',\n\tsupsub: '\\u2AD4',\n\tsupsup: '\\u2AD6',\n\tswarhk: '\\u2926',\n\tswArr: '\\u21D9',\n\tswarr: '\\u2199',\n\tswarrow: '\\u2199',\n\tswnwar: '\\u292A',\n\tszlig: '\\u00DF',\n\tTab: '\\u0009',\n\ttarget: '\\u2316',\n\tTau: '\\u03A4',\n\ttau: '\\u03C4',\n\ttbrk: '\\u23B4',\n\tTcaron: '\\u0164',\n\ttcaron: '\\u0165',\n\tTcedil: '\\u0162',\n\ttcedil: '\\u0163',\n\tTcy: '\\u0422',\n\ttcy: '\\u0442',\n\ttdot: '\\u20DB',\n\ttelrec: '\\u2315',\n\tTfr: '\\uD835\\uDD17',\n\ttfr: '\\uD835\\uDD31',\n\tthere4: '\\u2234',\n\tTherefore: '\\u2234',\n\ttherefore: '\\u2234',\n\tTheta: '\\u0398',\n\ttheta: '\\u03B8',\n\tthetasym: '\\u03D1',\n\tthetav: '\\u03D1',\n\tthickapprox: '\\u2248',\n\tthicksim: '\\u223C',\n\tThickSpace: '\\u205F\\u200A',\n\tthinsp: '\\u2009',\n\tThinSpace: '\\u2009',\n\tthkap: '\\u2248',\n\tthksim: '\\u223C',\n\tTHORN: '\\u00DE',\n\tthorn: '\\u00FE',\n\tTilde: '\\u223C',\n\ttilde: '\\u02DC',\n\tTildeEqual: '\\u2243',\n\tTildeFullEqual: '\\u2245',\n\tTildeTilde: '\\u2248',\n\ttimes: '\\u00D7',\n\ttimesb: '\\u22A0',\n\ttimesbar: '\\u2A31',\n\ttimesd: '\\u2A30',\n\ttint: '\\u222D',\n\ttoea: '\\u2928',\n\ttop: '\\u22A4',\n\ttopbot: '\\u2336',\n\ttopcir: '\\u2AF1',\n\tTopf: '\\uD835\\uDD4B',\n\ttopf: '\\uD835\\uDD65',\n\ttopfork: '\\u2ADA',\n\ttosa: '\\u2929',\n\ttprime: '\\u2034',\n\tTRADE: '\\u2122',\n\ttrade: '\\u2122',\n\ttriangle: '\\u25B5',\n\ttriangledown: '\\u25BF',\n\ttriangleleft: '\\u25C3',\n\ttrianglelefteq: '\\u22B4',\n\ttriangleq: '\\u225C',\n\ttriangleright: '\\u25B9',\n\ttrianglerighteq: '\\u22B5',\n\ttridot: '\\u25EC',\n\ttrie: '\\u225C',\n\ttriminus: '\\u2A3A',\n\tTripleDot: '\\u20DB',\n\ttriplus: '\\u2A39',\n\ttrisb: '\\u29CD',\n\ttritime: '\\u2A3B',\n\ttrpezium: '\\u23E2',\n\tTscr: '\\uD835\\uDCAF',\n\ttscr: '\\uD835\\uDCC9',\n\tTScy: '\\u0426',\n\ttscy: '\\u0446',\n\tTSHcy: '\\u040B',\n\ttshcy: '\\u045B',\n\tTstrok: '\\u0166',\n\ttstrok: '\\u0167',\n\ttwixt: '\\u226C',\n\ttwoheadleftarrow: '\\u219E',\n\ttwoheadrightarrow: '\\u21A0',\n\tUacute: '\\u00DA',\n\tuacute: '\\u00FA',\n\tUarr: '\\u219F',\n\tuArr: '\\u21D1',\n\tuarr: '\\u2191',\n\tUarrocir: '\\u2949',\n\tUbrcy: '\\u040E',\n\tubrcy: '\\u045E',\n\tUbreve: '\\u016C',\n\tubreve: '\\u016D',\n\tUcirc: '\\u00DB',\n\tucirc: '\\u00FB',\n\tUcy: '\\u0423',\n\tucy: '\\u0443',\n\tudarr: '\\u21C5',\n\tUdblac: '\\u0170',\n\tudblac: '\\u0171',\n\tudhar: '\\u296E',\n\tufisht: '\\u297E',\n\tUfr: '\\uD835\\uDD18',\n\tufr: '\\uD835\\uDD32',\n\tUgrave: '\\u00D9',\n\tugrave: '\\u00F9',\n\tuHar: '\\u2963',\n\tuharl: '\\u21BF',\n\tuharr: '\\u21BE',\n\tuhblk: '\\u2580',\n\tulcorn: '\\u231C',\n\tulcorner: '\\u231C',\n\tulcrop: '\\u230F',\n\tultri: '\\u25F8',\n\tUmacr: '\\u016A',\n\tumacr: '\\u016B',\n\tuml: '\\u00A8',\n\tUnderBar: '\\u005F',\n\tUnderBrace: '\\u23DF',\n\tUnderBracket: '\\u23B5',\n\tUnderParenthesis: '\\u23DD',\n\tUnion: '\\u22C3',\n\tUnionPlus: '\\u228E',\n\tUogon: '\\u0172',\n\tuogon: '\\u0173',\n\tUopf: '\\uD835\\uDD4C',\n\tuopf: '\\uD835\\uDD66',\n\tUpArrow: '\\u2191',\n\tUparrow: '\\u21D1',\n\tuparrow: '\\u2191',\n\tUpArrowBar: '\\u2912',\n\tUpArrowDownArrow: '\\u21C5',\n\tUpDownArrow: '\\u2195',\n\tUpdownarrow: '\\u21D5',\n\tupdownarrow: '\\u2195',\n\tUpEquilibrium: '\\u296E',\n\tupharpoonleft: '\\u21BF',\n\tupharpoonright: '\\u21BE',\n\tuplus: '\\u228E',\n\tUpperLeftArrow: '\\u2196',\n\tUpperRightArrow: '\\u2197',\n\tUpsi: '\\u03D2',\n\tupsi: '\\u03C5',\n\tupsih: '\\u03D2',\n\tUpsilon: '\\u03A5',\n\tupsilon: '\\u03C5',\n\tUpTee: '\\u22A5',\n\tUpTeeArrow: '\\u21A5',\n\tupuparrows: '\\u21C8',\n\turcorn: '\\u231D',\n\turcorner: '\\u231D',\n\turcrop: '\\u230E',\n\tUring: '\\u016E',\n\turing: '\\u016F',\n\turtri: '\\u25F9',\n\tUscr: '\\uD835\\uDCB0',\n\tuscr: '\\uD835\\uDCCA',\n\tutdot: '\\u22F0',\n\tUtilde: '\\u0168',\n\tutilde: '\\u0169',\n\tutri: '\\u25B5',\n\tutrif: '\\u25B4',\n\tuuarr: '\\u21C8',\n\tUuml: '\\u00DC',\n\tuuml: '\\u00FC',\n\tuwangle: '\\u29A7',\n\tvangrt: '\\u299C',\n\tvarepsilon: '\\u03F5',\n\tvarkappa: '\\u03F0',\n\tvarnothing: '\\u2205',\n\tvarphi: '\\u03D5',\n\tvarpi: '\\u03D6',\n\tvarpropto: '\\u221D',\n\tvArr: '\\u21D5',\n\tvarr: '\\u2195',\n\tvarrho: '\\u03F1',\n\tvarsigma: '\\u03C2',\n\tvarsubsetneq: '\\u228A\\uFE00',\n\tvarsubsetneqq: '\\u2ACB\\uFE00',\n\tvarsupsetneq: '\\u228B\\uFE00',\n\tvarsupsetneqq: '\\u2ACC\\uFE00',\n\tvartheta: '\\u03D1',\n\tvartriangleleft: '\\u22B2',\n\tvartriangleright: '\\u22B3',\n\tVbar: '\\u2AEB',\n\tvBar: '\\u2AE8',\n\tvBarv: '\\u2AE9',\n\tVcy: '\\u0412',\n\tvcy: '\\u0432',\n\tVDash: '\\u22AB',\n\tVdash: '\\u22A9',\n\tvDash: '\\u22A8',\n\tvdash: '\\u22A2',\n\tVdashl: '\\u2AE6',\n\tVee: '\\u22C1',\n\tvee: '\\u2228',\n\tveebar: '\\u22BB',\n\tveeeq: '\\u225A',\n\tvellip: '\\u22EE',\n\tVerbar: '\\u2016',\n\tverbar: '\\u007C',\n\tVert: '\\u2016',\n\tvert: '\\u007C',\n\tVerticalBar: '\\u2223',\n\tVerticalLine: '\\u007C',\n\tVerticalSeparator: '\\u2758',\n\tVerticalTilde: '\\u2240',\n\tVeryThinSpace: '\\u200A',\n\tVfr: '\\uD835\\uDD19',\n\tvfr: '\\uD835\\uDD33',\n\tvltri: '\\u22B2',\n\tvnsub: '\\u2282\\u20D2',\n\tvnsup: '\\u2283\\u20D2',\n\tVopf: '\\uD835\\uDD4D',\n\tvopf: '\\uD835\\uDD67',\n\tvprop: '\\u221D',\n\tvrtri: '\\u22B3',\n\tVscr: '\\uD835\\uDCB1',\n\tvscr: '\\uD835\\uDCCB',\n\tvsubnE: '\\u2ACB\\uFE00',\n\tvsubne: '\\u228A\\uFE00',\n\tvsupnE: '\\u2ACC\\uFE00',\n\tvsupne: '\\u228B\\uFE00',\n\tVvdash: '\\u22AA',\n\tvzigzag: '\\u299A',\n\tWcirc: '\\u0174',\n\twcirc: '\\u0175',\n\twedbar: '\\u2A5F',\n\tWedge: '\\u22C0',\n\twedge: '\\u2227',\n\twedgeq: '\\u2259',\n\tweierp: '\\u2118',\n\tWfr: '\\uD835\\uDD1A',\n\twfr: '\\uD835\\uDD34',\n\tWopf: '\\uD835\\uDD4E',\n\twopf: '\\uD835\\uDD68',\n\twp: '\\u2118',\n\twr: '\\u2240',\n\twreath: '\\u2240',\n\tWscr: '\\uD835\\uDCB2',\n\twscr: '\\uD835\\uDCCC',\n\txcap: '\\u22C2',\n\txcirc: '\\u25EF',\n\txcup: '\\u22C3',\n\txdtri: '\\u25BD',\n\tXfr: '\\uD835\\uDD1B',\n\txfr: '\\uD835\\uDD35',\n\txhArr: '\\u27FA',\n\txharr: '\\u27F7',\n\tXi: '\\u039E',\n\txi: '\\u03BE',\n\txlArr: '\\u27F8',\n\txlarr: '\\u27F5',\n\txmap: '\\u27FC',\n\txnis: '\\u22FB',\n\txodot: '\\u2A00',\n\tXopf: '\\uD835\\uDD4F',\n\txopf: '\\uD835\\uDD69',\n\txoplus: '\\u2A01',\n\txotime: '\\u2A02',\n\txrArr: '\\u27F9',\n\txrarr: '\\u27F6',\n\tXscr: '\\uD835\\uDCB3',\n\txscr: '\\uD835\\uDCCD',\n\txsqcup: '\\u2A06',\n\txuplus: '\\u2A04',\n\txutri: '\\u25B3',\n\txvee: '\\u22C1',\n\txwedge: '\\u22C0',\n\tYacute: '\\u00DD',\n\tyacute: '\\u00FD',\n\tYAcy: '\\u042F',\n\tyacy: '\\u044F',\n\tYcirc: '\\u0176',\n\tycirc: '\\u0177',\n\tYcy: '\\u042B',\n\tycy: '\\u044B',\n\tyen: '\\u00A5',\n\tYfr: '\\uD835\\uDD1C',\n\tyfr: '\\uD835\\uDD36',\n\tYIcy: '\\u0407',\n\tyicy: '\\u0457',\n\tYopf: '\\uD835\\uDD50',\n\tyopf: '\\uD835\\uDD6A',\n\tYscr: '\\uD835\\uDCB4',\n\tyscr: '\\uD835\\uDCCE',\n\tYUcy: '\\u042E',\n\tyucy: '\\u044E',\n\tYuml: '\\u0178',\n\tyuml: '\\u00FF',\n\tZacute: '\\u0179',\n\tzacute: '\\u017A',\n\tZcaron: '\\u017D',\n\tzcaron: '\\u017E',\n\tZcy: '\\u0417',\n\tzcy: '\\u0437',\n\tZdot: '\\u017B',\n\tzdot: '\\u017C',\n\tzeetrf: '\\u2128',\n\tZeroWidthSpace: '\\u200B',\n\tZeta: '\\u0396',\n\tzeta: '\\u03B6',\n\tZfr: '\\u2128',\n\tzfr: '\\uD835\\uDD37',\n\tZHcy: '\\u0416',\n\tzhcy: '\\u0436',\n\tzigrarr: '\\u21DD',\n\tZopf: '\\u2124',\n\tzopf: '\\uD835\\uDD6B',\n\tZscr: '\\uD835\\uDCB5',\n\tzscr: '\\uD835\\uDCCF',\n\tzwj: '\\u200D',\n\tzwnj: '\\u200C',\n});\n\n/**\n * @deprecated use `HTML_ENTITIES` instead\n * @see HTML_ENTITIES\n */\nexports.entityMap = exports.HTML_ENTITIES;\n","var dom = require('./dom')\nexports.DOMImplementation = dom.DOMImplementation\nexports.XMLSerializer = dom.XMLSerializer\nexports.DOMParser = require('./dom-parser').DOMParser\n","var NAMESPACE = require(\"./conventions\").NAMESPACE;\n\n//[4] \tNameStartChar\t ::= \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n//[4a] \tNameChar\t ::= \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\n//[5] \tName\t ::= \tNameStartChar (NameChar)*\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\n\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\nvar S_TAG = 0;//tag name offerring\nvar S_ATTR = 1;//attr name offerring\nvar S_ATTR_SPACE=2;//attr name end and space offer\nvar S_EQ = 3;//=space?\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\nvar S_TAG_CLOSE = 7;//closed el\n\n/**\n * Creates an error that will not be caught by XMLReader aka the SAX parser.\n *\n * @param {string} message\n * @param {any?} locator Optional, can provide details about the location in the source\n * @constructor\n */\nfunction ParseError(message, locator) {\n\tthis.message = message\n\tthis.locator = locator\n\tif(Error.captureStackTrace) Error.captureStackTrace(this, ParseError);\n}\nParseError.prototype = new Error();\nParseError.prototype.name = ParseError.name\n\nfunction XMLReader(){\n\n}\n\nXMLReader.prototype = {\n\tparse:function(source,defaultNSMap,entityMap){\n\t\tvar domBuilder = this.domBuilder;\n\t\tdomBuilder.startDocument();\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\n\t\tparse(source,defaultNSMap,entityMap,\n\t\t\t\tdomBuilder,this.errorHandler);\n\t\tdomBuilder.endDocument();\n\t}\n}\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\n\tfunction fixedFromCharCode(code) {\n\t\t// String.prototype.fromCharCode does not supports\n\t\t// > 2 bytes unicode chars directly\n\t\tif (code > 0xffff) {\n\t\t\tcode -= 0x10000;\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\n\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\n\t\t} else {\n\t\t\treturn String.fromCharCode(code);\n\t\t}\n\t}\n\tfunction entityReplacer(a){\n\t\tvar k = a.slice(1,-1);\n\t\tif (Object.hasOwnProperty.call(entityMap, k)) {\n\t\t\treturn entityMap[k];\n\t\t}else if(k.charAt(0) === '#'){\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\n\t\t}else{\n\t\t\terrorHandler.error('entity not found:'+a);\n\t\t\treturn a;\n\t\t}\n\t}\n\tfunction appendText(end){//has some bugs\n\t\tif(end>start){\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\tlocator&&position(start);\n\t\t\tdomBuilder.characters(xt,0,end-start);\n\t\t\tstart = end\n\t\t}\n\t}\n\tfunction position(p,m){\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\n\t\t\tlineStart = m.index;\n\t\t\tlineEnd = lineStart + m[0].length;\n\t\t\tlocator.lineNumber++;\n\t\t\t//console.log('line++:',locator,startPos,endPos)\n\t\t}\n\t\tlocator.columnNumber = p-lineStart+1;\n\t}\n\tvar lineStart = 0;\n\tvar lineEnd = 0;\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\n\tvar locator = domBuilder.locator;\n\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\n\tvar closeMap = {};\n\tvar start = 0;\n\twhile(true){\n\t\ttry{\n\t\t\tvar tagStart = source.indexOf('<',start);\n\t\t\tif(tagStart<0){\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\n\t\t\t\t\tvar doc = domBuilder.doc;\n\t \t\t\tvar text = doc.createTextNode(source.substr(start));\n\t \t\t\tdoc.appendChild(text);\n\t \t\t\tdomBuilder.currentElement = text;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(tagStart>start){\n\t\t\t\tappendText(tagStart);\n\t\t\t}\n\t\t\tswitch(source.charAt(tagStart+1)){\n\t\t\tcase '/':\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\n\t\t\t\tvar tagName = source.substring(tagStart + 2, end).replace(/[ \\t\\n\\r]+$/g, '');\n\t\t\t\tvar config = parseStack.pop();\n\t\t\t\tif(end<0){\n\n\t \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\n\t \t\tend = tagStart+1+tagName.length;\n\t \t}else if(tagName.match(/\\s\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\n\t\t\t\tbreak;\n\t\t\tcase '!':// start){\n\t\t\tstart = end;\n\t\t}else{\n\t\t\t//TODO: 这里有可能sax回退,有位置错误风险\n\t\t\tappendText(Math.max(tagStart,start)+1);\n\t\t}\n\t}\n}\nfunction copyLocator(f,t){\n\tt.lineNumber = f.lineNumber;\n\tt.columnNumber = f.columnNumber;\n\treturn t;\n}\n\n/**\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\n */\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\n\n\t/**\n\t * @param {string} qname\n\t * @param {string} value\n\t * @param {number} startIndex\n\t */\n\tfunction addAttribute(qname, value, startIndex) {\n\t\tif (el.attributeNames.hasOwnProperty(qname)) {\n\t\t\terrorHandler.fatalError('Attribute ' + qname + ' redefined')\n\t\t}\n\t\tel.addValue(\n\t\t\tqname,\n\t\t\t// @see https://www.w3.org/TR/xml/#AVNormalize\n\t\t\t// since the xmldom sax parser does not \"interpret\" DTD the following is not implemented:\n\t\t\t// - recursive replacement of (DTD) entity references\n\t\t\t// - trimming and collapsing multiple spaces into a single one for attributes that are not of type CDATA\n\t\t\tvalue.replace(/[\\t\\n\\r]/g, ' ').replace(/&#?\\w+;/g, entityReplacer),\n\t\t\tstartIndex\n\t\t)\n\t}\n\tvar attrName;\n\tvar value;\n\tvar p = ++start;\n\tvar s = S_TAG;//status\n\twhile(true){\n\t\tvar c = source.charAt(p);\n\t\tswitch(c){\n\t\tcase '=':\n\t\t\tif(s === S_ATTR){//attrName\n\t\t\t\tattrName = source.slice(start,p);\n\t\t\t\ts = S_EQ;\n\t\t\t}else if(s === S_ATTR_SPACE){\n\t\t\t\ts = S_EQ;\n\t\t\t}else{\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\n\t\t\t\tthrow new Error('attribute equal must after attrName'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '\\'':\n\t\tcase '\"':\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\n\t\t\t\t){//equal\n\t\t\t\tif(s === S_ATTR){\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t}\n\t\t\t\tstart = p+1;\n\t\t\t\tp = source.indexOf(c,start)\n\t\t\t\tif(p>0){\n\t\t\t\t\tvalue = source.slice(start, p);\n\t\t\t\t\taddAttribute(attrName, value, start-1);\n\t\t\t\t\ts = S_ATTR_END;\n\t\t\t\t}else{\n\t\t\t\t\t//fatalError: no end quot match\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\n\t\t\t\t}\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\tvalue = source.slice(start, p);\n\t\t\t\taddAttribute(attrName, value, start);\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\n\t\t\t\tstart = p+1;\n\t\t\t\ts = S_ATTR_END\n\t\t\t}else{\n\t\t\t\t//fatalError: no equal before\n\t\t\t\tthrow new Error('attribute value must after \"=\"'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '/':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\ts =S_TAG_CLOSE;\n\t\t\t\tel.closed = true;\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\tcase S_ATTR:\n\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tel.closed = true;\n\t\t\t\tbreak;\n\t\t\t//case S_EQ:\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\") // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ''://end document\n\t\t\terrorHandler.error('unexpected end of input');\n\t\t\tif(s == S_TAG){\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\t}\n\t\t\treturn p;\n\t\tcase '>':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\tbreak;//normal\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\n\t\t\tcase S_ATTR:\n\t\t\t\tvalue = source.slice(start,p);\n\t\t\t\tif(value.slice(-1) === '/'){\n\t\t\t\t\tel.closed = true;\n\t\t\t\t\tvalue = value.slice(0,-1)\n\t\t\t\t}\n\t\t\tcase S_ATTR_SPACE:\n\t\t\t\tif(s === S_ATTR_SPACE){\n\t\t\t\t\tvalue = attrName;\n\t\t\t\t}\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\t}else{\n\t\t\t\t\tif(!NAMESPACE.isHTML(currentNSMap['']) || !value.match(/^(?:disabled|checked|selected)$/i)){\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(value, value, start)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase S_EQ:\n\t\t\t\tthrow new Error('attribute value missed!!');\n\t\t\t}\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\n\t\t\treturn p;\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\n\t\tcase '\\u0080':\n\t\t\tc = ' ';\n\t\tdefault:\n\t\t\tif(c<= ' '){//space\n\t\t\t\tswitch(s){\n\t\t\t\tcase S_TAG:\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR:\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t\ts = S_ATTR_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\t\t\tvar value = source.slice(start, p);\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\t//case S_TAG_SPACE:\n\t\t\t\t//case S_EQ:\n\t\t\t\t//case S_ATTR_SPACE:\n\t\t\t\t//\tvoid();break;\n\t\t\t\t//case S_TAG_CLOSE:\n\t\t\t\t\t//ignore warning\n\t\t\t\t}\n\t\t\t}else{//not space\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\n\t\t\t\tswitch(s){\n\t\t\t\t//case S_TAG:void();break;\n\t\t\t\t//case S_ATTR:void();break;\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tvar tagName = el.tagName;\n\t\t\t\t\tif (!NAMESPACE.isHTML(currentNSMap['']) || !attrName.match(/^(?:disabled|checked|selected)$/i)) {\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(attrName, attrName, start);\n\t\t\t\t\tstart = p;\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\n\t\t\t\tcase S_TAG_SPACE:\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_EQ:\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_TAG_CLOSE:\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\n\t\t\t\t}\n\t\t\t}\n\t\t}//end outer switch\n\t\t//console.log('p++',p)\n\t\tp++;\n\t}\n}\n/**\n * @return true if has new namespace define\n */\nfunction appendElement(el,domBuilder,currentNSMap){\n\tvar tagName = el.tagName;\n\tvar localNSMap = null;\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\n\tvar i = el.length;\n\twhile(i--){\n\t\tvar a = el[i];\n\t\tvar qName = a.qName;\n\t\tvar value = a.value;\n\t\tvar nsp = qName.indexOf(':');\n\t\tif(nsp>0){\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\n\t\t\tvar localName = qName.slice(nsp+1);\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\n\t\t}else{\n\t\t\tlocalName = qName;\n\t\t\tprefix = null\n\t\t\tnsPrefix = qName === 'xmlns' && ''\n\t\t}\n\t\t//can not set prefix,because prefix !== ''\n\t\ta.localName = localName ;\n\t\t//prefix == null for no ns prefix attribute\n\t\tif(nsPrefix !== false){//hack!!\n\t\t\tif(localNSMap == null){\n\t\t\t\tlocalNSMap = {}\n\t\t\t\t//console.log(currentNSMap,0)\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\n\t\t\t\t//console.log(currentNSMap,1)\n\t\t\t}\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\n\t\t\ta.uri = NAMESPACE.XMLNS\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value)\n\t\t}\n\t}\n\tvar i = el.length;\n\twhile(i--){\n\t\ta = el[i];\n\t\tvar prefix = a.prefix;\n\t\tif(prefix){//no prefix attribute has no namespace\n\t\t\tif(prefix === 'xml'){\n\t\t\t\ta.uri = NAMESPACE.XML;\n\t\t\t}if(prefix !== 'xmlns'){\n\t\t\t\ta.uri = currentNSMap[prefix || '']\n\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\n\t\t\t}\n\t\t}\n\t}\n\tvar nsp = tagName.indexOf(':');\n\tif(nsp>0){\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\n\t}else{\n\t\tprefix = null;//important!!\n\t\tlocalName = el.localName = tagName;\n\t}\n\t//no prefix element has default namespace\n\tvar ns = el.uri = currentNSMap[prefix || ''];\n\tdomBuilder.startElement(ns,localName,tagName,el);\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\n\t//localNSMap = null\n\tif(el.closed){\n\t\tdomBuilder.endElement(ns,localName,tagName);\n\t\tif(localNSMap){\n\t\t\tfor (prefix in localNSMap) {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) {\n\t\t\t\t\tdomBuilder.endPrefixMapping(prefix);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}else{\n\t\tel.currentNSMap = currentNSMap;\n\t\tel.localNSMap = localNSMap;\n\t\t//parseStack.push(el);\n\t\treturn true;\n\t}\n}\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\n\tif(/^(?:script|textarea)$/i.test(tagName)){\n\t\tvar elEndStart = source.indexOf('',elStartEnd);\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\n\t\tif(/[&<]/.test(text)){\n\t\t\tif(/^script$/i.test(tagName)){\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\n\t\t\t\t\t//lexHandler.startCDATA();\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\t\t//lexHandler.endCDATA();\n\t\t\t\t\treturn elEndStart;\n\t\t\t\t//}\n\t\t\t}//}else{//text area\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\treturn elEndStart;\n\t\t\t//}\n\n\t\t}\n\t}\n\treturn elStartEnd+1;\n}\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\n\t//if(tagName in closeMap){\n\tvar pos = closeMap[tagName];\n\tif(pos == null){\n\t\t//console.log(tagName)\n\t\tpos = source.lastIndexOf('')\n\t\tif(pos',start+4);\n\t\t\t//append comment source.substring(4,end)// | item |\n// | item | | item | | item |\n// | ... | | ... | | ... |\n// | item | | item | | item |\n// | item | | item | | item |\n// | [empty] | <-- top | item | | item |\n// | [empty] | | item | | item |\n// | [empty] | | [empty] | <-- top top --> | [empty] |\n// +-----------+ +-----------+ +-----------+\n//\n// Or, if there is only one circular buffer, it looks something\n// like either of these:\n//\n// head tail head tail\n// | | | |\n// v v v v\n// +-----------+ +-----------+\n// | [null] | | [null] |\n// +-----------+ +-----------+\n// | [empty] | | item |\n// | [empty] | | item |\n// | item | <-- bottom top --> | [empty] |\n// | item | | [empty] |\n// | [empty] | <-- top bottom --> | item |\n// | [empty] | | item |\n// +-----------+ +-----------+\n//\n// Adding a value means moving `top` forward by one, removing means\n// moving `bottom` forward by one. After reaching the end, the queue\n// wraps around.\n//\n// When `top === bottom` the current queue is empty and when\n// `top + 1 === bottom` it's full. This wastes a single space of storage\n// but allows much quicker checks.\n\nclass FixedCircularBuffer {\n constructor() {\n this.bottom = 0;\n this.top = 0;\n this.list = new Array(kSize);\n this.next = null;\n }\n\n isEmpty() {\n return this.top === this.bottom;\n }\n\n isFull() {\n return ((this.top + 1) & kMask) === this.bottom;\n }\n\n push(data) {\n this.list[this.top] = data;\n this.top = (this.top + 1) & kMask;\n }\n\n shift() {\n const nextItem = this.list[this.bottom];\n if (nextItem === undefined)\n return null;\n this.list[this.bottom] = undefined;\n this.bottom = (this.bottom + 1) & kMask;\n return nextItem;\n }\n}\n\nmodule.exports = class FixedQueue {\n constructor() {\n this.head = this.tail = new FixedCircularBuffer();\n }\n\n isEmpty() {\n return this.head.isEmpty();\n }\n\n push(data) {\n if (this.head.isFull()) {\n // Head is full: Creates a new queue, sets the old queue's `.next` to it,\n // and sets it as the new main queue.\n this.head = this.head.next = new FixedCircularBuffer();\n }\n this.head.push(data);\n }\n\n shift() {\n const tail = this.tail;\n const next = tail.shift();\n if (tail.isEmpty() && tail.next !== null) {\n // If there is another queue, it forms the new tail.\n this.tail = tail.next;\n }\n return next;\n }\n};\n","'use strict'\n\nconst DispatcherBase = require('./dispatcher-base')\nconst FixedQueue = require('./node/fixed-queue')\nconst { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require('./core/symbols')\nconst PoolStats = require('./pool-stats')\n\nconst kClients = Symbol('clients')\nconst kNeedDrain = Symbol('needDrain')\nconst kQueue = Symbol('queue')\nconst kClosedResolve = Symbol('closed resolve')\nconst kOnDrain = Symbol('onDrain')\nconst kOnConnect = Symbol('onConnect')\nconst kOnDisconnect = Symbol('onDisconnect')\nconst kOnConnectionError = Symbol('onConnectionError')\nconst kGetDispatcher = Symbol('get dispatcher')\nconst kAddClient = Symbol('add client')\nconst kRemoveClient = Symbol('remove client')\nconst kStats = Symbol('stats')\n\nclass PoolBase extends DispatcherBase {\n constructor () {\n super()\n\n this[kQueue] = new FixedQueue()\n this[kClients] = []\n this[kQueued] = 0\n\n const pool = this\n\n this[kOnDrain] = function onDrain (origin, targets) {\n const queue = pool[kQueue]\n\n let needDrain = false\n\n while (!needDrain) {\n const item = queue.shift()\n if (!item) {\n break\n }\n pool[kQueued]--\n needDrain = !this.dispatch(item.opts, item.handler)\n }\n\n this[kNeedDrain] = needDrain\n\n if (!this[kNeedDrain] && pool[kNeedDrain]) {\n pool[kNeedDrain] = false\n pool.emit('drain', origin, [pool, ...targets])\n }\n\n if (pool[kClosedResolve] && queue.isEmpty()) {\n Promise\n .all(pool[kClients].map(c => c.close()))\n .then(pool[kClosedResolve])\n }\n }\n\n this[kOnConnect] = (origin, targets) => {\n pool.emit('connect', origin, [pool, ...targets])\n }\n\n this[kOnDisconnect] = (origin, targets, err) => {\n pool.emit('disconnect', origin, [pool, ...targets], err)\n }\n\n this[kOnConnectionError] = (origin, targets, err) => {\n pool.emit('connectionError', origin, [pool, ...targets], err)\n }\n\n this[kStats] = new PoolStats(this)\n }\n\n get [kBusy] () {\n return this[kNeedDrain]\n }\n\n get [kConnected] () {\n return this[kClients].filter(client => client[kConnected]).length\n }\n\n get [kFree] () {\n return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length\n }\n\n get [kPending] () {\n let ret = this[kQueued]\n for (const { [kPending]: pending } of this[kClients]) {\n ret += pending\n }\n return ret\n }\n\n get [kRunning] () {\n let ret = 0\n for (const { [kRunning]: running } of this[kClients]) {\n ret += running\n }\n return ret\n }\n\n get [kSize] () {\n let ret = this[kQueued]\n for (const { [kSize]: size } of this[kClients]) {\n ret += size\n }\n return ret\n }\n\n get stats () {\n return this[kStats]\n }\n\n async [kClose] () {\n if (this[kQueue].isEmpty()) {\n return Promise.all(this[kClients].map(c => c.close()))\n } else {\n return new Promise((resolve) => {\n this[kClosedResolve] = resolve\n })\n }\n }\n\n async [kDestroy] (err) {\n while (true) {\n const item = this[kQueue].shift()\n if (!item) {\n break\n }\n item.handler.onError(err)\n }\n\n return Promise.all(this[kClients].map(c => c.destroy(err)))\n }\n\n [kDispatch] (opts, handler) {\n const dispatcher = this[kGetDispatcher]()\n\n if (!dispatcher) {\n this[kNeedDrain] = true\n this[kQueue].push({ opts, handler })\n this[kQueued]++\n } else if (!dispatcher.dispatch(opts, handler)) {\n dispatcher[kNeedDrain] = true\n this[kNeedDrain] = !this[kGetDispatcher]()\n }\n\n return !this[kNeedDrain]\n }\n\n [kAddClient] (client) {\n client\n .on('drain', this[kOnDrain])\n .on('connect', this[kOnConnect])\n .on('disconnect', this[kOnDisconnect])\n .on('connectionError', this[kOnConnectionError])\n\n this[kClients].push(client)\n\n if (this[kNeedDrain]) {\n process.nextTick(() => {\n if (this[kNeedDrain]) {\n this[kOnDrain](client[kUrl], [this, client])\n }\n })\n }\n\n return this\n }\n\n [kRemoveClient] (client) {\n client.close(() => {\n const idx = this[kClients].indexOf(client)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n })\n\n this[kNeedDrain] = this[kClients].some(dispatcher => (\n !dispatcher[kNeedDrain] &&\n dispatcher.closed !== true &&\n dispatcher.destroyed !== true\n ))\n }\n}\n\nmodule.exports = {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kRemoveClient,\n kGetDispatcher\n}\n","const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require('./core/symbols')\nconst kPool = Symbol('pool')\n\nclass PoolStats {\n constructor (pool) {\n this[kPool] = pool\n }\n\n get connected () {\n return this[kPool][kConnected]\n }\n\n get free () {\n return this[kPool][kFree]\n }\n\n get pending () {\n return this[kPool][kPending]\n }\n\n get queued () {\n return this[kPool][kQueued]\n }\n\n get running () {\n return this[kPool][kRunning]\n }\n\n get size () {\n return this[kPool][kSize]\n }\n}\n\nmodule.exports = PoolStats\n","'use strict'\n\nconst {\n PoolBase,\n kClients,\n kNeedDrain,\n kAddClient,\n kGetDispatcher\n} = require('./pool-base')\nconst Client = require('./client')\nconst {\n InvalidArgumentError\n} = require('./core/errors')\nconst util = require('./core/util')\nconst { kUrl, kInterceptors } = require('./core/symbols')\nconst buildConnector = require('./core/connect')\n\nconst kOptions = Symbol('options')\nconst kConnections = Symbol('connections')\nconst kFactory = Symbol('factory')\n\nfunction defaultFactory (origin, opts) {\n return new Client(origin, opts)\n}\n\nclass Pool extends PoolBase {\n constructor (origin, {\n connections,\n factory = defaultFactory,\n connect,\n connectTimeout,\n tls,\n maxCachedSessions,\n socketPath,\n autoSelectFamily,\n autoSelectFamilyAttemptTimeout,\n allowH2,\n ...options\n } = {}) {\n super()\n\n if (connections != null && (!Number.isFinite(connections) || connections < 0)) {\n throw new InvalidArgumentError('invalid connections')\n }\n\n if (typeof factory !== 'function') {\n throw new InvalidArgumentError('factory must be a function.')\n }\n\n if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {\n throw new InvalidArgumentError('connect must be a function or an object')\n }\n\n if (typeof connect !== 'function') {\n connect = buildConnector({\n ...tls,\n maxCachedSessions,\n allowH2,\n socketPath,\n timeout: connectTimeout,\n ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),\n ...connect\n })\n }\n\n this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool)\n ? options.interceptors.Pool\n : []\n this[kConnections] = connections || null\n this[kUrl] = util.parseOrigin(origin)\n this[kOptions] = { ...util.deepClone(options), connect, allowH2 }\n this[kOptions].interceptors = options.interceptors\n ? { ...options.interceptors }\n : undefined\n this[kFactory] = factory\n\n this.on('connectionError', (origin, targets, error) => {\n // If a connection error occurs, we remove the client from the pool,\n // and emit a connectionError event. They will not be re-used.\n // Fixes https://github.com/nodejs/undici/issues/3895\n for (const target of targets) {\n // Do not use kRemoveClient here, as it will close the client,\n // but the client cannot be closed in this state.\n const idx = this[kClients].indexOf(target)\n if (idx !== -1) {\n this[kClients].splice(idx, 1)\n }\n }\n })\n }\n\n [kGetDispatcher] () {\n let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain])\n\n if (dispatcher) {\n return dispatcher\n }\n\n if (!this[kConnections] || this[kClients].length < this[kConnections]) {\n dispatcher = this[kFactory](this[kUrl], this[kOptions])\n this[kAddClient](dispatcher)\n }\n\n return dispatcher\n }\n}\n\nmodule.exports = Pool\n","'use strict'\n\nconst { kProxy, kClose, kDestroy, kInterceptors } = require('./core/symbols')\nconst { URL } = require('url')\nconst Agent = require('./agent')\nconst Pool = require('./pool')\nconst DispatcherBase = require('./dispatcher-base')\nconst { InvalidArgumentError, RequestAbortedError } = require('./core/errors')\nconst buildConnector = require('./core/connect')\n\nconst kAgent = Symbol('proxy agent')\nconst kClient = Symbol('proxy client')\nconst kProxyHeaders = Symbol('proxy headers')\nconst kRequestTls = Symbol('request tls settings')\nconst kProxyTls = Symbol('proxy tls settings')\nconst kConnectEndpoint = Symbol('connect endpoint function')\n\nfunction defaultProtocolPort (protocol) {\n return protocol === 'https:' ? 443 : 80\n}\n\nfunction buildProxyOptions (opts) {\n if (typeof opts === 'string') {\n opts = { uri: opts }\n }\n\n if (!opts || !opts.uri) {\n throw new InvalidArgumentError('Proxy opts.uri is mandatory')\n }\n\n return {\n uri: opts.uri,\n protocol: opts.protocol || 'https'\n }\n}\n\nfunction defaultFactory (origin, opts) {\n return new Pool(origin, opts)\n}\n\nclass ProxyAgent extends DispatcherBase {\n constructor (opts) {\n super(opts)\n this[kProxy] = buildProxyOptions(opts)\n this[kAgent] = new Agent(opts)\n this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent)\n ? opts.interceptors.ProxyAgent\n : []\n\n if (typeof opts === 'string') {\n opts = { uri: opts }\n }\n\n if (!opts || !opts.uri) {\n throw new InvalidArgumentError('Proxy opts.uri is mandatory')\n }\n\n const { clientFactory = defaultFactory } = opts\n\n if (typeof clientFactory !== 'function') {\n throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')\n }\n\n this[kRequestTls] = opts.requestTls\n this[kProxyTls] = opts.proxyTls\n this[kProxyHeaders] = opts.headers || {}\n\n const resolvedUrl = new URL(opts.uri)\n const { origin, port, host, username, password } = resolvedUrl\n\n if (opts.auth && opts.token) {\n throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')\n } else if (opts.auth) {\n /* @deprecated in favour of opts.token */\n this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`\n } else if (opts.token) {\n this[kProxyHeaders]['proxy-authorization'] = opts.token\n } else if (username && password) {\n this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`\n }\n\n const connect = buildConnector({ ...opts.proxyTls })\n this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })\n this[kClient] = clientFactory(resolvedUrl, { connect })\n this[kAgent] = new Agent({\n ...opts,\n connect: async (opts, callback) => {\n let requestedHost = opts.host\n if (!opts.port) {\n requestedHost += `:${defaultProtocolPort(opts.protocol)}`\n }\n try {\n const { socket, statusCode } = await this[kClient].connect({\n origin,\n port,\n path: requestedHost,\n signal: opts.signal,\n headers: {\n ...this[kProxyHeaders],\n host\n }\n })\n if (statusCode !== 200) {\n socket.on('error', () => {}).destroy()\n callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))\n }\n if (opts.protocol !== 'https:') {\n callback(null, socket)\n return\n }\n let servername\n if (this[kRequestTls]) {\n servername = this[kRequestTls].servername\n } else {\n servername = opts.servername\n }\n this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback)\n } catch (err) {\n callback(err)\n }\n }\n })\n }\n\n dispatch (opts, handler) {\n const { host } = new URL(opts.origin)\n const headers = buildHeaders(opts.headers)\n throwIfProxyAuthIsSent(headers)\n return this[kAgent].dispatch(\n {\n ...opts,\n headers: {\n ...headers,\n host\n }\n },\n handler\n )\n }\n\n async [kClose] () {\n await this[kAgent].close()\n await this[kClient].close()\n }\n\n async [kDestroy] () {\n await this[kAgent].destroy()\n await this[kClient].destroy()\n }\n}\n\n/**\n * @param {string[] | Record} headers\n * @returns {Record}\n */\nfunction buildHeaders (headers) {\n // When using undici.fetch, the headers list is stored\n // as an array.\n if (Array.isArray(headers)) {\n /** @type {Record} */\n const headersPair = {}\n\n for (let i = 0; i < headers.length; i += 2) {\n headersPair[headers[i]] = headers[i + 1]\n }\n\n return headersPair\n }\n\n return headers\n}\n\n/**\n * @param {Record} headers\n *\n * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers\n * Nevertheless, it was changed and to avoid a security vulnerability by end users\n * this check was created.\n * It should be removed in the next major version for performance reasons\n */\nfunction throwIfProxyAuthIsSent (headers) {\n const existProxyAuth = headers && Object.keys(headers)\n .find((key) => key.toLowerCase() === 'proxy-authorization')\n if (existProxyAuth) {\n throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')\n }\n}\n\nmodule.exports = ProxyAgent\n","'use strict'\n\nlet fastNow = Date.now()\nlet fastNowTimeout\n\nconst fastTimers = []\n\nfunction onTimeout () {\n fastNow = Date.now()\n\n let len = fastTimers.length\n let idx = 0\n while (idx < len) {\n const timer = fastTimers[idx]\n\n if (timer.state === 0) {\n timer.state = fastNow + timer.delay\n } else if (timer.state > 0 && fastNow >= timer.state) {\n timer.state = -1\n timer.callback(timer.opaque)\n }\n\n if (timer.state === -1) {\n timer.state = -2\n if (idx !== len - 1) {\n fastTimers[idx] = fastTimers.pop()\n } else {\n fastTimers.pop()\n }\n len -= 1\n } else {\n idx += 1\n }\n }\n\n if (fastTimers.length > 0) {\n refreshTimeout()\n }\n}\n\nfunction refreshTimeout () {\n if (fastNowTimeout && fastNowTimeout.refresh) {\n fastNowTimeout.refresh()\n } else {\n clearTimeout(fastNowTimeout)\n fastNowTimeout = setTimeout(onTimeout, 1e3)\n if (fastNowTimeout.unref) {\n fastNowTimeout.unref()\n }\n }\n}\n\nclass Timeout {\n constructor (callback, delay, opaque) {\n this.callback = callback\n this.delay = delay\n this.opaque = opaque\n\n // -2 not in timer list\n // -1 in timer list but inactive\n // 0 in timer list waiting for time\n // > 0 in timer list waiting for time to expire\n this.state = -2\n\n this.refresh()\n }\n\n refresh () {\n if (this.state === -2) {\n fastTimers.push(this)\n if (!fastNowTimeout || fastTimers.length === 1) {\n refreshTimeout()\n }\n }\n\n this.state = 0\n }\n\n clear () {\n this.state = -1\n }\n}\n\nmodule.exports = {\n setTimeout (callback, delay, opaque) {\n return delay < 1e3\n ? setTimeout(callback, delay, opaque)\n : new Timeout(callback, delay, opaque)\n },\n clearTimeout (timeout) {\n if (timeout instanceof Timeout) {\n timeout.clear()\n } else {\n clearTimeout(timeout)\n }\n }\n}\n","'use strict'\n\nconst diagnosticsChannel = require('diagnostics_channel')\nconst { uid, states } = require('./constants')\nconst {\n kReadyState,\n kSentClose,\n kByteParser,\n kReceivedClose\n} = require('./symbols')\nconst { fireEvent, failWebsocketConnection } = require('./util')\nconst { CloseEvent } = require('./events')\nconst { makeRequest } = require('../fetch/request')\nconst { fetching } = require('../fetch/index')\nconst { Headers } = require('../fetch/headers')\nconst { getGlobalDispatcher } = require('../global')\nconst { kHeadersList } = require('../core/symbols')\n\nconst channels = {}\nchannels.open = diagnosticsChannel.channel('undici:websocket:open')\nchannels.close = diagnosticsChannel.channel('undici:websocket:close')\nchannels.socketError = diagnosticsChannel.channel('undici:websocket:socket_error')\n\n/** @type {import('crypto')} */\nlet crypto\ntry {\n crypto = require('crypto')\n} catch {\n\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#concept-websocket-establish\n * @param {URL} url\n * @param {string|string[]} protocols\n * @param {import('./websocket').WebSocket} ws\n * @param {(response: any) => void} onEstablish\n * @param {Partial} options\n */\nfunction establishWebSocketConnection (url, protocols, ws, onEstablish, options) {\n // 1. Let requestURL be a copy of url, with its scheme set to \"http\", if url’s\n // scheme is \"ws\", and to \"https\" otherwise.\n const requestURL = url\n\n requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:'\n\n // 2. Let request be a new request, whose URL is requestURL, client is client,\n // service-workers mode is \"none\", referrer is \"no-referrer\", mode is\n // \"websocket\", credentials mode is \"include\", cache mode is \"no-store\" ,\n // and redirect mode is \"error\".\n const request = makeRequest({\n urlList: [requestURL],\n serviceWorkers: 'none',\n referrer: 'no-referrer',\n mode: 'websocket',\n credentials: 'include',\n cache: 'no-store',\n redirect: 'error'\n })\n\n // Note: undici extension, allow setting custom headers.\n if (options.headers) {\n const headersList = new Headers(options.headers)[kHeadersList]\n\n request.headersList = headersList\n }\n\n // 3. Append (`Upgrade`, `websocket`) to request’s header list.\n // 4. Append (`Connection`, `Upgrade`) to request’s header list.\n // Note: both of these are handled by undici currently.\n // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397\n\n // 5. Let keyValue be a nonce consisting of a randomly selected\n // 16-byte value that has been forgiving-base64-encoded and\n // isomorphic encoded.\n const keyValue = crypto.randomBytes(16).toString('base64')\n\n // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s\n // header list.\n request.headersList.append('sec-websocket-key', keyValue)\n\n // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s\n // header list.\n request.headersList.append('sec-websocket-version', '13')\n\n // 8. For each protocol in protocols, combine\n // (`Sec-WebSocket-Protocol`, protocol) in request’s header\n // list.\n for (const protocol of protocols) {\n request.headersList.append('sec-websocket-protocol', protocol)\n }\n\n // 9. Let permessageDeflate be a user-agent defined\n // \"permessage-deflate\" extension header value.\n // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673\n // TODO: enable once permessage-deflate is supported\n const permessageDeflate = '' // 'permessage-deflate; 15'\n\n // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to\n // request’s header list.\n // request.headersList.append('sec-websocket-extensions', permessageDeflate)\n\n // 11. Fetch request with useParallelQueue set to true, and\n // processResponse given response being these steps:\n const controller = fetching({\n request,\n useParallelQueue: true,\n dispatcher: options.dispatcher ?? getGlobalDispatcher(),\n processResponse (response) {\n // 1. If response is a network error or its status is not 101,\n // fail the WebSocket connection.\n if (response.type === 'error' || response.status !== 101) {\n failWebsocketConnection(ws, 'Received network error or non-101 status code.')\n return\n }\n\n // 2. If protocols is not the empty list and extracting header\n // list values given `Sec-WebSocket-Protocol` and response’s\n // header list results in null, failure, or the empty byte\n // sequence, then fail the WebSocket connection.\n if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) {\n failWebsocketConnection(ws, 'Server did not respond with sent protocols.')\n return\n }\n\n // 3. Follow the requirements stated step 2 to step 6, inclusive,\n // of the last set of steps in section 4.1 of The WebSocket\n // Protocol to validate response. This either results in fail\n // the WebSocket connection or the WebSocket connection is\n // established.\n\n // 2. If the response lacks an |Upgrade| header field or the |Upgrade|\n // header field contains a value that is not an ASCII case-\n // insensitive match for the value \"websocket\", the client MUST\n // _Fail the WebSocket Connection_.\n if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') {\n failWebsocketConnection(ws, 'Server did not set Upgrade header to \"websocket\".')\n return\n }\n\n // 3. If the response lacks a |Connection| header field or the\n // |Connection| header field doesn't contain a token that is an\n // ASCII case-insensitive match for the value \"Upgrade\", the client\n // MUST _Fail the WebSocket Connection_.\n if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') {\n failWebsocketConnection(ws, 'Server did not set Connection header to \"upgrade\".')\n return\n }\n\n // 4. If the response lacks a |Sec-WebSocket-Accept| header field or\n // the |Sec-WebSocket-Accept| contains a value other than the\n // base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-\n // Key| (as a string, not base64-decoded) with the string \"258EAFA5-\n // E914-47DA-95CA-C5AB0DC85B11\" but ignoring any leading and\n // trailing whitespace, the client MUST _Fail the WebSocket\n // Connection_.\n const secWSAccept = response.headersList.get('Sec-WebSocket-Accept')\n const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64')\n if (secWSAccept !== digest) {\n failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.')\n return\n }\n\n // 5. If the response includes a |Sec-WebSocket-Extensions| header\n // field and this header field indicates the use of an extension\n // that was not present in the client's handshake (the server has\n // indicated an extension not requested by the client), the client\n // MUST _Fail the WebSocket Connection_. (The parsing of this\n // header field to determine which extensions are requested is\n // discussed in Section 9.1.)\n const secExtension = response.headersList.get('Sec-WebSocket-Extensions')\n\n if (secExtension !== null && secExtension !== permessageDeflate) {\n failWebsocketConnection(ws, 'Received different permessage-deflate than the one set.')\n return\n }\n\n // 6. If the response includes a |Sec-WebSocket-Protocol| header field\n // and this header field indicates the use of a subprotocol that was\n // not present in the client's handshake (the server has indicated a\n // subprotocol not requested by the client), the client MUST _Fail\n // the WebSocket Connection_.\n const secProtocol = response.headersList.get('Sec-WebSocket-Protocol')\n\n if (secProtocol !== null && secProtocol !== request.headersList.get('Sec-WebSocket-Protocol')) {\n failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.')\n return\n }\n\n response.socket.on('data', onSocketData)\n response.socket.on('close', onSocketClose)\n response.socket.on('error', onSocketError)\n\n if (channels.open.hasSubscribers) {\n channels.open.publish({\n address: response.socket.address(),\n protocol: secProtocol,\n extensions: secExtension\n })\n }\n\n onEstablish(response)\n }\n })\n\n return controller\n}\n\n/**\n * @param {Buffer} chunk\n */\nfunction onSocketData (chunk) {\n if (!this.ws[kByteParser].write(chunk)) {\n this.pause()\n }\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4\n */\nfunction onSocketClose () {\n const { ws } = this\n\n // If the TCP connection was closed after the\n // WebSocket closing handshake was completed, the WebSocket connection\n // is said to have been closed _cleanly_.\n const wasClean = ws[kSentClose] && ws[kReceivedClose]\n\n let code = 1005\n let reason = ''\n\n const result = ws[kByteParser].closingInfo\n\n if (result) {\n code = result.code ?? 1005\n reason = result.reason\n } else if (!ws[kSentClose]) {\n // If _The WebSocket\n // Connection is Closed_ and no Close control frame was received by the\n // endpoint (such as could occur if the underlying transport connection\n // is lost), _The WebSocket Connection Close Code_ is considered to be\n // 1006.\n code = 1006\n }\n\n // 1. Change the ready state to CLOSED (3).\n ws[kReadyState] = states.CLOSED\n\n // 2. If the user agent was required to fail the WebSocket\n // connection, or if the WebSocket connection was closed\n // after being flagged as full, fire an event named error\n // at the WebSocket object.\n // TODO\n\n // 3. Fire an event named close at the WebSocket object,\n // using CloseEvent, with the wasClean attribute\n // initialized to true if the connection closed cleanly\n // and false otherwise, the code attribute initialized to\n // the WebSocket connection close code, and the reason\n // attribute initialized to the result of applying UTF-8\n // decode without BOM to the WebSocket connection close\n // reason.\n fireEvent('close', ws, CloseEvent, {\n wasClean, code, reason\n })\n\n if (channels.close.hasSubscribers) {\n channels.close.publish({\n websocket: ws,\n code,\n reason\n })\n }\n}\n\nfunction onSocketError (error) {\n const { ws } = this\n\n ws[kReadyState] = states.CLOSING\n\n if (channels.socketError.hasSubscribers) {\n channels.socketError.publish(error)\n }\n\n this.destroy()\n}\n\nmodule.exports = {\n establishWebSocketConnection\n}\n","'use strict'\n\n// This is a Globally Unique Identifier unique used\n// to validate that the endpoint accepts websocket\n// connections.\n// See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3\nconst uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'\n\n/** @type {PropertyDescriptor} */\nconst staticPropertyDescriptors = {\n enumerable: true,\n writable: false,\n configurable: false\n}\n\nconst states = {\n CONNECTING: 0,\n OPEN: 1,\n CLOSING: 2,\n CLOSED: 3\n}\n\nconst opcodes = {\n CONTINUATION: 0x0,\n TEXT: 0x1,\n BINARY: 0x2,\n CLOSE: 0x8,\n PING: 0x9,\n PONG: 0xA\n}\n\nconst maxUnsigned16Bit = 2 ** 16 - 1 // 65535\n\nconst parserStates = {\n INFO: 0,\n PAYLOADLENGTH_16: 2,\n PAYLOADLENGTH_64: 3,\n READ_DATA: 4\n}\n\nconst emptyBuffer = Buffer.allocUnsafe(0)\n\nmodule.exports = {\n uid,\n staticPropertyDescriptors,\n states,\n opcodes,\n maxUnsigned16Bit,\n parserStates,\n emptyBuffer\n}\n","'use strict'\n\nconst { webidl } = require('../fetch/webidl')\nconst { kEnumerableProperty } = require('../core/util')\nconst { MessagePort } = require('worker_threads')\n\n/**\n * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent\n */\nclass MessageEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' })\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.MessageEventInit(eventInitDict)\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n }\n\n get data () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.data\n }\n\n get origin () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.origin\n }\n\n get lastEventId () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.lastEventId\n }\n\n get source () {\n webidl.brandCheck(this, MessageEvent)\n\n return this.#eventInit.source\n }\n\n get ports () {\n webidl.brandCheck(this, MessageEvent)\n\n if (!Object.isFrozen(this.#eventInit.ports)) {\n Object.freeze(this.#eventInit.ports)\n }\n\n return this.#eventInit.ports\n }\n\n initMessageEvent (\n type,\n bubbles = false,\n cancelable = false,\n data = null,\n origin = '',\n lastEventId = '',\n source = null,\n ports = []\n ) {\n webidl.brandCheck(this, MessageEvent)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' })\n\n return new MessageEvent(type, {\n bubbles, cancelable, data, origin, lastEventId, source, ports\n })\n }\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#the-closeevent-interface\n */\nclass CloseEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict = {}) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' })\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.CloseEventInit(eventInitDict)\n\n super(type, eventInitDict)\n\n this.#eventInit = eventInitDict\n }\n\n get wasClean () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.wasClean\n }\n\n get code () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.code\n }\n\n get reason () {\n webidl.brandCheck(this, CloseEvent)\n\n return this.#eventInit.reason\n }\n}\n\n// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface\nclass ErrorEvent extends Event {\n #eventInit\n\n constructor (type, eventInitDict) {\n webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' })\n\n super(type, eventInitDict)\n\n type = webidl.converters.DOMString(type)\n eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})\n\n this.#eventInit = eventInitDict\n }\n\n get message () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.message\n }\n\n get filename () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.filename\n }\n\n get lineno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.lineno\n }\n\n get colno () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.colno\n }\n\n get error () {\n webidl.brandCheck(this, ErrorEvent)\n\n return this.#eventInit.error\n }\n}\n\nObject.defineProperties(MessageEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'MessageEvent',\n configurable: true\n },\n data: kEnumerableProperty,\n origin: kEnumerableProperty,\n lastEventId: kEnumerableProperty,\n source: kEnumerableProperty,\n ports: kEnumerableProperty,\n initMessageEvent: kEnumerableProperty\n})\n\nObject.defineProperties(CloseEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'CloseEvent',\n configurable: true\n },\n reason: kEnumerableProperty,\n code: kEnumerableProperty,\n wasClean: kEnumerableProperty\n})\n\nObject.defineProperties(ErrorEvent.prototype, {\n [Symbol.toStringTag]: {\n value: 'ErrorEvent',\n configurable: true\n },\n message: kEnumerableProperty,\n filename: kEnumerableProperty,\n lineno: kEnumerableProperty,\n colno: kEnumerableProperty,\n error: kEnumerableProperty\n})\n\nwebidl.converters.MessagePort = webidl.interfaceConverter(MessagePort)\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.MessagePort\n)\n\nconst eventInit = [\n {\n key: 'bubbles',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'cancelable',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'composed',\n converter: webidl.converters.boolean,\n defaultValue: false\n }\n]\n\nwebidl.converters.MessageEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'data',\n converter: webidl.converters.any,\n defaultValue: null\n },\n {\n key: 'origin',\n converter: webidl.converters.USVString,\n defaultValue: ''\n },\n {\n key: 'lastEventId',\n converter: webidl.converters.DOMString,\n defaultValue: ''\n },\n {\n key: 'source',\n // Node doesn't implement WindowProxy or ServiceWorker, so the only\n // valid value for source is a MessagePort.\n converter: webidl.nullableConverter(webidl.converters.MessagePort),\n defaultValue: null\n },\n {\n key: 'ports',\n converter: webidl.converters['sequence'],\n get defaultValue () {\n return []\n }\n }\n])\n\nwebidl.converters.CloseEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'wasClean',\n converter: webidl.converters.boolean,\n defaultValue: false\n },\n {\n key: 'code',\n converter: webidl.converters['unsigned short'],\n defaultValue: 0\n },\n {\n key: 'reason',\n converter: webidl.converters.USVString,\n defaultValue: ''\n }\n])\n\nwebidl.converters.ErrorEventInit = webidl.dictionaryConverter([\n ...eventInit,\n {\n key: 'message',\n converter: webidl.converters.DOMString,\n defaultValue: ''\n },\n {\n key: 'filename',\n converter: webidl.converters.USVString,\n defaultValue: ''\n },\n {\n key: 'lineno',\n converter: webidl.converters['unsigned long'],\n defaultValue: 0\n },\n {\n key: 'colno',\n converter: webidl.converters['unsigned long'],\n defaultValue: 0\n },\n {\n key: 'error',\n converter: webidl.converters.any\n }\n])\n\nmodule.exports = {\n MessageEvent,\n CloseEvent,\n ErrorEvent\n}\n","'use strict'\n\nconst { maxUnsigned16Bit } = require('./constants')\n\n/** @type {import('crypto')} */\nlet crypto\ntry {\n crypto = require('crypto')\n} catch {\n\n}\n\nclass WebsocketFrameSend {\n /**\n * @param {Buffer|undefined} data\n */\n constructor (data) {\n this.frameData = data\n this.maskKey = crypto.randomBytes(4)\n }\n\n createFrame (opcode) {\n const bodyLength = this.frameData?.byteLength ?? 0\n\n /** @type {number} */\n let payloadLength = bodyLength // 0-125\n let offset = 6\n\n if (bodyLength > maxUnsigned16Bit) {\n offset += 8 // payload length is next 8 bytes\n payloadLength = 127\n } else if (bodyLength > 125) {\n offset += 2 // payload length is next 2 bytes\n payloadLength = 126\n }\n\n const buffer = Buffer.allocUnsafe(bodyLength + offset)\n\n // Clear first 2 bytes, everything else is overwritten\n buffer[0] = buffer[1] = 0\n buffer[0] |= 0x80 // FIN\n buffer[0] = (buffer[0] & 0xF0) + opcode // opcode\n\n /*! ws. MIT License. Einar Otto Stangvik */\n buffer[offset - 4] = this.maskKey[0]\n buffer[offset - 3] = this.maskKey[1]\n buffer[offset - 2] = this.maskKey[2]\n buffer[offset - 1] = this.maskKey[3]\n\n buffer[1] = payloadLength\n\n if (payloadLength === 126) {\n buffer.writeUInt16BE(bodyLength, 2)\n } else if (payloadLength === 127) {\n // Clear extended payload length\n buffer[2] = buffer[3] = 0\n buffer.writeUIntBE(bodyLength, 4, 6)\n }\n\n buffer[1] |= 0x80 // MASK\n\n // mask body\n for (let i = 0; i < bodyLength; i++) {\n buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]\n }\n\n return buffer\n }\n}\n\nmodule.exports = {\n WebsocketFrameSend\n}\n","'use strict'\n\nconst { Writable } = require('stream')\nconst diagnosticsChannel = require('diagnostics_channel')\nconst { parserStates, opcodes, states, emptyBuffer } = require('./constants')\nconst { kReadyState, kSentClose, kResponse, kReceivedClose } = require('./symbols')\nconst { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = require('./util')\nconst { WebsocketFrameSend } = require('./frame')\n\n// This code was influenced by ws released under the MIT license.\n// Copyright (c) 2011 Einar Otto Stangvik \n// Copyright (c) 2013 Arnout Kazemier and contributors\n// Copyright (c) 2016 Luigi Pinca and contributors\n\nconst channels = {}\nchannels.ping = diagnosticsChannel.channel('undici:websocket:ping')\nchannels.pong = diagnosticsChannel.channel('undici:websocket:pong')\n\nclass ByteParser extends Writable {\n #buffers = []\n #byteOffset = 0\n\n #state = parserStates.INFO\n\n #info = {}\n #fragments = []\n\n constructor (ws) {\n super()\n\n this.ws = ws\n }\n\n /**\n * @param {Buffer} chunk\n * @param {() => void} callback\n */\n _write (chunk, _, callback) {\n this.#buffers.push(chunk)\n this.#byteOffset += chunk.length\n\n this.run(callback)\n }\n\n /**\n * Runs whenever a new chunk is received.\n * Callback is called whenever there are no more chunks buffering,\n * or not enough bytes are buffered to parse.\n */\n run (callback) {\n while (true) {\n if (this.#state === parserStates.INFO) {\n // If there aren't enough bytes to parse the payload length, etc.\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n\n this.#info.fin = (buffer[0] & 0x80) !== 0\n this.#info.opcode = buffer[0] & 0x0F\n\n // If we receive a fragmented message, we use the type of the first\n // frame to parse the full message as binary/text, when it's terminated\n this.#info.originalOpcode ??= this.#info.opcode\n\n this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION\n\n if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) {\n // Only text and binary frames can be fragmented\n failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.')\n return\n }\n\n const payloadLength = buffer[1] & 0x7F\n\n if (payloadLength <= 125) {\n this.#info.payloadLength = payloadLength\n this.#state = parserStates.READ_DATA\n } else if (payloadLength === 126) {\n this.#state = parserStates.PAYLOADLENGTH_16\n } else if (payloadLength === 127) {\n this.#state = parserStates.PAYLOADLENGTH_64\n }\n\n if (this.#info.fragmented && payloadLength > 125) {\n // A fragmented frame can't be fragmented itself\n failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.')\n return\n } else if (\n (this.#info.opcode === opcodes.PING ||\n this.#info.opcode === opcodes.PONG ||\n this.#info.opcode === opcodes.CLOSE) &&\n payloadLength > 125\n ) {\n // Control frames can have a payload length of 125 bytes MAX\n failWebsocketConnection(this.ws, 'Payload length for control frame exceeded 125 bytes.')\n return\n } else if (this.#info.opcode === opcodes.CLOSE) {\n if (payloadLength === 1) {\n failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.')\n return\n }\n\n const body = this.consume(payloadLength)\n\n this.#info.closeInfo = this.parseCloseBody(false, body)\n\n if (!this.ws[kSentClose]) {\n // If an endpoint receives a Close frame and did not previously send a\n // Close frame, the endpoint MUST send a Close frame in response. (When\n // sending a Close frame in response, the endpoint typically echos the\n // status code it received.)\n const body = Buffer.allocUnsafe(2)\n body.writeUInt16BE(this.#info.closeInfo.code, 0)\n const closeFrame = new WebsocketFrameSend(body)\n\n this.ws[kResponse].socket.write(\n closeFrame.createFrame(opcodes.CLOSE),\n (err) => {\n if (!err) {\n this.ws[kSentClose] = true\n }\n }\n )\n }\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n this.ws[kReadyState] = states.CLOSING\n this.ws[kReceivedClose] = true\n\n this.end()\n\n return\n } else if (this.#info.opcode === opcodes.PING) {\n // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in\n // response, unless it already received a Close frame.\n // A Pong frame sent in response to a Ping frame must have identical\n // \"Application data\"\n\n const body = this.consume(payloadLength)\n\n if (!this.ws[kReceivedClose]) {\n const frame = new WebsocketFrameSend(body)\n\n this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG))\n\n if (channels.ping.hasSubscribers) {\n channels.ping.publish({\n payload: body\n })\n }\n }\n\n this.#state = parserStates.INFO\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n return\n }\n } else if (this.#info.opcode === opcodes.PONG) {\n // A Pong frame MAY be sent unsolicited. This serves as a\n // unidirectional heartbeat. A response to an unsolicited Pong frame is\n // not expected.\n\n const body = this.consume(payloadLength)\n\n if (channels.pong.hasSubscribers) {\n channels.pong.publish({\n payload: body\n })\n }\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n return\n }\n }\n } else if (this.#state === parserStates.PAYLOADLENGTH_16) {\n if (this.#byteOffset < 2) {\n return callback()\n }\n\n const buffer = this.consume(2)\n\n this.#info.payloadLength = buffer.readUInt16BE(0)\n this.#state = parserStates.READ_DATA\n } else if (this.#state === parserStates.PAYLOADLENGTH_64) {\n if (this.#byteOffset < 8) {\n return callback()\n }\n\n const buffer = this.consume(8)\n const upper = buffer.readUInt32BE(0)\n\n // 2^31 is the maxinimum bytes an arraybuffer can contain\n // on 32-bit systems. Although, on 64-bit systems, this is\n // 2^53-1 bytes.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275\n // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e\n if (upper > 2 ** 31 - 1) {\n failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.')\n return\n }\n\n const lower = buffer.readUInt32BE(4)\n\n this.#info.payloadLength = (upper << 8) + lower\n this.#state = parserStates.READ_DATA\n } else if (this.#state === parserStates.READ_DATA) {\n if (this.#byteOffset < this.#info.payloadLength) {\n // If there is still more data in this chunk that needs to be read\n return callback()\n } else if (this.#byteOffset >= this.#info.payloadLength) {\n // If the server sent multiple frames in a single chunk\n\n const body = this.consume(this.#info.payloadLength)\n\n this.#fragments.push(body)\n\n // If the frame is unfragmented, or a fragmented frame was terminated,\n // a message was received\n if (!this.#info.fragmented || (this.#info.fin && this.#info.opcode === opcodes.CONTINUATION)) {\n const fullMessage = Buffer.concat(this.#fragments)\n\n websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage)\n\n this.#info = {}\n this.#fragments.length = 0\n }\n\n this.#state = parserStates.INFO\n }\n }\n\n if (this.#byteOffset > 0) {\n continue\n } else {\n callback()\n break\n }\n }\n }\n\n /**\n * Take n bytes from the buffered Buffers\n * @param {number} n\n * @returns {Buffer|null}\n */\n consume (n) {\n if (n > this.#byteOffset) {\n return null\n } else if (n === 0) {\n return emptyBuffer\n }\n\n if (this.#buffers[0].length === n) {\n this.#byteOffset -= this.#buffers[0].length\n return this.#buffers.shift()\n }\n\n const buffer = Buffer.allocUnsafe(n)\n let offset = 0\n\n while (offset !== n) {\n const next = this.#buffers[0]\n const { length } = next\n\n if (length + offset === n) {\n buffer.set(this.#buffers.shift(), offset)\n break\n } else if (length + offset > n) {\n buffer.set(next.subarray(0, n - offset), offset)\n this.#buffers[0] = next.subarray(n - offset)\n break\n } else {\n buffer.set(this.#buffers.shift(), offset)\n offset += next.length\n }\n }\n\n this.#byteOffset -= n\n\n return buffer\n }\n\n parseCloseBody (onlyCode, data) {\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5\n /** @type {number|undefined} */\n let code\n\n if (data.length >= 2) {\n // _The WebSocket Connection Close Code_ is\n // defined as the status code (Section 7.4) contained in the first Close\n // control frame received by the application\n code = data.readUInt16BE(0)\n }\n\n if (onlyCode) {\n if (!isValidStatusCode(code)) {\n return null\n }\n\n return { code }\n }\n\n // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6\n /** @type {Buffer} */\n let reason = data.subarray(2)\n\n // Remove BOM\n if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) {\n reason = reason.subarray(3)\n }\n\n if (code !== undefined && !isValidStatusCode(code)) {\n return null\n }\n\n try {\n // TODO: optimize this\n reason = new TextDecoder('utf-8', { fatal: true }).decode(reason)\n } catch {\n return null\n }\n\n return { code, reason }\n }\n\n get closingInfo () {\n return this.#info.closeInfo\n }\n}\n\nmodule.exports = {\n ByteParser\n}\n","'use strict'\n\nmodule.exports = {\n kWebSocketURL: Symbol('url'),\n kReadyState: Symbol('ready state'),\n kController: Symbol('controller'),\n kResponse: Symbol('response'),\n kBinaryType: Symbol('binary type'),\n kSentClose: Symbol('sent close'),\n kReceivedClose: Symbol('received close'),\n kByteParser: Symbol('byte parser')\n}\n","'use strict'\n\nconst { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require('./symbols')\nconst { states, opcodes } = require('./constants')\nconst { MessageEvent, ErrorEvent } = require('./events')\n\n/* globals Blob */\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isEstablished (ws) {\n // If the server's response is validated as provided for above, it is\n // said that _The WebSocket Connection is Established_ and that the\n // WebSocket Connection is in the OPEN state.\n return ws[kReadyState] === states.OPEN\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isClosing (ws) {\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n return ws[kReadyState] === states.CLOSING\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n */\nfunction isClosed (ws) {\n return ws[kReadyState] === states.CLOSED\n}\n\n/**\n * @see https://dom.spec.whatwg.org/#concept-event-fire\n * @param {string} e\n * @param {EventTarget} target\n * @param {EventInit | undefined} eventInitDict\n */\nfunction fireEvent (e, target, eventConstructor = Event, eventInitDict) {\n // 1. If eventConstructor is not given, then let eventConstructor be Event.\n\n // 2. Let event be the result of creating an event given eventConstructor,\n // in the relevant realm of target.\n // 3. Initialize event’s type attribute to e.\n const event = new eventConstructor(e, eventInitDict) // eslint-disable-line new-cap\n\n // 4. Initialize any other IDL attributes of event as described in the\n // invocation of this algorithm.\n\n // 5. Return the result of dispatching event at target, with legacy target\n // override flag set if set.\n target.dispatchEvent(event)\n}\n\n/**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n * @param {import('./websocket').WebSocket} ws\n * @param {number} type Opcode\n * @param {Buffer} data application data\n */\nfunction websocketMessageReceived (ws, type, data) {\n // 1. If ready state is not OPEN (1), then return.\n if (ws[kReadyState] !== states.OPEN) {\n return\n }\n\n // 2. Let dataForEvent be determined by switching on type and binary type:\n let dataForEvent\n\n if (type === opcodes.TEXT) {\n // -> type indicates that the data is Text\n // a new DOMString containing data\n try {\n dataForEvent = new TextDecoder('utf-8', { fatal: true }).decode(data)\n } catch {\n failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.')\n return\n }\n } else if (type === opcodes.BINARY) {\n if (ws[kBinaryType] === 'blob') {\n // -> type indicates that the data is Binary and binary type is \"blob\"\n // a new Blob object, created in the relevant Realm of the WebSocket\n // object, that represents data as its raw data\n dataForEvent = new Blob([data])\n } else {\n // -> type indicates that the data is Binary and binary type is \"arraybuffer\"\n // a new ArrayBuffer object, created in the relevant Realm of the\n // WebSocket object, whose contents are data\n dataForEvent = new Uint8Array(data).buffer\n }\n }\n\n // 3. Fire an event named message at the WebSocket object, using MessageEvent,\n // with the origin attribute initialized to the serialization of the WebSocket\n // object’s url's origin, and the data attribute initialized to dataForEvent.\n fireEvent('message', ws, MessageEvent, {\n origin: ws[kWebSocketURL].origin,\n data: dataForEvent\n })\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455\n * @see https://datatracker.ietf.org/doc/html/rfc2616\n * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407\n * @param {string} protocol\n */\nfunction isValidSubprotocol (protocol) {\n // If present, this value indicates one\n // or more comma-separated subprotocol the client wishes to speak,\n // ordered by preference. The elements that comprise this value\n // MUST be non-empty strings with characters in the range U+0021 to\n // U+007E not including separator characters as defined in\n // [RFC2616] and MUST all be unique strings.\n if (protocol.length === 0) {\n return false\n }\n\n for (const char of protocol) {\n const code = char.charCodeAt(0)\n\n if (\n code < 0x21 ||\n code > 0x7E ||\n char === '(' ||\n char === ')' ||\n char === '<' ||\n char === '>' ||\n char === '@' ||\n char === ',' ||\n char === ';' ||\n char === ':' ||\n char === '\\\\' ||\n char === '\"' ||\n char === '/' ||\n char === '[' ||\n char === ']' ||\n char === '?' ||\n char === '=' ||\n char === '{' ||\n char === '}' ||\n code === 32 || // SP\n code === 9 // HT\n ) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4\n * @param {number} code\n */\nfunction isValidStatusCode (code) {\n if (code >= 1000 && code < 1015) {\n return (\n code !== 1004 && // reserved\n code !== 1005 && // \"MUST NOT be set as a status code\"\n code !== 1006 // \"MUST NOT be set as a status code\"\n )\n }\n\n return code >= 3000 && code <= 4999\n}\n\n/**\n * @param {import('./websocket').WebSocket} ws\n * @param {string|undefined} reason\n */\nfunction failWebsocketConnection (ws, reason) {\n const { [kController]: controller, [kResponse]: response } = ws\n\n controller.abort()\n\n if (response?.socket && !response.socket.destroyed) {\n response.socket.destroy()\n }\n\n if (reason) {\n fireEvent('error', ws, ErrorEvent, {\n error: new Error(reason)\n })\n }\n}\n\nmodule.exports = {\n isEstablished,\n isClosing,\n isClosed,\n fireEvent,\n isValidSubprotocol,\n isValidStatusCode,\n failWebsocketConnection,\n websocketMessageReceived\n}\n","'use strict'\n\nconst { webidl } = require('../fetch/webidl')\nconst { DOMException } = require('../fetch/constants')\nconst { URLSerializer } = require('../fetch/dataURL')\nconst { getGlobalOrigin } = require('../fetch/global')\nconst { staticPropertyDescriptors, states, opcodes, emptyBuffer } = require('./constants')\nconst {\n kWebSocketURL,\n kReadyState,\n kController,\n kBinaryType,\n kResponse,\n kSentClose,\n kByteParser\n} = require('./symbols')\nconst { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = require('./util')\nconst { establishWebSocketConnection } = require('./connection')\nconst { WebsocketFrameSend } = require('./frame')\nconst { ByteParser } = require('./receiver')\nconst { kEnumerableProperty, isBlobLike } = require('../core/util')\nconst { getGlobalDispatcher } = require('../global')\nconst { types } = require('util')\n\nlet experimentalWarned = false\n\n// https://websockets.spec.whatwg.org/#interface-definition\nclass WebSocket extends EventTarget {\n #events = {\n open: null,\n error: null,\n close: null,\n message: null\n }\n\n #bufferedAmount = 0\n #protocol = ''\n #extensions = ''\n\n /**\n * @param {string} url\n * @param {string|string[]} protocols\n */\n constructor (url, protocols = []) {\n super()\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket constructor' })\n\n if (!experimentalWarned) {\n experimentalWarned = true\n process.emitWarning('WebSockets are experimental, expect them to change at any time.', {\n code: 'UNDICI-WS'\n })\n }\n\n const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols)\n\n url = webidl.converters.USVString(url)\n protocols = options.protocols\n\n // 1. Let baseURL be this's relevant settings object's API base URL.\n const baseURL = getGlobalOrigin()\n\n // 1. Let urlRecord be the result of applying the URL parser to url with baseURL.\n let urlRecord\n\n try {\n urlRecord = new URL(url, baseURL)\n } catch (e) {\n // 3. If urlRecord is failure, then throw a \"SyntaxError\" DOMException.\n throw new DOMException(e, 'SyntaxError')\n }\n\n // 4. If urlRecord’s scheme is \"http\", then set urlRecord’s scheme to \"ws\".\n if (urlRecord.protocol === 'http:') {\n urlRecord.protocol = 'ws:'\n } else if (urlRecord.protocol === 'https:') {\n // 5. Otherwise, if urlRecord’s scheme is \"https\", set urlRecord’s scheme to \"wss\".\n urlRecord.protocol = 'wss:'\n }\n\n // 6. If urlRecord’s scheme is not \"ws\" or \"wss\", then throw a \"SyntaxError\" DOMException.\n if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') {\n throw new DOMException(\n `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`,\n 'SyntaxError'\n )\n }\n\n // 7. If urlRecord’s fragment is non-null, then throw a \"SyntaxError\"\n // DOMException.\n if (urlRecord.hash || urlRecord.href.endsWith('#')) {\n throw new DOMException('Got fragment', 'SyntaxError')\n }\n\n // 8. If protocols is a string, set protocols to a sequence consisting\n // of just that string.\n if (typeof protocols === 'string') {\n protocols = [protocols]\n }\n\n // 9. If any of the values in protocols occur more than once or otherwise\n // fail to match the requirements for elements that comprise the value\n // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket\n // protocol, then throw a \"SyntaxError\" DOMException.\n if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {\n throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')\n }\n\n // 10. Set this's url to urlRecord.\n this[kWebSocketURL] = new URL(urlRecord.href)\n\n // 11. Let client be this's relevant settings object.\n\n // 12. Run this step in parallel:\n\n // 1. Establish a WebSocket connection given urlRecord, protocols,\n // and client.\n this[kController] = establishWebSocketConnection(\n urlRecord,\n protocols,\n this,\n (response) => this.#onConnectionEstablished(response),\n options\n )\n\n // Each WebSocket object has an associated ready state, which is a\n // number representing the state of the connection. Initially it must\n // be CONNECTING (0).\n this[kReadyState] = WebSocket.CONNECTING\n\n // The extensions attribute must initially return the empty string.\n\n // The protocol attribute must initially return the empty string.\n\n // Each WebSocket object has an associated binary type, which is a\n // BinaryType. Initially it must be \"blob\".\n this[kBinaryType] = 'blob'\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-close\n * @param {number|undefined} code\n * @param {string|undefined} reason\n */\n close (code = undefined, reason = undefined) {\n webidl.brandCheck(this, WebSocket)\n\n if (code !== undefined) {\n code = webidl.converters['unsigned short'](code, { clamp: true })\n }\n\n if (reason !== undefined) {\n reason = webidl.converters.USVString(reason)\n }\n\n // 1. If code is present, but is neither an integer equal to 1000 nor an\n // integer in the range 3000 to 4999, inclusive, throw an\n // \"InvalidAccessError\" DOMException.\n if (code !== undefined) {\n if (code !== 1000 && (code < 3000 || code > 4999)) {\n throw new DOMException('invalid code', 'InvalidAccessError')\n }\n }\n\n let reasonByteLength = 0\n\n // 2. If reason is present, then run these substeps:\n if (reason !== undefined) {\n // 1. Let reasonBytes be the result of encoding reason.\n // 2. If reasonBytes is longer than 123 bytes, then throw a\n // \"SyntaxError\" DOMException.\n reasonByteLength = Buffer.byteLength(reason)\n\n if (reasonByteLength > 123) {\n throw new DOMException(\n `Reason must be less than 123 bytes; received ${reasonByteLength}`,\n 'SyntaxError'\n )\n }\n }\n\n // 3. Run the first matching steps from the following list:\n if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) {\n // If this's ready state is CLOSING (2) or CLOSED (3)\n // Do nothing.\n } else if (!isEstablished(this)) {\n // If the WebSocket connection is not yet established\n // Fail the WebSocket connection and set this's ready state\n // to CLOSING (2).\n failWebsocketConnection(this, 'Connection was closed before it was established.')\n this[kReadyState] = WebSocket.CLOSING\n } else if (!isClosing(this)) {\n // If the WebSocket closing handshake has not yet been started\n // Start the WebSocket closing handshake and set this's ready\n // state to CLOSING (2).\n // - If neither code nor reason is present, the WebSocket Close\n // message must not have a body.\n // - If code is present, then the status code to use in the\n // WebSocket Close message must be the integer given by code.\n // - If reason is also present, then reasonBytes must be\n // provided in the Close message after the status code.\n\n const frame = new WebsocketFrameSend()\n\n // If neither code nor reason is present, the WebSocket Close\n // message must not have a body.\n\n // If code is present, then the status code to use in the\n // WebSocket Close message must be the integer given by code.\n if (code !== undefined && reason === undefined) {\n frame.frameData = Buffer.allocUnsafe(2)\n frame.frameData.writeUInt16BE(code, 0)\n } else if (code !== undefined && reason !== undefined) {\n // If reason is also present, then reasonBytes must be\n // provided in the Close message after the status code.\n frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength)\n frame.frameData.writeUInt16BE(code, 0)\n // the body MAY contain UTF-8-encoded data with value /reason/\n frame.frameData.write(reason, 2, 'utf-8')\n } else {\n frame.frameData = emptyBuffer\n }\n\n /** @type {import('stream').Duplex} */\n const socket = this[kResponse].socket\n\n socket.write(frame.createFrame(opcodes.CLOSE), (err) => {\n if (!err) {\n this[kSentClose] = true\n }\n })\n\n // Upon either sending or receiving a Close control frame, it is said\n // that _The WebSocket Closing Handshake is Started_ and that the\n // WebSocket connection is in the CLOSING state.\n this[kReadyState] = states.CLOSING\n } else {\n // Otherwise\n // Set this's ready state to CLOSING (2).\n this[kReadyState] = WebSocket.CLOSING\n }\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#dom-websocket-send\n * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data\n */\n send (data) {\n webidl.brandCheck(this, WebSocket)\n\n webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket.send' })\n\n data = webidl.converters.WebSocketSendData(data)\n\n // 1. If this's ready state is CONNECTING, then throw an\n // \"InvalidStateError\" DOMException.\n if (this[kReadyState] === WebSocket.CONNECTING) {\n throw new DOMException('Sent before connected.', 'InvalidStateError')\n }\n\n // 2. Run the appropriate set of steps from the following list:\n // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1\n // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n\n if (!isEstablished(this) || isClosing(this)) {\n return\n }\n\n /** @type {import('stream').Duplex} */\n const socket = this[kResponse].socket\n\n // If data is a string\n if (typeof data === 'string') {\n // If the WebSocket connection is established and the WebSocket\n // closing handshake has not yet started, then the user agent\n // must send a WebSocket Message comprised of the data argument\n // using a text frame opcode; if the data cannot be sent, e.g.\n // because it would need to be buffered but the buffer is full,\n // the user agent must flag the WebSocket as full and then close\n // the WebSocket connection. Any invocation of this method with a\n // string argument that does not throw an exception must increase\n // the bufferedAmount attribute by the number of bytes needed to\n // express the argument as UTF-8.\n\n const value = Buffer.from(data)\n const frame = new WebsocketFrameSend(value)\n const buffer = frame.createFrame(opcodes.TEXT)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n } else if (types.isArrayBuffer(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need\n // to be buffered but the buffer is full, the user agent must flag\n // the WebSocket as full and then close the WebSocket connection.\n // The data to be sent is the data stored in the buffer described\n // by the ArrayBuffer object. Any invocation of this method with an\n // ArrayBuffer argument that does not throw an exception must\n // increase the bufferedAmount attribute by the length of the\n // ArrayBuffer in bytes.\n\n const value = Buffer.from(data)\n const frame = new WebsocketFrameSend(value)\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n } else if (ArrayBuffer.isView(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The\n // data to be sent is the data stored in the section of the buffer\n // described by the ArrayBuffer object that data references. Any\n // invocation of this method with this kind of argument that does\n // not throw an exception must increase the bufferedAmount attribute\n // by the length of data’s buffer in bytes.\n\n const ab = Buffer.from(data, data.byteOffset, data.byteLength)\n\n const frame = new WebsocketFrameSend(ab)\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += ab.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= ab.byteLength\n })\n } else if (isBlobLike(data)) {\n // If the WebSocket connection is established, and the WebSocket\n // closing handshake has not yet started, then the user agent must\n // send a WebSocket Message comprised of data using a binary frame\n // opcode; if the data cannot be sent, e.g. because it would need to\n // be buffered but the buffer is full, the user agent must flag the\n // WebSocket as full and then close the WebSocket connection. The data\n // to be sent is the raw data represented by the Blob object. Any\n // invocation of this method with a Blob argument that does not throw\n // an exception must increase the bufferedAmount attribute by the size\n // of the Blob object’s raw data, in bytes.\n\n const frame = new WebsocketFrameSend()\n\n data.arrayBuffer().then((ab) => {\n const value = Buffer.from(ab)\n frame.frameData = value\n const buffer = frame.createFrame(opcodes.BINARY)\n\n this.#bufferedAmount += value.byteLength\n socket.write(buffer, () => {\n this.#bufferedAmount -= value.byteLength\n })\n })\n }\n }\n\n get readyState () {\n webidl.brandCheck(this, WebSocket)\n\n // The readyState getter steps are to return this's ready state.\n return this[kReadyState]\n }\n\n get bufferedAmount () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#bufferedAmount\n }\n\n get url () {\n webidl.brandCheck(this, WebSocket)\n\n // The url getter steps are to return this's url, serialized.\n return URLSerializer(this[kWebSocketURL])\n }\n\n get extensions () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#extensions\n }\n\n get protocol () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#protocol\n }\n\n get onopen () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.open\n }\n\n set onopen (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.open) {\n this.removeEventListener('open', this.#events.open)\n }\n\n if (typeof fn === 'function') {\n this.#events.open = fn\n this.addEventListener('open', fn)\n } else {\n this.#events.open = null\n }\n }\n\n get onerror () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.error\n }\n\n set onerror (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.error) {\n this.removeEventListener('error', this.#events.error)\n }\n\n if (typeof fn === 'function') {\n this.#events.error = fn\n this.addEventListener('error', fn)\n } else {\n this.#events.error = null\n }\n }\n\n get onclose () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.close\n }\n\n set onclose (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.close) {\n this.removeEventListener('close', this.#events.close)\n }\n\n if (typeof fn === 'function') {\n this.#events.close = fn\n this.addEventListener('close', fn)\n } else {\n this.#events.close = null\n }\n }\n\n get onmessage () {\n webidl.brandCheck(this, WebSocket)\n\n return this.#events.message\n }\n\n set onmessage (fn) {\n webidl.brandCheck(this, WebSocket)\n\n if (this.#events.message) {\n this.removeEventListener('message', this.#events.message)\n }\n\n if (typeof fn === 'function') {\n this.#events.message = fn\n this.addEventListener('message', fn)\n } else {\n this.#events.message = null\n }\n }\n\n get binaryType () {\n webidl.brandCheck(this, WebSocket)\n\n return this[kBinaryType]\n }\n\n set binaryType (type) {\n webidl.brandCheck(this, WebSocket)\n\n if (type !== 'blob' && type !== 'arraybuffer') {\n this[kBinaryType] = 'blob'\n } else {\n this[kBinaryType] = type\n }\n }\n\n /**\n * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol\n */\n #onConnectionEstablished (response) {\n // processResponse is called when the \"response’s header list has been received and initialized.\"\n // once this happens, the connection is open\n this[kResponse] = response\n\n const parser = new ByteParser(this)\n parser.on('drain', function onParserDrain () {\n this.ws[kResponse].socket.resume()\n })\n\n response.socket.ws = this\n this[kByteParser] = parser\n\n // 1. Change the ready state to OPEN (1).\n this[kReadyState] = states.OPEN\n\n // 2. Change the extensions attribute’s value to the extensions in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1\n const extensions = response.headersList.get('sec-websocket-extensions')\n\n if (extensions !== null) {\n this.#extensions = extensions\n }\n\n // 3. Change the protocol attribute’s value to the subprotocol in use, if\n // it is not the null value.\n // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9\n const protocol = response.headersList.get('sec-websocket-protocol')\n\n if (protocol !== null) {\n this.#protocol = protocol\n }\n\n // 4. Fire an event named open at the WebSocket object.\n fireEvent('open', this)\n }\n}\n\n// https://websockets.spec.whatwg.org/#dom-websocket-connecting\nWebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING\n// https://websockets.spec.whatwg.org/#dom-websocket-open\nWebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN\n// https://websockets.spec.whatwg.org/#dom-websocket-closing\nWebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING\n// https://websockets.spec.whatwg.org/#dom-websocket-closed\nWebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED\n\nObject.defineProperties(WebSocket.prototype, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors,\n url: kEnumerableProperty,\n readyState: kEnumerableProperty,\n bufferedAmount: kEnumerableProperty,\n onopen: kEnumerableProperty,\n onerror: kEnumerableProperty,\n onclose: kEnumerableProperty,\n close: kEnumerableProperty,\n onmessage: kEnumerableProperty,\n binaryType: kEnumerableProperty,\n send: kEnumerableProperty,\n extensions: kEnumerableProperty,\n protocol: kEnumerableProperty,\n [Symbol.toStringTag]: {\n value: 'WebSocket',\n writable: false,\n enumerable: false,\n configurable: true\n }\n})\n\nObject.defineProperties(WebSocket, {\n CONNECTING: staticPropertyDescriptors,\n OPEN: staticPropertyDescriptors,\n CLOSING: staticPropertyDescriptors,\n CLOSED: staticPropertyDescriptors\n})\n\nwebidl.converters['sequence'] = webidl.sequenceConverter(\n webidl.converters.DOMString\n)\n\nwebidl.converters['DOMString or sequence'] = function (V) {\n if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) {\n return webidl.converters['sequence'](V)\n }\n\n return webidl.converters.DOMString(V)\n}\n\n// This implements the propsal made in https://github.com/whatwg/websockets/issues/42\nwebidl.converters.WebSocketInit = webidl.dictionaryConverter([\n {\n key: 'protocols',\n converter: webidl.converters['DOMString or sequence'],\n get defaultValue () {\n return []\n }\n },\n {\n key: 'dispatcher',\n converter: (V) => V,\n get defaultValue () {\n return getGlobalDispatcher()\n }\n },\n {\n key: 'headers',\n converter: webidl.nullableConverter(webidl.converters.HeadersInit)\n }\n])\n\nwebidl.converters['DOMString or sequence or WebSocketInit'] = function (V) {\n if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) {\n return webidl.converters.WebSocketInit(V)\n }\n\n return { protocols: webidl.converters['DOMString or sequence'](V) }\n}\n\nwebidl.converters.WebSocketSendData = function (V) {\n if (webidl.util.Type(V) === 'Object') {\n if (isBlobLike(V)) {\n return webidl.converters.Blob(V, { strict: false })\n }\n\n if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) {\n return webidl.converters.BufferSource(V)\n }\n }\n\n return webidl.converters.USVString(V)\n}\n\nmodule.exports = {\n WebSocket\n}\n","/*\r\n * xpath.js\r\n *\r\n * An XPath 1.0 library for JavaScript.\r\n *\r\n * Cameron McCormack \r\n *\r\n * This work is licensed under the MIT License.\r\n *\r\n * Revision 20: April 26, 2011\r\n * Fixed a typo resulting in FIRST_ORDERED_NODE_TYPE results being wrong,\r\n * thanks to .\r\n *\r\n * Revision 19: November 29, 2005\r\n * Nodesets now store their nodes in a height balanced tree, increasing\r\n * performance for the common case of selecting nodes in document order,\r\n * thanks to Sébastien Cramatte .\r\n * AVL tree code adapted from Raimund Neumann .\r\n *\r\n * Revision 18: October 27, 2005\r\n * DOM 3 XPath support. Caveats:\r\n * - namespace prefixes aren't resolved in XPathEvaluator.createExpression,\r\n * but in XPathExpression.evaluate.\r\n * - XPathResult.invalidIteratorState is not implemented.\r\n *\r\n * Revision 17: October 25, 2005\r\n * Some core XPath function fixes and a patch to avoid crashing certain\r\n * versions of MSXML in PathExpr.prototype.getOwnerElement, thanks to\r\n * Sébastien Cramatte .\r\n *\r\n * Revision 16: September 22, 2005\r\n * Workarounds for some IE 5.5 deficiencies.\r\n * Fixed problem with prefix node tests on attribute nodes.\r\n *\r\n * Revision 15: May 21, 2005\r\n * Fixed problem with QName node tests on elements with an xmlns=\"...\".\r\n *\r\n * Revision 14: May 19, 2005\r\n * Fixed QName node tests on attribute node regression.\r\n *\r\n * Revision 13: May 3, 2005\r\n * Node tests are case insensitive now if working in an HTML DOM.\r\n *\r\n * Revision 12: April 26, 2005\r\n * Updated licence. Slight code changes to enable use of Dean\r\n * Edwards' script compression, http://dean.edwards.name/packer/ .\r\n *\r\n * Revision 11: April 23, 2005\r\n * Fixed bug with 'and' and 'or' operators, fix thanks to\r\n * Sandy McArthur .\r\n *\r\n * Revision 10: April 15, 2005\r\n * Added support for a virtual root node, supposedly helpful for\r\n * implementing XForms. Fixed problem with QName node tests and\r\n * the parent axis.\r\n *\r\n * Revision 9: March 17, 2005\r\n * Namespace resolver tweaked so using the document node as the context\r\n * for namespace lookups is equivalent to using the document element.\r\n *\r\n * Revision 8: February 13, 2005\r\n * Handle implicit declaration of 'xmlns' namespace prefix.\r\n * Fixed bug when comparing nodesets.\r\n * Instance data can now be associated with a FunctionResolver, and\r\n * workaround for MSXML not supporting 'localName' and 'getElementById',\r\n * thanks to Grant Gongaware.\r\n * Fix a few problems when the context node is the root node.\r\n *\r\n * Revision 7: February 11, 2005\r\n * Default namespace resolver fix from Grant Gongaware\r\n * .\r\n *\r\n * Revision 6: February 10, 2005\r\n * Fixed bug in 'number' function.\r\n *\r\n * Revision 5: February 9, 2005\r\n * Fixed bug where text nodes not getting converted to string values.\r\n *\r\n * Revision 4: January 21, 2005\r\n * Bug in 'name' function, fix thanks to Bill Edney.\r\n * Fixed incorrect processing of namespace nodes.\r\n * Fixed NamespaceResolver to resolve 'xml' namespace.\r\n * Implemented union '|' operator.\r\n *\r\n * Revision 3: January 14, 2005\r\n * Fixed bug with nodeset comparisons, bug lexing < and >.\r\n *\r\n * Revision 2: October 26, 2004\r\n * QName node test namespace handling fixed. Few other bug fixes.\r\n *\r\n * Revision 1: August 13, 2004\r\n * Bug fixes from William J. Edney .\r\n * Added minimal licence.\r\n *\r\n * Initial version: June 14, 2004\r\n */\r\n\r\n// non-node wrapper\r\nvar xpath = (typeof exports === 'undefined') ? {} : exports;\r\n\r\n(function (exports) {\r\n \"use strict\";\r\n\r\n // namespace nodes are not part of the DOM spec, so we use a custom nodetype for them.\r\n // should NOT be used externally\r\n var NAMESPACE_NODE_NODETYPE = '__namespace';\r\n\r\n var isNil = function (x) {\r\n return x === null || x === undefined;\r\n };\r\n\r\n var isValidNodeType = function (nodeType) {\r\n return nodeType === NAMESPACE_NODE_NODETYPE ||\r\n (Number.isInteger(nodeType)\r\n && nodeType >= 1\r\n && nodeType <= 11\r\n );\r\n };\r\n\r\n var isNodeLike = function (value) {\r\n return value\r\n && isValidNodeType(value.nodeType)\r\n && typeof value.nodeName === \"string\";\r\n };\r\n\r\n // functional helpers\r\n function curry(func) {\r\n var slice = Array.prototype.slice,\r\n totalargs = func.length,\r\n partial = function (args, fn) {\r\n return function () {\r\n return fn.apply(this, args.concat(slice.call(arguments)));\r\n }\r\n },\r\n fn = function () {\r\n var args = slice.call(arguments);\r\n return (args.length < totalargs) ?\r\n partial(args, fn) :\r\n func.apply(this, slice.apply(arguments, [0, totalargs]));\r\n };\r\n return fn;\r\n }\r\n\r\n var forEach = function (f, xs) {\r\n for (var i = 0; i < xs.length; i += 1) {\r\n f(xs[i], i, xs);\r\n }\r\n };\r\n\r\n var reduce = function (f, seed, xs) {\r\n var acc = seed;\r\n\r\n forEach(function (x, i) { acc = f(acc, x, i); }, xs);\r\n\r\n return acc;\r\n };\r\n\r\n var map = function (f, xs) {\r\n var mapped = new Array(xs.length);\r\n\r\n forEach(function (x, i) { mapped[i] = f(x); }, xs);\r\n\r\n return mapped;\r\n };\r\n\r\n var filter = function (f, xs) {\r\n var filtered = [];\r\n\r\n forEach(function (x, i) { if (f(x, i)) { filtered.push(x); } }, xs);\r\n\r\n return filtered;\r\n };\r\n\r\n var includes = function (values, value) {\r\n for (var i = 0; i < values.length; i += 1) {\r\n if (values[i] === value) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n function always(value) { return function () { return value; } }\r\n\r\n function toString(x) { return x.toString(); }\r\n var join = function (s, xs) { return xs.join(s); };\r\n var wrap = function (pref, suf, str) { return pref + str + suf; };\r\n\r\n var prototypeConcat = Array.prototype.concat;\r\n\r\n var sortNodes = function (nodes, reverse) {\r\n var ns = new XNodeSet();\r\n\r\n ns.addArray(nodes);\r\n\r\n var sorted = ns.toArray();\r\n\r\n return reverse ? sorted.reverse() : sorted;\r\n }\r\n\r\n // .apply() fails above a certain number of arguments - https://github.com/goto100/xpath/pull/98\r\n var MAX_ARGUMENT_LENGTH = 32767;\r\n\r\n function flatten(arr) {\r\n var result = [];\r\n\r\n for (var start = 0; start < arr.length; start += MAX_ARGUMENT_LENGTH) {\r\n var chunk = arr.slice(start, start + MAX_ARGUMENT_LENGTH);\r\n\r\n result = prototypeConcat.apply(result, chunk);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function assign(target, varArgs) { // .length of function is 2\r\n var to = Object(target);\r\n\r\n for (var index = 1; index < arguments.length; index++) {\r\n var nextSource = arguments[index];\r\n\r\n if (nextSource != null) { // Skip over if undefined or null\r\n for (var nextKey in nextSource) {\r\n // Avoid bugs when hasOwnProperty is shadowed\r\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\r\n to[nextKey] = nextSource[nextKey];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return to;\r\n }\r\n\r\n var NodeTypes = {\r\n ELEMENT_NODE: 1,\r\n ATTRIBUTE_NODE: 2,\r\n TEXT_NODE: 3,\r\n CDATA_SECTION_NODE: 4,\r\n PROCESSING_INSTRUCTION_NODE: 7,\r\n COMMENT_NODE: 8,\r\n DOCUMENT_NODE: 9,\r\n DOCUMENT_TYPE_NODE: 10,\r\n DOCUMENT_FRAGMENT_NODE: 11,\r\n NAMESPACE_NODE: NAMESPACE_NODE_NODETYPE,\r\n };\r\n\r\n // XPathParser ///////////////////////////////////////////////////////////////\r\n\r\n XPathParser.prototype = new Object();\r\n XPathParser.prototype.constructor = XPathParser;\r\n XPathParser.superclass = Object.prototype;\r\n\r\n function XPathParser() {\r\n this.init();\r\n }\r\n\r\n XPathParser.prototype.init = function () {\r\n this.reduceActions = [];\r\n\r\n this.reduceActions[3] = function (rhs) {\r\n return new OrOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[5] = function (rhs) {\r\n return new AndOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[7] = function (rhs) {\r\n return new EqualsOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[8] = function (rhs) {\r\n return new NotEqualOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[10] = function (rhs) {\r\n return new LessThanOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[11] = function (rhs) {\r\n return new GreaterThanOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[12] = function (rhs) {\r\n return new LessThanOrEqualOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[13] = function (rhs) {\r\n return new GreaterThanOrEqualOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[15] = function (rhs) {\r\n return new PlusOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[16] = function (rhs) {\r\n return new MinusOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[18] = function (rhs) {\r\n return new MultiplyOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[19] = function (rhs) {\r\n return new DivOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[20] = function (rhs) {\r\n return new ModOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[22] = function (rhs) {\r\n return new UnaryMinusOperation(rhs[1]);\r\n };\r\n this.reduceActions[24] = function (rhs) {\r\n return new BarOperation(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[25] = function (rhs) {\r\n return new PathExpr(undefined, undefined, rhs[0]);\r\n };\r\n this.reduceActions[27] = function (rhs) {\r\n rhs[0].locationPath = rhs[2];\r\n return rhs[0];\r\n };\r\n this.reduceActions[28] = function (rhs) {\r\n rhs[0].locationPath = rhs[2];\r\n rhs[0].locationPath.steps.unshift(new Step(Step.DESCENDANTORSELF, NodeTest.nodeTest, []));\r\n return rhs[0];\r\n };\r\n this.reduceActions[29] = function (rhs) {\r\n return new PathExpr(rhs[0], [], undefined);\r\n };\r\n this.reduceActions[30] = function (rhs) {\r\n if (Utilities.instance_of(rhs[0], PathExpr)) {\r\n if (rhs[0].filterPredicates == undefined) {\r\n rhs[0].filterPredicates = [];\r\n }\r\n rhs[0].filterPredicates.push(rhs[1]);\r\n return rhs[0];\r\n } else {\r\n return new PathExpr(rhs[0], [rhs[1]], undefined);\r\n }\r\n };\r\n this.reduceActions[32] = function (rhs) {\r\n return rhs[1];\r\n };\r\n this.reduceActions[33] = function (rhs) {\r\n return new XString(rhs[0]);\r\n };\r\n this.reduceActions[34] = function (rhs) {\r\n return new XNumber(rhs[0]);\r\n };\r\n this.reduceActions[36] = function (rhs) {\r\n return new FunctionCall(rhs[0], []);\r\n };\r\n this.reduceActions[37] = function (rhs) {\r\n return new FunctionCall(rhs[0], rhs[2]);\r\n };\r\n this.reduceActions[38] = function (rhs) {\r\n return [rhs[0]];\r\n };\r\n this.reduceActions[39] = function (rhs) {\r\n rhs[2].unshift(rhs[0]);\r\n return rhs[2];\r\n };\r\n this.reduceActions[43] = function (rhs) {\r\n return new LocationPath(true, []);\r\n };\r\n this.reduceActions[44] = function (rhs) {\r\n rhs[1].absolute = true;\r\n return rhs[1];\r\n };\r\n this.reduceActions[46] = function (rhs) {\r\n return new LocationPath(false, [rhs[0]]);\r\n };\r\n this.reduceActions[47] = function (rhs) {\r\n rhs[0].steps.push(rhs[2]);\r\n return rhs[0];\r\n };\r\n this.reduceActions[49] = function (rhs) {\r\n return new Step(rhs[0], rhs[1], []);\r\n };\r\n this.reduceActions[50] = function (rhs) {\r\n return new Step(Step.CHILD, rhs[0], []);\r\n };\r\n this.reduceActions[51] = function (rhs) {\r\n return new Step(rhs[0], rhs[1], rhs[2]);\r\n };\r\n this.reduceActions[52] = function (rhs) {\r\n return new Step(Step.CHILD, rhs[0], rhs[1]);\r\n };\r\n this.reduceActions[54] = function (rhs) {\r\n return [rhs[0]];\r\n };\r\n this.reduceActions[55] = function (rhs) {\r\n rhs[1].unshift(rhs[0]);\r\n return rhs[1];\r\n };\r\n this.reduceActions[56] = function (rhs) {\r\n if (rhs[0] == \"ancestor\") {\r\n return Step.ANCESTOR;\r\n } else if (rhs[0] == \"ancestor-or-self\") {\r\n return Step.ANCESTORORSELF;\r\n } else if (rhs[0] == \"attribute\") {\r\n return Step.ATTRIBUTE;\r\n } else if (rhs[0] == \"child\") {\r\n return Step.CHILD;\r\n } else if (rhs[0] == \"descendant\") {\r\n return Step.DESCENDANT;\r\n } else if (rhs[0] == \"descendant-or-self\") {\r\n return Step.DESCENDANTORSELF;\r\n } else if (rhs[0] == \"following\") {\r\n return Step.FOLLOWING;\r\n } else if (rhs[0] == \"following-sibling\") {\r\n return Step.FOLLOWINGSIBLING;\r\n } else if (rhs[0] == \"namespace\") {\r\n return Step.NAMESPACE;\r\n } else if (rhs[0] == \"parent\") {\r\n return Step.PARENT;\r\n } else if (rhs[0] == \"preceding\") {\r\n return Step.PRECEDING;\r\n } else if (rhs[0] == \"preceding-sibling\") {\r\n return Step.PRECEDINGSIBLING;\r\n } else if (rhs[0] == \"self\") {\r\n return Step.SELF;\r\n }\r\n return -1;\r\n };\r\n this.reduceActions[57] = function (rhs) {\r\n return Step.ATTRIBUTE;\r\n };\r\n this.reduceActions[59] = function (rhs) {\r\n if (rhs[0] == \"comment\") {\r\n return NodeTest.commentTest;\r\n } else if (rhs[0] == \"text\") {\r\n return NodeTest.textTest;\r\n } else if (rhs[0] == \"processing-instruction\") {\r\n return NodeTest.anyPiTest;\r\n } else if (rhs[0] == \"node\") {\r\n return NodeTest.nodeTest;\r\n }\r\n return new NodeTest(-1, undefined);\r\n };\r\n this.reduceActions[60] = function (rhs) {\r\n return new NodeTest.PITest(rhs[2]);\r\n };\r\n this.reduceActions[61] = function (rhs) {\r\n return rhs[1];\r\n };\r\n this.reduceActions[63] = function (rhs) {\r\n rhs[1].absolute = true;\r\n rhs[1].steps.unshift(new Step(Step.DESCENDANTORSELF, NodeTest.nodeTest, []));\r\n return rhs[1];\r\n };\r\n this.reduceActions[64] = function (rhs) {\r\n rhs[0].steps.push(new Step(Step.DESCENDANTORSELF, NodeTest.nodeTest, []));\r\n rhs[0].steps.push(rhs[2]);\r\n return rhs[0];\r\n };\r\n this.reduceActions[65] = function (rhs) {\r\n return new Step(Step.SELF, NodeTest.nodeTest, []);\r\n };\r\n this.reduceActions[66] = function (rhs) {\r\n return new Step(Step.PARENT, NodeTest.nodeTest, []);\r\n };\r\n this.reduceActions[67] = function (rhs) {\r\n return new VariableReference(rhs[1]);\r\n };\r\n this.reduceActions[68] = function (rhs) {\r\n return NodeTest.nameTestAny;\r\n };\r\n this.reduceActions[69] = function (rhs) {\r\n return new NodeTest.NameTestPrefixAny(rhs[0].split(':')[0]);\r\n };\r\n this.reduceActions[70] = function (rhs) {\r\n return new NodeTest.NameTestQName(rhs[0]);\r\n };\r\n };\r\n\r\n XPathParser.actionTable = [\r\n \" s s sssssssss s ss s ss\",\r\n \" s \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \" rrrrr \",\r\n \" s s sssssssss s ss s ss\",\r\n \"rs rrrrrrrr s sssssrrrrrr rrs rs \",\r\n \" s s sssssssss s ss s ss\",\r\n \" s \",\r\n \" s \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" s \",\r\n \" s \",\r\n \" s s sssss s s \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"a \",\r\n \"r s rr r \",\r\n \"r sr rr r \",\r\n \"r s rr s rr r \",\r\n \"r rssrr rss rr r \",\r\n \"r rrrrr rrrss rr r \",\r\n \"r rrrrrsss rrrrr rr r \",\r\n \"r rrrrrrrr rrrrr rr r \",\r\n \"r rrrrrrrr rrrrrs rr r \",\r\n \"r rrrrrrrr rrrrrr rr r \",\r\n \"r rrrrrrrr rrrrrr rr r \",\r\n \"r srrrrrrrr rrrrrrs rr sr \",\r\n \"r srrrrrrrr rrrrrrs rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrr rrrrrr rr r \",\r\n \"r rrrrrrrr rrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \" sssss \",\r\n \"r rrrrrrrrr rrrrrrr rr sr \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" s \",\r\n \"r srrrrrrrr rrrrrrs rr r \",\r\n \"r rrrrrrrr rrrrr rr r \",\r\n \" s \",\r\n \" s \",\r\n \" rrrrr \",\r\n \" s s sssssssss s sss s ss\",\r\n \"r srrrrrrrr rrrrrrs rr r \",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssssssss ss s ss\",\r\n \" s s sssssssss s ss s ss\",\r\n \" s s sssss s s \",\r\n \" s s sssss s s \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" s s sssss s s \",\r\n \" s s sssss s s \",\r\n \"r rrrrrrrrr rrrrrrr rr sr \",\r\n \"r rrrrrrrrr rrrrrrr rr sr \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" s \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" rr \",\r\n \" s \",\r\n \" rs \",\r\n \"r sr rr r \",\r\n \"r s rr s rr r \",\r\n \"r rssrr rss rr r \",\r\n \"r rssrr rss rr r \",\r\n \"r rrrrr rrrss rr r \",\r\n \"r rrrrr rrrss rr r \",\r\n \"r rrrrr rrrss rr r \",\r\n \"r rrrrr rrrss rr r \",\r\n \"r rrrrrsss rrrrr rr r \",\r\n \"r rrrrrsss rrrrr rr r \",\r\n \"r rrrrrrrr rrrrr rr r \",\r\n \"r rrrrrrrr rrrrr rr r \",\r\n \"r rrrrrrrr rrrrr rr r \",\r\n \"r rrrrrrrr rrrrrr rr r \",\r\n \" r \",\r\n \" s \",\r\n \"r srrrrrrrr rrrrrrs rr r \",\r\n \"r srrrrrrrr rrrrrrs rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr r \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" s s sssssssss s ss s ss\",\r\n \"r rrrrrrrrr rrrrrrr rr rr \",\r\n \" r \"\r\n ];\r\n\r\n XPathParser.actionTableNumber = [\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" J \",\r\n \"a aaaaaaaaa aaaaaaa aa a \",\r\n \" YYYYY \",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \"K1 KKKKKKKK . +*)('KKKKKK KK# K\\\" \",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" N \",\r\n \" O \",\r\n \"e eeeeeeeee eeeeeee ee ee \",\r\n \"f fffffffff fffffff ff ff \",\r\n \"d ddddddddd ddddddd dd dd \",\r\n \"B BBBBBBBBB BBBBBBB BB BB \",\r\n \"A AAAAAAAAA AAAAAAA AA AA \",\r\n \" P \",\r\n \" Q \",\r\n \" 1 . +*)(' # \\\" \",\r\n \"b bbbbbbbbb bbbbbbb bb b \",\r\n \" \",\r\n \"! S !! ! \",\r\n \"\\\" T\\\" \\\"\\\" \\\" \",\r\n \"$ V $$ U $$ $ \",\r\n \"& &ZY&& &XW && & \",\r\n \") ))))) )))\\\\[ )) ) \",\r\n \". ....._^] ..... .. . \",\r\n \"1 11111111 11111 11 1 \",\r\n \"5 55555555 55555` 55 5 \",\r\n \"7 77777777 777777 77 7 \",\r\n \"9 99999999 999999 99 9 \",\r\n \": c:::::::: ::::::b :: a: \",\r\n \"I fIIIIIIII IIIIIIe II I \",\r\n \"= ========= ======= == == \",\r\n \"? ????????? ??????? ?? ?? \",\r\n \"C CCCCCCCCC CCCCCCC CC CC \",\r\n \"J JJJJJJJJ JJJJJJ JJ J \",\r\n \"M MMMMMMMM MMMMMM MM M \",\r\n \"N NNNNNNNNN NNNNNNN NN N \",\r\n \"P PPPPPPPPP PPPPPPP PP P \",\r\n \" +*)(' \",\r\n \"R RRRRRRRRR RRRRRRR RR aR \",\r\n \"U UUUUUUUUU UUUUUUU UU U \",\r\n \"Z ZZZZZZZZZ ZZZZZZZ ZZ ZZ \",\r\n \"c ccccccccc ccccccc cc cc \",\r\n \" j \",\r\n \"L fLLLLLLLL LLLLLLe LL L \",\r\n \"6 66666666 66666 66 6 \",\r\n \" k \",\r\n \" l \",\r\n \" XXXXX \",\r\n \" 1 0 /.-,+*)(' & %$m # \\\"!\",\r\n \"_ f________ ______e __ _ \",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' %$ # \\\"!\",\r\n \" 1 0 /.-,+*)(' & %$ # \\\"!\",\r\n \" 1 . +*)(' # \\\" \",\r\n \" 1 . +*)(' # \\\" \",\r\n \"> >>>>>>>>> >>>>>>> >> >> \",\r\n \" 1 . +*)(' # \\\" \",\r\n \" 1 . +*)(' # \\\" \",\r\n \"Q QQQQQQQQQ QQQQQQQ QQ aQ \",\r\n \"V VVVVVVVVV VVVVVVV VV aV \",\r\n \"T TTTTTTTTT TTTTTTT TT T \",\r\n \"@ @@@@@@@@@ @@@@@@@ @@ @@ \",\r\n \" \\x87 \",\r\n \"[ [[[[[[[[[ [[[[[[[ [[ [[ \",\r\n \"D DDDDDDDDD DDDDDDD DD DD \",\r\n \" HH \",\r\n \" \\x88 \",\r\n \" F\\x89 \",\r\n \"# T# ## # \",\r\n \"% V %% U %% % \",\r\n \"' 'ZY'' 'XW '' ' \",\r\n \"( (ZY(( (XW (( ( \",\r\n \"+ +++++ +++\\\\[ ++ + \",\r\n \"* ***** ***\\\\[ ** * \",\r\n \"- ----- ---\\\\[ -- - \",\r\n \", ,,,,, ,,,\\\\[ ,, , \",\r\n \"0 00000_^] 00000 00 0 \",\r\n \"/ /////_^] ///// // / \",\r\n \"2 22222222 22222 22 2 \",\r\n \"3 33333333 33333 33 3 \",\r\n \"4 44444444 44444 44 4 \",\r\n \"8 88888888 888888 88 8 \",\r\n \" ^ \",\r\n \" \\x8a \",\r\n \"; f;;;;;;;; ;;;;;;e ;; ; \",\r\n \"< f<<<<<<<< <<<<<?@ AB CDEFGH IJ \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \"L456789:;<=>?@ AB CDEFGH IJ \",\r\n \" M EFGH IJ \",\r\n \" N;<=>?@ AB CDEFGH IJ \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" S EFGH IJ \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" e \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" h J \",\r\n \" i j \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \"o456789:;<=>?@ ABpqCDEFGH IJ \",\r\n \" \",\r\n \" r6789:;<=>?@ AB CDEFGH IJ \",\r\n \" s789:;<=>?@ AB CDEFGH IJ \",\r\n \" t89:;<=>?@ AB CDEFGH IJ \",\r\n \" u89:;<=>?@ AB CDEFGH IJ \",\r\n \" v9:;<=>?@ AB CDEFGH IJ \",\r\n \" w9:;<=>?@ AB CDEFGH IJ \",\r\n \" x9:;<=>?@ AB CDEFGH IJ \",\r\n \" y9:;<=>?@ AB CDEFGH IJ \",\r\n \" z:;<=>?@ AB CDEFGH IJ \",\r\n \" {:;<=>?@ AB CDEFGH IJ \",\r\n \" |;<=>?@ AB CDEFGH IJ \",\r\n \" };<=>?@ AB CDEFGH IJ \",\r\n \" ~;<=>?@ AB CDEFGH IJ \",\r\n \" \\x7f=>?@ AB CDEFGH IJ \",\r\n \"\\x80456789:;<=>?@ AB CDEFGH IJ\\x81\",\r\n \" \\x82 EFGH IJ \",\r\n \" \\x83 EFGH IJ \",\r\n \" \",\r\n \" \\x84 GH IJ \",\r\n \" \\x85 GH IJ \",\r\n \" i \\x86 \",\r\n \" i \\x87 \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \" \",\r\n \"o456789:;<=>?@ AB\\x8cqCDEFGH IJ \",\r\n \" \",\r\n \" \"\r\n ];\r\n\r\n XPathParser.productions = [\r\n [1, 1, 2],\r\n [2, 1, 3],\r\n [3, 1, 4],\r\n [3, 3, 3, -9, 4],\r\n [4, 1, 5],\r\n [4, 3, 4, -8, 5],\r\n [5, 1, 6],\r\n [5, 3, 5, -22, 6],\r\n [5, 3, 5, -5, 6],\r\n [6, 1, 7],\r\n [6, 3, 6, -23, 7],\r\n [6, 3, 6, -24, 7],\r\n [6, 3, 6, -6, 7],\r\n [6, 3, 6, -7, 7],\r\n [7, 1, 8],\r\n [7, 3, 7, -25, 8],\r\n [7, 3, 7, -26, 8],\r\n [8, 1, 9],\r\n [8, 3, 8, -12, 9],\r\n [8, 3, 8, -11, 9],\r\n [8, 3, 8, -10, 9],\r\n [9, 1, 10],\r\n [9, 2, -26, 9],\r\n [10, 1, 11],\r\n [10, 3, 10, -27, 11],\r\n [11, 1, 12],\r\n [11, 1, 13],\r\n [11, 3, 13, -28, 14],\r\n [11, 3, 13, -4, 14],\r\n [13, 1, 15],\r\n [13, 2, 13, 16],\r\n [15, 1, 17],\r\n [15, 3, -29, 2, -30],\r\n [15, 1, -15],\r\n [15, 1, -16],\r\n [15, 1, 18],\r\n [18, 3, -13, -29, -30],\r\n [18, 4, -13, -29, 19, -30],\r\n [19, 1, 20],\r\n [19, 3, 20, -31, 19],\r\n [20, 1, 2],\r\n [12, 1, 14],\r\n [12, 1, 21],\r\n [21, 1, -28],\r\n [21, 2, -28, 14],\r\n [21, 1, 22],\r\n [14, 1, 23],\r\n [14, 3, 14, -28, 23],\r\n [14, 1, 24],\r\n [23, 2, 25, 26],\r\n [23, 1, 26],\r\n [23, 3, 25, 26, 27],\r\n [23, 2, 26, 27],\r\n [23, 1, 28],\r\n [27, 1, 16],\r\n [27, 2, 16, 27],\r\n [25, 2, -14, -3],\r\n [25, 1, -32],\r\n [26, 1, 29],\r\n [26, 3, -20, -29, -30],\r\n [26, 4, -21, -29, -15, -30],\r\n [16, 3, -33, 30, -34],\r\n [30, 1, 2],\r\n [22, 2, -4, 14],\r\n [24, 3, 14, -4, 23],\r\n [28, 1, -35],\r\n [28, 1, -2],\r\n [17, 2, -36, -18],\r\n [29, 1, -17],\r\n [29, 1, -19],\r\n [29, 1, -18]\r\n ];\r\n\r\n XPathParser.DOUBLEDOT = 2;\r\n XPathParser.DOUBLECOLON = 3;\r\n XPathParser.DOUBLESLASH = 4;\r\n XPathParser.NOTEQUAL = 5;\r\n XPathParser.LESSTHANOREQUAL = 6;\r\n XPathParser.GREATERTHANOREQUAL = 7;\r\n XPathParser.AND = 8;\r\n XPathParser.OR = 9;\r\n XPathParser.MOD = 10;\r\n XPathParser.DIV = 11;\r\n XPathParser.MULTIPLYOPERATOR = 12;\r\n XPathParser.FUNCTIONNAME = 13;\r\n XPathParser.AXISNAME = 14;\r\n XPathParser.LITERAL = 15;\r\n XPathParser.NUMBER = 16;\r\n XPathParser.ASTERISKNAMETEST = 17;\r\n XPathParser.QNAME = 18;\r\n XPathParser.NCNAMECOLONASTERISK = 19;\r\n XPathParser.NODETYPE = 20;\r\n XPathParser.PROCESSINGINSTRUCTIONWITHLITERAL = 21;\r\n XPathParser.EQUALS = 22;\r\n XPathParser.LESSTHAN = 23;\r\n XPathParser.GREATERTHAN = 24;\r\n XPathParser.PLUS = 25;\r\n XPathParser.MINUS = 26;\r\n XPathParser.BAR = 27;\r\n XPathParser.SLASH = 28;\r\n XPathParser.LEFTPARENTHESIS = 29;\r\n XPathParser.RIGHTPARENTHESIS = 30;\r\n XPathParser.COMMA = 31;\r\n XPathParser.AT = 32;\r\n XPathParser.LEFTBRACKET = 33;\r\n XPathParser.RIGHTBRACKET = 34;\r\n XPathParser.DOT = 35;\r\n XPathParser.DOLLAR = 36;\r\n\r\n XPathParser.prototype.tokenize = function (s1) {\r\n var types = [];\r\n var values = [];\r\n var s = s1 + '\\0';\r\n\r\n var pos = 0;\r\n var c = s.charAt(pos++);\r\n while (1) {\r\n while (c == ' ' || c == '\\t' || c == '\\r' || c == '\\n') {\r\n c = s.charAt(pos++);\r\n }\r\n if (c == '\\0' || pos >= s.length) {\r\n break;\r\n }\r\n\r\n if (c == '(') {\r\n types.push(XPathParser.LEFTPARENTHESIS);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == ')') {\r\n types.push(XPathParser.RIGHTPARENTHESIS);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '[') {\r\n types.push(XPathParser.LEFTBRACKET);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == ']') {\r\n types.push(XPathParser.RIGHTBRACKET);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '@') {\r\n types.push(XPathParser.AT);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == ',') {\r\n types.push(XPathParser.COMMA);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '|') {\r\n types.push(XPathParser.BAR);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '+') {\r\n types.push(XPathParser.PLUS);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '-') {\r\n types.push(XPathParser.MINUS);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '=') {\r\n types.push(XPathParser.EQUALS);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c == '$') {\r\n types.push(XPathParser.DOLLAR);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n\r\n if (c == '.') {\r\n c = s.charAt(pos++);\r\n if (c == '.') {\r\n types.push(XPathParser.DOUBLEDOT);\r\n values.push(\"..\");\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (c >= '0' && c <= '9') {\r\n var number = \".\" + c;\r\n c = s.charAt(pos++);\r\n while (c >= '0' && c <= '9') {\r\n number += c;\r\n c = s.charAt(pos++);\r\n }\r\n types.push(XPathParser.NUMBER);\r\n values.push(number);\r\n continue;\r\n }\r\n types.push(XPathParser.DOT);\r\n values.push('.');\r\n continue;\r\n }\r\n\r\n if (c == '\\'' || c == '\"') {\r\n var delimiter = c;\r\n var literal = \"\";\r\n while (pos < s.length && (c = s.charAt(pos)) !== delimiter) {\r\n literal += c;\r\n pos += 1;\r\n }\r\n if (c !== delimiter) {\r\n throw XPathException.fromMessage(\"Unterminated string literal: \" + delimiter + literal);\r\n }\r\n pos += 1;\r\n types.push(XPathParser.LITERAL);\r\n values.push(literal);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n\r\n if (c >= '0' && c <= '9') {\r\n var number = c;\r\n c = s.charAt(pos++);\r\n while (c >= '0' && c <= '9') {\r\n number += c;\r\n c = s.charAt(pos++);\r\n }\r\n if (c == '.') {\r\n if (s.charAt(pos) >= '0' && s.charAt(pos) <= '9') {\r\n number += c;\r\n number += s.charAt(pos++);\r\n c = s.charAt(pos++);\r\n while (c >= '0' && c <= '9') {\r\n number += c;\r\n c = s.charAt(pos++);\r\n }\r\n }\r\n }\r\n types.push(XPathParser.NUMBER);\r\n values.push(number);\r\n continue;\r\n }\r\n\r\n if (c == '*') {\r\n if (types.length > 0) {\r\n var last = types[types.length - 1];\r\n if (last != XPathParser.AT\r\n && last != XPathParser.DOUBLECOLON\r\n && last != XPathParser.LEFTPARENTHESIS\r\n && last != XPathParser.LEFTBRACKET\r\n && last != XPathParser.AND\r\n && last != XPathParser.OR\r\n && last != XPathParser.MOD\r\n && last != XPathParser.DIV\r\n && last != XPathParser.MULTIPLYOPERATOR\r\n && last != XPathParser.SLASH\r\n && last != XPathParser.DOUBLESLASH\r\n && last != XPathParser.BAR\r\n && last != XPathParser.PLUS\r\n && last != XPathParser.MINUS\r\n && last != XPathParser.EQUALS\r\n && last != XPathParser.NOTEQUAL\r\n && last != XPathParser.LESSTHAN\r\n && last != XPathParser.LESSTHANOREQUAL\r\n && last != XPathParser.GREATERTHAN\r\n && last != XPathParser.GREATERTHANOREQUAL) {\r\n types.push(XPathParser.MULTIPLYOPERATOR);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n }\r\n types.push(XPathParser.ASTERISKNAMETEST);\r\n values.push(c);\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n\r\n if (c == ':') {\r\n if (s.charAt(pos) == ':') {\r\n types.push(XPathParser.DOUBLECOLON);\r\n values.push(\"::\");\r\n pos++;\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n }\r\n\r\n if (c == '/') {\r\n c = s.charAt(pos++);\r\n if (c == '/') {\r\n types.push(XPathParser.DOUBLESLASH);\r\n values.push(\"//\");\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n types.push(XPathParser.SLASH);\r\n values.push('/');\r\n continue;\r\n }\r\n\r\n if (c == '!') {\r\n if (s.charAt(pos) == '=') {\r\n types.push(XPathParser.NOTEQUAL);\r\n values.push(\"!=\");\r\n pos++;\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n }\r\n\r\n if (c == '<') {\r\n if (s.charAt(pos) == '=') {\r\n types.push(XPathParser.LESSTHANOREQUAL);\r\n values.push(\"<=\");\r\n pos++;\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n types.push(XPathParser.LESSTHAN);\r\n values.push('<');\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n\r\n if (c == '>') {\r\n if (s.charAt(pos) == '=') {\r\n types.push(XPathParser.GREATERTHANOREQUAL);\r\n values.push(\">=\");\r\n pos++;\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n types.push(XPathParser.GREATERTHAN);\r\n values.push('>');\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n\r\n if (c == '_' || Utilities.isLetter(c.charCodeAt(0))) {\r\n var name = c;\r\n c = s.charAt(pos++);\r\n while (Utilities.isNCNameChar(c.charCodeAt(0))) {\r\n name += c;\r\n c = s.charAt(pos++);\r\n }\r\n if (types.length > 0) {\r\n var last = types[types.length - 1];\r\n if (last != XPathParser.AT\r\n && last != XPathParser.DOUBLECOLON\r\n && last != XPathParser.LEFTPARENTHESIS\r\n && last != XPathParser.LEFTBRACKET\r\n && last != XPathParser.AND\r\n && last != XPathParser.OR\r\n && last != XPathParser.MOD\r\n && last != XPathParser.DIV\r\n && last != XPathParser.MULTIPLYOPERATOR\r\n && last != XPathParser.SLASH\r\n && last != XPathParser.DOUBLESLASH\r\n && last != XPathParser.BAR\r\n && last != XPathParser.PLUS\r\n && last != XPathParser.MINUS\r\n && last != XPathParser.EQUALS\r\n && last != XPathParser.NOTEQUAL\r\n && last != XPathParser.LESSTHAN\r\n && last != XPathParser.LESSTHANOREQUAL\r\n && last != XPathParser.GREATERTHAN\r\n && last != XPathParser.GREATERTHANOREQUAL) {\r\n if (name == \"and\") {\r\n types.push(XPathParser.AND);\r\n values.push(name);\r\n continue;\r\n }\r\n if (name == \"or\") {\r\n types.push(XPathParser.OR);\r\n values.push(name);\r\n continue;\r\n }\r\n if (name == \"mod\") {\r\n types.push(XPathParser.MOD);\r\n values.push(name);\r\n continue;\r\n }\r\n if (name == \"div\") {\r\n types.push(XPathParser.DIV);\r\n values.push(name);\r\n continue;\r\n }\r\n }\r\n }\r\n if (c == ':') {\r\n if (s.charAt(pos) == '*') {\r\n types.push(XPathParser.NCNAMECOLONASTERISK);\r\n values.push(name + \":*\");\r\n pos++;\r\n c = s.charAt(pos++);\r\n continue;\r\n }\r\n if (s.charAt(pos) == '_' || Utilities.isLetter(s.charCodeAt(pos))) {\r\n name += ':';\r\n c = s.charAt(pos++);\r\n while (Utilities.isNCNameChar(c.charCodeAt(0))) {\r\n name += c;\r\n c = s.charAt(pos++);\r\n }\r\n if (c == '(') {\r\n types.push(XPathParser.FUNCTIONNAME);\r\n values.push(name);\r\n continue;\r\n }\r\n types.push(XPathParser.QNAME);\r\n values.push(name);\r\n continue;\r\n }\r\n if (s.charAt(pos) == ':') {\r\n types.push(XPathParser.AXISNAME);\r\n values.push(name);\r\n continue;\r\n }\r\n }\r\n if (c == '(') {\r\n if (name == \"comment\" || name == \"text\" || name == \"node\") {\r\n types.push(XPathParser.NODETYPE);\r\n values.push(name);\r\n continue;\r\n }\r\n if (name == \"processing-instruction\") {\r\n if (s.charAt(pos) == ')') {\r\n types.push(XPathParser.NODETYPE);\r\n } else {\r\n types.push(XPathParser.PROCESSINGINSTRUCTIONWITHLITERAL);\r\n }\r\n values.push(name);\r\n continue;\r\n }\r\n types.push(XPathParser.FUNCTIONNAME);\r\n values.push(name);\r\n continue;\r\n }\r\n types.push(XPathParser.QNAME);\r\n values.push(name);\r\n continue;\r\n }\r\n\r\n throw new Error(\"Unexpected character \" + c);\r\n }\r\n types.push(1);\r\n values.push(\"[EOF]\");\r\n return [types, values];\r\n };\r\n\r\n XPathParser.SHIFT = 's';\r\n XPathParser.REDUCE = 'r';\r\n XPathParser.ACCEPT = 'a';\r\n\r\n XPathParser.prototype.parse = function (s) {\r\n if (!s) {\r\n throw new Error('XPath expression unspecified.');\r\n }\r\n if (typeof s !== 'string'){\r\n throw new Error('XPath expression must be a string.');\r\n }\r\n\r\n var types;\r\n var values;\r\n var res = this.tokenize(s);\r\n if (res == undefined) {\r\n return undefined;\r\n }\r\n types = res[0];\r\n values = res[1];\r\n var tokenPos = 0;\r\n var state = [];\r\n var tokenType = [];\r\n var tokenValue = [];\r\n var s;\r\n var a;\r\n var t;\r\n\r\n state.push(0);\r\n tokenType.push(1);\r\n tokenValue.push(\"_S\");\r\n\r\n a = types[tokenPos];\r\n t = values[tokenPos++];\r\n while (1) {\r\n s = state[state.length - 1];\r\n switch (XPathParser.actionTable[s].charAt(a - 1)) {\r\n case XPathParser.SHIFT:\r\n tokenType.push(-a);\r\n tokenValue.push(t);\r\n state.push(XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32);\r\n a = types[tokenPos];\r\n t = values[tokenPos++];\r\n break;\r\n case XPathParser.REDUCE:\r\n var num = XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][1];\r\n var rhs = [];\r\n for (var i = 0; i < num; i++) {\r\n tokenType.pop();\r\n rhs.unshift(tokenValue.pop());\r\n state.pop();\r\n }\r\n var s_ = state[state.length - 1];\r\n tokenType.push(XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][0]);\r\n if (this.reduceActions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32] == undefined) {\r\n tokenValue.push(rhs[0]);\r\n } else {\r\n tokenValue.push(this.reduceActions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32](rhs));\r\n }\r\n state.push(XPathParser.gotoTable[s_].charCodeAt(XPathParser.productions[XPathParser.actionTableNumber[s].charCodeAt(a - 1) - 32][0] - 2) - 33);\r\n break;\r\n case XPathParser.ACCEPT:\r\n return new XPath(tokenValue.pop());\r\n default:\r\n throw new Error(\"XPath parse error\");\r\n }\r\n }\r\n };\r\n\r\n // XPath /////////////////////////////////////////////////////////////////////\r\n\r\n XPath.prototype = new Object();\r\n XPath.prototype.constructor = XPath;\r\n XPath.superclass = Object.prototype;\r\n\r\n function XPath(e) {\r\n this.expression = e;\r\n }\r\n\r\n XPath.prototype.toString = function () {\r\n return this.expression.toString();\r\n };\r\n\r\n function setIfUnset(obj, prop, value) {\r\n if (!(prop in obj)) {\r\n obj[prop] = value;\r\n }\r\n }\r\n\r\n XPath.prototype.evaluate = function (c) {\r\n var node = c.expressionContextNode;\r\n\r\n if (!(isNil(node) || isNodeLike(node))) {\r\n throw new Error(\"Context node does not appear to be a valid DOM node.\");\r\n }\r\n\r\n c.contextNode = c.expressionContextNode;\r\n c.contextSize = 1;\r\n c.contextPosition = 1;\r\n\r\n // [2017-11-25] Removed usage of .implementation.hasFeature() since it does\r\n // not reliably detect HTML DOMs (always returns false in xmldom and true in browsers)\r\n if (c.isHtml) {\r\n setIfUnset(c, 'caseInsensitive', true);\r\n setIfUnset(c, 'allowAnyNamespaceForNoPrefix', true);\r\n }\r\n\r\n setIfUnset(c, 'caseInsensitive', false);\r\n\r\n return this.expression.evaluate(c);\r\n };\r\n\r\n XPath.XML_NAMESPACE_URI = \"http://www.w3.org/XML/1998/namespace\";\r\n XPath.XMLNS_NAMESPACE_URI = \"http://www.w3.org/2000/xmlns/\";\r\n\r\n // Expression ////////////////////////////////////////////////////////////////\r\n\r\n Expression.prototype = new Object();\r\n Expression.prototype.constructor = Expression;\r\n Expression.superclass = Object.prototype;\r\n\r\n function Expression() {\r\n }\r\n\r\n Expression.prototype.init = function () {\r\n };\r\n\r\n Expression.prototype.toString = function () {\r\n return \"\";\r\n };\r\n\r\n Expression.prototype.evaluate = function (c) {\r\n throw new Error(\"Could not evaluate expression.\");\r\n };\r\n\r\n // UnaryOperation ////////////////////////////////////////////////////////////\r\n\r\n UnaryOperation.prototype = new Expression();\r\n UnaryOperation.prototype.constructor = UnaryOperation;\r\n UnaryOperation.superclass = Expression.prototype;\r\n\r\n function UnaryOperation(rhs) {\r\n if (arguments.length > 0) {\r\n this.init(rhs);\r\n }\r\n }\r\n\r\n UnaryOperation.prototype.init = function (rhs) {\r\n this.rhs = rhs;\r\n };\r\n\r\n // UnaryMinusOperation ///////////////////////////////////////////////////////\r\n\r\n UnaryMinusOperation.prototype = new UnaryOperation();\r\n UnaryMinusOperation.prototype.constructor = UnaryMinusOperation;\r\n UnaryMinusOperation.superclass = UnaryOperation.prototype;\r\n\r\n function UnaryMinusOperation(rhs) {\r\n if (arguments.length > 0) {\r\n this.init(rhs);\r\n }\r\n }\r\n\r\n UnaryMinusOperation.prototype.init = function (rhs) {\r\n UnaryMinusOperation.superclass.init.call(this, rhs);\r\n };\r\n\r\n UnaryMinusOperation.prototype.evaluate = function (c) {\r\n return this.rhs.evaluate(c).number().negate();\r\n };\r\n\r\n UnaryMinusOperation.prototype.toString = function () {\r\n return \"-\" + this.rhs.toString();\r\n };\r\n\r\n // BinaryOperation ///////////////////////////////////////////////////////////\r\n\r\n BinaryOperation.prototype = new Expression();\r\n BinaryOperation.prototype.constructor = BinaryOperation;\r\n BinaryOperation.superclass = Expression.prototype;\r\n\r\n function BinaryOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n BinaryOperation.prototype.init = function (lhs, rhs) {\r\n this.lhs = lhs;\r\n this.rhs = rhs;\r\n };\r\n\r\n // OrOperation ///////////////////////////////////////////////////////////////\r\n\r\n OrOperation.prototype = new BinaryOperation();\r\n OrOperation.prototype.constructor = OrOperation;\r\n OrOperation.superclass = BinaryOperation.prototype;\r\n\r\n function OrOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n OrOperation.prototype.init = function (lhs, rhs) {\r\n OrOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n OrOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" or \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n OrOperation.prototype.evaluate = function (c) {\r\n var b = this.lhs.evaluate(c).bool();\r\n if (b.booleanValue()) {\r\n return b;\r\n }\r\n return this.rhs.evaluate(c).bool();\r\n };\r\n\r\n // AndOperation //////////////////////////////////////////////////////////////\r\n\r\n AndOperation.prototype = new BinaryOperation();\r\n AndOperation.prototype.constructor = AndOperation;\r\n AndOperation.superclass = BinaryOperation.prototype;\r\n\r\n function AndOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n AndOperation.prototype.init = function (lhs, rhs) {\r\n AndOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n AndOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" and \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n AndOperation.prototype.evaluate = function (c) {\r\n var b = this.lhs.evaluate(c).bool();\r\n if (!b.booleanValue()) {\r\n return b;\r\n }\r\n return this.rhs.evaluate(c).bool();\r\n };\r\n\r\n // EqualsOperation ///////////////////////////////////////////////////////////\r\n\r\n EqualsOperation.prototype = new BinaryOperation();\r\n EqualsOperation.prototype.constructor = EqualsOperation;\r\n EqualsOperation.superclass = BinaryOperation.prototype;\r\n\r\n function EqualsOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n EqualsOperation.prototype.init = function (lhs, rhs) {\r\n EqualsOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n EqualsOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" = \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n EqualsOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).equals(this.rhs.evaluate(c));\r\n };\r\n\r\n // NotEqualOperation /////////////////////////////////////////////////////////\r\n\r\n NotEqualOperation.prototype = new BinaryOperation();\r\n NotEqualOperation.prototype.constructor = NotEqualOperation;\r\n NotEqualOperation.superclass = BinaryOperation.prototype;\r\n\r\n function NotEqualOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n NotEqualOperation.prototype.init = function (lhs, rhs) {\r\n NotEqualOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n NotEqualOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" != \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n NotEqualOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).notequal(this.rhs.evaluate(c));\r\n };\r\n\r\n // LessThanOperation /////////////////////////////////////////////////////////\r\n\r\n LessThanOperation.prototype = new BinaryOperation();\r\n LessThanOperation.prototype.constructor = LessThanOperation;\r\n LessThanOperation.superclass = BinaryOperation.prototype;\r\n\r\n function LessThanOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n LessThanOperation.prototype.init = function (lhs, rhs) {\r\n LessThanOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n LessThanOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).lessthan(this.rhs.evaluate(c));\r\n };\r\n\r\n LessThanOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" < \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // GreaterThanOperation //////////////////////////////////////////////////////\r\n\r\n GreaterThanOperation.prototype = new BinaryOperation();\r\n GreaterThanOperation.prototype.constructor = GreaterThanOperation;\r\n GreaterThanOperation.superclass = BinaryOperation.prototype;\r\n\r\n function GreaterThanOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n GreaterThanOperation.prototype.init = function (lhs, rhs) {\r\n GreaterThanOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n GreaterThanOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).greaterthan(this.rhs.evaluate(c));\r\n };\r\n\r\n GreaterThanOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" > \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // LessThanOrEqualOperation //////////////////////////////////////////////////\r\n\r\n LessThanOrEqualOperation.prototype = new BinaryOperation();\r\n LessThanOrEqualOperation.prototype.constructor = LessThanOrEqualOperation;\r\n LessThanOrEqualOperation.superclass = BinaryOperation.prototype;\r\n\r\n function LessThanOrEqualOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n LessThanOrEqualOperation.prototype.init = function (lhs, rhs) {\r\n LessThanOrEqualOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n LessThanOrEqualOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).lessthanorequal(this.rhs.evaluate(c));\r\n };\r\n\r\n LessThanOrEqualOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" <= \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // GreaterThanOrEqualOperation ///////////////////////////////////////////////\r\n\r\n GreaterThanOrEqualOperation.prototype = new BinaryOperation();\r\n GreaterThanOrEqualOperation.prototype.constructor = GreaterThanOrEqualOperation;\r\n GreaterThanOrEqualOperation.superclass = BinaryOperation.prototype;\r\n\r\n function GreaterThanOrEqualOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n GreaterThanOrEqualOperation.prototype.init = function (lhs, rhs) {\r\n GreaterThanOrEqualOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n GreaterThanOrEqualOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).greaterthanorequal(this.rhs.evaluate(c));\r\n };\r\n\r\n GreaterThanOrEqualOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" >= \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // PlusOperation /////////////////////////////////////////////////////////////\r\n\r\n PlusOperation.prototype = new BinaryOperation();\r\n PlusOperation.prototype.constructor = PlusOperation;\r\n PlusOperation.superclass = BinaryOperation.prototype;\r\n\r\n function PlusOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n PlusOperation.prototype.init = function (lhs, rhs) {\r\n PlusOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n PlusOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).number().plus(this.rhs.evaluate(c).number());\r\n };\r\n\r\n PlusOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" + \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // MinusOperation ////////////////////////////////////////////////////////////\r\n\r\n MinusOperation.prototype = new BinaryOperation();\r\n MinusOperation.prototype.constructor = MinusOperation;\r\n MinusOperation.superclass = BinaryOperation.prototype;\r\n\r\n function MinusOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n MinusOperation.prototype.init = function (lhs, rhs) {\r\n MinusOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n MinusOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).number().minus(this.rhs.evaluate(c).number());\r\n };\r\n\r\n MinusOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" - \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // MultiplyOperation /////////////////////////////////////////////////////////\r\n\r\n MultiplyOperation.prototype = new BinaryOperation();\r\n MultiplyOperation.prototype.constructor = MultiplyOperation;\r\n MultiplyOperation.superclass = BinaryOperation.prototype;\r\n\r\n function MultiplyOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n MultiplyOperation.prototype.init = function (lhs, rhs) {\r\n MultiplyOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n MultiplyOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).number().multiply(this.rhs.evaluate(c).number());\r\n };\r\n\r\n MultiplyOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" * \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // DivOperation //////////////////////////////////////////////////////////////\r\n\r\n DivOperation.prototype = new BinaryOperation();\r\n DivOperation.prototype.constructor = DivOperation;\r\n DivOperation.superclass = BinaryOperation.prototype;\r\n\r\n function DivOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n DivOperation.prototype.init = function (lhs, rhs) {\r\n DivOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n DivOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).number().div(this.rhs.evaluate(c).number());\r\n };\r\n\r\n DivOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" div \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // ModOperation //////////////////////////////////////////////////////////////\r\n\r\n ModOperation.prototype = new BinaryOperation();\r\n ModOperation.prototype.constructor = ModOperation;\r\n ModOperation.superclass = BinaryOperation.prototype;\r\n\r\n function ModOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n ModOperation.prototype.init = function (lhs, rhs) {\r\n ModOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n ModOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).number().mod(this.rhs.evaluate(c).number());\r\n };\r\n\r\n ModOperation.prototype.toString = function () {\r\n return \"(\" + this.lhs.toString() + \" mod \" + this.rhs.toString() + \")\";\r\n };\r\n\r\n // BarOperation //////////////////////////////////////////////////////////////\r\n\r\n BarOperation.prototype = new BinaryOperation();\r\n BarOperation.prototype.constructor = BarOperation;\r\n BarOperation.superclass = BinaryOperation.prototype;\r\n\r\n function BarOperation(lhs, rhs) {\r\n if (arguments.length > 0) {\r\n this.init(lhs, rhs);\r\n }\r\n }\r\n\r\n BarOperation.prototype.init = function (lhs, rhs) {\r\n BarOperation.superclass.init.call(this, lhs, rhs);\r\n };\r\n\r\n BarOperation.prototype.evaluate = function (c) {\r\n return this.lhs.evaluate(c).nodeset().union(this.rhs.evaluate(c).nodeset());\r\n };\r\n\r\n BarOperation.prototype.toString = function () {\r\n return map(toString, [this.lhs, this.rhs]).join(' | ');\r\n };\r\n\r\n // PathExpr //////////////////////////////////////////////////////////////////\r\n\r\n PathExpr.prototype = new Expression();\r\n PathExpr.prototype.constructor = PathExpr;\r\n PathExpr.superclass = Expression.prototype;\r\n\r\n function PathExpr(filter, filterPreds, locpath) {\r\n if (arguments.length > 0) {\r\n this.init(filter, filterPreds, locpath);\r\n }\r\n }\r\n\r\n PathExpr.prototype.init = function (filter, filterPreds, locpath) {\r\n PathExpr.superclass.init.call(this);\r\n this.filter = filter;\r\n this.filterPredicates = filterPreds;\r\n this.locationPath = locpath;\r\n };\r\n\r\n /**\r\n * Returns the topmost node of the tree containing node\r\n */\r\n function findRoot(node) {\r\n while (node && node.parentNode) {\r\n node = node.parentNode;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n var applyPredicates = function (predicates, c, nodes, reverse) {\r\n if (predicates.length === 0) {\r\n return nodes;\r\n }\r\n\r\n var ctx = c.extend({});\r\n\r\n return reduce(\r\n function (inNodes, pred) {\r\n ctx.contextSize = inNodes.length;\r\n\r\n return filter(\r\n function (node, i) {\r\n ctx.contextNode = node;\r\n ctx.contextPosition = i + 1;\r\n\r\n return PathExpr.predicateMatches(pred, ctx);\r\n },\r\n inNodes\r\n );\r\n },\r\n sortNodes(nodes, reverse),\r\n predicates\r\n );\r\n };\r\n\r\n PathExpr.getRoot = function (xpc, nodes) {\r\n var firstNode = nodes[0];\r\n\r\n // xpc.virtualRoot could possibly provide a root even if firstNode is null,\r\n // so using a guard here instead of throwing.\r\n if (firstNode && firstNode.nodeType === NodeTypes.DOCUMENT_NODE) {\r\n return firstNode;\r\n }\r\n\r\n if (xpc.virtualRoot) {\r\n return xpc.virtualRoot;\r\n }\r\n\r\n if (!firstNode) {\r\n throw new Error('Context node not found when determining document root.');\r\n }\r\n\r\n var ownerDoc = firstNode.ownerDocument;\r\n\r\n if (ownerDoc) {\r\n return ownerDoc;\r\n }\r\n\r\n // IE 5.5 doesn't have ownerDocument?\r\n var n = firstNode;\r\n while (n.parentNode != null) {\r\n n = n.parentNode;\r\n }\r\n return n;\r\n }\r\n\r\n var getPrefixForNamespaceNode = function (attrNode) {\r\n var nm = String(attrNode.name);\r\n\r\n if (nm === \"xmlns\") {\r\n return \"\";\r\n }\r\n\r\n if (nm.substring(0, 6) === \"xmlns:\") {\r\n return nm.substring(6, nm.length);\r\n }\r\n\r\n return null;\r\n };\r\n\r\n PathExpr.applyStep = function (step, xpc, node) {\r\n if (!node) {\r\n throw new Error('Context node not found when evaluating XPath step: ' + step);\r\n }\r\n\r\n var newNodes = [];\r\n xpc.contextNode = node;\r\n\r\n switch (step.axis) {\r\n case Step.ANCESTOR:\r\n // look at all the ancestor nodes\r\n if (xpc.contextNode === xpc.virtualRoot) {\r\n break;\r\n }\r\n var m;\r\n if (xpc.contextNode.nodeType == NodeTypes.ATTRIBUTE_NODE) {\r\n m = PathExpr.getOwnerElement(xpc.contextNode);\r\n } else {\r\n m = xpc.contextNode.parentNode;\r\n }\r\n while (m != null) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n if (m === xpc.virtualRoot) {\r\n break;\r\n }\r\n m = m.parentNode;\r\n }\r\n break;\r\n\r\n case Step.ANCESTORORSELF:\r\n // look at all the ancestor nodes and the current node\r\n for (var m = xpc.contextNode; m != null; m = m.nodeType == NodeTypes.ATTRIBUTE_NODE ? PathExpr.getOwnerElement(m) : m.parentNode) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n if (m === xpc.virtualRoot) {\r\n break;\r\n }\r\n }\r\n break;\r\n\r\n case Step.ATTRIBUTE:\r\n // look at the attributes\r\n var nnm = xpc.contextNode.attributes;\r\n if (nnm != null) {\r\n for (var k = 0; k < nnm.length; k++) {\r\n var m = nnm.item(k);\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case Step.CHILD:\r\n // look at all child elements\r\n for (var m = xpc.contextNode.firstChild; m != null; m = m.nextSibling) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n }\r\n break;\r\n\r\n case Step.DESCENDANT:\r\n // look at all descendant nodes\r\n var st = [xpc.contextNode.firstChild];\r\n while (st.length > 0) {\r\n for (var m = st.pop(); m != null;) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n if (m.firstChild != null) {\r\n st.push(m.nextSibling);\r\n m = m.firstChild;\r\n } else {\r\n m = m.nextSibling;\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case Step.DESCENDANTORSELF:\r\n // look at self\r\n if (step.nodeTest.matches(xpc.contextNode, xpc)) {\r\n newNodes.push(xpc.contextNode);\r\n }\r\n // look at all descendant nodes\r\n var st = [xpc.contextNode.firstChild];\r\n while (st.length > 0) {\r\n for (var m = st.pop(); m != null;) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n if (m.firstChild != null) {\r\n st.push(m.nextSibling);\r\n m = m.firstChild;\r\n } else {\r\n m = m.nextSibling;\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case Step.FOLLOWING:\r\n if (xpc.contextNode === xpc.virtualRoot) {\r\n break;\r\n }\r\n var st = [];\r\n if (xpc.contextNode.firstChild != null) {\r\n st.unshift(xpc.contextNode.firstChild);\r\n } else {\r\n st.unshift(xpc.contextNode.nextSibling);\r\n }\r\n for (var m = xpc.contextNode.parentNode; m != null && m.nodeType != NodeTypes.DOCUMENT_NODE && m !== xpc.virtualRoot; m = m.parentNode) {\r\n st.unshift(m.nextSibling);\r\n }\r\n do {\r\n for (var m = st.pop(); m != null;) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n if (m.firstChild != null) {\r\n st.push(m.nextSibling);\r\n m = m.firstChild;\r\n } else {\r\n m = m.nextSibling;\r\n }\r\n }\r\n } while (st.length > 0);\r\n break;\r\n\r\n case Step.FOLLOWINGSIBLING:\r\n if (xpc.contextNode === xpc.virtualRoot) {\r\n break;\r\n }\r\n for (var m = xpc.contextNode.nextSibling; m != null; m = m.nextSibling) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n }\r\n break;\r\n\r\n case Step.NAMESPACE:\r\n var nodes = {};\r\n\r\n if (xpc.contextNode.nodeType == NodeTypes.ELEMENT_NODE) {\r\n // BUG: This only collects the namespaces on the current node, but seemingly\r\n // it should collect all those in scope\r\n nodes[\"xml\"] = new XPathNamespace(\"xml\", null, XPath.XML_NAMESPACE_URI, xpc.contextNode);\r\n\r\n for (var m = xpc.contextNode; m != null && m.nodeType == NodeTypes.ELEMENT_NODE; m = m.parentNode) {\r\n for (var k = 0; k < m.attributes.length; k++) {\r\n var attr = m.attributes.item(k);\r\n\r\n var pre = getPrefixForNamespaceNode(attr);\r\n\r\n if (pre != null && nodes[pre] == undefined) {\r\n nodes[pre] = new XPathNamespace(pre, attr, attr.value, xpc.contextNode);\r\n }\r\n }\r\n }\r\n\r\n for (var pre in nodes) {\r\n var node = nodes[pre];\r\n\r\n if (step.nodeTest.matches(node, xpc)) {\r\n newNodes.push(node);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case Step.PARENT:\r\n m = null;\r\n if (xpc.contextNode !== xpc.virtualRoot) {\r\n if (xpc.contextNode.nodeType == NodeTypes.ATTRIBUTE_NODE) {\r\n m = PathExpr.getOwnerElement(xpc.contextNode);\r\n } else {\r\n m = xpc.contextNode.parentNode;\r\n }\r\n }\r\n if (m != null && step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n break;\r\n\r\n case Step.PRECEDING:\r\n var st;\r\n if (xpc.virtualRoot != null) {\r\n st = [xpc.virtualRoot];\r\n } else {\r\n // cannot rely on .ownerDocument because the node may be in a document fragment\r\n st = [findRoot(xpc.contextNode)];\r\n }\r\n outer: while (st.length > 0) {\r\n for (var m = st.pop(); m != null;) {\r\n if (m == xpc.contextNode) {\r\n break outer;\r\n }\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.unshift(m);\r\n }\r\n if (m.firstChild != null) {\r\n st.push(m.nextSibling);\r\n m = m.firstChild;\r\n } else {\r\n m = m.nextSibling;\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case Step.PRECEDINGSIBLING:\r\n if (xpc.contextNode === xpc.virtualRoot) {\r\n break;\r\n }\r\n for (var m = xpc.contextNode.previousSibling; m != null; m = m.previousSibling) {\r\n if (step.nodeTest.matches(m, xpc)) {\r\n newNodes.push(m);\r\n }\r\n }\r\n break;\r\n\r\n case Step.SELF:\r\n if (step.nodeTest.matches(xpc.contextNode, xpc)) {\r\n newNodes.push(xpc.contextNode);\r\n }\r\n break;\r\n\r\n default:\r\n }\r\n\r\n return newNodes;\r\n };\r\n\r\n function applyStepWithPredicates(step, xpc, node) {\r\n return applyPredicates(\r\n step.predicates,\r\n xpc,\r\n PathExpr.applyStep(step, xpc, node),\r\n includes(REVERSE_AXES, step.axis)\r\n );\r\n }\r\n\r\n function applyStepToNodes(context, nodes, step) {\r\n return flatten(\r\n map(\r\n applyStepWithPredicates.bind(null, step, context),\r\n nodes\r\n )\r\n );\r\n }\r\n\r\n PathExpr.applySteps = function (steps, xpc, nodes) {\r\n return reduce(\r\n applyStepToNodes.bind(null, xpc),\r\n nodes,\r\n steps\r\n );\r\n }\r\n\r\n PathExpr.prototype.applyFilter = function (c, xpc) {\r\n if (!this.filter) {\r\n return { nodes: [c.contextNode] };\r\n }\r\n\r\n var ns = this.filter.evaluate(c);\r\n\r\n if (!Utilities.instance_of(ns, XNodeSet)) {\r\n if (this.filterPredicates != null && this.filterPredicates.length > 0 || this.locationPath != null) {\r\n throw new Error(\"Path expression filter must evaluate to a nodeset if predicates or location path are used\");\r\n }\r\n\r\n return { nonNodes: ns };\r\n }\r\n\r\n return {\r\n nodes: applyPredicates(\r\n this.filterPredicates || [],\r\n xpc,\r\n ns.toUnsortedArray(),\r\n false // reverse\r\n )\r\n };\r\n };\r\n\r\n PathExpr.applyLocationPath = function (locationPath, xpc, nodes) {\r\n if (!locationPath) {\r\n return nodes;\r\n }\r\n\r\n var startNodes = locationPath.absolute ? [PathExpr.getRoot(xpc, nodes)] : nodes;\r\n\r\n return PathExpr.applySteps(locationPath.steps, xpc, startNodes);\r\n };\r\n\r\n PathExpr.prototype.evaluate = function (c) {\r\n var xpc = assign(new XPathContext(), c);\r\n\r\n var filterResult = this.applyFilter(c, xpc);\r\n\r\n if ('nonNodes' in filterResult) {\r\n return filterResult.nonNodes;\r\n }\r\n\r\n var ns = new XNodeSet();\r\n ns.addArray(PathExpr.applyLocationPath(this.locationPath, xpc, filterResult.nodes));\r\n return ns;\r\n };\r\n\r\n PathExpr.predicateMatches = function (pred, c) {\r\n var res = pred.evaluate(c);\r\n\r\n return Utilities.instance_of(res, XNumber)\r\n ? c.contextPosition === res.numberValue()\r\n : res.booleanValue();\r\n };\r\n\r\n PathExpr.predicateString = function (predicate) {\r\n return wrap('[', ']', predicate.toString());\r\n }\r\n\r\n PathExpr.predicatesString = function (predicates) {\r\n return join(\r\n '',\r\n map(PathExpr.predicateString, predicates)\r\n );\r\n }\r\n\r\n PathExpr.prototype.toString = function () {\r\n if (this.filter != undefined) {\r\n var filterStr = toString(this.filter);\r\n\r\n if (Utilities.instance_of(this.filter, XString)) {\r\n return wrap(\"'\", \"'\", filterStr);\r\n }\r\n if (this.filterPredicates != undefined && this.filterPredicates.length) {\r\n return wrap('(', ')', filterStr) +\r\n PathExpr.predicatesString(this.filterPredicates);\r\n }\r\n if (this.locationPath != undefined) {\r\n return filterStr +\r\n (this.locationPath.absolute ? '' : '/') +\r\n toString(this.locationPath);\r\n }\r\n\r\n return filterStr;\r\n }\r\n\r\n return toString(this.locationPath);\r\n };\r\n\r\n PathExpr.getOwnerElement = function (n) {\r\n // DOM 2 has ownerElement\r\n if (n.ownerElement) {\r\n return n.ownerElement;\r\n }\r\n // DOM 1 Internet Explorer can use selectSingleNode (ironically)\r\n try {\r\n if (n.selectSingleNode) {\r\n return n.selectSingleNode(\"..\");\r\n }\r\n } catch (e) {\r\n }\r\n // Other DOM 1 implementations must use this egregious search\r\n var doc = n.nodeType == NodeTypes.DOCUMENT_NODE\r\n ? n\r\n : n.ownerDocument;\r\n var elts = doc.getElementsByTagName(\"*\");\r\n for (var i = 0; i < elts.length; i++) {\r\n var elt = elts.item(i);\r\n var nnm = elt.attributes;\r\n for (var j = 0; j < nnm.length; j++) {\r\n var an = nnm.item(j);\r\n if (an === n) {\r\n return elt;\r\n }\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n // LocationPath //////////////////////////////////////////////////////////////\r\n\r\n LocationPath.prototype = new Object();\r\n LocationPath.prototype.constructor = LocationPath;\r\n LocationPath.superclass = Object.prototype;\r\n\r\n function LocationPath(abs, steps) {\r\n if (arguments.length > 0) {\r\n this.init(abs, steps);\r\n }\r\n }\r\n\r\n LocationPath.prototype.init = function (abs, steps) {\r\n this.absolute = abs;\r\n this.steps = steps;\r\n };\r\n\r\n LocationPath.prototype.toString = function () {\r\n return (\r\n (this.absolute ? '/' : '') +\r\n map(toString, this.steps).join('/')\r\n );\r\n };\r\n\r\n // Step //////////////////////////////////////////////////////////////////////\r\n\r\n Step.prototype = new Object();\r\n Step.prototype.constructor = Step;\r\n Step.superclass = Object.prototype;\r\n\r\n function Step(axis, nodetest, preds) {\r\n if (arguments.length > 0) {\r\n this.init(axis, nodetest, preds);\r\n }\r\n }\r\n\r\n Step.prototype.init = function (axis, nodetest, preds) {\r\n this.axis = axis;\r\n this.nodeTest = nodetest;\r\n this.predicates = preds;\r\n };\r\n\r\n Step.prototype.toString = function () {\r\n return Step.STEPNAMES[this.axis] +\r\n \"::\" +\r\n this.nodeTest.toString() +\r\n PathExpr.predicatesString(this.predicates);\r\n };\r\n\r\n\r\n Step.ANCESTOR = 0;\r\n Step.ANCESTORORSELF = 1;\r\n Step.ATTRIBUTE = 2;\r\n Step.CHILD = 3;\r\n Step.DESCENDANT = 4;\r\n Step.DESCENDANTORSELF = 5;\r\n Step.FOLLOWING = 6;\r\n Step.FOLLOWINGSIBLING = 7;\r\n Step.NAMESPACE = 8;\r\n Step.PARENT = 9;\r\n Step.PRECEDING = 10;\r\n Step.PRECEDINGSIBLING = 11;\r\n Step.SELF = 12;\r\n\r\n Step.STEPNAMES = reduce(function (acc, x) { return acc[x[0]] = x[1], acc; }, {}, [\r\n [Step.ANCESTOR, 'ancestor'],\r\n [Step.ANCESTORORSELF, 'ancestor-or-self'],\r\n [Step.ATTRIBUTE, 'attribute'],\r\n [Step.CHILD, 'child'],\r\n [Step.DESCENDANT, 'descendant'],\r\n [Step.DESCENDANTORSELF, 'descendant-or-self'],\r\n [Step.FOLLOWING, 'following'],\r\n [Step.FOLLOWINGSIBLING, 'following-sibling'],\r\n [Step.NAMESPACE, 'namespace'],\r\n [Step.PARENT, 'parent'],\r\n [Step.PRECEDING, 'preceding'],\r\n [Step.PRECEDINGSIBLING, 'preceding-sibling'],\r\n [Step.SELF, 'self']\r\n ]);\r\n\r\n var REVERSE_AXES = [\r\n Step.ANCESTOR,\r\n Step.ANCESTORORSELF,\r\n Step.PARENT,\r\n Step.PRECEDING,\r\n Step.PRECEDINGSIBLING\r\n ];\r\n\r\n // NodeTest //////////////////////////////////////////////////////////////////\r\n\r\n NodeTest.prototype = new Object();\r\n NodeTest.prototype.constructor = NodeTest;\r\n NodeTest.superclass = Object.prototype;\r\n\r\n function NodeTest(type, value) {\r\n if (arguments.length > 0) {\r\n this.init(type, value);\r\n }\r\n }\r\n\r\n NodeTest.prototype.init = function (type, value) {\r\n this.type = type;\r\n this.value = value;\r\n };\r\n\r\n NodeTest.prototype.toString = function () {\r\n return \"\";\r\n };\r\n\r\n NodeTest.prototype.matches = function (n, xpc) {\r\n console.warn('unknown node test type');\r\n };\r\n\r\n NodeTest.NAMETESTANY = 0;\r\n NodeTest.NAMETESTPREFIXANY = 1;\r\n NodeTest.NAMETESTQNAME = 2;\r\n NodeTest.COMMENT = 3;\r\n NodeTest.TEXT = 4;\r\n NodeTest.PI = 5;\r\n NodeTest.NODE = 6;\r\n\r\n NodeTest.isNodeType = function (types) {\r\n return function (node) {\r\n return includes(types, node.nodeType);\r\n };\r\n };\r\n\r\n NodeTest.makeNodeTestType = function (type, members, ctor) {\r\n var newType = ctor || function () { };\r\n\r\n newType.prototype = new NodeTest(type);\r\n newType.prototype.constructor = newType;\r\n\r\n assign(newType.prototype, members);\r\n\r\n return newType;\r\n };\r\n // create invariant node test for certain node types\r\n NodeTest.makeNodeTypeTest = function (type, nodeTypes, stringVal) {\r\n return new (NodeTest.makeNodeTestType(type, {\r\n matches: NodeTest.isNodeType(nodeTypes),\r\n toString: always(stringVal)\r\n }))();\r\n };\r\n\r\n NodeTest.hasPrefix = function (node) {\r\n return node.prefix || (node.nodeName || node.tagName).indexOf(':') !== -1;\r\n };\r\n\r\n NodeTest.isElementOrAttribute = NodeTest.isNodeType([1, 2]);\r\n NodeTest.nameSpaceMatches = function (prefix, xpc, n) {\r\n var nNamespace = (n.namespaceURI || '');\r\n\r\n if (!prefix) {\r\n return !nNamespace || (xpc.allowAnyNamespaceForNoPrefix && !NodeTest.hasPrefix(n));\r\n }\r\n\r\n var ns = xpc.namespaceResolver.getNamespace(prefix, xpc.expressionContextNode);\r\n\r\n if (ns == null) {\r\n throw new Error(\"Cannot resolve QName \" + prefix);\r\n }\r\n\r\n return ns === nNamespace;\r\n };\r\n NodeTest.localNameMatches = function (localName, xpc, n) {\r\n var nLocalName = (n.localName || n.nodeName);\r\n\r\n return xpc.caseInsensitive\r\n ? localName.toLowerCase() === nLocalName.toLowerCase()\r\n : localName === nLocalName;\r\n };\r\n\r\n NodeTest.NameTestPrefixAny = NodeTest.makeNodeTestType(\r\n NodeTest.NAMETESTPREFIXANY,\r\n {\r\n matches: function (n, xpc) {\r\n return NodeTest.isElementOrAttribute(n) &&\r\n NodeTest.nameSpaceMatches(this.prefix, xpc, n);\r\n },\r\n toString: function () {\r\n return this.prefix + \":*\";\r\n }\r\n },\r\n function NameTestPrefixAny(prefix) { this.prefix = prefix; }\r\n );\r\n\r\n NodeTest.NameTestQName = NodeTest.makeNodeTestType(\r\n NodeTest.NAMETESTQNAME,\r\n {\r\n matches: function (n, xpc) {\r\n return NodeTest.isNodeType(\r\n [\r\n NodeTypes.ELEMENT_NODE,\r\n NodeTypes.ATTRIBUTE_NODE,\r\n NodeTypes.NAMESPACE_NODE,\r\n ]\r\n )(n) &&\r\n NodeTest.nameSpaceMatches(this.prefix, xpc, n) &&\r\n NodeTest.localNameMatches(this.localName, xpc, n);\r\n },\r\n toString: function () {\r\n return this.name;\r\n }\r\n },\r\n function NameTestQName(name) {\r\n var nameParts = name.split(':');\r\n\r\n this.name = name;\r\n this.prefix = nameParts.length > 1 ? nameParts[0] : null;\r\n this.localName = nameParts[nameParts.length > 1 ? 1 : 0];\r\n }\r\n );\r\n\r\n NodeTest.PITest = NodeTest.makeNodeTestType(NodeTest.PI, {\r\n matches: function (n, xpc) {\r\n return NodeTest.isNodeType(\r\n [NodeTypes.PROCESSING_INSTRUCTION_NODE]\r\n )(n) &&\r\n (n.target || n.nodeName) === this.name;\r\n },\r\n toString: function () {\r\n return wrap('processing-instruction(\"', '\")', this.name);\r\n }\r\n }, function (name) { this.name = name; })\r\n\r\n // singletons\r\n\r\n // elements, attributes, namespaces\r\n NodeTest.nameTestAny = NodeTest.makeNodeTypeTest(\r\n NodeTest.NAMETESTANY,\r\n [\r\n NodeTypes.ELEMENT_NODE,\r\n NodeTypes.ATTRIBUTE_NODE,\r\n NodeTypes.NAMESPACE_NODE,\r\n ],\r\n '*'\r\n );\r\n // text, cdata\r\n NodeTest.textTest = NodeTest.makeNodeTypeTest(\r\n NodeTest.TEXT,\r\n [\r\n NodeTypes.TEXT_NODE,\r\n NodeTypes.CDATA_SECTION_NODE,\r\n ],\r\n 'text()'\r\n );\r\n NodeTest.commentTest = NodeTest.makeNodeTypeTest(\r\n NodeTest.COMMENT,\r\n [NodeTypes.COMMENT_NODE],\r\n 'comment()'\r\n );\r\n // elements, attributes, text, cdata, PIs, comments, document nodes\r\n NodeTest.nodeTest = NodeTest.makeNodeTypeTest(\r\n NodeTest.NODE,\r\n [\r\n NodeTypes.ELEMENT_NODE,\r\n NodeTypes.ATTRIBUTE_NODE,\r\n NodeTypes.TEXT_NODE,\r\n NodeTypes.CDATA_SECTION_NODE,\r\n NodeTypes.PROCESSING_INSTRUCTION_NODE,\r\n NodeTypes.COMMENT_NODE,\r\n NodeTypes.DOCUMENT_NODE,\r\n ],\r\n 'node()'\r\n );\r\n NodeTest.anyPiTest = NodeTest.makeNodeTypeTest(\r\n NodeTest.PI,\r\n [NodeTypes.PROCESSING_INSTRUCTION_NODE],\r\n 'processing-instruction()'\r\n );\r\n\r\n // VariableReference /////////////////////////////////////////////////////////\r\n\r\n VariableReference.prototype = new Expression();\r\n VariableReference.prototype.constructor = VariableReference;\r\n VariableReference.superclass = Expression.prototype;\r\n\r\n function VariableReference(v) {\r\n if (arguments.length > 0) {\r\n this.init(v);\r\n }\r\n }\r\n\r\n VariableReference.prototype.init = function (v) {\r\n this.variable = v;\r\n };\r\n\r\n VariableReference.prototype.toString = function () {\r\n return \"$\" + this.variable;\r\n };\r\n\r\n VariableReference.prototype.evaluate = function (c) {\r\n var parts = Utilities.resolveQName(this.variable, c.namespaceResolver, c.contextNode, false);\r\n\r\n if (parts[0] == null) {\r\n throw new Error(\"Cannot resolve QName \" + fn);\r\n }\r\n var result = c.variableResolver.getVariable(parts[1], parts[0]);\r\n if (!result) {\r\n throw XPathException.fromMessage(\"Undeclared variable: \" + this.toString());\r\n }\r\n return result;\r\n };\r\n\r\n // FunctionCall //////////////////////////////////////////////////////////////\r\n\r\n FunctionCall.prototype = new Expression();\r\n FunctionCall.prototype.constructor = FunctionCall;\r\n FunctionCall.superclass = Expression.prototype;\r\n\r\n function FunctionCall(fn, args) {\r\n if (arguments.length > 0) {\r\n this.init(fn, args);\r\n }\r\n }\r\n\r\n FunctionCall.prototype.init = function (fn, args) {\r\n this.functionName = fn;\r\n this.arguments = args;\r\n };\r\n\r\n FunctionCall.prototype.toString = function () {\r\n var s = this.functionName + \"(\";\r\n for (var i = 0; i < this.arguments.length; i++) {\r\n if (i > 0) {\r\n s += \", \";\r\n }\r\n s += this.arguments[i].toString();\r\n }\r\n return s + \")\";\r\n };\r\n\r\n FunctionCall.prototype.evaluate = function (c) {\r\n var f = FunctionResolver.getFunctionFromContext(this.functionName, c);\r\n\r\n if (!f) {\r\n throw new Error(\"Unknown function \" + this.functionName);\r\n }\r\n\r\n var a = [c].concat(this.arguments);\r\n return f.apply(c.functionResolver.thisArg, a);\r\n };\r\n\r\n // Operators /////////////////////////////////////////////////////////////////\r\n\r\n var Operators = new Object();\r\n\r\n Operators.equals = function (l, r) {\r\n return l.equals(r);\r\n };\r\n\r\n Operators.notequal = function (l, r) {\r\n return l.notequal(r);\r\n };\r\n\r\n Operators.lessthan = function (l, r) {\r\n return l.lessthan(r);\r\n };\r\n\r\n Operators.greaterthan = function (l, r) {\r\n return l.greaterthan(r);\r\n };\r\n\r\n Operators.lessthanorequal = function (l, r) {\r\n return l.lessthanorequal(r);\r\n };\r\n\r\n Operators.greaterthanorequal = function (l, r) {\r\n return l.greaterthanorequal(r);\r\n };\r\n\r\n // XString ///////////////////////////////////////////////////////////////////\r\n\r\n XString.prototype = new Expression();\r\n XString.prototype.constructor = XString;\r\n XString.superclass = Expression.prototype;\r\n\r\n function XString(s) {\r\n if (arguments.length > 0) {\r\n this.init(s);\r\n }\r\n }\r\n\r\n XString.prototype.init = function (s) {\r\n this.str = String(s);\r\n };\r\n\r\n XString.prototype.toString = function () {\r\n return this.str;\r\n };\r\n\r\n XString.prototype.evaluate = function (c) {\r\n return this;\r\n };\r\n\r\n XString.prototype.string = function () {\r\n return this;\r\n };\r\n\r\n XString.prototype.number = function () {\r\n return new XNumber(this.str);\r\n };\r\n\r\n XString.prototype.bool = function () {\r\n return new XBoolean(this.str);\r\n };\r\n\r\n XString.prototype.nodeset = function () {\r\n throw new Error(\"Cannot convert string to nodeset\");\r\n };\r\n\r\n XString.prototype.stringValue = function () {\r\n return this.str;\r\n };\r\n\r\n XString.prototype.numberValue = function () {\r\n return this.number().numberValue();\r\n };\r\n\r\n XString.prototype.booleanValue = function () {\r\n return this.bool().booleanValue();\r\n };\r\n\r\n XString.prototype.equals = function (r) {\r\n if (Utilities.instance_of(r, XBoolean)) {\r\n return this.bool().equals(r);\r\n }\r\n if (Utilities.instance_of(r, XNumber)) {\r\n return this.number().equals(r);\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithString(this, Operators.equals);\r\n }\r\n return new XBoolean(this.str == r.str);\r\n };\r\n\r\n XString.prototype.notequal = function (r) {\r\n if (Utilities.instance_of(r, XBoolean)) {\r\n return this.bool().notequal(r);\r\n }\r\n if (Utilities.instance_of(r, XNumber)) {\r\n return this.number().notequal(r);\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithString(this, Operators.notequal);\r\n }\r\n return new XBoolean(this.str != r.str);\r\n };\r\n\r\n XString.prototype.lessthan = function (r) {\r\n return this.number().lessthan(r);\r\n };\r\n\r\n XString.prototype.greaterthan = function (r) {\r\n return this.number().greaterthan(r);\r\n };\r\n\r\n XString.prototype.lessthanorequal = function (r) {\r\n return this.number().lessthanorequal(r);\r\n };\r\n\r\n XString.prototype.greaterthanorequal = function (r) {\r\n return this.number().greaterthanorequal(r);\r\n };\r\n\r\n // XNumber ///////////////////////////////////////////////////////////////////\r\n\r\n XNumber.prototype = new Expression();\r\n XNumber.prototype.constructor = XNumber;\r\n XNumber.superclass = Expression.prototype;\r\n\r\n function XNumber(n) {\r\n if (arguments.length > 0) {\r\n this.init(n);\r\n }\r\n }\r\n\r\n XNumber.prototype.init = function (n) {\r\n this.num = typeof n === \"string\" ? this.parse(n) : Number(n);\r\n };\r\n\r\n XNumber.prototype.numberFormat = /^\\s*-?[0-9]*\\.?[0-9]+\\s*$/;\r\n\r\n XNumber.prototype.parse = function (s) {\r\n // XPath representation of numbers is more restrictive than what Number() or parseFloat() allow\r\n return this.numberFormat.test(s) ? parseFloat(s) : Number.NaN;\r\n };\r\n\r\n function padSmallNumber(numberStr) {\r\n var parts = numberStr.split('e-');\r\n var base = parts[0].replace('.', '');\r\n var exponent = Number(parts[1]);\r\n\r\n for (var i = 0; i < exponent - 1; i += 1) {\r\n base = '0' + base;\r\n }\r\n\r\n return '0.' + base;\r\n }\r\n\r\n function padLargeNumber(numberStr) {\r\n var parts = numberStr.split('e');\r\n var base = parts[0].replace('.', '');\r\n var exponent = Number(parts[1]);\r\n var zerosToAppend = exponent + 1 - base.length;\r\n\r\n for (var i = 0; i < zerosToAppend; i += 1) {\r\n base += '0';\r\n }\r\n\r\n return base;\r\n }\r\n\r\n XNumber.prototype.toString = function () {\r\n var strValue = this.num.toString();\r\n\r\n if (strValue.indexOf('e-') !== -1) {\r\n return padSmallNumber(strValue);\r\n }\r\n\r\n if (strValue.indexOf('e') !== -1) {\r\n return padLargeNumber(strValue);\r\n }\r\n\r\n return strValue;\r\n };\r\n\r\n XNumber.prototype.evaluate = function (c) {\r\n return this;\r\n };\r\n\r\n XNumber.prototype.string = function () {\r\n\r\n\r\n return new XString(this.toString());\r\n };\r\n\r\n XNumber.prototype.number = function () {\r\n return this;\r\n };\r\n\r\n XNumber.prototype.bool = function () {\r\n return new XBoolean(this.num);\r\n };\r\n\r\n XNumber.prototype.nodeset = function () {\r\n throw new Error(\"Cannot convert number to nodeset\");\r\n };\r\n\r\n XNumber.prototype.stringValue = function () {\r\n return this.string().stringValue();\r\n };\r\n\r\n XNumber.prototype.numberValue = function () {\r\n return this.num;\r\n };\r\n\r\n XNumber.prototype.booleanValue = function () {\r\n return this.bool().booleanValue();\r\n };\r\n\r\n XNumber.prototype.negate = function () {\r\n return new XNumber(-this.num);\r\n };\r\n\r\n XNumber.prototype.equals = function (r) {\r\n if (Utilities.instance_of(r, XBoolean)) {\r\n return this.bool().equals(r);\r\n }\r\n if (Utilities.instance_of(r, XString)) {\r\n return this.equals(r.number());\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.equals);\r\n }\r\n return new XBoolean(this.num == r.num);\r\n };\r\n\r\n XNumber.prototype.notequal = function (r) {\r\n if (Utilities.instance_of(r, XBoolean)) {\r\n return this.bool().notequal(r);\r\n }\r\n if (Utilities.instance_of(r, XString)) {\r\n return this.notequal(r.number());\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.notequal);\r\n }\r\n return new XBoolean(this.num != r.num);\r\n };\r\n\r\n XNumber.prototype.lessthan = function (r) {\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.greaterthan);\r\n }\r\n if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {\r\n return this.lessthan(r.number());\r\n }\r\n return new XBoolean(this.num < r.num);\r\n };\r\n\r\n XNumber.prototype.greaterthan = function (r) {\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.lessthan);\r\n }\r\n if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {\r\n return this.greaterthan(r.number());\r\n }\r\n return new XBoolean(this.num > r.num);\r\n };\r\n\r\n XNumber.prototype.lessthanorequal = function (r) {\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.greaterthanorequal);\r\n }\r\n if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {\r\n return this.lessthanorequal(r.number());\r\n }\r\n return new XBoolean(this.num <= r.num);\r\n };\r\n\r\n XNumber.prototype.greaterthanorequal = function (r) {\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithNumber(this, Operators.lessthanorequal);\r\n }\r\n if (Utilities.instance_of(r, XBoolean) || Utilities.instance_of(r, XString)) {\r\n return this.greaterthanorequal(r.number());\r\n }\r\n return new XBoolean(this.num >= r.num);\r\n };\r\n\r\n XNumber.prototype.plus = function (r) {\r\n return new XNumber(this.num + r.num);\r\n };\r\n\r\n XNumber.prototype.minus = function (r) {\r\n return new XNumber(this.num - r.num);\r\n };\r\n\r\n XNumber.prototype.multiply = function (r) {\r\n return new XNumber(this.num * r.num);\r\n };\r\n\r\n XNumber.prototype.div = function (r) {\r\n return new XNumber(this.num / r.num);\r\n };\r\n\r\n XNumber.prototype.mod = function (r) {\r\n return new XNumber(this.num % r.num);\r\n };\r\n\r\n // XBoolean //////////////////////////////////////////////////////////////////\r\n\r\n XBoolean.prototype = new Expression();\r\n XBoolean.prototype.constructor = XBoolean;\r\n XBoolean.superclass = Expression.prototype;\r\n\r\n function XBoolean(b) {\r\n if (arguments.length > 0) {\r\n this.init(b);\r\n }\r\n }\r\n\r\n XBoolean.prototype.init = function (b) {\r\n this.b = Boolean(b);\r\n };\r\n\r\n XBoolean.prototype.toString = function () {\r\n return this.b.toString();\r\n };\r\n\r\n XBoolean.prototype.evaluate = function (c) {\r\n return this;\r\n };\r\n\r\n XBoolean.prototype.string = function () {\r\n return new XString(this.b);\r\n };\r\n\r\n XBoolean.prototype.number = function () {\r\n return new XNumber(this.b);\r\n };\r\n\r\n XBoolean.prototype.bool = function () {\r\n return this;\r\n };\r\n\r\n XBoolean.prototype.nodeset = function () {\r\n throw new Error(\"Cannot convert boolean to nodeset\");\r\n };\r\n\r\n XBoolean.prototype.stringValue = function () {\r\n return this.string().stringValue();\r\n };\r\n\r\n XBoolean.prototype.numberValue = function () {\r\n return this.number().numberValue();\r\n };\r\n\r\n XBoolean.prototype.booleanValue = function () {\r\n return this.b;\r\n };\r\n\r\n XBoolean.prototype.not = function () {\r\n return new XBoolean(!this.b);\r\n };\r\n\r\n XBoolean.prototype.equals = function (r) {\r\n if (Utilities.instance_of(r, XString) || Utilities.instance_of(r, XNumber)) {\r\n return this.equals(r.bool());\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithBoolean(this, Operators.equals);\r\n }\r\n return new XBoolean(this.b == r.b);\r\n };\r\n\r\n XBoolean.prototype.notequal = function (r) {\r\n if (Utilities.instance_of(r, XString) || Utilities.instance_of(r, XNumber)) {\r\n return this.notequal(r.bool());\r\n }\r\n if (Utilities.instance_of(r, XNodeSet)) {\r\n return r.compareWithBoolean(this, Operators.notequal);\r\n }\r\n return new XBoolean(this.b != r.b);\r\n };\r\n\r\n XBoolean.prototype.lessthan = function (r) {\r\n return this.number().lessthan(r);\r\n };\r\n\r\n XBoolean.prototype.greaterthan = function (r) {\r\n return this.number().greaterthan(r);\r\n };\r\n\r\n XBoolean.prototype.lessthanorequal = function (r) {\r\n return this.number().lessthanorequal(r);\r\n };\r\n\r\n XBoolean.prototype.greaterthanorequal = function (r) {\r\n return this.number().greaterthanorequal(r);\r\n };\r\n\r\n XBoolean.true_ = new XBoolean(true);\r\n XBoolean.false_ = new XBoolean(false);\r\n\r\n // AVLTree ///////////////////////////////////////////////////////////////////\r\n\r\n AVLTree.prototype = new Object();\r\n AVLTree.prototype.constructor = AVLTree;\r\n AVLTree.superclass = Object.prototype;\r\n\r\n function AVLTree(n) {\r\n this.init(n);\r\n }\r\n\r\n AVLTree.prototype.init = function (n) {\r\n this.left = null;\r\n this.right = null;\r\n this.node = n;\r\n this.depth = 1;\r\n };\r\n\r\n AVLTree.prototype.balance = function () {\r\n var ldepth = this.left == null ? 0 : this.left.depth;\r\n var rdepth = this.right == null ? 0 : this.right.depth;\r\n\r\n if (ldepth > rdepth + 1) {\r\n // LR or LL rotation\r\n var lldepth = this.left.left == null ? 0 : this.left.left.depth;\r\n var lrdepth = this.left.right == null ? 0 : this.left.right.depth;\r\n\r\n if (lldepth < lrdepth) {\r\n // LR rotation consists of a RR rotation of the left child\r\n this.left.rotateRR();\r\n // plus a LL rotation of this node, which happens anyway\r\n }\r\n this.rotateLL();\r\n } else if (ldepth + 1 < rdepth) {\r\n // RR or RL rorarion\r\n var rrdepth = this.right.right == null ? 0 : this.right.right.depth;\r\n var rldepth = this.right.left == null ? 0 : this.right.left.depth;\r\n\r\n if (rldepth > rrdepth) {\r\n // RR rotation consists of a LL rotation of the right child\r\n this.right.rotateLL();\r\n // plus a RR rotation of this node, which happens anyway\r\n }\r\n this.rotateRR();\r\n }\r\n };\r\n\r\n AVLTree.prototype.rotateLL = function () {\r\n // the left side is too long => rotate from the left (_not_ leftwards)\r\n var nodeBefore = this.node;\r\n var rightBefore = this.right;\r\n this.node = this.left.node;\r\n this.right = this.left;\r\n this.left = this.left.left;\r\n this.right.left = this.right.right;\r\n this.right.right = rightBefore;\r\n this.right.node = nodeBefore;\r\n this.right.updateInNewLocation();\r\n this.updateInNewLocation();\r\n };\r\n\r\n AVLTree.prototype.rotateRR = function () {\r\n // the right side is too long => rotate from the right (_not_ rightwards)\r\n var nodeBefore = this.node;\r\n var leftBefore = this.left;\r\n this.node = this.right.node;\r\n this.left = this.right;\r\n this.right = this.right.right;\r\n this.left.right = this.left.left;\r\n this.left.left = leftBefore;\r\n this.left.node = nodeBefore;\r\n this.left.updateInNewLocation();\r\n this.updateInNewLocation();\r\n };\r\n\r\n AVLTree.prototype.updateInNewLocation = function () {\r\n this.getDepthFromChildren();\r\n };\r\n\r\n AVLTree.prototype.getDepthFromChildren = function () {\r\n this.depth = this.node == null ? 0 : 1;\r\n if (this.left != null) {\r\n this.depth = this.left.depth + 1;\r\n }\r\n if (this.right != null && this.depth <= this.right.depth) {\r\n this.depth = this.right.depth + 1;\r\n }\r\n };\r\n\r\n function nodeOrder(n1, n2) {\r\n if (n1 === n2) {\r\n return 0;\r\n }\r\n\r\n if (n1.compareDocumentPosition) {\r\n var cpos = n1.compareDocumentPosition(n2);\r\n\r\n if (cpos & 0x01) {\r\n // not in the same document; return an arbitrary result (is there a better way to do this)\r\n return 1;\r\n }\r\n if (cpos & 0x0A) {\r\n // n2 precedes or contains n1\r\n return 1;\r\n }\r\n if (cpos & 0x14) {\r\n // n2 follows or is contained by n1\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n var d1 = 0,\r\n d2 = 0;\r\n for (var m1 = n1; m1 != null; m1 = m1.parentNode || m1.ownerElement) {\r\n d1++;\r\n }\r\n for (var m2 = n2; m2 != null; m2 = m2.parentNode || m2.ownerElement) {\r\n d2++;\r\n }\r\n\r\n // step up to same depth\r\n if (d1 > d2) {\r\n while (d1 > d2) {\r\n n1 = n1.parentNode || n1.ownerElement;\r\n d1--;\r\n }\r\n if (n1 === n2) {\r\n return 1;\r\n }\r\n } else if (d2 > d1) {\r\n while (d2 > d1) {\r\n n2 = n2.parentNode || n2.ownerElement;\r\n d2--;\r\n }\r\n if (n1 === n2) {\r\n return -1;\r\n }\r\n }\r\n\r\n var n1Par = n1.parentNode || n1.ownerElement,\r\n n2Par = n2.parentNode || n2.ownerElement;\r\n\r\n // find common parent\r\n while (n1Par !== n2Par) {\r\n n1 = n1Par;\r\n n2 = n2Par;\r\n n1Par = n1.parentNode || n1.ownerElement;\r\n n2Par = n2.parentNode || n2.ownerElement;\r\n }\r\n\r\n var n1isAttr = isAttributeLike(n1);\r\n var n2isAttr = isAttributeLike(n2);\r\n\r\n if (n1isAttr && !n2isAttr) {\r\n return -1;\r\n }\r\n if (!n1isAttr && n2isAttr) {\r\n return 1;\r\n }\r\n\r\n // xml namespace node comes before others. namespace nodes before non-namespace nodes\r\n if (n1.isXPathNamespace) {\r\n if (n1.nodeValue === XPath.XML_NAMESPACE_URI) {\r\n return -1;\r\n }\r\n\r\n if (!n2.isXPathNamespace) {\r\n return -1;\r\n }\r\n\r\n if (n2.nodeValue === XPath.XML_NAMESPACE_URI) {\r\n return 1;\r\n }\r\n } else if (n2.isXPathNamespace) {\r\n return 1;\r\n }\r\n\r\n if (n1Par) {\r\n var cn = n1isAttr ? n1Par.attributes : n1Par.childNodes;\r\n var len = cn.length;\r\n var n1Compare = n1.baseNode || n1;\r\n var n2Compare = n2.baseNode || n2;\r\n\r\n for (var i = 0; i < len; i += 1) {\r\n var n = cn[i];\r\n if (n === n1Compare) {\r\n return -1;\r\n }\r\n if (n === n2Compare) {\r\n return 1;\r\n }\r\n }\r\n }\r\n\r\n throw new Error('Unexpected: could not determine node order');\r\n }\r\n\r\n AVLTree.prototype.add = function (n) {\r\n if (n === this.node) {\r\n return false;\r\n }\r\n\r\n var o = nodeOrder(n, this.node);\r\n\r\n var ret = false;\r\n if (o == -1) {\r\n if (this.left == null) {\r\n this.left = new AVLTree(n);\r\n ret = true;\r\n } else {\r\n ret = this.left.add(n);\r\n if (ret) {\r\n this.balance();\r\n }\r\n }\r\n } else if (o == 1) {\r\n if (this.right == null) {\r\n this.right = new AVLTree(n);\r\n ret = true;\r\n } else {\r\n ret = this.right.add(n);\r\n if (ret) {\r\n this.balance();\r\n }\r\n }\r\n }\r\n\r\n if (ret) {\r\n this.getDepthFromChildren();\r\n }\r\n return ret;\r\n };\r\n\r\n // XNodeSet //////////////////////////////////////////////////////////////////\r\n\r\n XNodeSet.prototype = new Expression();\r\n XNodeSet.prototype.constructor = XNodeSet;\r\n XNodeSet.superclass = Expression.prototype;\r\n\r\n function XNodeSet() {\r\n this.init();\r\n }\r\n\r\n XNodeSet.prototype.init = function () {\r\n this.tree = null;\r\n this.nodes = [];\r\n this.size = 0;\r\n };\r\n\r\n XNodeSet.prototype.toString = function () {\r\n var p = this.first();\r\n if (p == null) {\r\n return \"\";\r\n }\r\n return this.stringForNode(p);\r\n };\r\n\r\n XNodeSet.prototype.evaluate = function (c) {\r\n return this;\r\n };\r\n\r\n XNodeSet.prototype.string = function () {\r\n return new XString(this.toString());\r\n };\r\n\r\n XNodeSet.prototype.stringValue = function () {\r\n return this.toString();\r\n };\r\n\r\n XNodeSet.prototype.number = function () {\r\n return new XNumber(this.string());\r\n };\r\n\r\n XNodeSet.prototype.numberValue = function () {\r\n return Number(this.string());\r\n };\r\n\r\n XNodeSet.prototype.bool = function () {\r\n return new XBoolean(this.booleanValue());\r\n };\r\n\r\n XNodeSet.prototype.booleanValue = function () {\r\n return !!this.size;\r\n };\r\n\r\n XNodeSet.prototype.nodeset = function () {\r\n return this;\r\n };\r\n\r\n XNodeSet.prototype.stringForNode = function (n) {\r\n if (n.nodeType == NodeTypes.DOCUMENT_NODE ||\r\n n.nodeType == NodeTypes.ELEMENT_NODE ||\r\n n.nodeType === NodeTypes.DOCUMENT_FRAGMENT_NODE) {\r\n return this.stringForContainerNode(n);\r\n }\r\n if (n.nodeType === NodeTypes.ATTRIBUTE_NODE) {\r\n return n.value || n.nodeValue;\r\n }\r\n if (n.isNamespaceNode) {\r\n return n.namespace;\r\n }\r\n return n.nodeValue;\r\n };\r\n\r\n XNodeSet.prototype.stringForContainerNode = function (n) {\r\n var s = \"\";\r\n for (var n2 = n.firstChild; n2 != null; n2 = n2.nextSibling) {\r\n var nt = n2.nodeType;\r\n // Element, Text, CDATA, Document, Document Fragment\r\n if (nt === 1 || nt === 3 || nt === 4 || nt === 9 || nt === 11) {\r\n s += this.stringForNode(n2);\r\n }\r\n }\r\n return s;\r\n };\r\n\r\n XNodeSet.prototype.buildTree = function () {\r\n if (!this.tree && this.nodes.length) {\r\n this.tree = new AVLTree(this.nodes[0]);\r\n for (var i = 1; i < this.nodes.length; i += 1) {\r\n this.tree.add(this.nodes[i]);\r\n }\r\n }\r\n\r\n return this.tree;\r\n };\r\n\r\n XNodeSet.prototype.first = function () {\r\n var p = this.buildTree();\r\n if (p == null) {\r\n return null;\r\n }\r\n while (p.left != null) {\r\n p = p.left;\r\n }\r\n return p.node;\r\n };\r\n\r\n XNodeSet.prototype.add = function (n) {\r\n for (var i = 0; i < this.nodes.length; i += 1) {\r\n if (n === this.nodes[i]) {\r\n return;\r\n }\r\n }\r\n\r\n this.tree = null;\r\n this.nodes.push(n);\r\n this.size += 1;\r\n };\r\n\r\n XNodeSet.prototype.addArray = function (ns) {\r\n var self = this;\r\n\r\n forEach(function (x) { self.add(x); }, ns);\r\n };\r\n\r\n /**\r\n * Returns an array of the node set's contents in document order\r\n */\r\n XNodeSet.prototype.toArray = function () {\r\n var a = [];\r\n this.toArrayRec(this.buildTree(), a);\r\n return a;\r\n };\r\n\r\n XNodeSet.prototype.toArrayRec = function (t, a) {\r\n if (t != null) {\r\n this.toArrayRec(t.left, a);\r\n a.push(t.node);\r\n this.toArrayRec(t.right, a);\r\n }\r\n };\r\n\r\n /**\r\n * Returns an array of the node set's contents in arbitrary order\r\n */\r\n XNodeSet.prototype.toUnsortedArray = function () {\r\n return this.nodes.slice();\r\n };\r\n\r\n XNodeSet.prototype.compareWithString = function (r, o) {\r\n var a = this.toUnsortedArray();\r\n for (var i = 0; i < a.length; i++) {\r\n var n = a[i];\r\n var l = new XString(this.stringForNode(n));\r\n var res = o(l, r);\r\n if (res.booleanValue()) {\r\n return res;\r\n }\r\n }\r\n return new XBoolean(false);\r\n };\r\n\r\n XNodeSet.prototype.compareWithNumber = function (r, o) {\r\n var a = this.toUnsortedArray();\r\n for (var i = 0; i < a.length; i++) {\r\n var n = a[i];\r\n var l = new XNumber(this.stringForNode(n));\r\n var res = o(l, r);\r\n if (res.booleanValue()) {\r\n return res;\r\n }\r\n }\r\n return new XBoolean(false);\r\n };\r\n\r\n XNodeSet.prototype.compareWithBoolean = function (r, o) {\r\n return o(this.bool(), r);\r\n };\r\n\r\n XNodeSet.prototype.compareWithNodeSet = function (r, o) {\r\n var arr = this.toUnsortedArray();\r\n var oInvert = function (lop, rop) { return o(rop, lop); };\r\n\r\n for (var i = 0; i < arr.length; i++) {\r\n var l = new XString(this.stringForNode(arr[i]));\r\n\r\n var res = r.compareWithString(l, oInvert);\r\n if (res.booleanValue()) {\r\n return res;\r\n }\r\n }\r\n\r\n return new XBoolean(false);\r\n };\r\n\r\n XNodeSet.compareWith = curry(function (o, r) {\r\n if (Utilities.instance_of(r, XString)) {\r\n return this.compareWithString(r, o);\r\n }\r\n if (Utilities.instance_of(r, XNumber)) {\r\n return this.compareWithNumber(r, o);\r\n }\r\n if (Utilities.instance_of(r, XBoolean)) {\r\n return this.compareWithBoolean(r, o);\r\n }\r\n return this.compareWithNodeSet(r, o);\r\n });\r\n\r\n XNodeSet.prototype.equals = XNodeSet.compareWith(Operators.equals);\r\n XNodeSet.prototype.notequal = XNodeSet.compareWith(Operators.notequal);\r\n XNodeSet.prototype.lessthan = XNodeSet.compareWith(Operators.lessthan);\r\n XNodeSet.prototype.greaterthan = XNodeSet.compareWith(Operators.greaterthan);\r\n XNodeSet.prototype.lessthanorequal = XNodeSet.compareWith(Operators.lessthanorequal);\r\n XNodeSet.prototype.greaterthanorequal = XNodeSet.compareWith(Operators.greaterthanorequal);\r\n\r\n XNodeSet.prototype.union = function (r) {\r\n var ns = new XNodeSet();\r\n ns.addArray(this.toUnsortedArray());\r\n ns.addArray(r.toUnsortedArray());\r\n return ns;\r\n };\r\n\r\n // XPathNamespace ////////////////////////////////////////////////////////////\r\n\r\n XPathNamespace.prototype = new Object();\r\n XPathNamespace.prototype.constructor = XPathNamespace;\r\n XPathNamespace.superclass = Object.prototype;\r\n\r\n function XPathNamespace(pre, node, uri, p) {\r\n this.isXPathNamespace = true;\r\n this.baseNode = node;\r\n this.ownerDocument = p.ownerDocument;\r\n this.nodeName = pre;\r\n this.prefix = pre;\r\n this.localName = pre;\r\n this.namespaceURI = null;\r\n this.nodeValue = uri;\r\n this.ownerElement = p;\r\n this.nodeType = NodeTypes.NAMESPACE_NODE;\r\n }\r\n\r\n XPathNamespace.prototype.toString = function () {\r\n return \"{ \\\"\" + this.prefix + \"\\\", \\\"\" + this.namespaceURI + \"\\\" }\";\r\n };\r\n\r\n // XPathContext //////////////////////////////////////////////////////////////\r\n\r\n XPathContext.prototype = new Object();\r\n XPathContext.prototype.constructor = XPathContext;\r\n XPathContext.superclass = Object.prototype;\r\n\r\n function XPathContext(vr, nr, fr) {\r\n this.variableResolver = vr != null ? vr : new VariableResolver();\r\n this.namespaceResolver = nr != null ? nr : new NamespaceResolver();\r\n this.functionResolver = fr != null ? fr : new FunctionResolver();\r\n }\r\n\r\n XPathContext.prototype.extend = function (newProps) {\r\n return assign(new XPathContext(), this, newProps);\r\n };\r\n\r\n // VariableResolver //////////////////////////////////////////////////////////\r\n\r\n VariableResolver.prototype = new Object();\r\n VariableResolver.prototype.constructor = VariableResolver;\r\n VariableResolver.superclass = Object.prototype;\r\n\r\n function VariableResolver() {\r\n }\r\n\r\n VariableResolver.prototype.getVariable = function (ln, ns) {\r\n return null;\r\n };\r\n\r\n // FunctionResolver //////////////////////////////////////////////////////////\r\n\r\n FunctionResolver.prototype = new Object();\r\n FunctionResolver.prototype.constructor = FunctionResolver;\r\n FunctionResolver.superclass = Object.prototype;\r\n\r\n function FunctionResolver(thisArg) {\r\n this.thisArg = thisArg != null ? thisArg : Functions;\r\n this.functions = new Object();\r\n this.addStandardFunctions();\r\n }\r\n\r\n FunctionResolver.prototype.addStandardFunctions = function () {\r\n this.functions[\"{}last\"] = Functions.last;\r\n this.functions[\"{}position\"] = Functions.position;\r\n this.functions[\"{}count\"] = Functions.count;\r\n this.functions[\"{}id\"] = Functions.id;\r\n this.functions[\"{}local-name\"] = Functions.localName;\r\n this.functions[\"{}namespace-uri\"] = Functions.namespaceURI;\r\n this.functions[\"{}name\"] = Functions.name;\r\n this.functions[\"{}string\"] = Functions.string;\r\n this.functions[\"{}concat\"] = Functions.concat;\r\n this.functions[\"{}starts-with\"] = Functions.startsWith;\r\n this.functions[\"{}contains\"] = Functions.contains;\r\n this.functions[\"{}substring-before\"] = Functions.substringBefore;\r\n this.functions[\"{}substring-after\"] = Functions.substringAfter;\r\n this.functions[\"{}substring\"] = Functions.substring;\r\n this.functions[\"{}string-length\"] = Functions.stringLength;\r\n this.functions[\"{}normalize-space\"] = Functions.normalizeSpace;\r\n this.functions[\"{}translate\"] = Functions.translate;\r\n this.functions[\"{}boolean\"] = Functions.boolean_;\r\n this.functions[\"{}not\"] = Functions.not;\r\n this.functions[\"{}true\"] = Functions.true_;\r\n this.functions[\"{}false\"] = Functions.false_;\r\n this.functions[\"{}lang\"] = Functions.lang;\r\n this.functions[\"{}number\"] = Functions.number;\r\n this.functions[\"{}sum\"] = Functions.sum;\r\n this.functions[\"{}floor\"] = Functions.floor;\r\n this.functions[\"{}ceiling\"] = Functions.ceiling;\r\n this.functions[\"{}round\"] = Functions.round;\r\n };\r\n\r\n FunctionResolver.prototype.addFunction = function (ns, ln, f) {\r\n this.functions[\"{\" + ns + \"}\" + ln] = f;\r\n };\r\n\r\n FunctionResolver.getFunctionFromContext = function (qName, context) {\r\n var parts = Utilities.resolveQName(qName, context.namespaceResolver, context.contextNode, false);\r\n\r\n if (parts[0] === null) {\r\n throw new Error(\"Cannot resolve QName \" + name);\r\n }\r\n\r\n return context.functionResolver.getFunction(parts[1], parts[0]);\r\n };\r\n\r\n FunctionResolver.prototype.getFunction = function (localName, namespace) {\r\n return this.functions[\"{\" + namespace + \"}\" + localName];\r\n };\r\n\r\n // NamespaceResolver /////////////////////////////////////////////////////////\r\n\r\n NamespaceResolver.prototype = new Object();\r\n NamespaceResolver.prototype.constructor = NamespaceResolver;\r\n NamespaceResolver.superclass = Object.prototype;\r\n\r\n function NamespaceResolver() {\r\n }\r\n\r\n NamespaceResolver.prototype.getNamespace = function (prefix, n) {\r\n if (prefix == \"xml\") {\r\n return XPath.XML_NAMESPACE_URI;\r\n } else if (prefix == \"xmlns\") {\r\n return XPath.XMLNS_NAMESPACE_URI;\r\n }\r\n if (n.nodeType == NodeTypes.DOCUMENT_NODE) {\r\n n = n.documentElement;\r\n } else if (n.nodeType == NodeTypes.ATTRIBUTE_NODE) {\r\n n = PathExpr.getOwnerElement(n);\r\n } else if (n.nodeType != NodeTypes.ELEMENT_NODE) {\r\n n = n.parentNode;\r\n }\r\n while (n != null && n.nodeType == NodeTypes.ELEMENT_NODE) {\r\n var nnm = n.attributes;\r\n for (var i = 0; i < nnm.length; i++) {\r\n var a = nnm.item(i);\r\n var aname = a.name || a.nodeName;\r\n if ((aname === \"xmlns\" && prefix === \"\")\r\n || aname === \"xmlns:\" + prefix) {\r\n return String(a.value || a.nodeValue);\r\n }\r\n }\r\n n = n.parentNode;\r\n }\r\n return null;\r\n };\r\n\r\n // Functions /////////////////////////////////////////////////////////////////\r\n\r\n var Functions = new Object();\r\n\r\n Functions.last = function (c) {\r\n if (arguments.length != 1) {\r\n throw new Error(\"Function last expects ()\");\r\n }\r\n\r\n return new XNumber(c.contextSize);\r\n };\r\n\r\n Functions.position = function (c) {\r\n if (arguments.length != 1) {\r\n throw new Error(\"Function position expects ()\");\r\n }\r\n\r\n return new XNumber(c.contextPosition);\r\n };\r\n\r\n Functions.count = function () {\r\n var c = arguments[0];\r\n var ns;\r\n if (arguments.length != 2 || !Utilities.instance_of(ns = arguments[1].evaluate(c), XNodeSet)) {\r\n throw new Error(\"Function count expects (node-set)\");\r\n }\r\n return new XNumber(ns.size);\r\n };\r\n\r\n Functions.id = function () {\r\n var c = arguments[0];\r\n var id;\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function id expects (object)\");\r\n }\r\n id = arguments[1].evaluate(c);\r\n if (Utilities.instance_of(id, XNodeSet)) {\r\n id = id.toArray().join(\" \");\r\n } else {\r\n id = id.stringValue();\r\n }\r\n var ids = id.split(/[\\x0d\\x0a\\x09\\x20]+/);\r\n var count = 0;\r\n var ns = new XNodeSet();\r\n var doc = c.contextNode.nodeType == NodeTypes.DOCUMENT_NODE\r\n ? c.contextNode\r\n : c.contextNode.ownerDocument;\r\n for (var i = 0; i < ids.length; i++) {\r\n var n;\r\n if (doc.getElementById) {\r\n n = doc.getElementById(ids[i]);\r\n } else {\r\n n = Utilities.getElementById(doc, ids[i]);\r\n }\r\n if (n != null) {\r\n ns.add(n);\r\n count++;\r\n }\r\n }\r\n return ns;\r\n };\r\n\r\n Functions.localName = function (c, eNode) {\r\n var n;\r\n\r\n if (arguments.length == 1) {\r\n n = c.contextNode;\r\n } else if (arguments.length == 2) {\r\n n = eNode.evaluate(c).first();\r\n } else {\r\n throw new Error(\"Function local-name expects (node-set?)\");\r\n }\r\n\r\n if (n == null) {\r\n return new XString(\"\");\r\n }\r\n\r\n return new XString(\r\n n.localName || // standard elements and attributes\r\n n.baseName || // IE\r\n n.target || // processing instructions\r\n n.nodeName || // DOM1 elements\r\n \"\" // fallback\r\n );\r\n };\r\n\r\n Functions.namespaceURI = function () {\r\n var c = arguments[0];\r\n var n;\r\n\r\n if (arguments.length == 1) {\r\n n = c.contextNode;\r\n } else if (arguments.length == 2) {\r\n n = arguments[1].evaluate(c).first();\r\n } else {\r\n throw new Error(\"Function namespace-uri expects (node-set?)\");\r\n }\r\n\r\n if (n == null) {\r\n return new XString(\"\");\r\n }\r\n return new XString(n.namespaceURI || '');\r\n };\r\n\r\n Functions.name = function () {\r\n var c = arguments[0];\r\n var n;\r\n if (arguments.length == 1) {\r\n n = c.contextNode;\r\n } else if (arguments.length == 2) {\r\n n = arguments[1].evaluate(c).first();\r\n } else {\r\n throw new Error(\"Function name expects (node-set?)\");\r\n }\r\n if (n == null) {\r\n return new XString(\"\");\r\n }\r\n if (n.nodeType == NodeTypes.ELEMENT_NODE) {\r\n return new XString(n.nodeName);\r\n } else if (n.nodeType == NodeTypes.ATTRIBUTE_NODE) {\r\n return new XString(n.name || n.nodeName);\r\n } else if (n.nodeType === NodeTypes.PROCESSING_INSTRUCTION_NODE) {\r\n return new XString(n.target || n.nodeName);\r\n } else if (n.localName == null) {\r\n return new XString(\"\");\r\n } else {\r\n return new XString(n.localName);\r\n }\r\n };\r\n\r\n Functions.string = function () {\r\n var c = arguments[0];\r\n if (arguments.length == 1) {\r\n return new XString(XNodeSet.prototype.stringForNode(c.contextNode));\r\n } else if (arguments.length == 2) {\r\n return arguments[1].evaluate(c).string();\r\n }\r\n throw new Error(\"Function string expects (object?)\");\r\n };\r\n\r\n Functions.concat = function (c) {\r\n if (arguments.length < 3) {\r\n throw new Error(\"Function concat expects (string, string[, string]*)\");\r\n }\r\n var s = \"\";\r\n for (var i = 1; i < arguments.length; i++) {\r\n s += arguments[i].evaluate(c).stringValue();\r\n }\r\n return new XString(s);\r\n };\r\n\r\n Functions.startsWith = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 3) {\r\n throw new Error(\"Function startsWith expects (string, string)\");\r\n }\r\n var s1 = arguments[1].evaluate(c).stringValue();\r\n var s2 = arguments[2].evaluate(c).stringValue();\r\n return new XBoolean(s1.substring(0, s2.length) == s2);\r\n };\r\n\r\n Functions.contains = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 3) {\r\n throw new Error(\"Function contains expects (string, string)\");\r\n }\r\n var s1 = arguments[1].evaluate(c).stringValue();\r\n var s2 = arguments[2].evaluate(c).stringValue();\r\n return new XBoolean(s1.indexOf(s2) !== -1);\r\n };\r\n\r\n Functions.substringBefore = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 3) {\r\n throw new Error(\"Function substring-before expects (string, string)\");\r\n }\r\n var s1 = arguments[1].evaluate(c).stringValue();\r\n var s2 = arguments[2].evaluate(c).stringValue();\r\n return new XString(s1.substring(0, s1.indexOf(s2)));\r\n };\r\n\r\n Functions.substringAfter = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 3) {\r\n throw new Error(\"Function substring-after expects (string, string)\");\r\n }\r\n var s1 = arguments[1].evaluate(c).stringValue();\r\n var s2 = arguments[2].evaluate(c).stringValue();\r\n if (s2.length == 0) {\r\n return new XString(s1);\r\n }\r\n var i = s1.indexOf(s2);\r\n if (i == -1) {\r\n return new XString(\"\");\r\n }\r\n return new XString(s1.substring(i + s2.length));\r\n };\r\n\r\n Functions.substring = function () {\r\n var c = arguments[0];\r\n if (!(arguments.length == 3 || arguments.length == 4)) {\r\n throw new Error(\"Function substring expects (string, number, number?)\");\r\n }\r\n var s = arguments[1].evaluate(c).stringValue();\r\n var n1 = Math.round(arguments[2].evaluate(c).numberValue()) - 1;\r\n var n2 = arguments.length == 4 ? n1 + Math.round(arguments[3].evaluate(c).numberValue()) : undefined;\r\n return new XString(s.substring(n1, n2));\r\n };\r\n\r\n Functions.stringLength = function () {\r\n var c = arguments[0];\r\n var s;\r\n if (arguments.length == 1) {\r\n s = XNodeSet.prototype.stringForNode(c.contextNode);\r\n } else if (arguments.length == 2) {\r\n s = arguments[1].evaluate(c).stringValue();\r\n } else {\r\n throw new Error(\"Function string-length expects (string?)\");\r\n }\r\n return new XNumber(s.length);\r\n };\r\n\r\n Functions.normalizeSpace = function () {\r\n var c = arguments[0];\r\n var s;\r\n if (arguments.length == 1) {\r\n s = XNodeSet.prototype.stringForNode(c.contextNode);\r\n } else if (arguments.length == 2) {\r\n s = arguments[1].evaluate(c).stringValue();\r\n } else {\r\n throw new Error(\"Function normalize-space expects (string?)\");\r\n }\r\n var i = 0;\r\n var j = s.length - 1;\r\n while (Utilities.isSpace(s.charCodeAt(j))) {\r\n j--;\r\n }\r\n var t = \"\";\r\n while (i <= j && Utilities.isSpace(s.charCodeAt(i))) {\r\n i++;\r\n }\r\n while (i <= j) {\r\n if (Utilities.isSpace(s.charCodeAt(i))) {\r\n t += \" \";\r\n while (i <= j && Utilities.isSpace(s.charCodeAt(i))) {\r\n i++;\r\n }\r\n } else {\r\n t += s.charAt(i);\r\n i++;\r\n }\r\n }\r\n return new XString(t);\r\n };\r\n\r\n Functions.translate = function (c, eValue, eFrom, eTo) {\r\n if (arguments.length != 4) {\r\n throw new Error(\"Function translate expects (string, string, string)\");\r\n }\r\n\r\n var value = eValue.evaluate(c).stringValue();\r\n var from = eFrom.evaluate(c).stringValue();\r\n var to = eTo.evaluate(c).stringValue();\r\n\r\n var cMap = reduce(function (acc, ch, i) {\r\n if (!(ch in acc)) {\r\n acc[ch] = i > to.length ? '' : to[i];\r\n }\r\n return acc;\r\n }, {}, from);\r\n\r\n var t = join(\r\n '',\r\n map(function (ch) {\r\n return ch in cMap ? cMap[ch] : ch;\r\n }, value)\r\n );\r\n\r\n return new XString(t);\r\n };\r\n\r\n Functions.boolean_ = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function boolean expects (object)\");\r\n }\r\n return arguments[1].evaluate(c).bool();\r\n };\r\n\r\n Functions.not = function (c, eValue) {\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function not expects (object)\");\r\n }\r\n return eValue.evaluate(c).bool().not();\r\n };\r\n\r\n Functions.true_ = function () {\r\n if (arguments.length != 1) {\r\n throw new Error(\"Function true expects ()\");\r\n }\r\n return XBoolean.true_;\r\n };\r\n\r\n Functions.false_ = function () {\r\n if (arguments.length != 1) {\r\n throw new Error(\"Function false expects ()\");\r\n }\r\n return XBoolean.false_;\r\n };\r\n\r\n Functions.lang = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function lang expects (string)\");\r\n }\r\n var lang;\r\n for (var n = c.contextNode; n != null && n.nodeType != NodeTypes.DOCUMENT_NODE; n = n.parentNode) {\r\n var a = n.getAttributeNS(XPath.XML_NAMESPACE_URI, \"lang\");\r\n if (a != null) {\r\n lang = String(a);\r\n break;\r\n }\r\n }\r\n if (lang == null) {\r\n return XBoolean.false_;\r\n }\r\n var s = arguments[1].evaluate(c).stringValue();\r\n return new XBoolean(lang.substring(0, s.length) == s\r\n && (lang.length == s.length || lang.charAt(s.length) == '-'));\r\n };\r\n\r\n Functions.number = function () {\r\n var c = arguments[0];\r\n if (!(arguments.length == 1 || arguments.length == 2)) {\r\n throw new Error(\"Function number expects (object?)\");\r\n }\r\n if (arguments.length == 1) {\r\n return new XNumber(XNodeSet.prototype.stringForNode(c.contextNode));\r\n }\r\n return arguments[1].evaluate(c).number();\r\n };\r\n\r\n Functions.sum = function () {\r\n var c = arguments[0];\r\n var ns;\r\n if (arguments.length != 2 || !Utilities.instance_of((ns = arguments[1].evaluate(c)), XNodeSet)) {\r\n throw new Error(\"Function sum expects (node-set)\");\r\n }\r\n ns = ns.toUnsortedArray();\r\n var n = 0;\r\n for (var i = 0; i < ns.length; i++) {\r\n n += new XNumber(XNodeSet.prototype.stringForNode(ns[i])).numberValue();\r\n }\r\n return new XNumber(n);\r\n };\r\n\r\n Functions.floor = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function floor expects (number)\");\r\n }\r\n return new XNumber(Math.floor(arguments[1].evaluate(c).numberValue()));\r\n };\r\n\r\n Functions.ceiling = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function ceiling expects (number)\");\r\n }\r\n return new XNumber(Math.ceil(arguments[1].evaluate(c).numberValue()));\r\n };\r\n\r\n Functions.round = function () {\r\n var c = arguments[0];\r\n if (arguments.length != 2) {\r\n throw new Error(\"Function round expects (number)\");\r\n }\r\n return new XNumber(Math.round(arguments[1].evaluate(c).numberValue()));\r\n };\r\n\r\n // Utilities /////////////////////////////////////////////////////////////////\r\n\r\n var Utilities = new Object();\r\n\r\n // Returns true if the node is an attribute node or namespace node\r\n var isAttributeLike = function (val) {\r\n return val && (\r\n val.nodeType === NodeTypes.ATTRIBUTE_NODE ||\r\n val.ownerElement ||\r\n val.isXPathNamespace\r\n );\r\n }\r\n\r\n Utilities.splitQName = function (qn) {\r\n var i = qn.indexOf(\":\");\r\n if (i == -1) {\r\n return [null, qn];\r\n }\r\n return [qn.substring(0, i), qn.substring(i + 1)];\r\n };\r\n\r\n Utilities.resolveQName = function (qn, nr, n, useDefault) {\r\n var parts = Utilities.splitQName(qn);\r\n if (parts[0] != null) {\r\n parts[0] = nr.getNamespace(parts[0], n);\r\n } else {\r\n if (useDefault) {\r\n parts[0] = nr.getNamespace(\"\", n);\r\n if (parts[0] == null) {\r\n parts[0] = \"\";\r\n }\r\n } else {\r\n parts[0] = \"\";\r\n }\r\n }\r\n return parts;\r\n };\r\n\r\n Utilities.isSpace = function (c) {\r\n return c == 0x9 || c == 0xd || c == 0xa || c == 0x20;\r\n };\r\n\r\n Utilities.isLetter = function (c) {\r\n return c >= 0x0041 && c <= 0x005A ||\r\n c >= 0x0061 && c <= 0x007A ||\r\n c >= 0x00C0 && c <= 0x00D6 ||\r\n c >= 0x00D8 && c <= 0x00F6 ||\r\n c >= 0x00F8 && c <= 0x00FF ||\r\n c >= 0x0100 && c <= 0x0131 ||\r\n c >= 0x0134 && c <= 0x013E ||\r\n c >= 0x0141 && c <= 0x0148 ||\r\n c >= 0x014A && c <= 0x017E ||\r\n c >= 0x0180 && c <= 0x01C3 ||\r\n c >= 0x01CD && c <= 0x01F0 ||\r\n c >= 0x01F4 && c <= 0x01F5 ||\r\n c >= 0x01FA && c <= 0x0217 ||\r\n c >= 0x0250 && c <= 0x02A8 ||\r\n c >= 0x02BB && c <= 0x02C1 ||\r\n c == 0x0386 ||\r\n c >= 0x0388 && c <= 0x038A ||\r\n c == 0x038C ||\r\n c >= 0x038E && c <= 0x03A1 ||\r\n c >= 0x03A3 && c <= 0x03CE ||\r\n c >= 0x03D0 && c <= 0x03D6 ||\r\n c == 0x03DA ||\r\n c == 0x03DC ||\r\n c == 0x03DE ||\r\n c == 0x03E0 ||\r\n c >= 0x03E2 && c <= 0x03F3 ||\r\n c >= 0x0401 && c <= 0x040C ||\r\n c >= 0x040E && c <= 0x044F ||\r\n c >= 0x0451 && c <= 0x045C ||\r\n c >= 0x045E && c <= 0x0481 ||\r\n c >= 0x0490 && c <= 0x04C4 ||\r\n c >= 0x04C7 && c <= 0x04C8 ||\r\n c >= 0x04CB && c <= 0x04CC ||\r\n c >= 0x04D0 && c <= 0x04EB ||\r\n c >= 0x04EE && c <= 0x04F5 ||\r\n c >= 0x04F8 && c <= 0x04F9 ||\r\n c >= 0x0531 && c <= 0x0556 ||\r\n c == 0x0559 ||\r\n c >= 0x0561 && c <= 0x0586 ||\r\n c >= 0x05D0 && c <= 0x05EA ||\r\n c >= 0x05F0 && c <= 0x05F2 ||\r\n c >= 0x0621 && c <= 0x063A ||\r\n c >= 0x0641 && c <= 0x064A ||\r\n c >= 0x0671 && c <= 0x06B7 ||\r\n c >= 0x06BA && c <= 0x06BE ||\r\n c >= 0x06C0 && c <= 0x06CE ||\r\n c >= 0x06D0 && c <= 0x06D3 ||\r\n c == 0x06D5 ||\r\n c >= 0x06E5 && c <= 0x06E6 ||\r\n c >= 0x0905 && c <= 0x0939 ||\r\n c == 0x093D ||\r\n c >= 0x0958 && c <= 0x0961 ||\r\n c >= 0x0985 && c <= 0x098C ||\r\n c >= 0x098F && c <= 0x0990 ||\r\n c >= 0x0993 && c <= 0x09A8 ||\r\n c >= 0x09AA && c <= 0x09B0 ||\r\n c == 0x09B2 ||\r\n c >= 0x09B6 && c <= 0x09B9 ||\r\n c >= 0x09DC && c <= 0x09DD ||\r\n c >= 0x09DF && c <= 0x09E1 ||\r\n c >= 0x09F0 && c <= 0x09F1 ||\r\n c >= 0x0A05 && c <= 0x0A0A ||\r\n c >= 0x0A0F && c <= 0x0A10 ||\r\n c >= 0x0A13 && c <= 0x0A28 ||\r\n c >= 0x0A2A && c <= 0x0A30 ||\r\n c >= 0x0A32 && c <= 0x0A33 ||\r\n c >= 0x0A35 && c <= 0x0A36 ||\r\n c >= 0x0A38 && c <= 0x0A39 ||\r\n c >= 0x0A59 && c <= 0x0A5C ||\r\n c == 0x0A5E ||\r\n c >= 0x0A72 && c <= 0x0A74 ||\r\n c >= 0x0A85 && c <= 0x0A8B ||\r\n c == 0x0A8D ||\r\n c >= 0x0A8F && c <= 0x0A91 ||\r\n c >= 0x0A93 && c <= 0x0AA8 ||\r\n c >= 0x0AAA && c <= 0x0AB0 ||\r\n c >= 0x0AB2 && c <= 0x0AB3 ||\r\n c >= 0x0AB5 && c <= 0x0AB9 ||\r\n c == 0x0ABD ||\r\n c == 0x0AE0 ||\r\n c >= 0x0B05 && c <= 0x0B0C ||\r\n c >= 0x0B0F && c <= 0x0B10 ||\r\n c >= 0x0B13 && c <= 0x0B28 ||\r\n c >= 0x0B2A && c <= 0x0B30 ||\r\n c >= 0x0B32 && c <= 0x0B33 ||\r\n c >= 0x0B36 && c <= 0x0B39 ||\r\n c == 0x0B3D ||\r\n c >= 0x0B5C && c <= 0x0B5D ||\r\n c >= 0x0B5F && c <= 0x0B61 ||\r\n c >= 0x0B85 && c <= 0x0B8A ||\r\n c >= 0x0B8E && c <= 0x0B90 ||\r\n c >= 0x0B92 && c <= 0x0B95 ||\r\n c >= 0x0B99 && c <= 0x0B9A ||\r\n c == 0x0B9C ||\r\n c >= 0x0B9E && c <= 0x0B9F ||\r\n c >= 0x0BA3 && c <= 0x0BA4 ||\r\n c >= 0x0BA8 && c <= 0x0BAA ||\r\n c >= 0x0BAE && c <= 0x0BB5 ||\r\n c >= 0x0BB7 && c <= 0x0BB9 ||\r\n c >= 0x0C05 && c <= 0x0C0C ||\r\n c >= 0x0C0E && c <= 0x0C10 ||\r\n c >= 0x0C12 && c <= 0x0C28 ||\r\n c >= 0x0C2A && c <= 0x0C33 ||\r\n c >= 0x0C35 && c <= 0x0C39 ||\r\n c >= 0x0C60 && c <= 0x0C61 ||\r\n c >= 0x0C85 && c <= 0x0C8C ||\r\n c >= 0x0C8E && c <= 0x0C90 ||\r\n c >= 0x0C92 && c <= 0x0CA8 ||\r\n c >= 0x0CAA && c <= 0x0CB3 ||\r\n c >= 0x0CB5 && c <= 0x0CB9 ||\r\n c == 0x0CDE ||\r\n c >= 0x0CE0 && c <= 0x0CE1 ||\r\n c >= 0x0D05 && c <= 0x0D0C ||\r\n c >= 0x0D0E && c <= 0x0D10 ||\r\n c >= 0x0D12 && c <= 0x0D28 ||\r\n c >= 0x0D2A && c <= 0x0D39 ||\r\n c >= 0x0D60 && c <= 0x0D61 ||\r\n c >= 0x0E01 && c <= 0x0E2E ||\r\n c == 0x0E30 ||\r\n c >= 0x0E32 && c <= 0x0E33 ||\r\n c >= 0x0E40 && c <= 0x0E45 ||\r\n c >= 0x0E81 && c <= 0x0E82 ||\r\n c == 0x0E84 ||\r\n c >= 0x0E87 && c <= 0x0E88 ||\r\n c == 0x0E8A ||\r\n c == 0x0E8D ||\r\n c >= 0x0E94 && c <= 0x0E97 ||\r\n c >= 0x0E99 && c <= 0x0E9F ||\r\n c >= 0x0EA1 && c <= 0x0EA3 ||\r\n c == 0x0EA5 ||\r\n c == 0x0EA7 ||\r\n c >= 0x0EAA && c <= 0x0EAB ||\r\n c >= 0x0EAD && c <= 0x0EAE ||\r\n c == 0x0EB0 ||\r\n c >= 0x0EB2 && c <= 0x0EB3 ||\r\n c == 0x0EBD ||\r\n c >= 0x0EC0 && c <= 0x0EC4 ||\r\n c >= 0x0F40 && c <= 0x0F47 ||\r\n c >= 0x0F49 && c <= 0x0F69 ||\r\n c >= 0x10A0 && c <= 0x10C5 ||\r\n c >= 0x10D0 && c <= 0x10F6 ||\r\n c == 0x1100 ||\r\n c >= 0x1102 && c <= 0x1103 ||\r\n c >= 0x1105 && c <= 0x1107 ||\r\n c == 0x1109 ||\r\n c >= 0x110B && c <= 0x110C ||\r\n c >= 0x110E && c <= 0x1112 ||\r\n c == 0x113C ||\r\n c == 0x113E ||\r\n c == 0x1140 ||\r\n c == 0x114C ||\r\n c == 0x114E ||\r\n c == 0x1150 ||\r\n c >= 0x1154 && c <= 0x1155 ||\r\n c == 0x1159 ||\r\n c >= 0x115F && c <= 0x1161 ||\r\n c == 0x1163 ||\r\n c == 0x1165 ||\r\n c == 0x1167 ||\r\n c == 0x1169 ||\r\n c >= 0x116D && c <= 0x116E ||\r\n c >= 0x1172 && c <= 0x1173 ||\r\n c == 0x1175 ||\r\n c == 0x119E ||\r\n c == 0x11A8 ||\r\n c == 0x11AB ||\r\n c >= 0x11AE && c <= 0x11AF ||\r\n c >= 0x11B7 && c <= 0x11B8 ||\r\n c == 0x11BA ||\r\n c >= 0x11BC && c <= 0x11C2 ||\r\n c == 0x11EB ||\r\n c == 0x11F0 ||\r\n c == 0x11F9 ||\r\n c >= 0x1E00 && c <= 0x1E9B ||\r\n c >= 0x1EA0 && c <= 0x1EF9 ||\r\n c >= 0x1F00 && c <= 0x1F15 ||\r\n c >= 0x1F18 && c <= 0x1F1D ||\r\n c >= 0x1F20 && c <= 0x1F45 ||\r\n c >= 0x1F48 && c <= 0x1F4D ||\r\n c >= 0x1F50 && c <= 0x1F57 ||\r\n c == 0x1F59 ||\r\n c == 0x1F5B ||\r\n c == 0x1F5D ||\r\n c >= 0x1F5F && c <= 0x1F7D ||\r\n c >= 0x1F80 && c <= 0x1FB4 ||\r\n c >= 0x1FB6 && c <= 0x1FBC ||\r\n c == 0x1FBE ||\r\n c >= 0x1FC2 && c <= 0x1FC4 ||\r\n c >= 0x1FC6 && c <= 0x1FCC ||\r\n c >= 0x1FD0 && c <= 0x1FD3 ||\r\n c >= 0x1FD6 && c <= 0x1FDB ||\r\n c >= 0x1FE0 && c <= 0x1FEC ||\r\n c >= 0x1FF2 && c <= 0x1FF4 ||\r\n c >= 0x1FF6 && c <= 0x1FFC ||\r\n c == 0x2126 ||\r\n c >= 0x212A && c <= 0x212B ||\r\n c == 0x212E ||\r\n c >= 0x2180 && c <= 0x2182 ||\r\n c >= 0x3041 && c <= 0x3094 ||\r\n c >= 0x30A1 && c <= 0x30FA ||\r\n c >= 0x3105 && c <= 0x312C ||\r\n c >= 0xAC00 && c <= 0xD7A3 ||\r\n c >= 0x4E00 && c <= 0x9FA5 ||\r\n c == 0x3007 ||\r\n c >= 0x3021 && c <= 0x3029;\r\n };\r\n\r\n Utilities.isNCNameChar = function (c) {\r\n return c >= 0x0030 && c <= 0x0039\r\n || c >= 0x0660 && c <= 0x0669\r\n || c >= 0x06F0 && c <= 0x06F9\r\n || c >= 0x0966 && c <= 0x096F\r\n || c >= 0x09E6 && c <= 0x09EF\r\n || c >= 0x0A66 && c <= 0x0A6F\r\n || c >= 0x0AE6 && c <= 0x0AEF\r\n || c >= 0x0B66 && c <= 0x0B6F\r\n || c >= 0x0BE7 && c <= 0x0BEF\r\n || c >= 0x0C66 && c <= 0x0C6F\r\n || c >= 0x0CE6 && c <= 0x0CEF\r\n || c >= 0x0D66 && c <= 0x0D6F\r\n || c >= 0x0E50 && c <= 0x0E59\r\n || c >= 0x0ED0 && c <= 0x0ED9\r\n || c >= 0x0F20 && c <= 0x0F29\r\n || c == 0x002E\r\n || c == 0x002D\r\n || c == 0x005F\r\n || Utilities.isLetter(c)\r\n || c >= 0x0300 && c <= 0x0345\r\n || c >= 0x0360 && c <= 0x0361\r\n || c >= 0x0483 && c <= 0x0486\r\n || c >= 0x0591 && c <= 0x05A1\r\n || c >= 0x05A3 && c <= 0x05B9\r\n || c >= 0x05BB && c <= 0x05BD\r\n || c == 0x05BF\r\n || c >= 0x05C1 && c <= 0x05C2\r\n || c == 0x05C4\r\n || c >= 0x064B && c <= 0x0652\r\n || c == 0x0670\r\n || c >= 0x06D6 && c <= 0x06DC\r\n || c >= 0x06DD && c <= 0x06DF\r\n || c >= 0x06E0 && c <= 0x06E4\r\n || c >= 0x06E7 && c <= 0x06E8\r\n || c >= 0x06EA && c <= 0x06ED\r\n || c >= 0x0901 && c <= 0x0903\r\n || c == 0x093C\r\n || c >= 0x093E && c <= 0x094C\r\n || c == 0x094D\r\n || c >= 0x0951 && c <= 0x0954\r\n || c >= 0x0962 && c <= 0x0963\r\n || c >= 0x0981 && c <= 0x0983\r\n || c == 0x09BC\r\n || c == 0x09BE\r\n || c == 0x09BF\r\n || c >= 0x09C0 && c <= 0x09C4\r\n || c >= 0x09C7 && c <= 0x09C8\r\n || c >= 0x09CB && c <= 0x09CD\r\n || c == 0x09D7\r\n || c >= 0x09E2 && c <= 0x09E3\r\n || c == 0x0A02\r\n || c == 0x0A3C\r\n || c == 0x0A3E\r\n || c == 0x0A3F\r\n || c >= 0x0A40 && c <= 0x0A42\r\n || c >= 0x0A47 && c <= 0x0A48\r\n || c >= 0x0A4B && c <= 0x0A4D\r\n || c >= 0x0A70 && c <= 0x0A71\r\n || c >= 0x0A81 && c <= 0x0A83\r\n || c == 0x0ABC\r\n || c >= 0x0ABE && c <= 0x0AC5\r\n || c >= 0x0AC7 && c <= 0x0AC9\r\n || c >= 0x0ACB && c <= 0x0ACD\r\n || c >= 0x0B01 && c <= 0x0B03\r\n || c == 0x0B3C\r\n || c >= 0x0B3E && c <= 0x0B43\r\n || c >= 0x0B47 && c <= 0x0B48\r\n || c >= 0x0B4B && c <= 0x0B4D\r\n || c >= 0x0B56 && c <= 0x0B57\r\n || c >= 0x0B82 && c <= 0x0B83\r\n || c >= 0x0BBE && c <= 0x0BC2\r\n || c >= 0x0BC6 && c <= 0x0BC8\r\n || c >= 0x0BCA && c <= 0x0BCD\r\n || c == 0x0BD7\r\n || c >= 0x0C01 && c <= 0x0C03\r\n || c >= 0x0C3E && c <= 0x0C44\r\n || c >= 0x0C46 && c <= 0x0C48\r\n || c >= 0x0C4A && c <= 0x0C4D\r\n || c >= 0x0C55 && c <= 0x0C56\r\n || c >= 0x0C82 && c <= 0x0C83\r\n || c >= 0x0CBE && c <= 0x0CC4\r\n || c >= 0x0CC6 && c <= 0x0CC8\r\n || c >= 0x0CCA && c <= 0x0CCD\r\n || c >= 0x0CD5 && c <= 0x0CD6\r\n || c >= 0x0D02 && c <= 0x0D03\r\n || c >= 0x0D3E && c <= 0x0D43\r\n || c >= 0x0D46 && c <= 0x0D48\r\n || c >= 0x0D4A && c <= 0x0D4D\r\n || c == 0x0D57\r\n || c == 0x0E31\r\n || c >= 0x0E34 && c <= 0x0E3A\r\n || c >= 0x0E47 && c <= 0x0E4E\r\n || c == 0x0EB1\r\n || c >= 0x0EB4 && c <= 0x0EB9\r\n || c >= 0x0EBB && c <= 0x0EBC\r\n || c >= 0x0EC8 && c <= 0x0ECD\r\n || c >= 0x0F18 && c <= 0x0F19\r\n || c == 0x0F35\r\n || c == 0x0F37\r\n || c == 0x0F39\r\n || c == 0x0F3E\r\n || c == 0x0F3F\r\n || c >= 0x0F71 && c <= 0x0F84\r\n || c >= 0x0F86 && c <= 0x0F8B\r\n || c >= 0x0F90 && c <= 0x0F95\r\n || c == 0x0F97\r\n || c >= 0x0F99 && c <= 0x0FAD\r\n || c >= 0x0FB1 && c <= 0x0FB7\r\n || c == 0x0FB9\r\n || c >= 0x20D0 && c <= 0x20DC\r\n || c == 0x20E1\r\n || c >= 0x302A && c <= 0x302F\r\n || c == 0x3099\r\n || c == 0x309A\r\n || c == 0x00B7\r\n || c == 0x02D0\r\n || c == 0x02D1\r\n || c == 0x0387\r\n || c == 0x0640\r\n || c == 0x0E46\r\n || c == 0x0EC6\r\n || c == 0x3005\r\n || c >= 0x3031 && c <= 0x3035\r\n || c >= 0x309D && c <= 0x309E\r\n || c >= 0x30FC && c <= 0x30FE;\r\n };\r\n\r\n Utilities.coalesceText = function (n) {\r\n for (var m = n.firstChild; m != null; m = m.nextSibling) {\r\n if (m.nodeType == NodeTypes.TEXT_NODE || m.nodeType == NodeTypes.CDATA_SECTION_NODE) {\r\n var s = m.nodeValue;\r\n var first = m;\r\n m = m.nextSibling;\r\n while (m != null && (m.nodeType == NodeTypes.TEXT_NODE || m.nodeType == NodeTypes.CDATA_SECTION_NODE)) {\r\n s += m.nodeValue;\r\n var del = m;\r\n m = m.nextSibling;\r\n del.parentNode.removeChild(del);\r\n }\r\n if (first.nodeType == NodeTypes.CDATA_SECTION_NODE) {\r\n var p = first.parentNode;\r\n if (first.nextSibling == null) {\r\n p.removeChild(first);\r\n p.appendChild(p.ownerDocument.createTextNode(s));\r\n } else {\r\n var next = first.nextSibling;\r\n p.removeChild(first);\r\n p.insertBefore(p.ownerDocument.createTextNode(s), next);\r\n }\r\n } else {\r\n first.nodeValue = s;\r\n }\r\n if (m == null) {\r\n break;\r\n }\r\n } else if (m.nodeType == NodeTypes.ELEMENT_NODE) {\r\n Utilities.coalesceText(m);\r\n }\r\n }\r\n };\r\n\r\n Utilities.instance_of = function (o, c) {\r\n while (o != null) {\r\n if (o.constructor === c) {\r\n return true;\r\n }\r\n if (o === Object) {\r\n return false;\r\n }\r\n o = o.constructor.superclass;\r\n }\r\n return false;\r\n };\r\n\r\n Utilities.getElementById = function (n, id) {\r\n // Note that this does not check the DTD to check for actual\r\n // attributes of type ID, so this may be a bit wrong.\r\n if (n.nodeType == NodeTypes.ELEMENT_NODE) {\r\n if (n.getAttribute(\"id\") == id\r\n || n.getAttributeNS(null, \"id\") == id) {\r\n return n;\r\n }\r\n }\r\n for (var m = n.firstChild; m != null; m = m.nextSibling) {\r\n var res = Utilities.getElementById(m, id);\r\n if (res != null) {\r\n return res;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n // XPathException ////////////////////////////////////////////////////////////\r\n\r\n var XPathException = (function () {\r\n function getMessage(code, exception) {\r\n var msg = exception ? \": \" + exception.toString() : \"\";\r\n switch (code) {\r\n case XPathException.INVALID_EXPRESSION_ERR:\r\n return \"Invalid expression\" + msg;\r\n case XPathException.TYPE_ERR:\r\n return \"Type error\" + msg;\r\n }\r\n return null;\r\n }\r\n\r\n function XPathException(code, error, message) {\r\n var err = Error.call(this, getMessage(code, error) || message);\r\n\r\n err.code = code;\r\n err.exception = error;\r\n\r\n return err;\r\n }\r\n\r\n XPathException.prototype = Object.create(Error.prototype);\r\n XPathException.prototype.constructor = XPathException;\r\n XPathException.superclass = Error;\r\n\r\n XPathException.prototype.toString = function () {\r\n return this.message;\r\n };\r\n\r\n XPathException.fromMessage = function (message, error) {\r\n return new XPathException(null, error, message);\r\n };\r\n\r\n XPathException.INVALID_EXPRESSION_ERR = 51;\r\n XPathException.TYPE_ERR = 52;\r\n\r\n return XPathException;\r\n })();\r\n\r\n // XPathExpression ///////////////////////////////////////////////////////////\r\n\r\n XPathExpression.prototype = {};\r\n XPathExpression.prototype.constructor = XPathExpression;\r\n XPathExpression.superclass = Object.prototype;\r\n\r\n function XPathExpression(e, r, p) {\r\n this.xpath = p.parse(e);\r\n this.context = new XPathContext();\r\n this.context.namespaceResolver = new XPathNSResolverWrapper(r);\r\n }\r\n\r\n XPathExpression.getOwnerDocument = function (n) {\r\n return n.nodeType === NodeTypes.DOCUMENT_NODE ? n : n.ownerDocument;\r\n }\r\n\r\n XPathExpression.detectHtmlDom = function (n) {\r\n if (!n) { return false; }\r\n\r\n var doc = XPathExpression.getOwnerDocument(n);\r\n\r\n try {\r\n return doc.implementation.hasFeature(\"HTML\", \"2.0\");\r\n } catch (e) {\r\n return true;\r\n }\r\n }\r\n\r\n XPathExpression.prototype.evaluate = function (n, t, res) {\r\n this.context.expressionContextNode = n;\r\n // backward compatibility - no reliable way to detect whether the DOM is HTML, but\r\n // this library has been using this method up until now, so we will continue to use it\r\n // ONLY when using an XPathExpression\r\n this.context.caseInsensitive = XPathExpression.detectHtmlDom(n);\r\n\r\n var result = this.xpath.evaluate(this.context);\r\n\r\n return new XPathResult(result, t);\r\n }\r\n\r\n // XPathNSResolverWrapper ////////////////////////////////////////////////////\r\n\r\n XPathNSResolverWrapper.prototype = {};\r\n XPathNSResolverWrapper.prototype.constructor = XPathNSResolverWrapper;\r\n XPathNSResolverWrapper.superclass = Object.prototype;\r\n\r\n function XPathNSResolverWrapper(r) {\r\n this.xpathNSResolver = r;\r\n }\r\n\r\n XPathNSResolverWrapper.prototype.getNamespace = function (prefix, n) {\r\n if (this.xpathNSResolver == null) {\r\n return null;\r\n }\r\n return this.xpathNSResolver.lookupNamespaceURI(prefix);\r\n };\r\n\r\n // NodeXPathNSResolver ///////////////////////////////////////////////////////\r\n\r\n NodeXPathNSResolver.prototype = {};\r\n NodeXPathNSResolver.prototype.constructor = NodeXPathNSResolver;\r\n NodeXPathNSResolver.superclass = Object.prototype;\r\n\r\n function NodeXPathNSResolver(n) {\r\n this.node = n;\r\n this.namespaceResolver = new NamespaceResolver();\r\n }\r\n\r\n NodeXPathNSResolver.prototype.lookupNamespaceURI = function (prefix) {\r\n return this.namespaceResolver.getNamespace(prefix, this.node);\r\n };\r\n\r\n // XPathResult ///////////////////////////////////////////////////////////////\r\n\r\n XPathResult.prototype = {};\r\n XPathResult.prototype.constructor = XPathResult;\r\n XPathResult.superclass = Object.prototype;\r\n\r\n function XPathResult(v, t) {\r\n if (t == XPathResult.ANY_TYPE) {\r\n if (v.constructor === XString) {\r\n t = XPathResult.STRING_TYPE;\r\n } else if (v.constructor === XNumber) {\r\n t = XPathResult.NUMBER_TYPE;\r\n } else if (v.constructor === XBoolean) {\r\n t = XPathResult.BOOLEAN_TYPE;\r\n } else if (v.constructor === XNodeSet) {\r\n t = XPathResult.UNORDERED_NODE_ITERATOR_TYPE;\r\n }\r\n }\r\n this.resultType = t;\r\n switch (t) {\r\n case XPathResult.NUMBER_TYPE:\r\n this.numberValue = v.numberValue();\r\n return;\r\n case XPathResult.STRING_TYPE:\r\n this.stringValue = v.stringValue();\r\n return;\r\n case XPathResult.BOOLEAN_TYPE:\r\n this.booleanValue = v.booleanValue();\r\n return;\r\n case XPathResult.ANY_UNORDERED_NODE_TYPE:\r\n case XPathResult.FIRST_ORDERED_NODE_TYPE:\r\n if (v.constructor === XNodeSet) {\r\n this.singleNodeValue = v.first();\r\n return;\r\n }\r\n break;\r\n case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:\r\n case XPathResult.ORDERED_NODE_ITERATOR_TYPE:\r\n if (v.constructor === XNodeSet) {\r\n this.invalidIteratorState = false;\r\n this.nodes = v.toArray();\r\n this.iteratorIndex = 0;\r\n return;\r\n }\r\n break;\r\n case XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:\r\n case XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:\r\n if (v.constructor === XNodeSet) {\r\n this.nodes = v.toArray();\r\n this.snapshotLength = this.nodes.length;\r\n return;\r\n }\r\n break;\r\n }\r\n throw new XPathException(XPathException.TYPE_ERR);\r\n };\r\n\r\n XPathResult.prototype.iterateNext = function () {\r\n if (this.resultType != XPathResult.UNORDERED_NODE_ITERATOR_TYPE\r\n && this.resultType != XPathResult.ORDERED_NODE_ITERATOR_TYPE) {\r\n throw new XPathException(XPathException.TYPE_ERR);\r\n }\r\n return this.nodes[this.iteratorIndex++];\r\n };\r\n\r\n XPathResult.prototype.snapshotItem = function (i) {\r\n if (this.resultType != XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE\r\n && this.resultType != XPathResult.ORDERED_NODE_SNAPSHOT_TYPE) {\r\n throw new XPathException(XPathException.TYPE_ERR);\r\n }\r\n return this.nodes[i];\r\n };\r\n\r\n XPathResult.ANY_TYPE = 0;\r\n XPathResult.NUMBER_TYPE = 1;\r\n XPathResult.STRING_TYPE = 2;\r\n XPathResult.BOOLEAN_TYPE = 3;\r\n XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;\r\n XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;\r\n XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;\r\n XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;\r\n XPathResult.ANY_UNORDERED_NODE_TYPE = 8;\r\n XPathResult.FIRST_ORDERED_NODE_TYPE = 9;\r\n\r\n // DOM 3 XPath support ///////////////////////////////////////////////////////\r\n\r\n function installDOM3XPathSupport(doc, p) {\r\n doc.createExpression = function (e, r) {\r\n try {\r\n return new XPathExpression(e, r, p);\r\n } catch (e) {\r\n throw new XPathException(XPathException.INVALID_EXPRESSION_ERR, e);\r\n }\r\n };\r\n doc.createNSResolver = function (n) {\r\n return new NodeXPathNSResolver(n);\r\n };\r\n doc.evaluate = function (e, cn, r, t, res) {\r\n if (t < 0 || t > 9) {\r\n throw { code: 0, toString: function () { return \"Request type not supported\"; } };\r\n }\r\n return doc.createExpression(e, r, p).evaluate(cn, t, res);\r\n };\r\n };\r\n\r\n // ---------------------------------------------------------------------------\r\n\r\n // Install DOM 3 XPath support for the current document.\r\n try {\r\n var shouldInstall = true;\r\n try {\r\n if (document.implementation\r\n && document.implementation.hasFeature\r\n && document.implementation.hasFeature(\"XPath\", null)) {\r\n shouldInstall = false;\r\n }\r\n } catch (e) {\r\n }\r\n if (shouldInstall) {\r\n installDOM3XPathSupport(document, new XPathParser());\r\n }\r\n } catch (e) {\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // exports for node.js\r\n\r\n installDOM3XPathSupport(exports, new XPathParser());\r\n\r\n (function () {\r\n var parser = new XPathParser();\r\n\r\n var defaultNSResolver = new NamespaceResolver();\r\n var defaultFunctionResolver = new FunctionResolver();\r\n var defaultVariableResolver = new VariableResolver();\r\n\r\n function makeNSResolverFromFunction(func) {\r\n return {\r\n getNamespace: function (prefix, node) {\r\n var ns = func(prefix, node);\r\n\r\n return ns || defaultNSResolver.getNamespace(prefix, node);\r\n }\r\n };\r\n }\r\n\r\n function makeNSResolverFromObject(obj) {\r\n return makeNSResolverFromFunction(obj.getNamespace.bind(obj));\r\n }\r\n\r\n function makeNSResolverFromMap(map) {\r\n return makeNSResolverFromFunction(function (prefix) {\r\n return map[prefix];\r\n });\r\n }\r\n\r\n function makeNSResolver(resolver) {\r\n if (resolver && typeof resolver.getNamespace === \"function\") {\r\n return makeNSResolverFromObject(resolver);\r\n }\r\n\r\n if (typeof resolver === \"function\") {\r\n return makeNSResolverFromFunction(resolver);\r\n }\r\n\r\n // assume prefix -> uri mapping\r\n if (typeof resolver === \"object\") {\r\n return makeNSResolverFromMap(resolver);\r\n }\r\n\r\n return defaultNSResolver;\r\n }\r\n\r\n /** Converts native JavaScript types to their XPath library equivalent */\r\n function convertValue(value) {\r\n if (value === null ||\r\n typeof value === \"undefined\" ||\r\n value instanceof XString ||\r\n value instanceof XBoolean ||\r\n value instanceof XNumber ||\r\n value instanceof XNodeSet) {\r\n return value;\r\n }\r\n\r\n switch (typeof value) {\r\n case \"string\": return new XString(value);\r\n case \"boolean\": return new XBoolean(value);\r\n case \"number\": return new XNumber(value);\r\n }\r\n\r\n // assume node(s)\r\n var ns = new XNodeSet();\r\n ns.addArray([].concat(value));\r\n return ns;\r\n }\r\n\r\n function makeEvaluator(func) {\r\n return function (context) {\r\n var args = Array.prototype.slice.call(arguments, 1).map(function (arg) {\r\n return arg.evaluate(context);\r\n });\r\n var result = func.apply(this, [].concat(context, args));\r\n return convertValue(result);\r\n };\r\n }\r\n\r\n function makeFunctionResolverFromFunction(func) {\r\n return {\r\n getFunction: function (name, namespace) {\r\n var found = func(name, namespace);\r\n if (found) {\r\n return makeEvaluator(found);\r\n }\r\n return defaultFunctionResolver.getFunction(name, namespace);\r\n }\r\n };\r\n }\r\n\r\n function makeFunctionResolverFromObject(obj) {\r\n return makeFunctionResolverFromFunction(obj.getFunction.bind(obj));\r\n }\r\n\r\n function makeFunctionResolverFromMap(map) {\r\n return makeFunctionResolverFromFunction(function (name) {\r\n return map[name];\r\n });\r\n }\r\n\r\n function makeFunctionResolver(resolver) {\r\n if (resolver && typeof resolver.getFunction === \"function\") {\r\n return makeFunctionResolverFromObject(resolver);\r\n }\r\n\r\n if (typeof resolver === \"function\") {\r\n return makeFunctionResolverFromFunction(resolver);\r\n }\r\n\r\n // assume map\r\n if (typeof resolver === \"object\") {\r\n return makeFunctionResolverFromMap(resolver);\r\n }\r\n\r\n return defaultFunctionResolver;\r\n }\r\n\r\n function makeVariableResolverFromFunction(func) {\r\n return {\r\n getVariable: function (name, namespace) {\r\n var value = func(name, namespace);\r\n return convertValue(value);\r\n }\r\n };\r\n }\r\n\r\n function makeVariableResolver(resolver) {\r\n if (resolver) {\r\n if (typeof resolver.getVariable === \"function\") {\r\n return makeVariableResolverFromFunction(resolver.getVariable.bind(resolver));\r\n }\r\n\r\n if (typeof resolver === \"function\") {\r\n return makeVariableResolverFromFunction(resolver);\r\n }\r\n\r\n // assume map\r\n if (typeof resolver === \"object\") {\r\n return makeVariableResolverFromFunction(function (name) {\r\n return resolver[name];\r\n });\r\n }\r\n }\r\n\r\n return defaultVariableResolver;\r\n }\r\n\r\n function copyIfPresent(prop, dest, source) {\r\n if (prop in source) { dest[prop] = source[prop]; }\r\n }\r\n\r\n function makeContext(options) {\r\n var context = new XPathContext();\r\n\r\n if (options) {\r\n context.namespaceResolver = makeNSResolver(options.namespaces);\r\n context.functionResolver = makeFunctionResolver(options.functions);\r\n context.variableResolver = makeVariableResolver(options.variables);\r\n context.expressionContextNode = options.node;\r\n copyIfPresent('allowAnyNamespaceForNoPrefix', context, options);\r\n copyIfPresent('isHtml', context, options);\r\n } else {\r\n context.namespaceResolver = defaultNSResolver;\r\n }\r\n\r\n return context;\r\n }\r\n\r\n function evaluate(parsedExpression, options) {\r\n var context = makeContext(options);\r\n\r\n return parsedExpression.evaluate(context);\r\n }\r\n\r\n var evaluatorPrototype = {\r\n evaluate: function (options) {\r\n return evaluate(this.expression, options);\r\n }\r\n\r\n , evaluateNumber: function (options) {\r\n return this.evaluate(options).numberValue();\r\n }\r\n\r\n , evaluateString: function (options) {\r\n return this.evaluate(options).stringValue();\r\n }\r\n\r\n , evaluateBoolean: function (options) {\r\n return this.evaluate(options).booleanValue();\r\n }\r\n\r\n , evaluateNodeSet: function (options) {\r\n return this.evaluate(options).nodeset();\r\n }\r\n\r\n , select: function (options) {\r\n return this.evaluateNodeSet(options).toArray()\r\n }\r\n\r\n , select1: function (options) {\r\n return this.select(options)[0];\r\n }\r\n };\r\n\r\n function parse(xpath) {\r\n var parsed = parser.parse(xpath);\r\n\r\n return Object.create(evaluatorPrototype, {\r\n expression: {\r\n value: parsed\r\n }\r\n });\r\n }\r\n\r\n exports.parse = parse;\r\n })();\r\n\r\n assign(\r\n exports,\r\n {\r\n XPath: XPath,\r\n XPathParser: XPathParser,\r\n XPathResult: XPathResult,\r\n\r\n Step: Step,\r\n PathExpr: PathExpr,\r\n NodeTest: NodeTest,\r\n LocationPath: LocationPath,\r\n\r\n OrOperation: OrOperation,\r\n AndOperation: AndOperation,\r\n\r\n BarOperation: BarOperation,\r\n\r\n EqualsOperation: EqualsOperation,\r\n NotEqualOperation: NotEqualOperation,\r\n LessThanOperation: LessThanOperation,\r\n GreaterThanOperation: GreaterThanOperation,\r\n LessThanOrEqualOperation: LessThanOrEqualOperation,\r\n GreaterThanOrEqualOperation: GreaterThanOrEqualOperation,\r\n\r\n PlusOperation: PlusOperation,\r\n MinusOperation: MinusOperation,\r\n MultiplyOperation: MultiplyOperation,\r\n DivOperation: DivOperation,\r\n ModOperation: ModOperation,\r\n UnaryMinusOperation: UnaryMinusOperation,\r\n\r\n FunctionCall: FunctionCall,\r\n VariableReference: VariableReference,\r\n\r\n XPathContext: XPathContext,\r\n\r\n XNodeSet: XNodeSet,\r\n XBoolean: XBoolean,\r\n XString: XString,\r\n XNumber: XNumber,\r\n\r\n NamespaceResolver: NamespaceResolver,\r\n FunctionResolver: FunctionResolver,\r\n VariableResolver: VariableResolver,\r\n\r\n Utilities: Utilities,\r\n }\r\n );\r\n\r\n // helper\r\n exports.select = function (e, doc, single) {\r\n return exports.selectWithResolver(e, doc, null, single);\r\n };\r\n\r\n exports.useNamespaces = function (mappings) {\r\n var resolver = {\r\n mappings: mappings || {},\r\n lookupNamespaceURI: function (prefix) {\r\n return this.mappings[prefix];\r\n }\r\n };\r\n\r\n return function (e, doc, single) {\r\n return exports.selectWithResolver(e, doc, resolver, single);\r\n };\r\n };\r\n\r\n exports.selectWithResolver = function (e, doc, resolver, single) {\r\n var expression = new XPathExpression(e, resolver, new XPathParser());\r\n var type = XPathResult.ANY_TYPE;\r\n\r\n var result = expression.evaluate(doc, type, null);\r\n\r\n if (result.resultType == XPathResult.STRING_TYPE) {\r\n result = result.stringValue;\r\n }\r\n else if (result.resultType == XPathResult.NUMBER_TYPE) {\r\n result = result.numberValue;\r\n }\r\n else if (result.resultType == XPathResult.BOOLEAN_TYPE) {\r\n result = result.booleanValue;\r\n }\r\n else {\r\n result = result.nodes;\r\n if (single) {\r\n result = result[0];\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n exports.select1 = function (e, doc) {\r\n return exports.select(e, doc, true);\r\n };\r\n\r\n var isArrayOfNodes = function (value) {\r\n return Array.isArray(value) && value.every(isNodeLike);\r\n };\r\n\r\n var isNodeOfType = function (type) {\r\n return function (value) {\r\n return isNodeLike(value) && value.nodeType === type;\r\n };\r\n };\r\n\r\n assign(\r\n exports,\r\n {\r\n isNodeLike: isNodeLike,\r\n isArrayOfNodes: isArrayOfNodes,\r\n isElement: isNodeOfType(NodeTypes.ELEMENT_NODE),\r\n isAttribute: isNodeOfType(NodeTypes.ATTRIBUTE_NODE),\r\n isTextNode: isNodeOfType(NodeTypes.TEXT_NODE),\r\n isCDATASection: isNodeOfType(NodeTypes.CDATA_SECTION_NODE),\r\n isProcessingInstruction: isNodeOfType(NodeTypes.PROCESSING_INSTRUCTION_NODE),\r\n isComment: isNodeOfType(NodeTypes.COMMENT_NODE),\r\n isDocumentNode: isNodeOfType(NodeTypes.DOCUMENT_NODE),\r\n isDocumentTypeNode: isNodeOfType(NodeTypes.DOCUMENT_TYPE_NODE),\r\n isDocumentFragment: isNodeOfType(NodeTypes.DOCUMENT_FRAGMENT_NODE),\r\n }\r\n );\r\n // end non-node wrapper\r\n})(xpath);\r\n","module.exports = require(\"assert\");","module.exports = require(\"async_hooks\");","module.exports = require(\"buffer\");","module.exports = require(\"child_process\");","module.exports = require(\"console\");","module.exports = require(\"crypto\");","module.exports = require(\"diagnostics_channel\");","module.exports = require(\"events\");","module.exports = require(\"fs\");","module.exports = require(\"http\");","module.exports = require(\"http2\");","module.exports = require(\"https\");","module.exports = require(\"net\");","module.exports = require(\"node:crypto\");","module.exports = require(\"node:events\");","module.exports = require(\"node:stream\");","module.exports = require(\"node:util\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = require(\"perf_hooks\");","module.exports = require(\"process\");","module.exports = require(\"querystring\");","module.exports = require(\"stream\");","module.exports = require(\"stream/web\");","module.exports = require(\"string_decoder\");","module.exports = require(\"timers\");","module.exports = require(\"tls\");","module.exports = require(\"url\");","module.exports = require(\"util\");","module.exports = require(\"util/types\");","module.exports = require(\"vm\");","module.exports = require(\"worker_threads\");","module.exports = require(\"zlib\");","'use strict'\n\nconst WritableStream = require('node:stream').Writable\nconst inherits = require('node:util').inherits\n\nconst StreamSearch = require('../../streamsearch/sbmh')\n\nconst PartStream = require('./PartStream')\nconst HeaderParser = require('./HeaderParser')\n\nconst DASH = 45\nconst B_ONEDASH = Buffer.from('-')\nconst B_CRLF = Buffer.from('\\r\\n')\nconst EMPTY_FN = function () {}\n\nfunction Dicer (cfg) {\n if (!(this instanceof Dicer)) { return new Dicer(cfg) }\n WritableStream.call(this, cfg)\n\n if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') }\n\n if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined }\n\n this._headerFirst = cfg.headerFirst\n\n this._dashes = 0\n this._parts = 0\n this._finished = false\n this._realFinish = false\n this._isPreamble = true\n this._justMatched = false\n this._firstWrite = true\n this._inHeader = true\n this._part = undefined\n this._cb = undefined\n this._ignoreData = false\n this._partOpts = { highWaterMark: cfg.partHwm }\n this._pause = false\n\n const self = this\n this._hparser = new HeaderParser(cfg)\n this._hparser.on('header', function (header) {\n self._inHeader = false\n self._part.emit('header', header)\n })\n}\ninherits(Dicer, WritableStream)\n\nDicer.prototype.emit = function (ev) {\n if (ev === 'finish' && !this._realFinish) {\n if (!this._finished) {\n const self = this\n process.nextTick(function () {\n self.emit('error', new Error('Unexpected end of multipart data'))\n if (self._part && !self._ignoreData) {\n const type = (self._isPreamble ? 'Preamble' : 'Part')\n self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'))\n self._part.push(null)\n process.nextTick(function () {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n })\n return\n }\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n })\n }\n } else { WritableStream.prototype.emit.apply(this, arguments) }\n}\n\nDicer.prototype._write = function (data, encoding, cb) {\n // ignore unexpected data (e.g. extra trailer data after finished)\n if (!this._hparser && !this._bparser) { return cb() }\n\n if (this._headerFirst && this._isPreamble) {\n if (!this._part) {\n this._part = new PartStream(this._partOpts)\n if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part) } else { this._ignore() }\n }\n const r = this._hparser.push(data)\n if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() }\n }\n\n // allows for \"easier\" testing\n if (this._firstWrite) {\n this._bparser.push(B_CRLF)\n this._firstWrite = false\n }\n\n this._bparser.push(data)\n\n if (this._pause) { this._cb = cb } else { cb() }\n}\n\nDicer.prototype.reset = function () {\n this._part = undefined\n this._bparser = undefined\n this._hparser = undefined\n}\n\nDicer.prototype.setBoundary = function (boundary) {\n const self = this\n this._bparser = new StreamSearch('\\r\\n--' + boundary)\n this._bparser.on('info', function (isMatch, data, start, end) {\n self._oninfo(isMatch, data, start, end)\n })\n}\n\nDicer.prototype._ignore = function () {\n if (this._part && !this._ignoreData) {\n this._ignoreData = true\n this._part.on('error', EMPTY_FN)\n // we must perform some kind of read on the stream even though we are\n // ignoring the data, otherwise node's Readable stream will not emit 'end'\n // after pushing null to the stream\n this._part.resume()\n }\n}\n\nDicer.prototype._oninfo = function (isMatch, data, start, end) {\n let buf; const self = this; let i = 0; let r; let shouldWriteMore = true\n\n if (!this._part && this._justMatched && data) {\n while (this._dashes < 2 && (start + i) < end) {\n if (data[start + i] === DASH) {\n ++i\n ++this._dashes\n } else {\n if (this._dashes) { buf = B_ONEDASH }\n this._dashes = 0\n break\n }\n }\n if (this._dashes === 2) {\n if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)) }\n this.reset()\n this._finished = true\n // no more parts will be added\n if (self._parts === 0) {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n }\n }\n if (this._dashes) { return }\n }\n if (this._justMatched) { this._justMatched = false }\n if (!this._part) {\n this._part = new PartStream(this._partOpts)\n this._part._read = function (n) {\n self._unpause()\n }\n if (this._isPreamble && this.listenerCount('preamble') !== 0) {\n this.emit('preamble', this._part)\n } else if (this._isPreamble !== true && this.listenerCount('part') !== 0) {\n this.emit('part', this._part)\n } else {\n this._ignore()\n }\n if (!this._isPreamble) { this._inHeader = true }\n }\n if (data && start < end && !this._ignoreData) {\n if (this._isPreamble || !this._inHeader) {\n if (buf) { shouldWriteMore = this._part.push(buf) }\n shouldWriteMore = this._part.push(data.slice(start, end))\n if (!shouldWriteMore) { this._pause = true }\n } else if (!this._isPreamble && this._inHeader) {\n if (buf) { this._hparser.push(buf) }\n r = this._hparser.push(data.slice(start, end))\n if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) }\n }\n }\n if (isMatch) {\n this._hparser.reset()\n if (this._isPreamble) { this._isPreamble = false } else {\n if (start !== end) {\n ++this._parts\n this._part.on('end', function () {\n if (--self._parts === 0) {\n if (self._finished) {\n self._realFinish = true\n self.emit('finish')\n self._realFinish = false\n } else {\n self._unpause()\n }\n }\n })\n }\n }\n this._part.push(null)\n this._part = undefined\n this._ignoreData = false\n this._justMatched = true\n this._dashes = 0\n }\n}\n\nDicer.prototype._unpause = function () {\n if (!this._pause) { return }\n\n this._pause = false\n if (this._cb) {\n const cb = this._cb\n this._cb = undefined\n cb()\n }\n}\n\nmodule.exports = Dicer\n","'use strict'\n\nconst EventEmitter = require('node:events').EventEmitter\nconst inherits = require('node:util').inherits\nconst getLimit = require('../../../lib/utils/getLimit')\n\nconst StreamSearch = require('../../streamsearch/sbmh')\n\nconst B_DCRLF = Buffer.from('\\r\\n\\r\\n')\nconst RE_CRLF = /\\r\\n/g\nconst RE_HDR = /^([^:]+):[ \\t]?([\\x00-\\xFF]+)?$/ // eslint-disable-line no-control-regex\n\nfunction HeaderParser (cfg) {\n EventEmitter.call(this)\n\n cfg = cfg || {}\n const self = this\n this.nread = 0\n this.maxed = false\n this.npairs = 0\n this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000)\n this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024)\n this.buffer = ''\n this.header = {}\n this.finished = false\n this.ss = new StreamSearch(B_DCRLF)\n this.ss.on('info', function (isMatch, data, start, end) {\n if (data && !self.maxed) {\n if (self.nread + end - start >= self.maxHeaderSize) {\n end = self.maxHeaderSize - self.nread + start\n self.nread = self.maxHeaderSize\n self.maxed = true\n } else { self.nread += (end - start) }\n\n self.buffer += data.toString('binary', start, end)\n }\n if (isMatch) { self._finish() }\n })\n}\ninherits(HeaderParser, EventEmitter)\n\nHeaderParser.prototype.push = function (data) {\n const r = this.ss.push(data)\n if (this.finished) { return r }\n}\n\nHeaderParser.prototype.reset = function () {\n this.finished = false\n this.buffer = ''\n this.header = {}\n this.ss.reset()\n}\n\nHeaderParser.prototype._finish = function () {\n if (this.buffer) { this._parseHeader() }\n this.ss.matches = this.ss.maxMatches\n const header = this.header\n this.header = {}\n this.buffer = ''\n this.finished = true\n this.nread = this.npairs = 0\n this.maxed = false\n this.emit('header', header)\n}\n\nHeaderParser.prototype._parseHeader = function () {\n if (this.npairs === this.maxHeaderPairs) { return }\n\n const lines = this.buffer.split(RE_CRLF)\n const len = lines.length\n let m, h\n\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n if (lines[i].length === 0) { continue }\n if (lines[i][0] === '\\t' || lines[i][0] === ' ') {\n // folded header content\n // RFC2822 says to just remove the CRLF and not the whitespace following\n // it, so we follow the RFC and include the leading whitespace ...\n if (h) {\n this.header[h][this.header[h].length - 1] += lines[i]\n continue\n }\n }\n\n const posColon = lines[i].indexOf(':')\n if (\n posColon === -1 ||\n posColon === 0\n ) {\n return\n }\n m = RE_HDR.exec(lines[i])\n h = m[1].toLowerCase()\n this.header[h] = this.header[h] || []\n this.header[h].push((m[2] || ''))\n if (++this.npairs === this.maxHeaderPairs) { break }\n }\n}\n\nmodule.exports = HeaderParser\n","'use strict'\n\nconst inherits = require('node:util').inherits\nconst ReadableStream = require('node:stream').Readable\n\nfunction PartStream (opts) {\n ReadableStream.call(this, opts)\n}\ninherits(PartStream, ReadableStream)\n\nPartStream.prototype._read = function (n) {}\n\nmodule.exports = PartStream\n","'use strict'\n\n/**\n * Copyright Brian White. All rights reserved.\n *\n * @see https://github.com/mscdex/streamsearch\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n *\n * Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation\n * by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool\n */\nconst EventEmitter = require('node:events').EventEmitter\nconst inherits = require('node:util').inherits\n\nfunction SBMH (needle) {\n if (typeof needle === 'string') {\n needle = Buffer.from(needle)\n }\n\n if (!Buffer.isBuffer(needle)) {\n throw new TypeError('The needle has to be a String or a Buffer.')\n }\n\n const needleLength = needle.length\n\n if (needleLength === 0) {\n throw new Error('The needle cannot be an empty String/Buffer.')\n }\n\n if (needleLength > 256) {\n throw new Error('The needle cannot have a length bigger than 256.')\n }\n\n this.maxMatches = Infinity\n this.matches = 0\n\n this._occ = new Array(256)\n .fill(needleLength) // Initialize occurrence table.\n this._lookbehind_size = 0\n this._needle = needle\n this._bufpos = 0\n\n this._lookbehind = Buffer.alloc(needleLength)\n\n // Populate occurrence table with analysis of the needle,\n // ignoring last letter.\n for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var\n this._occ[needle[i]] = needleLength - 1 - i\n }\n}\ninherits(SBMH, EventEmitter)\n\nSBMH.prototype.reset = function () {\n this._lookbehind_size = 0\n this.matches = 0\n this._bufpos = 0\n}\n\nSBMH.prototype.push = function (chunk, pos) {\n if (!Buffer.isBuffer(chunk)) {\n chunk = Buffer.from(chunk, 'binary')\n }\n const chlen = chunk.length\n this._bufpos = pos || 0\n let r\n while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) }\n return r\n}\n\nSBMH.prototype._sbmh_feed = function (data) {\n const len = data.length\n const needle = this._needle\n const needleLength = needle.length\n const lastNeedleChar = needle[needleLength - 1]\n\n // Positive: points to a position in `data`\n // pos == 3 points to data[3]\n // Negative: points to a position in the lookbehind buffer\n // pos == -2 points to lookbehind[lookbehind_size - 2]\n let pos = -this._lookbehind_size\n let ch\n\n if (pos < 0) {\n // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool\n // search with character lookup code that considers both the\n // lookbehind buffer and the current round's haystack data.\n //\n // Loop until\n // there is a match.\n // or until\n // we've moved past the position that requires the\n // lookbehind buffer. In this case we switch to the\n // optimized loop.\n // or until\n // the character to look at lies outside the haystack.\n while (pos < 0 && pos <= len - needleLength) {\n ch = this._sbmh_lookup_char(data, pos + needleLength - 1)\n\n if (\n ch === lastNeedleChar &&\n this._sbmh_memcmp(data, pos, needleLength - 1)\n ) {\n this._lookbehind_size = 0\n ++this.matches\n this.emit('info', true)\n\n return (this._bufpos = pos + needleLength)\n }\n pos += this._occ[ch]\n }\n\n // No match.\n\n if (pos < 0) {\n // There's too few data for Boyer-Moore-Horspool to run,\n // so let's use a different algorithm to skip as much as\n // we can.\n // Forward pos until\n // the trailing part of lookbehind + data\n // looks like the beginning of the needle\n // or until\n // pos == 0\n while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos }\n }\n\n if (pos >= 0) {\n // Discard lookbehind buffer.\n this.emit('info', false, this._lookbehind, 0, this._lookbehind_size)\n this._lookbehind_size = 0\n } else {\n // Cut off part of the lookbehind buffer that has\n // been processed and append the entire haystack\n // into it.\n const bytesToCutOff = this._lookbehind_size + pos\n if (bytesToCutOff > 0) {\n // The cut off data is guaranteed not to contain the needle.\n this.emit('info', false, this._lookbehind, 0, bytesToCutOff)\n }\n\n this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff,\n this._lookbehind_size - bytesToCutOff)\n this._lookbehind_size -= bytesToCutOff\n\n data.copy(this._lookbehind, this._lookbehind_size)\n this._lookbehind_size += len\n\n this._bufpos = len\n return len\n }\n }\n\n pos += (pos >= 0) * this._bufpos\n\n // Lookbehind buffer is now empty. We only need to check if the\n // needle is in the haystack.\n if (data.indexOf(needle, pos) !== -1) {\n pos = data.indexOf(needle, pos)\n ++this.matches\n if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) }\n\n return (this._bufpos = pos + needleLength)\n } else {\n pos = len - needleLength\n }\n\n // There was no match. If there's trailing haystack data that we cannot\n // match yet using the Boyer-Moore-Horspool algorithm (because the trailing\n // data is less than the needle size) then match using a modified\n // algorithm that starts matching from the beginning instead of the end.\n // Whatever trailing data is left after running this algorithm is added to\n // the lookbehind buffer.\n while (\n pos < len &&\n (\n data[pos] !== needle[0] ||\n (\n (Buffer.compare(\n data.subarray(pos, pos + len - pos),\n needle.subarray(0, len - pos)\n ) !== 0)\n )\n )\n ) {\n ++pos\n }\n if (pos < len) {\n data.copy(this._lookbehind, 0, pos, pos + (len - pos))\n this._lookbehind_size = len - pos\n }\n\n // Everything until pos is guaranteed not to contain needle data.\n if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) }\n\n this._bufpos = len\n return len\n}\n\nSBMH.prototype._sbmh_lookup_char = function (data, pos) {\n return (pos < 0)\n ? this._lookbehind[this._lookbehind_size + pos]\n : data[pos]\n}\n\nSBMH.prototype._sbmh_memcmp = function (data, pos, len) {\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false }\n }\n return true\n}\n\nmodule.exports = SBMH\n","'use strict'\n\nconst WritableStream = require('node:stream').Writable\nconst { inherits } = require('node:util')\nconst Dicer = require('../deps/dicer/lib/Dicer')\n\nconst MultipartParser = require('./types/multipart')\nconst UrlencodedParser = require('./types/urlencoded')\nconst parseParams = require('./utils/parseParams')\n\nfunction Busboy (opts) {\n if (!(this instanceof Busboy)) { return new Busboy(opts) }\n\n if (typeof opts !== 'object') {\n throw new TypeError('Busboy expected an options-Object.')\n }\n if (typeof opts.headers !== 'object') {\n throw new TypeError('Busboy expected an options-Object with headers-attribute.')\n }\n if (typeof opts.headers['content-type'] !== 'string') {\n throw new TypeError('Missing Content-Type-header.')\n }\n\n const {\n headers,\n ...streamOptions\n } = opts\n\n this.opts = {\n autoDestroy: false,\n ...streamOptions\n }\n WritableStream.call(this, this.opts)\n\n this._done = false\n this._parser = this.getParserByHeaders(headers)\n this._finished = false\n}\ninherits(Busboy, WritableStream)\n\nBusboy.prototype.emit = function (ev) {\n if (ev === 'finish') {\n if (!this._done) {\n this._parser?.end()\n return\n } else if (this._finished) {\n return\n }\n this._finished = true\n }\n WritableStream.prototype.emit.apply(this, arguments)\n}\n\nBusboy.prototype.getParserByHeaders = function (headers) {\n const parsed = parseParams(headers['content-type'])\n\n const cfg = {\n defCharset: this.opts.defCharset,\n fileHwm: this.opts.fileHwm,\n headers,\n highWaterMark: this.opts.highWaterMark,\n isPartAFile: this.opts.isPartAFile,\n limits: this.opts.limits,\n parsedConType: parsed,\n preservePath: this.opts.preservePath\n }\n\n if (MultipartParser.detect.test(parsed[0])) {\n return new MultipartParser(this, cfg)\n }\n if (UrlencodedParser.detect.test(parsed[0])) {\n return new UrlencodedParser(this, cfg)\n }\n throw new Error('Unsupported Content-Type.')\n}\n\nBusboy.prototype._write = function (chunk, encoding, cb) {\n this._parser.write(chunk, cb)\n}\n\nmodule.exports = Busboy\nmodule.exports.default = Busboy\nmodule.exports.Busboy = Busboy\n\nmodule.exports.Dicer = Dicer\n","'use strict'\n\n// TODO:\n// * support 1 nested multipart level\n// (see second multipart example here:\n// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data)\n// * support limits.fieldNameSize\n// -- this will require modifications to utils.parseParams\n\nconst { Readable } = require('node:stream')\nconst { inherits } = require('node:util')\n\nconst Dicer = require('../../deps/dicer/lib/Dicer')\n\nconst parseParams = require('../utils/parseParams')\nconst decodeText = require('../utils/decodeText')\nconst basename = require('../utils/basename')\nconst getLimit = require('../utils/getLimit')\n\nconst RE_BOUNDARY = /^boundary$/i\nconst RE_FIELD = /^form-data$/i\nconst RE_CHARSET = /^charset$/i\nconst RE_FILENAME = /^filename$/i\nconst RE_NAME = /^name$/i\n\nMultipart.detect = /^multipart\\/form-data/i\nfunction Multipart (boy, cfg) {\n let i\n let len\n const self = this\n let boundary\n const limits = cfg.limits\n const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined))\n const parsedConType = cfg.parsedConType || []\n const defCharset = cfg.defCharset || 'utf8'\n const preservePath = cfg.preservePath\n const fileOpts = { highWaterMark: cfg.fileHwm }\n\n for (i = 0, len = parsedConType.length; i < len; ++i) {\n if (Array.isArray(parsedConType[i]) &&\n RE_BOUNDARY.test(parsedConType[i][0])) {\n boundary = parsedConType[i][1]\n break\n }\n }\n\n function checkFinished () {\n if (nends === 0 && finished && !boy._done) {\n finished = false\n self.end()\n }\n }\n\n if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') }\n\n const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)\n const fileSizeLimit = getLimit(limits, 'fileSize', Infinity)\n const filesLimit = getLimit(limits, 'files', Infinity)\n const fieldsLimit = getLimit(limits, 'fields', Infinity)\n const partsLimit = getLimit(limits, 'parts', Infinity)\n const headerPairsLimit = getLimit(limits, 'headerPairs', 2000)\n const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024)\n\n let nfiles = 0\n let nfields = 0\n let nends = 0\n let curFile\n let curField\n let finished = false\n\n this._needDrain = false\n this._pause = false\n this._cb = undefined\n this._nparts = 0\n this._boy = boy\n\n const parserCfg = {\n boundary,\n maxHeaderPairs: headerPairsLimit,\n maxHeaderSize: headerSizeLimit,\n partHwm: fileOpts.highWaterMark,\n highWaterMark: cfg.highWaterMark\n }\n\n this.parser = new Dicer(parserCfg)\n this.parser.on('drain', function () {\n self._needDrain = false\n if (self._cb && !self._pause) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n }).on('part', function onPart (part) {\n if (++self._nparts > partsLimit) {\n self.parser.removeListener('part', onPart)\n self.parser.on('part', skipPart)\n boy.hitPartsLimit = true\n boy.emit('partsLimit')\n return skipPart(part)\n }\n\n // hack because streams2 _always_ doesn't emit 'end' until nextTick, so let\n // us emit 'end' early since we know the part has ended if we are already\n // seeing the next part\n if (curField) {\n const field = curField\n field.emit('end')\n field.removeAllListeners('end')\n }\n\n part.on('header', function (header) {\n let contype\n let fieldname\n let parsed\n let charset\n let encoding\n let filename\n let nsize = 0\n\n if (header['content-type']) {\n parsed = parseParams(header['content-type'][0])\n if (parsed[0]) {\n contype = parsed[0].toLowerCase()\n for (i = 0, len = parsed.length; i < len; ++i) {\n if (RE_CHARSET.test(parsed[i][0])) {\n charset = parsed[i][1].toLowerCase()\n break\n }\n }\n }\n }\n\n if (contype === undefined) { contype = 'text/plain' }\n if (charset === undefined) { charset = defCharset }\n\n if (header['content-disposition']) {\n parsed = parseParams(header['content-disposition'][0])\n if (!RE_FIELD.test(parsed[0])) { return skipPart(part) }\n for (i = 0, len = parsed.length; i < len; ++i) {\n if (RE_NAME.test(parsed[i][0])) {\n fieldname = parsed[i][1]\n } else if (RE_FILENAME.test(parsed[i][0])) {\n filename = parsed[i][1]\n if (!preservePath) { filename = basename(filename) }\n }\n }\n } else { return skipPart(part) }\n\n if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' }\n\n let onData,\n onEnd\n\n if (isPartAFile(fieldname, contype, filename)) {\n // file/binary field\n if (nfiles === filesLimit) {\n if (!boy.hitFilesLimit) {\n boy.hitFilesLimit = true\n boy.emit('filesLimit')\n }\n return skipPart(part)\n }\n\n ++nfiles\n\n if (boy.listenerCount('file') === 0) {\n self.parser._ignore()\n return\n }\n\n ++nends\n const file = new FileStream(fileOpts)\n curFile = file\n file.on('end', function () {\n --nends\n self._pause = false\n checkFinished()\n if (self._cb && !self._needDrain) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n })\n file._read = function (n) {\n if (!self._pause) { return }\n self._pause = false\n if (self._cb && !self._needDrain) {\n const cb = self._cb\n self._cb = undefined\n cb()\n }\n }\n boy.emit('file', fieldname, file, filename, encoding, contype)\n\n onData = function (data) {\n if ((nsize += data.length) > fileSizeLimit) {\n const extralen = fileSizeLimit - nsize + data.length\n if (extralen > 0) { file.push(data.slice(0, extralen)) }\n file.truncated = true\n file.bytesRead = fileSizeLimit\n part.removeAllListeners('data')\n file.emit('limit')\n return\n } else if (!file.push(data)) { self._pause = true }\n\n file.bytesRead = nsize\n }\n\n onEnd = function () {\n curFile = undefined\n file.push(null)\n }\n } else {\n // non-file field\n if (nfields === fieldsLimit) {\n if (!boy.hitFieldsLimit) {\n boy.hitFieldsLimit = true\n boy.emit('fieldsLimit')\n }\n return skipPart(part)\n }\n\n ++nfields\n ++nends\n let buffer = ''\n let truncated = false\n curField = part\n\n onData = function (data) {\n if ((nsize += data.length) > fieldSizeLimit) {\n const extralen = (fieldSizeLimit - (nsize - data.length))\n buffer += data.toString('binary', 0, extralen)\n truncated = true\n part.removeAllListeners('data')\n } else { buffer += data.toString('binary') }\n }\n\n onEnd = function () {\n curField = undefined\n if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) }\n boy.emit('field', fieldname, buffer, false, truncated, encoding, contype)\n --nends\n checkFinished()\n }\n }\n\n /* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become\n broken. Streams2/streams3 is a huge black box of confusion, but\n somehow overriding the sync state seems to fix things again (and still\n seems to work for previous node versions).\n */\n part._readableState.sync = false\n\n part.on('data', onData)\n part.on('end', onEnd)\n }).on('error', function (err) {\n if (curFile) { curFile.emit('error', err) }\n })\n }).on('error', function (err) {\n boy.emit('error', err)\n }).on('finish', function () {\n finished = true\n checkFinished()\n })\n}\n\nMultipart.prototype.write = function (chunk, cb) {\n const r = this.parser.write(chunk)\n if (r && !this._pause) {\n cb()\n } else {\n this._needDrain = !r\n this._cb = cb\n }\n}\n\nMultipart.prototype.end = function () {\n const self = this\n\n if (self.parser.writable) {\n self.parser.end()\n } else if (!self._boy._done) {\n process.nextTick(function () {\n self._boy._done = true\n self._boy.emit('finish')\n })\n }\n}\n\nfunction skipPart (part) {\n part.resume()\n}\n\nfunction FileStream (opts) {\n Readable.call(this, opts)\n\n this.bytesRead = 0\n\n this.truncated = false\n}\n\ninherits(FileStream, Readable)\n\nFileStream.prototype._read = function (n) {}\n\nmodule.exports = Multipart\n","'use strict'\n\nconst Decoder = require('../utils/Decoder')\nconst decodeText = require('../utils/decodeText')\nconst getLimit = require('../utils/getLimit')\n\nconst RE_CHARSET = /^charset$/i\n\nUrlEncoded.detect = /^application\\/x-www-form-urlencoded/i\nfunction UrlEncoded (boy, cfg) {\n const limits = cfg.limits\n const parsedConType = cfg.parsedConType\n this.boy = boy\n\n this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)\n this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100)\n this.fieldsLimit = getLimit(limits, 'fields', Infinity)\n\n let charset\n for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var\n if (Array.isArray(parsedConType[i]) &&\n RE_CHARSET.test(parsedConType[i][0])) {\n charset = parsedConType[i][1].toLowerCase()\n break\n }\n }\n\n if (charset === undefined) { charset = cfg.defCharset || 'utf8' }\n\n this.decoder = new Decoder()\n this.charset = charset\n this._fields = 0\n this._state = 'key'\n this._checkingBytes = true\n this._bytesKey = 0\n this._bytesVal = 0\n this._key = ''\n this._val = ''\n this._keyTrunc = false\n this._valTrunc = false\n this._hitLimit = false\n}\n\nUrlEncoded.prototype.write = function (data, cb) {\n if (this._fields === this.fieldsLimit) {\n if (!this.boy.hitFieldsLimit) {\n this.boy.hitFieldsLimit = true\n this.boy.emit('fieldsLimit')\n }\n return cb()\n }\n\n let idxeq; let idxamp; let i; let p = 0; const len = data.length\n\n while (p < len) {\n if (this._state === 'key') {\n idxeq = idxamp = undefined\n for (i = p; i < len; ++i) {\n if (!this._checkingBytes) { ++p }\n if (data[i] === 0x3D/* = */) {\n idxeq = i\n break\n } else if (data[i] === 0x26/* & */) {\n idxamp = i\n break\n }\n if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {\n this._hitLimit = true\n break\n } else if (this._checkingBytes) { ++this._bytesKey }\n }\n\n if (idxeq !== undefined) {\n // key with assignment\n if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) }\n this._state = 'val'\n\n this._hitLimit = false\n this._checkingBytes = true\n this._val = ''\n this._bytesVal = 0\n this._valTrunc = false\n this.decoder.reset()\n\n p = idxeq + 1\n } else if (idxamp !== undefined) {\n // key with no assignment\n ++this._fields\n let key; const keyTrunc = this._keyTrunc\n if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key }\n\n this._hitLimit = false\n this._checkingBytes = true\n this._key = ''\n this._bytesKey = 0\n this._keyTrunc = false\n this.decoder.reset()\n\n if (key.length) {\n this.boy.emit('field', decodeText(key, 'binary', this.charset),\n '',\n keyTrunc,\n false)\n }\n\n p = idxamp + 1\n if (this._fields === this.fieldsLimit) { return cb() }\n } else if (this._hitLimit) {\n // we may not have hit the actual limit if there are encoded bytes...\n if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) }\n p = i\n if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {\n // yep, we actually did hit the limit\n this._checkingBytes = false\n this._keyTrunc = true\n }\n } else {\n if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) }\n p = len\n }\n } else {\n idxamp = undefined\n for (i = p; i < len; ++i) {\n if (!this._checkingBytes) { ++p }\n if (data[i] === 0x26/* & */) {\n idxamp = i\n break\n }\n if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {\n this._hitLimit = true\n break\n } else if (this._checkingBytes) { ++this._bytesVal }\n }\n\n if (idxamp !== undefined) {\n ++this._fields\n if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) }\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n decodeText(this._val, 'binary', this.charset),\n this._keyTrunc,\n this._valTrunc)\n this._state = 'key'\n\n this._hitLimit = false\n this._checkingBytes = true\n this._key = ''\n this._bytesKey = 0\n this._keyTrunc = false\n this.decoder.reset()\n\n p = idxamp + 1\n if (this._fields === this.fieldsLimit) { return cb() }\n } else if (this._hitLimit) {\n // we may not have hit the actual limit if there are encoded bytes...\n if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) }\n p = i\n if ((this._val === '' && this.fieldSizeLimit === 0) ||\n (this._bytesVal = this._val.length) === this.fieldSizeLimit) {\n // yep, we actually did hit the limit\n this._checkingBytes = false\n this._valTrunc = true\n }\n } else {\n if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) }\n p = len\n }\n }\n }\n cb()\n}\n\nUrlEncoded.prototype.end = function () {\n if (this.boy._done) { return }\n\n if (this._state === 'key' && this._key.length > 0) {\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n '',\n this._keyTrunc,\n false)\n } else if (this._state === 'val') {\n this.boy.emit('field', decodeText(this._key, 'binary', this.charset),\n decodeText(this._val, 'binary', this.charset),\n this._keyTrunc,\n this._valTrunc)\n }\n this.boy._done = true\n this.boy.emit('finish')\n}\n\nmodule.exports = UrlEncoded\n","'use strict'\n\nconst RE_PLUS = /\\+/g\n\nconst HEX = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,\n 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n]\n\nfunction Decoder () {\n this.buffer = undefined\n}\nDecoder.prototype.write = function (str) {\n // Replace '+' with ' ' before decoding\n str = str.replace(RE_PLUS, ' ')\n let res = ''\n let i = 0; let p = 0; const len = str.length\n for (; i < len; ++i) {\n if (this.buffer !== undefined) {\n if (!HEX[str.charCodeAt(i)]) {\n res += '%' + this.buffer\n this.buffer = undefined\n --i // retry character\n } else {\n this.buffer += str[i]\n ++p\n if (this.buffer.length === 2) {\n res += String.fromCharCode(parseInt(this.buffer, 16))\n this.buffer = undefined\n }\n }\n } else if (str[i] === '%') {\n if (i > p) {\n res += str.substring(p, i)\n p = i\n }\n this.buffer = ''\n ++p\n }\n }\n if (p < len && this.buffer === undefined) { res += str.substring(p) }\n return res\n}\nDecoder.prototype.reset = function () {\n this.buffer = undefined\n}\n\nmodule.exports = Decoder\n","'use strict'\n\nmodule.exports = function basename (path) {\n if (typeof path !== 'string') { return '' }\n for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var\n switch (path.charCodeAt(i)) {\n case 0x2F: // '/'\n case 0x5C: // '\\'\n path = path.slice(i + 1)\n return (path === '..' || path === '.' ? '' : path)\n }\n }\n return (path === '..' || path === '.' ? '' : path)\n}\n","'use strict'\n\n// Node has always utf-8\nconst utf8Decoder = new TextDecoder('utf-8')\nconst textDecoders = new Map([\n ['utf-8', utf8Decoder],\n ['utf8', utf8Decoder]\n])\n\nfunction getDecoder (charset) {\n let lc\n while (true) {\n switch (charset) {\n case 'utf-8':\n case 'utf8':\n return decoders.utf8\n case 'latin1':\n case 'ascii': // TODO: Make these a separate, strict decoder?\n case 'us-ascii':\n case 'iso-8859-1':\n case 'iso8859-1':\n case 'iso88591':\n case 'iso_8859-1':\n case 'windows-1252':\n case 'iso_8859-1:1987':\n case 'cp1252':\n case 'x-cp1252':\n return decoders.latin1\n case 'utf16le':\n case 'utf-16le':\n case 'ucs2':\n case 'ucs-2':\n return decoders.utf16le\n case 'base64':\n return decoders.base64\n default:\n if (lc === undefined) {\n lc = true\n charset = charset.toLowerCase()\n continue\n }\n return decoders.other.bind(charset)\n }\n }\n}\n\nconst decoders = {\n utf8: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n return data.utf8Slice(0, data.length)\n },\n\n latin1: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n return data\n }\n return data.latin1Slice(0, data.length)\n },\n\n utf16le: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n return data.ucs2Slice(0, data.length)\n },\n\n base64: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n return data.base64Slice(0, data.length)\n },\n\n other: (data, sourceEncoding) => {\n if (data.length === 0) {\n return ''\n }\n if (typeof data === 'string') {\n data = Buffer.from(data, sourceEncoding)\n }\n\n if (textDecoders.has(this.toString())) {\n try {\n return textDecoders.get(this).decode(data)\n } catch {}\n }\n return typeof data === 'string'\n ? data\n : data.toString()\n }\n}\n\nfunction decodeText (text, sourceEncoding, destEncoding) {\n if (text) {\n return getDecoder(destEncoding)(text, sourceEncoding)\n }\n return text\n}\n\nmodule.exports = decodeText\n","'use strict'\n\nmodule.exports = function getLimit (limits, name, defaultLimit) {\n if (\n !limits ||\n limits[name] === undefined ||\n limits[name] === null\n ) { return defaultLimit }\n\n if (\n typeof limits[name] !== 'number' ||\n isNaN(limits[name])\n ) { throw new TypeError('Limit ' + name + ' is not a valid number') }\n\n return limits[name]\n}\n","/* eslint-disable object-property-newline */\n'use strict'\n\nconst decodeText = require('./decodeText')\n\nconst RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g\n\nconst EncodedLookup = {\n '%00': '\\x00', '%01': '\\x01', '%02': '\\x02', '%03': '\\x03', '%04': '\\x04',\n '%05': '\\x05', '%06': '\\x06', '%07': '\\x07', '%08': '\\x08', '%09': '\\x09',\n '%0a': '\\x0a', '%0A': '\\x0a', '%0b': '\\x0b', '%0B': '\\x0b', '%0c': '\\x0c',\n '%0C': '\\x0c', '%0d': '\\x0d', '%0D': '\\x0d', '%0e': '\\x0e', '%0E': '\\x0e',\n '%0f': '\\x0f', '%0F': '\\x0f', '%10': '\\x10', '%11': '\\x11', '%12': '\\x12',\n '%13': '\\x13', '%14': '\\x14', '%15': '\\x15', '%16': '\\x16', '%17': '\\x17',\n '%18': '\\x18', '%19': '\\x19', '%1a': '\\x1a', '%1A': '\\x1a', '%1b': '\\x1b',\n '%1B': '\\x1b', '%1c': '\\x1c', '%1C': '\\x1c', '%1d': '\\x1d', '%1D': '\\x1d',\n '%1e': '\\x1e', '%1E': '\\x1e', '%1f': '\\x1f', '%1F': '\\x1f', '%20': '\\x20',\n '%21': '\\x21', '%22': '\\x22', '%23': '\\x23', '%24': '\\x24', '%25': '\\x25',\n '%26': '\\x26', '%27': '\\x27', '%28': '\\x28', '%29': '\\x29', '%2a': '\\x2a',\n '%2A': '\\x2a', '%2b': '\\x2b', '%2B': '\\x2b', '%2c': '\\x2c', '%2C': '\\x2c',\n '%2d': '\\x2d', '%2D': '\\x2d', '%2e': '\\x2e', '%2E': '\\x2e', '%2f': '\\x2f',\n '%2F': '\\x2f', '%30': '\\x30', '%31': '\\x31', '%32': '\\x32', '%33': '\\x33',\n '%34': '\\x34', '%35': '\\x35', '%36': '\\x36', '%37': '\\x37', '%38': '\\x38',\n '%39': '\\x39', '%3a': '\\x3a', '%3A': '\\x3a', '%3b': '\\x3b', '%3B': '\\x3b',\n '%3c': '\\x3c', '%3C': '\\x3c', '%3d': '\\x3d', '%3D': '\\x3d', '%3e': '\\x3e',\n '%3E': '\\x3e', '%3f': '\\x3f', '%3F': '\\x3f', '%40': '\\x40', '%41': '\\x41',\n '%42': '\\x42', '%43': '\\x43', '%44': '\\x44', '%45': '\\x45', '%46': '\\x46',\n '%47': '\\x47', '%48': '\\x48', '%49': '\\x49', '%4a': '\\x4a', '%4A': '\\x4a',\n '%4b': '\\x4b', '%4B': '\\x4b', '%4c': '\\x4c', '%4C': '\\x4c', '%4d': '\\x4d',\n '%4D': '\\x4d', '%4e': '\\x4e', '%4E': '\\x4e', '%4f': '\\x4f', '%4F': '\\x4f',\n '%50': '\\x50', '%51': '\\x51', '%52': '\\x52', '%53': '\\x53', '%54': '\\x54',\n '%55': '\\x55', '%56': '\\x56', '%57': '\\x57', '%58': '\\x58', '%59': '\\x59',\n '%5a': '\\x5a', '%5A': '\\x5a', '%5b': '\\x5b', '%5B': '\\x5b', '%5c': '\\x5c',\n '%5C': '\\x5c', '%5d': '\\x5d', '%5D': '\\x5d', '%5e': '\\x5e', '%5E': '\\x5e',\n '%5f': '\\x5f', '%5F': '\\x5f', '%60': '\\x60', '%61': '\\x61', '%62': '\\x62',\n '%63': '\\x63', '%64': '\\x64', '%65': '\\x65', '%66': '\\x66', '%67': '\\x67',\n '%68': '\\x68', '%69': '\\x69', '%6a': '\\x6a', '%6A': '\\x6a', '%6b': '\\x6b',\n '%6B': '\\x6b', '%6c': '\\x6c', '%6C': '\\x6c', '%6d': '\\x6d', '%6D': '\\x6d',\n '%6e': '\\x6e', '%6E': '\\x6e', '%6f': '\\x6f', '%6F': '\\x6f', '%70': '\\x70',\n '%71': '\\x71', '%72': '\\x72', '%73': '\\x73', '%74': '\\x74', '%75': '\\x75',\n '%76': '\\x76', '%77': '\\x77', '%78': '\\x78', '%79': '\\x79', '%7a': '\\x7a',\n '%7A': '\\x7a', '%7b': '\\x7b', '%7B': '\\x7b', '%7c': '\\x7c', '%7C': '\\x7c',\n '%7d': '\\x7d', '%7D': '\\x7d', '%7e': '\\x7e', '%7E': '\\x7e', '%7f': '\\x7f',\n '%7F': '\\x7f', '%80': '\\x80', '%81': '\\x81', '%82': '\\x82', '%83': '\\x83',\n '%84': '\\x84', '%85': '\\x85', '%86': '\\x86', '%87': '\\x87', '%88': '\\x88',\n '%89': '\\x89', '%8a': '\\x8a', '%8A': '\\x8a', '%8b': '\\x8b', '%8B': '\\x8b',\n '%8c': '\\x8c', '%8C': '\\x8c', '%8d': '\\x8d', '%8D': '\\x8d', '%8e': '\\x8e',\n '%8E': '\\x8e', '%8f': '\\x8f', '%8F': '\\x8f', '%90': '\\x90', '%91': '\\x91',\n '%92': '\\x92', '%93': '\\x93', '%94': '\\x94', '%95': '\\x95', '%96': '\\x96',\n '%97': '\\x97', '%98': '\\x98', '%99': '\\x99', '%9a': '\\x9a', '%9A': '\\x9a',\n '%9b': '\\x9b', '%9B': '\\x9b', '%9c': '\\x9c', '%9C': '\\x9c', '%9d': '\\x9d',\n '%9D': '\\x9d', '%9e': '\\x9e', '%9E': '\\x9e', '%9f': '\\x9f', '%9F': '\\x9f',\n '%a0': '\\xa0', '%A0': '\\xa0', '%a1': '\\xa1', '%A1': '\\xa1', '%a2': '\\xa2',\n '%A2': '\\xa2', '%a3': '\\xa3', '%A3': '\\xa3', '%a4': '\\xa4', '%A4': '\\xa4',\n '%a5': '\\xa5', '%A5': '\\xa5', '%a6': '\\xa6', '%A6': '\\xa6', '%a7': '\\xa7',\n '%A7': '\\xa7', '%a8': '\\xa8', '%A8': '\\xa8', '%a9': '\\xa9', '%A9': '\\xa9',\n '%aa': '\\xaa', '%Aa': '\\xaa', '%aA': '\\xaa', '%AA': '\\xaa', '%ab': '\\xab',\n '%Ab': '\\xab', '%aB': '\\xab', '%AB': '\\xab', '%ac': '\\xac', '%Ac': '\\xac',\n '%aC': '\\xac', '%AC': '\\xac', '%ad': '\\xad', '%Ad': '\\xad', '%aD': '\\xad',\n '%AD': '\\xad', '%ae': '\\xae', '%Ae': '\\xae', '%aE': '\\xae', '%AE': '\\xae',\n '%af': '\\xaf', '%Af': '\\xaf', '%aF': '\\xaf', '%AF': '\\xaf', '%b0': '\\xb0',\n '%B0': '\\xb0', '%b1': '\\xb1', '%B1': '\\xb1', '%b2': '\\xb2', '%B2': '\\xb2',\n '%b3': '\\xb3', '%B3': '\\xb3', '%b4': '\\xb4', '%B4': '\\xb4', '%b5': '\\xb5',\n '%B5': '\\xb5', '%b6': '\\xb6', '%B6': '\\xb6', '%b7': '\\xb7', '%B7': '\\xb7',\n '%b8': '\\xb8', '%B8': '\\xb8', '%b9': '\\xb9', '%B9': '\\xb9', '%ba': '\\xba',\n '%Ba': '\\xba', '%bA': '\\xba', '%BA': '\\xba', '%bb': '\\xbb', '%Bb': '\\xbb',\n '%bB': '\\xbb', '%BB': '\\xbb', '%bc': '\\xbc', '%Bc': '\\xbc', '%bC': '\\xbc',\n '%BC': '\\xbc', '%bd': '\\xbd', '%Bd': '\\xbd', '%bD': '\\xbd', '%BD': '\\xbd',\n '%be': '\\xbe', '%Be': '\\xbe', '%bE': '\\xbe', '%BE': '\\xbe', '%bf': '\\xbf',\n '%Bf': '\\xbf', '%bF': '\\xbf', '%BF': '\\xbf', '%c0': '\\xc0', '%C0': '\\xc0',\n '%c1': '\\xc1', '%C1': '\\xc1', '%c2': '\\xc2', '%C2': '\\xc2', '%c3': '\\xc3',\n '%C3': '\\xc3', '%c4': '\\xc4', '%C4': '\\xc4', '%c5': '\\xc5', '%C5': '\\xc5',\n '%c6': '\\xc6', '%C6': '\\xc6', '%c7': '\\xc7', '%C7': '\\xc7', '%c8': '\\xc8',\n '%C8': '\\xc8', '%c9': '\\xc9', '%C9': '\\xc9', '%ca': '\\xca', '%Ca': '\\xca',\n '%cA': '\\xca', '%CA': '\\xca', '%cb': '\\xcb', '%Cb': '\\xcb', '%cB': '\\xcb',\n '%CB': '\\xcb', '%cc': '\\xcc', '%Cc': '\\xcc', '%cC': '\\xcc', '%CC': '\\xcc',\n '%cd': '\\xcd', '%Cd': '\\xcd', '%cD': '\\xcd', '%CD': '\\xcd', '%ce': '\\xce',\n '%Ce': '\\xce', '%cE': '\\xce', '%CE': '\\xce', '%cf': '\\xcf', '%Cf': '\\xcf',\n '%cF': '\\xcf', '%CF': '\\xcf', '%d0': '\\xd0', '%D0': '\\xd0', '%d1': '\\xd1',\n '%D1': '\\xd1', '%d2': '\\xd2', '%D2': '\\xd2', '%d3': '\\xd3', '%D3': '\\xd3',\n '%d4': '\\xd4', '%D4': '\\xd4', '%d5': '\\xd5', '%D5': '\\xd5', '%d6': '\\xd6',\n '%D6': '\\xd6', '%d7': '\\xd7', '%D7': '\\xd7', '%d8': '\\xd8', '%D8': '\\xd8',\n '%d9': '\\xd9', '%D9': '\\xd9', '%da': '\\xda', '%Da': '\\xda', '%dA': '\\xda',\n '%DA': '\\xda', '%db': '\\xdb', '%Db': '\\xdb', '%dB': '\\xdb', '%DB': '\\xdb',\n '%dc': '\\xdc', '%Dc': '\\xdc', '%dC': '\\xdc', '%DC': '\\xdc', '%dd': '\\xdd',\n '%Dd': '\\xdd', '%dD': '\\xdd', '%DD': '\\xdd', '%de': '\\xde', '%De': '\\xde',\n '%dE': '\\xde', '%DE': '\\xde', '%df': '\\xdf', '%Df': '\\xdf', '%dF': '\\xdf',\n '%DF': '\\xdf', '%e0': '\\xe0', '%E0': '\\xe0', '%e1': '\\xe1', '%E1': '\\xe1',\n '%e2': '\\xe2', '%E2': '\\xe2', '%e3': '\\xe3', '%E3': '\\xe3', '%e4': '\\xe4',\n '%E4': '\\xe4', '%e5': '\\xe5', '%E5': '\\xe5', '%e6': '\\xe6', '%E6': '\\xe6',\n '%e7': '\\xe7', '%E7': '\\xe7', '%e8': '\\xe8', '%E8': '\\xe8', '%e9': '\\xe9',\n '%E9': '\\xe9', '%ea': '\\xea', '%Ea': '\\xea', '%eA': '\\xea', '%EA': '\\xea',\n '%eb': '\\xeb', '%Eb': '\\xeb', '%eB': '\\xeb', '%EB': '\\xeb', '%ec': '\\xec',\n '%Ec': '\\xec', '%eC': '\\xec', '%EC': '\\xec', '%ed': '\\xed', '%Ed': '\\xed',\n '%eD': '\\xed', '%ED': '\\xed', '%ee': '\\xee', '%Ee': '\\xee', '%eE': '\\xee',\n '%EE': '\\xee', '%ef': '\\xef', '%Ef': '\\xef', '%eF': '\\xef', '%EF': '\\xef',\n '%f0': '\\xf0', '%F0': '\\xf0', '%f1': '\\xf1', '%F1': '\\xf1', '%f2': '\\xf2',\n '%F2': '\\xf2', '%f3': '\\xf3', '%F3': '\\xf3', '%f4': '\\xf4', '%F4': '\\xf4',\n '%f5': '\\xf5', '%F5': '\\xf5', '%f6': '\\xf6', '%F6': '\\xf6', '%f7': '\\xf7',\n '%F7': '\\xf7', '%f8': '\\xf8', '%F8': '\\xf8', '%f9': '\\xf9', '%F9': '\\xf9',\n '%fa': '\\xfa', '%Fa': '\\xfa', '%fA': '\\xfa', '%FA': '\\xfa', '%fb': '\\xfb',\n '%Fb': '\\xfb', '%fB': '\\xfb', '%FB': '\\xfb', '%fc': '\\xfc', '%Fc': '\\xfc',\n '%fC': '\\xfc', '%FC': '\\xfc', '%fd': '\\xfd', '%Fd': '\\xfd', '%fD': '\\xfd',\n '%FD': '\\xfd', '%fe': '\\xfe', '%Fe': '\\xfe', '%fE': '\\xfe', '%FE': '\\xfe',\n '%ff': '\\xff', '%Ff': '\\xff', '%fF': '\\xff', '%FF': '\\xff'\n}\n\nfunction encodedReplacer (match) {\n return EncodedLookup[match]\n}\n\nconst STATE_KEY = 0\nconst STATE_VALUE = 1\nconst STATE_CHARSET = 2\nconst STATE_LANG = 3\n\nfunction parseParams (str) {\n const res = []\n let state = STATE_KEY\n let charset = ''\n let inquote = false\n let escaping = false\n let p = 0\n let tmp = ''\n const len = str.length\n\n for (var i = 0; i < len; ++i) { // eslint-disable-line no-var\n const char = str[i]\n if (char === '\\\\' && inquote) {\n if (escaping) { escaping = false } else {\n escaping = true\n continue\n }\n } else if (char === '\"') {\n if (!escaping) {\n if (inquote) {\n inquote = false\n state = STATE_KEY\n } else { inquote = true }\n continue\n } else { escaping = false }\n } else {\n if (escaping && inquote) { tmp += '\\\\' }\n escaping = false\n if ((state === STATE_CHARSET || state === STATE_LANG) && char === \"'\") {\n if (state === STATE_CHARSET) {\n state = STATE_LANG\n charset = tmp.substring(1)\n } else { state = STATE_VALUE }\n tmp = ''\n continue\n } else if (state === STATE_KEY &&\n (char === '*' || char === '=') &&\n res.length) {\n state = char === '*'\n ? STATE_CHARSET\n : STATE_VALUE\n res[p] = [tmp, undefined]\n tmp = ''\n continue\n } else if (!inquote && char === ';') {\n state = STATE_KEY\n if (charset) {\n if (tmp.length) {\n tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),\n 'binary',\n charset)\n }\n charset = ''\n } else if (tmp.length) {\n tmp = decodeText(tmp, 'binary', 'utf8')\n }\n if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp }\n tmp = ''\n ++p\n continue\n } else if (!inquote && (char === ' ' || char === '\\t')) { continue }\n }\n tmp += char\n }\n if (charset && tmp.length) {\n tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),\n 'binary',\n charset)\n } else if (tmp) {\n tmp = decodeText(tmp, 'binary', 'utf8')\n }\n\n if (res[p] === undefined) {\n if (tmp) { res[p] = tmp }\n } else { res[p][1] = tmp }\n\n return res\n}\n\nmodule.exports = parseParams\n","'use strict';\n\nvar vm = require('vm');\n\n/**\n * @implements {IHooks}\n */\nclass Hooks {\n /**\n * @callback HookCallback\n * @this {*|Jsep} this\n * @param {Jsep} env\n * @returns: void\n */\n /**\n * Adds the given callback to the list of callbacks for the given hook.\n *\n * The callback will be invoked when the hook it is registered for is run.\n *\n * One callback function can be registered to multiple hooks and the same hook multiple times.\n *\n * @param {string|object} name The name of the hook, or an object of callbacks keyed by name\n * @param {HookCallback|boolean} callback The callback function which is given environment variables.\n * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)\n * @public\n */\n add(name, callback, first) {\n if (typeof arguments[0] != 'string') {\n // Multiple hook callbacks, keyed by name\n for (let name in arguments[0]) {\n this.add(name, arguments[0][name], arguments[1]);\n }\n } else {\n (Array.isArray(name) ? name : [name]).forEach(function (name) {\n this[name] = this[name] || [];\n if (callback) {\n this[name][first ? 'unshift' : 'push'](callback);\n }\n }, this);\n }\n }\n\n /**\n * Runs a hook invoking all registered callbacks with the given environment variables.\n *\n * Callbacks will be invoked synchronously and in the order in which they were registered.\n *\n * @param {string} name The name of the hook.\n * @param {Object} env The environment variables of the hook passed to all callbacks registered.\n * @public\n */\n run(name, env) {\n this[name] = this[name] || [];\n this[name].forEach(function (callback) {\n callback.call(env && env.context ? env.context : env, env);\n });\n }\n}\n\n/**\n * @implements {IPlugins}\n */\nclass Plugins {\n constructor(jsep) {\n this.jsep = jsep;\n this.registered = {};\n }\n\n /**\n * @callback PluginSetup\n * @this {Jsep} jsep\n * @returns: void\n */\n /**\n * Adds the given plugin(s) to the registry\n *\n * @param {object} plugins\n * @param {string} plugins.name The name of the plugin\n * @param {PluginSetup} plugins.init The init function\n * @public\n */\n register(...plugins) {\n plugins.forEach(plugin => {\n if (typeof plugin !== 'object' || !plugin.name || !plugin.init) {\n throw new Error('Invalid JSEP plugin format');\n }\n if (this.registered[plugin.name]) {\n // already registered. Ignore.\n return;\n }\n plugin.init(this.jsep);\n this.registered[plugin.name] = plugin;\n });\n }\n}\n\n// JavaScript Expression Parser (JSEP) 1.4.0\n\nclass Jsep {\n /**\n * @returns {string}\n */\n static get version() {\n // To be filled in by the template\n return '1.4.0';\n }\n\n /**\n * @returns {string}\n */\n static toString() {\n return 'JavaScript Expression Parser (JSEP) v' + Jsep.version;\n }\n // ==================== CONFIG ================================\n /**\n * @method addUnaryOp\n * @param {string} op_name The name of the unary op to add\n * @returns {Jsep}\n */\n static addUnaryOp(op_name) {\n Jsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);\n Jsep.unary_ops[op_name] = 1;\n return Jsep;\n }\n\n /**\n * @method jsep.addBinaryOp\n * @param {string} op_name The name of the binary op to add\n * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence\n * @param {boolean} [isRightAssociative=false] whether operator is right-associative\n * @returns {Jsep}\n */\n static addBinaryOp(op_name, precedence, isRightAssociative) {\n Jsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);\n Jsep.binary_ops[op_name] = precedence;\n if (isRightAssociative) {\n Jsep.right_associative.add(op_name);\n } else {\n Jsep.right_associative.delete(op_name);\n }\n return Jsep;\n }\n\n /**\n * @method addIdentifierChar\n * @param {string} char The additional character to treat as a valid part of an identifier\n * @returns {Jsep}\n */\n static addIdentifierChar(char) {\n Jsep.additional_identifier_chars.add(char);\n return Jsep;\n }\n\n /**\n * @method addLiteral\n * @param {string} literal_name The name of the literal to add\n * @param {*} literal_value The value of the literal\n * @returns {Jsep}\n */\n static addLiteral(literal_name, literal_value) {\n Jsep.literals[literal_name] = literal_value;\n return Jsep;\n }\n\n /**\n * @method removeUnaryOp\n * @param {string} op_name The name of the unary op to remove\n * @returns {Jsep}\n */\n static removeUnaryOp(op_name) {\n delete Jsep.unary_ops[op_name];\n if (op_name.length === Jsep.max_unop_len) {\n Jsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\n }\n return Jsep;\n }\n\n /**\n * @method removeAllUnaryOps\n * @returns {Jsep}\n */\n static removeAllUnaryOps() {\n Jsep.unary_ops = {};\n Jsep.max_unop_len = 0;\n return Jsep;\n }\n\n /**\n * @method removeIdentifierChar\n * @param {string} char The additional character to stop treating as a valid part of an identifier\n * @returns {Jsep}\n */\n static removeIdentifierChar(char) {\n Jsep.additional_identifier_chars.delete(char);\n return Jsep;\n }\n\n /**\n * @method removeBinaryOp\n * @param {string} op_name The name of the binary op to remove\n * @returns {Jsep}\n */\n static removeBinaryOp(op_name) {\n delete Jsep.binary_ops[op_name];\n if (op_name.length === Jsep.max_binop_len) {\n Jsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n }\n Jsep.right_associative.delete(op_name);\n return Jsep;\n }\n\n /**\n * @method removeAllBinaryOps\n * @returns {Jsep}\n */\n static removeAllBinaryOps() {\n Jsep.binary_ops = {};\n Jsep.max_binop_len = 0;\n return Jsep;\n }\n\n /**\n * @method removeLiteral\n * @param {string} literal_name The name of the literal to remove\n * @returns {Jsep}\n */\n static removeLiteral(literal_name) {\n delete Jsep.literals[literal_name];\n return Jsep;\n }\n\n /**\n * @method removeAllLiterals\n * @returns {Jsep}\n */\n static removeAllLiterals() {\n Jsep.literals = {};\n return Jsep;\n }\n // ==================== END CONFIG ============================\n\n /**\n * @returns {string}\n */\n get char() {\n return this.expr.charAt(this.index);\n }\n\n /**\n * @returns {number}\n */\n get code() {\n return this.expr.charCodeAt(this.index);\n }\n /**\n * @param {string} expr a string with the passed in express\n * @returns Jsep\n */\n constructor(expr) {\n // `index` stores the character number we are currently at\n // All of the gobbles below will modify `index` as we move along\n this.expr = expr;\n this.index = 0;\n }\n\n /**\n * static top-level parser\n * @returns {jsep.Expression}\n */\n static parse(expr) {\n return new Jsep(expr).parse();\n }\n\n /**\n * Get the longest key length of any object\n * @param {object} obj\n * @returns {number}\n */\n static getMaxKeyLen(obj) {\n return Math.max(0, ...Object.keys(obj).map(k => k.length));\n }\n\n /**\n * `ch` is a character code in the next three functions\n * @param {number} ch\n * @returns {boolean}\n */\n static isDecimalDigit(ch) {\n return ch >= 48 && ch <= 57; // 0...9\n }\n\n /**\n * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.\n * @param {string} op_val\n * @returns {number}\n */\n static binaryPrecedence(op_val) {\n return Jsep.binary_ops[op_val] || 0;\n }\n\n /**\n * Looks for start of identifier\n * @param {number} ch\n * @returns {boolean}\n */\n static isIdentifierStart(ch) {\n return ch >= 65 && ch <= 90 ||\n // A...Z\n ch >= 97 && ch <= 122 ||\n // a...z\n ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)] ||\n // any non-ASCII that is not an operator\n Jsep.additional_identifier_chars.has(String.fromCharCode(ch)); // additional characters\n }\n\n /**\n * @param {number} ch\n * @returns {boolean}\n */\n static isIdentifierPart(ch) {\n return Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);\n }\n\n /**\n * throw error at index of the expression\n * @param {string} message\n * @throws\n */\n throwError(message) {\n const error = new Error(message + ' at character ' + this.index);\n error.index = this.index;\n error.description = message;\n throw error;\n }\n\n /**\n * Run a given hook\n * @param {string} name\n * @param {jsep.Expression|false} [node]\n * @returns {?jsep.Expression}\n */\n runHook(name, node) {\n if (Jsep.hooks[name]) {\n const env = {\n context: this,\n node\n };\n Jsep.hooks.run(name, env);\n return env.node;\n }\n return node;\n }\n\n /**\n * Runs a given hook until one returns a node\n * @param {string} name\n * @returns {?jsep.Expression}\n */\n searchHook(name) {\n if (Jsep.hooks[name]) {\n const env = {\n context: this\n };\n Jsep.hooks[name].find(function (callback) {\n callback.call(env.context, env);\n return env.node;\n });\n return env.node;\n }\n }\n\n /**\n * Push `index` up to the next non-space character\n */\n gobbleSpaces() {\n let ch = this.code;\n // Whitespace\n while (ch === Jsep.SPACE_CODE || ch === Jsep.TAB_CODE || ch === Jsep.LF_CODE || ch === Jsep.CR_CODE) {\n ch = this.expr.charCodeAt(++this.index);\n }\n this.runHook('gobble-spaces');\n }\n\n /**\n * Top-level method to parse all expressions and returns compound or single node\n * @returns {jsep.Expression}\n */\n parse() {\n this.runHook('before-all');\n const nodes = this.gobbleExpressions();\n\n // If there's only one expression just try returning the expression\n const node = nodes.length === 1 ? nodes[0] : {\n type: Jsep.COMPOUND,\n body: nodes\n };\n return this.runHook('after-all', node);\n }\n\n /**\n * top-level parser (but can be reused within as well)\n * @param {number} [untilICode]\n * @returns {jsep.Expression[]}\n */\n gobbleExpressions(untilICode) {\n let nodes = [],\n ch_i,\n node;\n while (this.index < this.expr.length) {\n ch_i = this.code;\n\n // Expressions can be separated by semicolons, commas, or just inferred without any\n // separators\n if (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {\n this.index++; // ignore separators\n } else {\n // Try to gobble each expression individually\n if (node = this.gobbleExpression()) {\n nodes.push(node);\n // If we weren't able to find a binary expression and are out of room, then\n // the expression passed in probably has too much\n } else if (this.index < this.expr.length) {\n if (ch_i === untilICode) {\n break;\n }\n this.throwError('Unexpected \"' + this.char + '\"');\n }\n }\n }\n return nodes;\n }\n\n /**\n * The main parsing function.\n * @returns {?jsep.Expression}\n */\n gobbleExpression() {\n const node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();\n this.gobbleSpaces();\n return this.runHook('after-expression', node);\n }\n\n /**\n * Search for the operation portion of the string (e.g. `+`, `===`)\n * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n * and move down from 3 to 2 to 1 character until a matching binary operation is found\n * then, return that binary operation\n * @returns {string|boolean}\n */\n gobbleBinaryOp() {\n this.gobbleSpaces();\n let to_check = this.expr.substr(this.index, Jsep.max_binop_len);\n let tc_len = to_check.length;\n while (tc_len > 0) {\n // Don't accept a binary op when it is an identifier.\n // Binary ops that start with a identifier-valid character must be followed\n // by a non identifier-part valid character\n if (Jsep.binary_ops.hasOwnProperty(to_check) && (!Jsep.isIdentifierStart(this.code) || this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))) {\n this.index += tc_len;\n return to_check;\n }\n to_check = to_check.substr(0, --tc_len);\n }\n return false;\n }\n\n /**\n * This function is responsible for gobbling an individual expression,\n * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n * @returns {?jsep.BinaryExpression}\n */\n gobbleBinaryExpression() {\n let node, biop, prec, stack, biop_info, left, right, i, cur_biop;\n\n // First, try to get the leftmost thing\n // Then, check to see if there's a binary operator operating on that leftmost thing\n // Don't gobbleBinaryOp without a left-hand-side\n left = this.gobbleToken();\n if (!left) {\n return left;\n }\n biop = this.gobbleBinaryOp();\n\n // If there wasn't a binary operator, just return the leftmost node\n if (!biop) {\n return left;\n }\n\n // Otherwise, we need to start a stack to properly place the binary operations in their\n // precedence structure\n biop_info = {\n value: biop,\n prec: Jsep.binaryPrecedence(biop),\n right_a: Jsep.right_associative.has(biop)\n };\n right = this.gobbleToken();\n if (!right) {\n this.throwError(\"Expected expression after \" + biop);\n }\n stack = [left, biop_info, right];\n\n // Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n while (biop = this.gobbleBinaryOp()) {\n prec = Jsep.binaryPrecedence(biop);\n if (prec === 0) {\n this.index -= biop.length;\n break;\n }\n biop_info = {\n value: biop,\n prec,\n right_a: Jsep.right_associative.has(biop)\n };\n cur_biop = biop;\n\n // Reduce: make a binary expression from the three topmost entries.\n const comparePrev = prev => biop_info.right_a && prev.right_a ? prec > prev.prec : prec <= prev.prec;\n while (stack.length > 2 && comparePrev(stack[stack.length - 2])) {\n right = stack.pop();\n biop = stack.pop().value;\n left = stack.pop();\n node = {\n type: Jsep.BINARY_EXP,\n operator: biop,\n left,\n right\n };\n stack.push(node);\n }\n node = this.gobbleToken();\n if (!node) {\n this.throwError(\"Expected expression after \" + cur_biop);\n }\n stack.push(biop_info, node);\n }\n i = stack.length - 1;\n node = stack[i];\n while (i > 1) {\n node = {\n type: Jsep.BINARY_EXP,\n operator: stack[i - 1].value,\n left: stack[i - 2],\n right: node\n };\n i -= 2;\n }\n return node;\n }\n\n /**\n * An individual part of a binary expression:\n * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n * @returns {boolean|jsep.Expression}\n */\n gobbleToken() {\n let ch, to_check, tc_len, node;\n this.gobbleSpaces();\n node = this.searchHook('gobble-token');\n if (node) {\n return this.runHook('after-token', node);\n }\n ch = this.code;\n if (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {\n // Char code 46 is a dot `.` which can start off a numeric literal\n return this.gobbleNumericLiteral();\n }\n if (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {\n // Single or double quotes\n node = this.gobbleStringLiteral();\n } else if (ch === Jsep.OBRACK_CODE) {\n node = this.gobbleArray();\n } else {\n to_check = this.expr.substr(this.index, Jsep.max_unop_len);\n tc_len = to_check.length;\n while (tc_len > 0) {\n // Don't accept an unary op when it is an identifier.\n // Unary ops that start with a identifier-valid character must be followed\n // by a non identifier-part valid character\n if (Jsep.unary_ops.hasOwnProperty(to_check) && (!Jsep.isIdentifierStart(this.code) || this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))) {\n this.index += tc_len;\n const argument = this.gobbleToken();\n if (!argument) {\n this.throwError('missing unaryOp argument');\n }\n return this.runHook('after-token', {\n type: Jsep.UNARY_EXP,\n operator: to_check,\n argument,\n prefix: true\n });\n }\n to_check = to_check.substr(0, --tc_len);\n }\n if (Jsep.isIdentifierStart(ch)) {\n node = this.gobbleIdentifier();\n if (Jsep.literals.hasOwnProperty(node.name)) {\n node = {\n type: Jsep.LITERAL,\n value: Jsep.literals[node.name],\n raw: node.name\n };\n } else if (node.name === Jsep.this_str) {\n node = {\n type: Jsep.THIS_EXP\n };\n }\n } else if (ch === Jsep.OPAREN_CODE) {\n // open parenthesis\n node = this.gobbleGroup();\n }\n }\n if (!node) {\n return this.runHook('after-token', false);\n }\n node = this.gobbleTokenProperty(node);\n return this.runHook('after-token', node);\n }\n\n /**\n * Gobble properties of of identifiers/strings/arrays/groups.\n * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n * It also gobbles function calls:\n * e.g. `Math.acos(obj.angle)`\n * @param {jsep.Expression} node\n * @returns {jsep.Expression}\n */\n gobbleTokenProperty(node) {\n this.gobbleSpaces();\n let ch = this.code;\n while (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE || ch === Jsep.QUMARK_CODE) {\n let optional;\n if (ch === Jsep.QUMARK_CODE) {\n if (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) {\n break;\n }\n optional = true;\n this.index += 2;\n this.gobbleSpaces();\n ch = this.code;\n }\n this.index++;\n if (ch === Jsep.OBRACK_CODE) {\n node = {\n type: Jsep.MEMBER_EXP,\n computed: true,\n object: node,\n property: this.gobbleExpression()\n };\n if (!node.property) {\n this.throwError('Unexpected \"' + this.char + '\"');\n }\n this.gobbleSpaces();\n ch = this.code;\n if (ch !== Jsep.CBRACK_CODE) {\n this.throwError('Unclosed [');\n }\n this.index++;\n } else if (ch === Jsep.OPAREN_CODE) {\n // A function call is being made; gobble all the arguments\n node = {\n type: Jsep.CALL_EXP,\n 'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),\n callee: node\n };\n } else if (ch === Jsep.PERIOD_CODE || optional) {\n if (optional) {\n this.index--;\n }\n this.gobbleSpaces();\n node = {\n type: Jsep.MEMBER_EXP,\n computed: false,\n object: node,\n property: this.gobbleIdentifier()\n };\n }\n if (optional) {\n node.optional = true;\n } // else leave undefined for compatibility with esprima\n\n this.gobbleSpaces();\n ch = this.code;\n }\n return node;\n }\n\n /**\n * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n * @returns {jsep.Literal}\n */\n gobbleNumericLiteral() {\n let number = '',\n ch,\n chCode;\n while (Jsep.isDecimalDigit(this.code)) {\n number += this.expr.charAt(this.index++);\n }\n if (this.code === Jsep.PERIOD_CODE) {\n // can start with a decimal marker\n number += this.expr.charAt(this.index++);\n while (Jsep.isDecimalDigit(this.code)) {\n number += this.expr.charAt(this.index++);\n }\n }\n ch = this.char;\n if (ch === 'e' || ch === 'E') {\n // exponent marker\n number += this.expr.charAt(this.index++);\n ch = this.char;\n if (ch === '+' || ch === '-') {\n // exponent sign\n number += this.expr.charAt(this.index++);\n }\n while (Jsep.isDecimalDigit(this.code)) {\n // exponent itself\n number += this.expr.charAt(this.index++);\n }\n if (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1))) {\n this.throwError('Expected exponent (' + number + this.char + ')');\n }\n }\n chCode = this.code;\n\n // Check to make sure this isn't a variable name that start with a number (123abc)\n if (Jsep.isIdentifierStart(chCode)) {\n this.throwError('Variable names cannot start with a number (' + number + this.char + ')');\n } else if (chCode === Jsep.PERIOD_CODE || number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE) {\n this.throwError('Unexpected period');\n }\n return {\n type: Jsep.LITERAL,\n value: parseFloat(number),\n raw: number\n };\n }\n\n /**\n * Parses a string literal, staring with single or double quotes with basic support for escape codes\n * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n * @returns {jsep.Literal}\n */\n gobbleStringLiteral() {\n let str = '';\n const startIndex = this.index;\n const quote = this.expr.charAt(this.index++);\n let closed = false;\n while (this.index < this.expr.length) {\n let ch = this.expr.charAt(this.index++);\n if (ch === quote) {\n closed = true;\n break;\n } else if (ch === '\\\\') {\n // Check for all of the common escape codes\n ch = this.expr.charAt(this.index++);\n switch (ch) {\n case 'n':\n str += '\\n';\n break;\n case 'r':\n str += '\\r';\n break;\n case 't':\n str += '\\t';\n break;\n case 'b':\n str += '\\b';\n break;\n case 'f':\n str += '\\f';\n break;\n case 'v':\n str += '\\x0B';\n break;\n default:\n str += ch;\n }\n } else {\n str += ch;\n }\n }\n if (!closed) {\n this.throwError('Unclosed quote after \"' + str + '\"');\n }\n return {\n type: Jsep.LITERAL,\n value: str,\n raw: this.expr.substring(startIndex, this.index)\n };\n }\n\n /**\n * Gobbles only identifiers\n * e.g.: `foo`, `_value`, `$x1`\n * Also, this function checks if that identifier is a literal:\n * (e.g. `true`, `false`, `null`) or `this`\n * @returns {jsep.Identifier}\n */\n gobbleIdentifier() {\n let ch = this.code,\n start = this.index;\n if (Jsep.isIdentifierStart(ch)) {\n this.index++;\n } else {\n this.throwError('Unexpected ' + this.char);\n }\n while (this.index < this.expr.length) {\n ch = this.code;\n if (Jsep.isIdentifierPart(ch)) {\n this.index++;\n } else {\n break;\n }\n }\n return {\n type: Jsep.IDENTIFIER,\n name: this.expr.slice(start, this.index)\n };\n }\n\n /**\n * Gobbles a list of arguments within the context of a function call\n * or array literal. This function also assumes that the opening character\n * `(` or `[` has already been gobbled, and gobbles expressions and commas\n * until the terminator character `)` or `]` is encountered.\n * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n * @param {number} termination\n * @returns {jsep.Expression[]}\n */\n gobbleArguments(termination) {\n const args = [];\n let closed = false;\n let separator_count = 0;\n while (this.index < this.expr.length) {\n this.gobbleSpaces();\n let ch_i = this.code;\n if (ch_i === termination) {\n // done parsing\n closed = true;\n this.index++;\n if (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length) {\n this.throwError('Unexpected token ' + String.fromCharCode(termination));\n }\n break;\n } else if (ch_i === Jsep.COMMA_CODE) {\n // between expressions\n this.index++;\n separator_count++;\n if (separator_count !== args.length) {\n // missing argument\n if (termination === Jsep.CPAREN_CODE) {\n this.throwError('Unexpected token ,');\n } else if (termination === Jsep.CBRACK_CODE) {\n for (let arg = args.length; arg < separator_count; arg++) {\n args.push(null);\n }\n }\n }\n } else if (args.length !== separator_count && separator_count !== 0) {\n // NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments\n this.throwError('Expected comma');\n } else {\n const node = this.gobbleExpression();\n if (!node || node.type === Jsep.COMPOUND) {\n this.throwError('Expected comma');\n }\n args.push(node);\n }\n }\n if (!closed) {\n this.throwError('Expected ' + String.fromCharCode(termination));\n }\n return args;\n }\n\n /**\n * Responsible for parsing a group of things within parentheses `()`\n * that have no identifier in front (so not a function call)\n * This function assumes that it needs to gobble the opening parenthesis\n * and then tries to gobble everything within that parenthesis, assuming\n * that the next thing it should see is the close parenthesis. If not,\n * then the expression probably doesn't have a `)`\n * @returns {boolean|jsep.Expression}\n */\n gobbleGroup() {\n this.index++;\n let nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);\n if (this.code === Jsep.CPAREN_CODE) {\n this.index++;\n if (nodes.length === 1) {\n return nodes[0];\n } else if (!nodes.length) {\n return false;\n } else {\n return {\n type: Jsep.SEQUENCE_EXP,\n expressions: nodes\n };\n }\n } else {\n this.throwError('Unclosed (');\n }\n }\n\n /**\n * Responsible for parsing Array literals `[1, 2, 3]`\n * This function assumes that it needs to gobble the opening bracket\n * and then tries to gobble the expressions as arguments.\n * @returns {jsep.ArrayExpression}\n */\n gobbleArray() {\n this.index++;\n return {\n type: Jsep.ARRAY_EXP,\n elements: this.gobbleArguments(Jsep.CBRACK_CODE)\n };\n }\n}\n\n// Static fields:\nconst hooks = new Hooks();\nObject.assign(Jsep, {\n hooks,\n plugins: new Plugins(Jsep),\n // Node Types\n // ----------\n // This is the full set of types that any JSEP node can be.\n // Store them here to save space when minified\n COMPOUND: 'Compound',\n SEQUENCE_EXP: 'SequenceExpression',\n IDENTIFIER: 'Identifier',\n MEMBER_EXP: 'MemberExpression',\n LITERAL: 'Literal',\n THIS_EXP: 'ThisExpression',\n CALL_EXP: 'CallExpression',\n UNARY_EXP: 'UnaryExpression',\n BINARY_EXP: 'BinaryExpression',\n ARRAY_EXP: 'ArrayExpression',\n TAB_CODE: 9,\n LF_CODE: 10,\n CR_CODE: 13,\n SPACE_CODE: 32,\n PERIOD_CODE: 46,\n // '.'\n COMMA_CODE: 44,\n // ','\n SQUOTE_CODE: 39,\n // single quote\n DQUOTE_CODE: 34,\n // double quotes\n OPAREN_CODE: 40,\n // (\n CPAREN_CODE: 41,\n // )\n OBRACK_CODE: 91,\n // [\n CBRACK_CODE: 93,\n // ]\n QUMARK_CODE: 63,\n // ?\n SEMCOL_CODE: 59,\n // ;\n COLON_CODE: 58,\n // :\n\n // Operations\n // ----------\n // Use a quickly-accessible map to store all of the unary operators\n // Values are set to `1` (it really doesn't matter)\n unary_ops: {\n '-': 1,\n '!': 1,\n '~': 1,\n '+': 1\n },\n // Also use a map for the binary operations but set their values to their\n // binary precedence for quick reference (higher number = higher precedence)\n // see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\n binary_ops: {\n '||': 1,\n '??': 1,\n '&&': 2,\n '|': 3,\n '^': 4,\n '&': 5,\n '==': 6,\n '!=': 6,\n '===': 6,\n '!==': 6,\n '<': 7,\n '>': 7,\n '<=': 7,\n '>=': 7,\n '<<': 8,\n '>>': 8,\n '>>>': 8,\n '+': 9,\n '-': 9,\n '*': 10,\n '/': 10,\n '%': 10,\n '**': 11\n },\n // sets specific binary_ops as right-associative\n right_associative: new Set(['**']),\n // Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)\n additional_identifier_chars: new Set(['$', '_']),\n // Literals\n // ----------\n // Store the values to return for the various literals we may encounter\n literals: {\n 'true': true,\n 'false': false,\n 'null': null\n },\n // Except for `this`, which is special. This could be changed to something like `'self'` as well\n this_str: 'this'\n});\nJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\nJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\n// Backward Compatibility:\nconst jsep = expr => new Jsep(expr).parse();\nconst stdClassProps = Object.getOwnPropertyNames(class Test {});\nObject.getOwnPropertyNames(Jsep).filter(prop => !stdClassProps.includes(prop) && jsep[prop] === undefined).forEach(m => {\n jsep[m] = Jsep[m];\n});\njsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');\n\nconst CONDITIONAL_EXP = 'ConditionalExpression';\nvar ternary = {\n name: 'ternary',\n init(jsep) {\n // Ternary expression: test ? consequent : alternate\n jsep.hooks.add('after-expression', function gobbleTernary(env) {\n if (env.node && this.code === jsep.QUMARK_CODE) {\n this.index++;\n const test = env.node;\n const consequent = this.gobbleExpression();\n if (!consequent) {\n this.throwError('Expected expression');\n }\n this.gobbleSpaces();\n if (this.code === jsep.COLON_CODE) {\n this.index++;\n const alternate = this.gobbleExpression();\n if (!alternate) {\n this.throwError('Expected expression');\n }\n env.node = {\n type: CONDITIONAL_EXP,\n test,\n consequent,\n alternate\n };\n\n // check for operators of higher priority than ternary (i.e. assignment)\n // jsep sets || at 1, and assignment at 0.9, and conditional should be between them\n if (test.operator && jsep.binary_ops[test.operator] <= 0.9) {\n let newTest = test;\n while (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {\n newTest = newTest.right;\n }\n env.node.test = newTest.right;\n newTest.right = env.node;\n env.node = test;\n }\n } else {\n this.throwError('Expected :');\n }\n }\n });\n }\n};\n\n// Add default plugins:\n\njsep.plugins.register(ternary);\n\nconst FSLASH_CODE = 47; // '/'\nconst BSLASH_CODE = 92; // '\\\\'\n\nvar index = {\n name: 'regex',\n init(jsep) {\n // Regex literal: /abc123/ig\n jsep.hooks.add('gobble-token', function gobbleRegexLiteral(env) {\n if (this.code === FSLASH_CODE) {\n const patternIndex = ++this.index;\n let inCharSet = false;\n while (this.index < this.expr.length) {\n if (this.code === FSLASH_CODE && !inCharSet) {\n const pattern = this.expr.slice(patternIndex, this.index);\n let flags = '';\n while (++this.index < this.expr.length) {\n const code = this.code;\n if (code >= 97 && code <= 122 // a...z\n || code >= 65 && code <= 90 // A...Z\n || code >= 48 && code <= 57) {\n // 0-9\n flags += this.char;\n } else {\n break;\n }\n }\n let value;\n try {\n value = new RegExp(pattern, flags);\n } catch (e) {\n this.throwError(e.message);\n }\n env.node = {\n type: jsep.LITERAL,\n value,\n raw: this.expr.slice(patternIndex - 1, this.index)\n };\n\n // allow . [] and () after regex: /regex/.test(a)\n env.node = this.gobbleTokenProperty(env.node);\n return env.node;\n }\n if (this.code === jsep.OBRACK_CODE) {\n inCharSet = true;\n } else if (inCharSet && this.code === jsep.CBRACK_CODE) {\n inCharSet = false;\n }\n this.index += this.code === BSLASH_CODE ? 2 : 1;\n }\n this.throwError('Unclosed Regex');\n }\n });\n }\n};\n\nconst PLUS_CODE = 43; // +\nconst MINUS_CODE = 45; // -\n\nconst plugin = {\n name: 'assignment',\n assignmentOperators: new Set(['=', '*=', '**=', '/=', '%=', '+=', '-=', '<<=', '>>=', '>>>=', '&=', '^=', '|=', '||=', '&&=', '??=']),\n updateOperators: [PLUS_CODE, MINUS_CODE],\n assignmentPrecedence: 0.9,\n init(jsep) {\n const updateNodeTypes = [jsep.IDENTIFIER, jsep.MEMBER_EXP];\n plugin.assignmentOperators.forEach(op => jsep.addBinaryOp(op, plugin.assignmentPrecedence, true));\n jsep.hooks.add('gobble-token', function gobbleUpdatePrefix(env) {\n const code = this.code;\n if (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n this.index += 2;\n env.node = {\n type: 'UpdateExpression',\n operator: code === PLUS_CODE ? '++' : '--',\n argument: this.gobbleTokenProperty(this.gobbleIdentifier()),\n prefix: true\n };\n if (!env.node.argument || !updateNodeTypes.includes(env.node.argument.type)) {\n this.throwError(`Unexpected ${env.node.operator}`);\n }\n }\n });\n jsep.hooks.add('after-token', function gobbleUpdatePostfix(env) {\n if (env.node) {\n const code = this.code;\n if (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n if (!updateNodeTypes.includes(env.node.type)) {\n this.throwError(`Unexpected ${env.node.operator}`);\n }\n this.index += 2;\n env.node = {\n type: 'UpdateExpression',\n operator: code === PLUS_CODE ? '++' : '--',\n argument: env.node,\n prefix: false\n };\n }\n }\n });\n jsep.hooks.add('after-expression', function gobbleAssignment(env) {\n if (env.node) {\n // Note: Binaries can be chained in a single expression to respect\n // operator precedence (i.e. a = b = 1 + 2 + 3)\n // Update all binary assignment nodes in the tree\n updateBinariesToAssignments(env.node);\n }\n });\n function updateBinariesToAssignments(node) {\n if (plugin.assignmentOperators.has(node.operator)) {\n node.type = 'AssignmentExpression';\n updateBinariesToAssignments(node.left);\n updateBinariesToAssignments(node.right);\n } else if (!node.operator) {\n Object.values(node).forEach(val => {\n if (val && typeof val === 'object') {\n updateBinariesToAssignments(val);\n }\n });\n }\n }\n }\n};\n\n/* eslint-disable no-bitwise -- Convenient */\n\n// register plugins\njsep.plugins.register(index, plugin);\njsep.addUnaryOp('typeof');\njsep.addLiteral('null', null);\njsep.addLiteral('undefined', undefined);\nconst BLOCKED_PROTO_PROPERTIES = new Set(['constructor', '__proto__', '__defineGetter__', '__defineSetter__']);\nconst SafeEval = {\n /**\n * @param {jsep.Expression} ast\n * @param {Record} subs\n */\n evalAst(ast, subs) {\n switch (ast.type) {\n case 'BinaryExpression':\n case 'LogicalExpression':\n return SafeEval.evalBinaryExpression(ast, subs);\n case 'Compound':\n return SafeEval.evalCompound(ast, subs);\n case 'ConditionalExpression':\n return SafeEval.evalConditionalExpression(ast, subs);\n case 'Identifier':\n return SafeEval.evalIdentifier(ast, subs);\n case 'Literal':\n return SafeEval.evalLiteral(ast, subs);\n case 'MemberExpression':\n return SafeEval.evalMemberExpression(ast, subs);\n case 'UnaryExpression':\n return SafeEval.evalUnaryExpression(ast, subs);\n case 'ArrayExpression':\n return SafeEval.evalArrayExpression(ast, subs);\n case 'CallExpression':\n return SafeEval.evalCallExpression(ast, subs);\n case 'AssignmentExpression':\n return SafeEval.evalAssignmentExpression(ast, subs);\n default:\n throw SyntaxError('Unexpected expression', ast);\n }\n },\n evalBinaryExpression(ast, subs) {\n const result = {\n '||': (a, b) => a || b(),\n '&&': (a, b) => a && b(),\n '|': (a, b) => a | b(),\n '^': (a, b) => a ^ b(),\n '&': (a, b) => a & b(),\n // eslint-disable-next-line eqeqeq -- API\n '==': (a, b) => a == b(),\n // eslint-disable-next-line eqeqeq -- API\n '!=': (a, b) => a != b(),\n '===': (a, b) => a === b(),\n '!==': (a, b) => a !== b(),\n '<': (a, b) => a < b(),\n '>': (a, b) => a > b(),\n '<=': (a, b) => a <= b(),\n '>=': (a, b) => a >= b(),\n '<<': (a, b) => a << b(),\n '>>': (a, b) => a >> b(),\n '>>>': (a, b) => a >>> b(),\n '+': (a, b) => a + b(),\n '-': (a, b) => a - b(),\n '*': (a, b) => a * b(),\n '/': (a, b) => a / b(),\n '%': (a, b) => a % b()\n }[ast.operator](SafeEval.evalAst(ast.left, subs), () => SafeEval.evalAst(ast.right, subs));\n return result;\n },\n evalCompound(ast, subs) {\n let last;\n for (let i = 0; i < ast.body.length; i++) {\n if (ast.body[i].type === 'Identifier' && ['var', 'let', 'const'].includes(ast.body[i].name) && ast.body[i + 1] && ast.body[i + 1].type === 'AssignmentExpression') {\n // var x=2; is detected as\n // [{Identifier var}, {AssignmentExpression x=2}]\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient\n i += 1;\n }\n const expr = ast.body[i];\n last = SafeEval.evalAst(expr, subs);\n }\n return last;\n },\n evalConditionalExpression(ast, subs) {\n if (SafeEval.evalAst(ast.test, subs)) {\n return SafeEval.evalAst(ast.consequent, subs);\n }\n return SafeEval.evalAst(ast.alternate, subs);\n },\n evalIdentifier(ast, subs) {\n if (Object.hasOwn(subs, ast.name)) {\n return subs[ast.name];\n }\n throw ReferenceError(`${ast.name} is not defined`);\n },\n evalLiteral(ast) {\n return ast.value;\n },\n evalMemberExpression(ast, subs) {\n const prop = String(\n // NOTE: `String(value)` throws error when\n // value has overwritten the toString method to return non-string\n // i.e. `value = {toString: () => []}`\n ast.computed ? SafeEval.evalAst(ast.property) // `object[property]`\n : ast.property.name // `object.property` property is Identifier\n );\n const obj = SafeEval.evalAst(ast.object, subs);\n if (obj === undefined || obj === null) {\n throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`);\n }\n if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) {\n throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`);\n }\n const result = obj[prop];\n if (typeof result === 'function') {\n return result.bind(obj); // arrow functions aren't affected by bind.\n }\n return result;\n },\n evalUnaryExpression(ast, subs) {\n const result = {\n '-': a => -SafeEval.evalAst(a, subs),\n '!': a => !SafeEval.evalAst(a, subs),\n '~': a => ~SafeEval.evalAst(a, subs),\n // eslint-disable-next-line no-implicit-coercion -- API\n '+': a => +SafeEval.evalAst(a, subs),\n typeof: a => typeof SafeEval.evalAst(a, subs)\n }[ast.operator](ast.argument);\n return result;\n },\n evalArrayExpression(ast, subs) {\n return ast.elements.map(el => SafeEval.evalAst(el, subs));\n },\n evalCallExpression(ast, subs) {\n const args = ast.arguments.map(arg => SafeEval.evalAst(arg, subs));\n const func = SafeEval.evalAst(ast.callee, subs);\n // if (func === Function) {\n // throw new Error('Function constructor is disabled');\n // }\n return func(...args);\n },\n evalAssignmentExpression(ast, subs) {\n if (ast.left.type !== 'Identifier') {\n throw SyntaxError('Invalid left-hand side in assignment');\n }\n const id = ast.left.name;\n const value = SafeEval.evalAst(ast.right, subs);\n subs[id] = value;\n return subs[id];\n }\n};\n\n/**\n * A replacement for NodeJS' VM.Script which is also {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP | Content Security Policy} friendly.\n */\nclass SafeScript {\n /**\n * @param {string} expr Expression to evaluate\n */\n constructor(expr) {\n this.code = expr;\n this.ast = jsep(this.code);\n }\n\n /**\n * @param {object} context Object whose items will be added\n * to evaluation\n * @returns {EvaluatedResult} Result of evaluated code\n */\n runInNewContext(context) {\n // `Object.create(null)` creates a prototypeless object\n const keyMap = Object.assign(Object.create(null), context);\n return SafeEval.evalAst(this.ast, keyMap);\n }\n}\n\n/* eslint-disable camelcase -- Convenient for escaping */\n\n\n/**\n * @typedef {null|boolean|number|string|object|GenericArray} JSONObject\n */\n\n/**\n * @typedef {any} AnyItem\n */\n\n/**\n * @typedef {any} AnyResult\n */\n\n/**\n * Copies array and then pushes item into it.\n * @param {GenericArray} arr Array to copy and into which to push\n * @param {AnyItem} item Array item to add (to end)\n * @returns {GenericArray} Copy of the original array\n */\nfunction push(arr, item) {\n arr = arr.slice();\n arr.push(item);\n return arr;\n}\n/**\n * Copies array and then unshifts item into it.\n * @param {AnyItem} item Array item to add (to beginning)\n * @param {GenericArray} arr Array to copy and into which to unshift\n * @returns {GenericArray} Copy of the original array\n */\nfunction unshift(item, arr) {\n arr = arr.slice();\n arr.unshift(item);\n return arr;\n}\n\n/**\n * Caught when JSONPath is used without `new` but rethrown if with `new`\n * @extends Error\n */\nclass NewError extends Error {\n /**\n * @param {AnyResult} value The evaluated scalar value\n */\n constructor(value) {\n super('JSONPath should not be called with \"new\" (it prevents return ' + 'of (unwrapped) scalar values)');\n this.avoidNew = true;\n this.value = value;\n this.name = 'NewError';\n }\n}\n\n/**\n* @typedef {object} ReturnObject\n* @property {string} path\n* @property {JSONObject} value\n* @property {object|GenericArray} parent\n* @property {string} parentProperty\n*/\n\n/**\n* @callback JSONPathCallback\n* @param {string|object} preferredOutput\n* @param {\"value\"|\"property\"} type\n* @param {ReturnObject} fullRetObj\n* @returns {void}\n*/\n\n/**\n* @callback OtherTypeCallback\n* @param {JSONObject} val\n* @param {string} path\n* @param {object|GenericArray} parent\n* @param {string} parentPropName\n* @returns {boolean}\n*/\n\n/**\n * @typedef {any} ContextItem\n */\n\n/**\n * @typedef {any} EvaluatedResult\n */\n\n/**\n* @callback EvalCallback\n* @param {string} code\n* @param {ContextItem} context\n* @returns {EvaluatedResult}\n*/\n\n/**\n * @typedef {typeof SafeScript} EvalClass\n */\n\n/**\n * @typedef {object} JSONPathOptions\n * @property {JSON} json\n * @property {string|string[]} path\n * @property {\"value\"|\"path\"|\"pointer\"|\"parent\"|\"parentProperty\"|\n * \"all\"} [resultType=\"value\"]\n * @property {boolean} [flatten=false]\n * @property {boolean} [wrap=true]\n * @property {object} [sandbox={}]\n * @property {EvalCallback|EvalClass|'safe'|'native'|\n * boolean} [eval = 'safe']\n * @property {object|GenericArray|null} [parent=null]\n * @property {string|null} [parentProperty=null]\n * @property {JSONPathCallback} [callback]\n * @property {OtherTypeCallback} [otherTypeCallback] Defaults to\n * function which throws on encountering `@other`\n * @property {boolean} [autostart=true]\n */\n\n/**\n * @param {string|JSONPathOptions} opts If a string, will be treated as `expr`\n * @param {string} [expr] JSON path to evaluate\n * @param {JSON} [obj] JSON object to evaluate against\n * @param {JSONPathCallback} [callback] Passed 3 arguments: 1) desired payload\n * per `resultType`, 2) `\"value\"|\"property\"`, 3) Full returned object with\n * all payloads\n * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end\n * of one's query, this will be invoked with the value of the item, its\n * path, its parent, and its parent's property name, and it should return\n * a boolean indicating whether the supplied value belongs to the \"other\"\n * type or not (or it may handle transformations and return `false`).\n * @returns {JSONPath}\n * @class\n */\nfunction JSONPath(opts, expr, obj, callback, otherTypeCallback) {\n // eslint-disable-next-line no-restricted-syntax -- Allow for pseudo-class\n if (!(this instanceof JSONPath)) {\n try {\n return new JSONPath(opts, expr, obj, callback, otherTypeCallback);\n } catch (e) {\n if (!e.avoidNew) {\n throw e;\n }\n return e.value;\n }\n }\n if (typeof opts === 'string') {\n otherTypeCallback = callback;\n callback = obj;\n obj = expr;\n expr = opts;\n opts = null;\n }\n const optObj = opts && typeof opts === 'object';\n opts = opts || {};\n this.json = opts.json || obj;\n this.path = opts.path || expr;\n this.resultType = opts.resultType || 'value';\n this.flatten = opts.flatten || false;\n this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true;\n this.sandbox = opts.sandbox || {};\n this.eval = opts.eval === undefined ? 'safe' : opts.eval;\n this.ignoreEvalErrors = typeof opts.ignoreEvalErrors === 'undefined' ? false : opts.ignoreEvalErrors;\n this.parent = opts.parent || null;\n this.parentProperty = opts.parentProperty || null;\n this.callback = opts.callback || callback || null;\n this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function () {\n throw new TypeError('You must supply an otherTypeCallback callback option ' + 'with the @other() operator.');\n };\n if (opts.autostart !== false) {\n const args = {\n path: optObj ? opts.path : expr\n };\n if (!optObj) {\n args.json = obj;\n } else if ('json' in opts) {\n args.json = opts.json;\n }\n const ret = this.evaluate(args);\n if (!ret || typeof ret !== 'object') {\n throw new NewError(ret);\n }\n return ret;\n }\n}\n\n// PUBLIC METHODS\nJSONPath.prototype.evaluate = function (expr, json, callback, otherTypeCallback) {\n let currParent = this.parent,\n currParentProperty = this.parentProperty;\n let {\n flatten,\n wrap\n } = this;\n this.currResultType = this.resultType;\n this.currEval = this.eval;\n this.currSandbox = this.sandbox;\n callback = callback || this.callback;\n this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback;\n json = json || this.json;\n expr = expr || this.path;\n if (expr && typeof expr === 'object' && !Array.isArray(expr)) {\n if (!expr.path && expr.path !== '') {\n throw new TypeError('You must supply a \"path\" property when providing an object ' + 'argument to JSONPath.evaluate().');\n }\n if (!Object.hasOwn(expr, 'json')) {\n throw new TypeError('You must supply a \"json\" property when providing an object ' + 'argument to JSONPath.evaluate().');\n }\n ({\n json\n } = expr);\n flatten = Object.hasOwn(expr, 'flatten') ? expr.flatten : flatten;\n this.currResultType = Object.hasOwn(expr, 'resultType') ? expr.resultType : this.currResultType;\n this.currSandbox = Object.hasOwn(expr, 'sandbox') ? expr.sandbox : this.currSandbox;\n wrap = Object.hasOwn(expr, 'wrap') ? expr.wrap : wrap;\n this.currEval = Object.hasOwn(expr, 'eval') ? expr.eval : this.currEval;\n callback = Object.hasOwn(expr, 'callback') ? expr.callback : callback;\n this.currOtherTypeCallback = Object.hasOwn(expr, 'otherTypeCallback') ? expr.otherTypeCallback : this.currOtherTypeCallback;\n currParent = Object.hasOwn(expr, 'parent') ? expr.parent : currParent;\n currParentProperty = Object.hasOwn(expr, 'parentProperty') ? expr.parentProperty : currParentProperty;\n expr = expr.path;\n }\n currParent = currParent || null;\n currParentProperty = currParentProperty || null;\n if (Array.isArray(expr)) {\n expr = JSONPath.toPathString(expr);\n }\n if (!expr && expr !== '' || !json) {\n return undefined;\n }\n const exprList = JSONPath.toPathArray(expr);\n if (exprList[0] === '$' && exprList.length > 1) {\n exprList.shift();\n }\n this._hasParentSelector = null;\n const result = this._trace(exprList, json, ['$'], currParent, currParentProperty, callback).filter(function (ea) {\n return ea && !ea.isParentSelector;\n });\n if (!result.length) {\n return wrap ? [] : undefined;\n }\n if (!wrap && result.length === 1 && !result[0].hasArrExpr) {\n return this._getPreferredOutput(result[0]);\n }\n return result.reduce((rslt, ea) => {\n const valOrPath = this._getPreferredOutput(ea);\n if (flatten && Array.isArray(valOrPath)) {\n rslt = rslt.concat(valOrPath);\n } else {\n rslt.push(valOrPath);\n }\n return rslt;\n }, []);\n};\n\n// PRIVATE METHODS\n\nJSONPath.prototype._getPreferredOutput = function (ea) {\n const resultType = this.currResultType;\n switch (resultType) {\n case 'all':\n {\n const path = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path);\n ea.pointer = JSONPath.toPointer(path);\n ea.path = typeof ea.path === 'string' ? ea.path : JSONPath.toPathString(ea.path);\n return ea;\n }\n case 'value':\n case 'parent':\n case 'parentProperty':\n return ea[resultType];\n case 'path':\n return JSONPath.toPathString(ea[resultType]);\n case 'pointer':\n return JSONPath.toPointer(ea.path);\n default:\n throw new TypeError('Unknown result type');\n }\n};\nJSONPath.prototype._handleCallback = function (fullRetObj, callback, type) {\n if (callback) {\n const preferredOutput = this._getPreferredOutput(fullRetObj);\n fullRetObj.path = typeof fullRetObj.path === 'string' ? fullRetObj.path : JSONPath.toPathString(fullRetObj.path);\n // eslint-disable-next-line n/callback-return -- No need to return\n callback(preferredOutput, type, fullRetObj);\n }\n};\n\n/**\n *\n * @param {string} expr\n * @param {JSONObject} val\n * @param {string} path\n * @param {object|GenericArray} parent\n * @param {string} parentPropName\n * @param {JSONPathCallback} callback\n * @param {boolean} hasArrExpr\n * @param {boolean} literalPriority\n * @returns {ReturnObject|ReturnObject[]}\n */\nJSONPath.prototype._trace = function (expr, val, path, parent, parentPropName, callback, hasArrExpr, literalPriority) {\n // No expr to follow? return path and value as the result of\n // this trace branch\n let retObj;\n if (!expr.length) {\n retObj = {\n path,\n value: val,\n parent,\n parentProperty: parentPropName,\n hasArrExpr\n };\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n const loc = expr[0],\n x = expr.slice(1);\n\n // We need to gather the return value of recursive trace calls in order to\n // do the parent sel computation.\n const ret = [];\n /**\n *\n * @param {ReturnObject|ReturnObject[]} elems\n * @returns {void}\n */\n function addRet(elems) {\n if (Array.isArray(elems)) {\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test:\n // `ret.push(...elems);`\n elems.forEach(t => {\n ret.push(t);\n });\n } else {\n ret.push(elems);\n }\n }\n if ((typeof loc !== 'string' || literalPriority) && val && Object.hasOwn(val, loc)) {\n // simple case--directly follow property\n addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr));\n // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if`\n } else if (loc === '*') {\n // all child properties\n this._walk(val, m => {\n addRet(this._trace(x, val[m], push(path, m), val, m, callback, true, true));\n });\n } else if (loc === '..') {\n // all descendent parent properties\n // Check remaining expression with val's immediate children\n addRet(this._trace(x, val, path, parent, parentPropName, callback, hasArrExpr));\n this._walk(val, m => {\n // We don't join m and x here because we only want parents,\n // not scalar values\n if (typeof val[m] === 'object') {\n // Keep going with recursive descent on val's\n // object children\n addRet(this._trace(expr.slice(), val[m], push(path, m), val, m, callback, true));\n }\n });\n // The parent sel computation is handled in the frame above using the\n // ancestor object of val\n } else if (loc === '^') {\n // This is not a final endpoint, so we do not invoke the callback here\n this._hasParentSelector = true;\n return {\n path: path.slice(0, -1),\n expr: x,\n isParentSelector: true\n };\n } else if (loc === '~') {\n // property name\n retObj = {\n path: push(path, loc),\n value: parentPropName,\n parent,\n parentProperty: null\n };\n this._handleCallback(retObj, callback, 'property');\n return retObj;\n } else if (loc === '$') {\n // root only\n addRet(this._trace(x, val, path, null, null, callback, hasArrExpr));\n } else if (/^(-?\\d*):(-?\\d*):?(\\d*)$/u.test(loc)) {\n // [start:end:step] Python slice syntax\n addRet(this._slice(loc, x, val, path, parent, parentPropName, callback));\n } else if (loc.indexOf('?(') === 0) {\n // [?(expr)] (filtering)\n if (this.currEval === false) {\n throw new Error('Eval [?(expr)] prevented in JSONPath expression.');\n }\n const safeLoc = loc.replace(/^\\?\\((.*?)\\)$/u, '$1');\n // check for a nested filter expression\n const nested = /@.?([^?]*)[['](\\??\\(.*?\\))(?!.\\)\\])[\\]']/gu.exec(safeLoc);\n if (nested) {\n // find if there are matches in the nested expression\n // add them to the result set if there is at least one match\n this._walk(val, m => {\n const npath = [nested[2]];\n const nvalue = nested[1] ? val[m][nested[1]] : val[m];\n const filterResults = this._trace(npath, nvalue, path, parent, parentPropName, callback, true);\n if (filterResults.length > 0) {\n addRet(this._trace(x, val[m], push(path, m), val, m, callback, true));\n }\n });\n } else {\n this._walk(val, m => {\n if (this._eval(safeLoc, val[m], m, path, parent, parentPropName)) {\n addRet(this._trace(x, val[m], push(path, m), val, m, callback, true));\n }\n });\n }\n } else if (loc[0] === '(') {\n // [(expr)] (dynamic property/index)\n if (this.currEval === false) {\n throw new Error('Eval [(expr)] prevented in JSONPath expression.');\n }\n // As this will resolve to a property name (but we don't know it\n // yet), property and parent information is relative to the\n // parent of the property to which this expression will resolve\n addRet(this._trace(unshift(this._eval(loc, val, path.at(-1), path.slice(0, -1), parent, parentPropName), x), val, path, parent, parentPropName, callback, hasArrExpr));\n } else if (loc[0] === '@') {\n // value type: @boolean(), etc.\n let addType = false;\n const valueType = loc.slice(1, -2);\n switch (valueType) {\n case 'scalar':\n if (!val || !['object', 'function'].includes(typeof val)) {\n addType = true;\n }\n break;\n case 'boolean':\n case 'string':\n case 'undefined':\n case 'function':\n if (typeof val === valueType) {\n addType = true;\n }\n break;\n case 'integer':\n if (Number.isFinite(val) && !(val % 1)) {\n addType = true;\n }\n break;\n case 'number':\n if (Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'nonFinite':\n if (typeof val === 'number' && !Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'object':\n if (val && typeof val === valueType) {\n addType = true;\n }\n break;\n case 'array':\n if (Array.isArray(val)) {\n addType = true;\n }\n break;\n case 'other':\n addType = this.currOtherTypeCallback(val, path, parent, parentPropName);\n break;\n case 'null':\n if (val === null) {\n addType = true;\n }\n break;\n /* c8 ignore next 2 */\n default:\n throw new TypeError('Unknown value type ' + valueType);\n }\n if (addType) {\n retObj = {\n path,\n value: val,\n parent,\n parentProperty: parentPropName\n };\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n // `-escaped property\n } else if (loc[0] === '`' && val && Object.hasOwn(val, loc.slice(1))) {\n const locProp = loc.slice(1);\n addRet(this._trace(x, val[locProp], push(path, locProp), val, locProp, callback, hasArrExpr, true));\n } else if (loc.includes(',')) {\n // [name1,name2,...]\n const parts = loc.split(',');\n for (const part of parts) {\n addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback, true));\n }\n // simple case--directly follow property\n } else if (!literalPriority && val && Object.hasOwn(val, loc)) {\n addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr, true));\n }\n\n // We check the resulting values for parent selections. For parent\n // selections we discard the value object and continue the trace with the\n // current val object\n if (this._hasParentSelector) {\n for (let t = 0; t < ret.length; t++) {\n const rett = ret[t];\n if (rett && rett.isParentSelector) {\n const tmp = this._trace(rett.expr, val, rett.path, parent, parentPropName, callback, hasArrExpr);\n if (Array.isArray(tmp)) {\n ret[t] = tmp[0];\n const tl = tmp.length;\n for (let tt = 1; tt < tl; tt++) {\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient\n t++;\n ret.splice(t, 0, tmp[tt]);\n }\n } else {\n ret[t] = tmp;\n }\n }\n }\n }\n return ret;\n};\nJSONPath.prototype._walk = function (val, f) {\n if (Array.isArray(val)) {\n const n = val.length;\n for (let i = 0; i < n; i++) {\n f(i);\n }\n } else if (val && typeof val === 'object') {\n Object.keys(val).forEach(m => {\n f(m);\n });\n }\n};\nJSONPath.prototype._slice = function (loc, expr, val, path, parent, parentPropName, callback) {\n if (!Array.isArray(val)) {\n return undefined;\n }\n const len = val.length,\n parts = loc.split(':'),\n step = parts[2] && Number.parseInt(parts[2]) || 1;\n let start = parts[0] && Number.parseInt(parts[0]) || 0,\n end = parts[1] && Number.parseInt(parts[1]) || len;\n start = start < 0 ? Math.max(0, start + len) : Math.min(len, start);\n end = end < 0 ? Math.max(0, end + len) : Math.min(len, end);\n const ret = [];\n for (let i = start; i < end; i += step) {\n const tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback, true);\n // Should only be possible to be an array here since first part of\n // ``unshift(i, expr)` passed in above would not be empty, nor `~`,\n // nor begin with `@` (as could return objects)\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test: `ret.push(...tmp);`\n tmp.forEach(t => {\n ret.push(t);\n });\n }\n return ret;\n};\nJSONPath.prototype._eval = function (code, _v, _vname, path, parent, parentPropName) {\n this.currSandbox._$_parentProperty = parentPropName;\n this.currSandbox._$_parent = parent;\n this.currSandbox._$_property = _vname;\n this.currSandbox._$_root = this.json;\n this.currSandbox._$_v = _v;\n const containsPath = code.includes('@path');\n if (containsPath) {\n this.currSandbox._$_path = JSONPath.toPathString(path.concat([_vname]));\n }\n const scriptCacheKey = this.currEval + 'Script:' + code;\n if (!JSONPath.cache[scriptCacheKey]) {\n let script = code.replaceAll('@parentProperty', '_$_parentProperty').replaceAll('@parent', '_$_parent').replaceAll('@property', '_$_property').replaceAll('@root', '_$_root').replaceAll(/@([.\\s)[])/gu, '_$_v$1');\n if (containsPath) {\n script = script.replaceAll('@path', '_$_path');\n }\n if (this.currEval === 'safe' || this.currEval === true || this.currEval === undefined) {\n JSONPath.cache[scriptCacheKey] = new this.safeVm.Script(script);\n } else if (this.currEval === 'native') {\n JSONPath.cache[scriptCacheKey] = new this.vm.Script(script);\n } else if (typeof this.currEval === 'function' && this.currEval.prototype && Object.hasOwn(this.currEval.prototype, 'runInNewContext')) {\n const CurrEval = this.currEval;\n JSONPath.cache[scriptCacheKey] = new CurrEval(script);\n } else if (typeof this.currEval === 'function') {\n JSONPath.cache[scriptCacheKey] = {\n runInNewContext: context => this.currEval(script, context)\n };\n } else {\n throw new TypeError(`Unknown \"eval\" property \"${this.currEval}\"`);\n }\n }\n try {\n return JSONPath.cache[scriptCacheKey].runInNewContext(this.currSandbox);\n } catch (e) {\n if (this.ignoreEvalErrors) {\n return false;\n }\n throw new Error('jsonPath: ' + e.message + ': ' + code);\n }\n};\n\n// PUBLIC CLASS PROPERTIES AND METHODS\n\n// Could store the cache object itself\nJSONPath.cache = {};\n\n/**\n * @param {string[]} pathArr Array to convert\n * @returns {string} The path string\n */\nJSONPath.toPathString = function (pathArr) {\n const x = pathArr,\n n = x.length;\n let p = '$';\n for (let i = 1; i < n; i++) {\n if (!/^(~|\\^|@.*?\\(\\))$/u.test(x[i])) {\n p += /^[0-9*]+$/u.test(x[i]) ? '[' + x[i] + ']' : \"['\" + x[i] + \"']\";\n }\n }\n return p;\n};\n\n/**\n * @param {string} pointer JSON Path\n * @returns {string} JSON Pointer\n */\nJSONPath.toPointer = function (pointer) {\n const x = pointer,\n n = x.length;\n let p = '';\n for (let i = 1; i < n; i++) {\n if (!/^(~|\\^|@.*?\\(\\))$/u.test(x[i])) {\n p += '/' + x[i].toString().replaceAll('~', '~0').replaceAll('/', '~1');\n }\n }\n return p;\n};\n\n/**\n * @param {string} expr Expression to convert\n * @returns {string[]}\n */\nJSONPath.toPathArray = function (expr) {\n const {\n cache\n } = JSONPath;\n if (cache[expr]) {\n return cache[expr].concat();\n }\n const subx = [];\n const normalized = expr\n // Properties\n .replaceAll(/@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\\(\\)/gu, ';$&;')\n // Parenthetical evaluations (filtering and otherwise), directly\n // within brackets or single quotes\n .replaceAll(/[['](\\??\\(.*?\\))[\\]'](?!.\\])/gu, function ($0, $1) {\n return '[#' + (subx.push($1) - 1) + ']';\n })\n // Escape periods and tildes within properties\n .replaceAll(/\\[['\"]([^'\\]]*)['\"]\\]/gu, function ($0, prop) {\n return \"['\" + prop.replaceAll('.', '%@%').replaceAll('~', '%%@@%%') + \"']\";\n })\n // Properties operator\n .replaceAll('~', ';~;')\n // Split by property boundaries\n .replaceAll(/['\"]?\\.['\"]?(?![^[]*\\])|\\[['\"]?/gu, ';')\n // Reinsert periods within properties\n .replaceAll('%@%', '.')\n // Reinsert tildes within properties\n .replaceAll('%%@@%%', '~')\n // Parent\n .replaceAll(/(?:;)?(\\^+)(?:;)?/gu, function ($0, ups) {\n return ';' + ups.split('').join(';') + ';';\n })\n // Descendents\n .replaceAll(/;;;|;;/gu, ';..;')\n // Remove trailing\n .replaceAll(/;$|'?\\]|'$/gu, '');\n const exprList = normalized.split(';').map(function (exp) {\n const match = exp.match(/#(\\d+)/u);\n return !match || !match[1] ? exp : subx[match[1]];\n });\n cache[expr] = exprList;\n return cache[expr].concat();\n};\nJSONPath.prototype.safeVm = {\n Script: SafeScript\n};\n\nJSONPath.prototype.vm = vm;\n\nexports.JSONPath = JSONPath;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tvar threw = true;\n\ttry {\n\t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\t\tthrew = false;\n\t} finally {\n\t\tif(threw) delete __webpack_module_cache__[moduleId];\n\t}\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","\nif (typeof __webpack_require__ !== 'undefined') __webpack_require__.ab = __dirname + \"/\";","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(5915);\n",""],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 5bd4ab5..9aaef22 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,7 +5,7 @@ import * as core from '@actions/core' import {DOMParser} from '@xmldom/xmldom' import * as xpath from 'xpath' import {JSONPath} from 'jsonpath-plus' -import {LogLevel, log} from './utils' +import {LogLevel, log, normalizeCweId} from './utils' let sarifFilePath: string let outputFilePath: string @@ -103,9 +103,15 @@ JSONPath({ for (const tag of tags) { if (tag.startsWith(codeQlCweTagPrefix)) { const cweId = tag.replace(codeQlCweTagPrefix, '') - if (cweIds.includes(cweId)) { + // Normalize CWE ID by converting to integer to remove leading zeros + const normalizedCweId = normalizeCweId(cweId) + // Skip if the CWE ID is not a valid number + if (normalizedCweId === null) { + continue + } + if (cweIds.includes(normalizedCweId)) { tags.push(securityStandardTag) - tags.push(...cweCategories[cweId]) + tags.push(...cweCategories[normalizedCweId]) return } } diff --git a/src/utils.ts b/src/utils.ts index f12c569..78daef3 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -41,3 +41,16 @@ export function log(message: string, level = LogLevel.Info): void { } } } + +/** + * Normalize a CWE ID by removing leading zeros + * @param cweId - The CWE ID string (e.g., "099", "020", "89") + * @returns The normalized CWE ID string (e.g., "99", "20", "89") or null if invalid + */ +export function normalizeCweId(cweId: string): string | null { + const parsedCweId = parseInt(cweId, 10) + if (Number.isNaN(parsedCweId) || parsedCweId < 0) { + return null + } + return String(parsedCweId) +} diff --git a/test-data/webgoat-with-security-standard-tag.sarif.expected b/test-data/webgoat-with-security-standard-tag.sarif.expected index 31cf392..94c11eb 100644 --- a/test-data/webgoat-with-security-standard-tag.sarif.expected +++ b/test-data/webgoat-with-security-standard-tag.sarif.expected @@ -1 +1 @@ -{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"CodeQL","organization":"GitHub","semanticVersion":"2.12.2","notifications":[{"id":"java/baseline/expected-extracted-files","name":"java/baseline/expected-extracted-files","shortDescription":{"text":"Expected extracted files"},"fullDescription":{"text":"Files appearing in the source archive that are expected to be extracted."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["expected-extracted-files","telemetry"]}},{"id":"js/baseline/expected-extracted-files","name":"js/baseline/expected-extracted-files","shortDescription":{"text":"Expected extracted files"},"fullDescription":{"text":"Files appearing in the source archive that are expected to be extracted."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["expected-extracted-files","telemetry"]}}],"rules":[]},"extensions":[{"name":"codeql/java-all","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-all/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-all/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/javascript-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/java-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/cpp-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/regex","semanticVersion":"0.0.6+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/regex/0.0.6/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/regex/0.0.6/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/csharp-queries","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-queries/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-queries/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/tutorial","semanticVersion":"0.0.3+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/tutorial/0.0.3/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/tutorial/0.0.3/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/ssa","semanticVersion":"0.0.10+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ssa/0.0.10/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ssa/0.0.10/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/util","semanticVersion":"0.0.3+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/util/0.0.3/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/util/0.0.3/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/ruby-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/typos","semanticVersion":"0.0.10+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/typos/0.0.10/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/typos/0.0.10/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/ruby-all","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-all/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-all/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/csharp-all","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-all/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-all/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/javascript-all","semanticVersion":"0.4.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-all/0.4.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-all/0.4.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/python-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/csharp-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"legacy-upgrades","semanticVersion":"0.0.0","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/legacy-upgrades/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/legacy-upgrades/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/go-all","semanticVersion":"0.4.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-all/0.4.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-all/0.4.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/java-queries","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","notifications":[{"id":"java/diagnostics/extraction-errors","name":"java/diagnostics/extraction-errors","shortDescription":{"text":"Extraction errors"},"fullDescription":{"text":"A list of extraction errors for files in the source code directory."},"defaultConfiguration":{"enabled":true},"properties":{"description":"A list of extraction errors for files in the source code directory.","id":"java/diagnostics/extraction-errors","kind":"diagnostic","name":"Extraction errors"}},{"id":"java/diagnostics/successfully-extracted-files","name":"java/diagnostics/successfully-extracted-files","shortDescription":{"text":"Successfully extracted files"},"fullDescription":{"text":"A list of all files in the source code directory that were extracted without encountering an error in the file."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["successfully-extracted-files"],"description":"A list of all files in the source code directory that\n were extracted without encountering an error in the file.","id":"java/diagnostics/successfully-extracted-files","kind":"diagnostic","name":"Successfully extracted files"}},{"id":"java/diagnostics/extraction-warnings","name":"java/diagnostics/extraction-warnings","shortDescription":{"text":"Extraction warnings"},"fullDescription":{"text":"A list of extraction warnings for files in the source code directory."},"defaultConfiguration":{"enabled":true},"properties":{"description":"A list of extraction warnings for files in the source code directory.","id":"java/diagnostics/extraction-warnings","kind":"diagnostic","name":"Extraction warnings"}}],"rules":[{"id":"java/implicit-cast-in-compound-assignment","name":"java/implicit-cast-in-compound-assignment","shortDescription":{"text":"Implicit narrowing conversion in compound assignment"},"fullDescription":{"text":"Compound assignment statements (for example 'intvar += longvar') that implicitly cast a value of a wider type to a narrower type may result in information loss and numeric errors such as overflows."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Implicit narrowing conversion in compound assignment\nCompound assignment statements of the form `x += y` or `x *= y` perform an implicit narrowing conversion if the type of `x` is narrower than the type of `y`. For example, `x += y` is equivalent to `x = (T)(x + y)`, where `T` is the type of `x`. This can result in information loss and numeric errors such as overflows.\n\n\n## Recommendation\nEnsure that the type of the left-hand side of the compound assignment statement is at least as wide as the type of the right-hand side.\n\n\n## Example\nIf `x` is of type `short` and `y` is of type `int`, the expression `x + y` is of type `int`. However, the expression `x += y` is equivalent to `x = (short) (x + y)`. The expression `x + y` is cast to the type of the left-hand side of the assignment: `short`, possibly leading to information loss.\n\nTo avoid implicitly narrowing the type of `x + y`, change the type of `x` to `int`. Then the types of `x` and `x + y` are both `int` and there is no need for an implicit cast.\n\n\n## References\n* J. Bloch and N. Gafter, *Java Puzzlers: Traps, Pitfalls, and Corner Cases*, Puzzle 9. Addison-Wesley, 2005.\n* Java Language Specification: [Compound Assignment Operators](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.26.2), [Narrowing Primitive Conversion](https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.1.3).\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-192](https://cwe.mitre.org/data/definitions/192.html).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n* Common Weakness Enumeration: [CWE-681](https://cwe.mitre.org/data/definitions/681.html).\n","markdown":"# Implicit narrowing conversion in compound assignment\nCompound assignment statements of the form `x += y` or `x *= y` perform an implicit narrowing conversion if the type of `x` is narrower than the type of `y`. For example, `x += y` is equivalent to `x = (T)(x + y)`, where `T` is the type of `x`. This can result in information loss and numeric errors such as overflows.\n\n\n## Recommendation\nEnsure that the type of the left-hand side of the compound assignment statement is at least as wide as the type of the right-hand side.\n\n\n## Example\nIf `x` is of type `short` and `y` is of type `int`, the expression `x + y` is of type `int`. However, the expression `x += y` is equivalent to `x = (short) (x + y)`. The expression `x + y` is cast to the type of the left-hand side of the assignment: `short`, possibly leading to information loss.\n\nTo avoid implicitly narrowing the type of `x + y`, change the type of `x` to `int`. Then the types of `x` and `x + y` are both `int` and there is no need for an implicit cast.\n\n\n## References\n* J. Bloch and N. Gafter, *Java Puzzlers: Traps, Pitfalls, and Corner Cases*, Puzzle 9. Addison-Wesley, 2005.\n* Java Language Specification: [Compound Assignment Operators](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.26.2), [Narrowing Primitive Conversion](https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.1.3).\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-192](https://cwe.mitre.org/data/definitions/192.html).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n* Common Weakness Enumeration: [CWE-681](https://cwe.mitre.org/data/definitions/681.html).\n"},"properties":{"tags":["reliability","security","external/cwe/cwe-190","external/cwe/cwe-192","external/cwe/cwe-197","external/cwe/cwe-681"],"description":"Compound assignment statements (for example 'intvar += longvar') that implicitly\n cast a value of a wider type to a narrower type may result in information loss and\n numeric errors such as overflows.","id":"java/implicit-cast-in-compound-assignment","kind":"problem","name":"Implicit narrowing conversion in compound assignment","precision":"very-high","problem.severity":"warning","security-severity":"8.1"}},{"id":"java/predictable-seed","name":"java/predictable-seed","shortDescription":{"text":"Use of a predictable seed in a secure random number generator"},"fullDescription":{"text":"Using a predictable seed in a pseudo-random number generator can lead to predictability of the numbers generated by it."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Use of a predictable seed in a secure random number generator\nUsing a predictable seed in a pseudo-random number generator can lead to predictability of the numbers generated by it.\n\n\n## Recommendation\nIf the predictability of the pseudo-random number generator does not matter then consider using the faster `Random` class from `java.util`. If it is important that the pseudo-random number generator produces completely unpredictable values then either let the generator securely seed itself by not specifying a seed or specify a randomly generated, unpredictable seed.\n\n\n## Example\nIn the first example shown here, a constant value is used as a seed. Depending on the implementation of ` SecureRandom`, this could lead to the same random number being generated each time the code is executed.\n\nIn the second example shown here, the system time is used as a seed. Depending on the implementation of ` SecureRandom`, if an attacker knows what time the code was run, they could predict the generated random number.\n\nIn the third example shown here, the random number generator is allowed to generate its own seed, which it will do in a secure way.\n\n\n```java\nSecureRandom prng = new SecureRandom();\nint randomData = 0;\n\n// BAD: Using a constant value as a seed for a random number generator means all numbers it generates are predictable.\nprng.setSeed(12345L);\nrandomData = prng.next(32);\n\n// BAD: System.currentTimeMillis() returns the system time which is predictable.\nprng.setSeed(System.currentTimeMillis());\nrandomData = prng.next(32);\n\n// GOOD: SecureRandom implementations seed themselves securely by default.\nprng = new SecureRandom();\nrandomData = prng.next(32);\n\n```\n\n## References\n* Common Weakness Enumeration: [CWE-335](https://cwe.mitre.org/data/definitions/335.html).\n* Common Weakness Enumeration: [CWE-337](https://cwe.mitre.org/data/definitions/337.html).\n","markdown":"# Use of a predictable seed in a secure random number generator\nUsing a predictable seed in a pseudo-random number generator can lead to predictability of the numbers generated by it.\n\n\n## Recommendation\nIf the predictability of the pseudo-random number generator does not matter then consider using the faster `Random` class from `java.util`. If it is important that the pseudo-random number generator produces completely unpredictable values then either let the generator securely seed itself by not specifying a seed or specify a randomly generated, unpredictable seed.\n\n\n## Example\nIn the first example shown here, a constant value is used as a seed. Depending on the implementation of ` SecureRandom`, this could lead to the same random number being generated each time the code is executed.\n\nIn the second example shown here, the system time is used as a seed. Depending on the implementation of ` SecureRandom`, if an attacker knows what time the code was run, they could predict the generated random number.\n\nIn the third example shown here, the random number generator is allowed to generate its own seed, which it will do in a secure way.\n\n\n```java\nSecureRandom prng = new SecureRandom();\nint randomData = 0;\n\n// BAD: Using a constant value as a seed for a random number generator means all numbers it generates are predictable.\nprng.setSeed(12345L);\nrandomData = prng.next(32);\n\n// BAD: System.currentTimeMillis() returns the system time which is predictable.\nprng.setSeed(System.currentTimeMillis());\nrandomData = prng.next(32);\n\n// GOOD: SecureRandom implementations seed themselves securely by default.\nprng = new SecureRandom();\nrandomData = prng.next(32);\n\n```\n\n## References\n* Common Weakness Enumeration: [CWE-335](https://cwe.mitre.org/data/definitions/335.html).\n* Common Weakness Enumeration: [CWE-337](https://cwe.mitre.org/data/definitions/337.html).\n"},"properties":{"tags":["security","external/cwe/cwe-335","external/cwe/cwe-337","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using a predictable seed in a pseudo-random number generator can lead to predictability of the numbers generated by it.","id":"java/predictable-seed","kind":"problem","name":"Use of a predictable seed in a secure random number generator","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/android/intent-uri-permission-manipulation","name":"java/android/intent-uri-permission-manipulation","shortDescription":{"text":"Intent URI permission manipulation"},"fullDescription":{"text":"Returning an externally provided Intent via 'setResult' may allow a malicious application to access arbitrary content providers of the vulnerable application."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Intent URI permission manipulation\nWhen an Android component expects a result from an Activity, `startActivityForResult` can be used. The started Activity can then use `setResult` to return the appropriate data to the calling component.\n\nIf an Activity obtains the incoming, user-provided Intent and directly returns it via `setResult` without any checks, the application may be unintentionally giving arbitrary access to its content providers, even if they are not exported, as long as they are configured with the attribute `android:grantUriPermissions=\"true\"`. This happens because the attacker adds the appropriate URI permission flags to the provided Intent, which take effect once the Intent is reflected back.\n\n\n## Recommendation\nAvoid returning user-provided or untrusted Intents via `setResult`. Use a new Intent instead.\n\nIf it is required to use the received Intent, make sure that it does not contain URI permission flags, either by checking them with `Intent.getFlags` or removing them with `Intent.removeFlags`.\n\n\n## Example\nThe following sample contains three examples. In the first example, a user-provided Intent is obtained and directly returned back with `setResult`, which is dangerous. In the second example, a new Intent is created to safely return the desired data. The third example shows how the obtained Intent can be sanitized by removing dangerous flags before using it to return data to the calling component.\n\n\n```java\npublic class IntentUriPermissionManipulation extends Activity {\n\n // BAD: the user-provided Intent is returned as-is\n public void dangerous() {\n Intent intent = getIntent();\n intent.putExtra(\"result\", \"resultData\");\n setResult(intent);\n }\n\n // GOOD: a new Intent is created and returned\n public void safe() {\n Intent intent = new Intent();\n intent.putExtra(\"result\", \"resultData\");\n setResult(intent);\n }\n\n // GOOD: the user-provided Intent is sanitized before being returned\n public void sanitized() {\n Intent intent = getIntent();\n intent.putExtra(\"result\", \"resultData\");\n intent.removeFlags(\n Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);\n setResult(intent);\n }\n}\n\n```\n\n## References\n* Google Help: [Remediation for Intent Redirection Vulnerability](https://support.google.com/faqs/answer/9267555?hl=en).\n* Common Weakness Enumeration: [CWE-266](https://cwe.mitre.org/data/definitions/266.html).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n","markdown":"# Intent URI permission manipulation\nWhen an Android component expects a result from an Activity, `startActivityForResult` can be used. The started Activity can then use `setResult` to return the appropriate data to the calling component.\n\nIf an Activity obtains the incoming, user-provided Intent and directly returns it via `setResult` without any checks, the application may be unintentionally giving arbitrary access to its content providers, even if they are not exported, as long as they are configured with the attribute `android:grantUriPermissions=\"true\"`. This happens because the attacker adds the appropriate URI permission flags to the provided Intent, which take effect once the Intent is reflected back.\n\n\n## Recommendation\nAvoid returning user-provided or untrusted Intents via `setResult`. Use a new Intent instead.\n\nIf it is required to use the received Intent, make sure that it does not contain URI permission flags, either by checking them with `Intent.getFlags` or removing them with `Intent.removeFlags`.\n\n\n## Example\nThe following sample contains three examples. In the first example, a user-provided Intent is obtained and directly returned back with `setResult`, which is dangerous. In the second example, a new Intent is created to safely return the desired data. The third example shows how the obtained Intent can be sanitized by removing dangerous flags before using it to return data to the calling component.\n\n\n```java\npublic class IntentUriPermissionManipulation extends Activity {\n\n // BAD: the user-provided Intent is returned as-is\n public void dangerous() {\n Intent intent = getIntent();\n intent.putExtra(\"result\", \"resultData\");\n setResult(intent);\n }\n\n // GOOD: a new Intent is created and returned\n public void safe() {\n Intent intent = new Intent();\n intent.putExtra(\"result\", \"resultData\");\n setResult(intent);\n }\n\n // GOOD: the user-provided Intent is sanitized before being returned\n public void sanitized() {\n Intent intent = getIntent();\n intent.putExtra(\"result\", \"resultData\");\n intent.removeFlags(\n Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);\n setResult(intent);\n }\n}\n\n```\n\n## References\n* Google Help: [Remediation for Intent Redirection Vulnerability](https://support.google.com/faqs/answer/9267555?hl=en).\n* Common Weakness Enumeration: [CWE-266](https://cwe.mitre.org/data/definitions/266.html).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n"},"properties":{"tags":["security","external/cwe/cwe-266","external/cwe/cwe-926","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Returning an externally provided Intent via 'setResult' may allow a malicious\n application to access arbitrary content providers of the vulnerable application.","id":"java/android/intent-uri-permission-manipulation","kind":"path-problem","name":"Intent URI permission manipulation","precision":"high","problem.severity":"error","security-severity":"7.8"}},{"id":"java/android/debuggable-attribute-enabled","name":"java/android/debuggable-attribute-enabled","shortDescription":{"text":"Android debuggable attribute enabled"},"fullDescription":{"text":"An enabled debugger can allow for entry points in the application or reveal sensitive information."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android debuggable attribute enabled\nThe Android manifest file defines configuration settings for Android applications. In this file, the `android:debuggable` attribute of the `application` element can be used to define whether or not the application can be debugged. When set to `true`, this attribute will allow the application to be debugged even when running on a device in user mode.\n\nWhen a debugger is enabled, it could allow for entry points in the application or reveal sensitive information. As a result, `android:debuggable` should only be enabled during development and should be disabled in production builds.\n\n\n## Recommendation\nIn Android applications, either set the `android:debuggable` attribute to `false`, or do not include it in the manifest. The default value, when not included, is `false`.\n\n\n## Example\nIn the example below, the `android:debuggable` attribute is set to `true`.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\nThe corrected version sets the `android:debuggable` attribute to `false`.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Developers: [App Manifest Overview](https://developer.android.com/guide/topics/manifest/manifest-intro).\n* Android Developers: [The android:debuggable attribute](https://developer.android.com/guide/topics/manifest/application-element#debug).\n* Android Developers: [Enable debugging](https://developer.android.com/studio/debug#enable-debug).\n* Common Weakness Enumeration: [CWE-489](https://cwe.mitre.org/data/definitions/489.html).\n","markdown":"# Android debuggable attribute enabled\nThe Android manifest file defines configuration settings for Android applications. In this file, the `android:debuggable` attribute of the `application` element can be used to define whether or not the application can be debugged. When set to `true`, this attribute will allow the application to be debugged even when running on a device in user mode.\n\nWhen a debugger is enabled, it could allow for entry points in the application or reveal sensitive information. As a result, `android:debuggable` should only be enabled during development and should be disabled in production builds.\n\n\n## Recommendation\nIn Android applications, either set the `android:debuggable` attribute to `false`, or do not include it in the manifest. The default value, when not included, is `false`.\n\n\n## Example\nIn the example below, the `android:debuggable` attribute is set to `true`.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\nThe corrected version sets the `android:debuggable` attribute to `false`.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Developers: [App Manifest Overview](https://developer.android.com/guide/topics/manifest/manifest-intro).\n* Android Developers: [The android:debuggable attribute](https://developer.android.com/guide/topics/manifest/application-element#debug).\n* Android Developers: [Enable debugging](https://developer.android.com/studio/debug#enable-debug).\n* Common Weakness Enumeration: [CWE-489](https://cwe.mitre.org/data/definitions/489.html).\n"},"properties":{"tags":["security","external/cwe/cwe-489"],"description":"An enabled debugger can allow for entry points in the application or reveal sensitive information.","id":"java/android/debuggable-attribute-enabled","kind":"problem","name":"Android debuggable attribute enabled","precision":"very-high","problem.severity":"warning","security-severity":"7.2"}},{"id":"java/android/webview-debugging-enabled","name":"java/android/webview-debugging-enabled","shortDescription":{"text":"Android Webview debugging enabled"},"fullDescription":{"text":"Enabling Webview debugging in production builds can expose entry points or leak sensitive information."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android Webview debugging enabled\nThe `WebView.setWebContentsDebuggingEnabled` method enables or disables the contents of any `WebView` in the application to be debugged.\n\nYou should only enable debugging features during development. When you create a production build, you should disable it. If you enable debugging features, this can make your code vulnerable by adding entry points, or leaking sensitive information.\n\n\n## Recommendation\nEnsure that debugging features are not enabled in production builds, such as by guarding calls to `WebView.setWebContentsDebuggingEnabled(true)` by a flag that is only enabled in debug builds.\n\n\n## Example\nIn the first (bad) example, WebView debugging is always enabled. whereas the GOOD case only enables it if the `android:debuggable` attribute is set to `true`.\n\n\n```java\n// BAD - debugging is always enabled \nWebView.setWebContentsDebuggingEnabled(true);\n\n// GOOD - debugging is only enabled when this is a debug build, as indicated by the debuggable flag being set.\nif (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) {\n WebView.setWebContentsDebuggingEnabled(true);\n}\n```\n\n## References\n* Android Developers: [setWebContentsDebuggingEnabled](https://developer.android.com/reference/android/webkit/WebView.html#setWebContentsDebuggingEnabled(boolean)).\n* Android Developers: [Remote debugging WebViews](https://developer.chrome.com/docs/devtools/remote-debugging/webviews/).\n* Common Weakness Enumeration: [CWE-489](https://cwe.mitre.org/data/definitions/489.html).\n","markdown":"# Android Webview debugging enabled\nThe `WebView.setWebContentsDebuggingEnabled` method enables or disables the contents of any `WebView` in the application to be debugged.\n\nYou should only enable debugging features during development. When you create a production build, you should disable it. If you enable debugging features, this can make your code vulnerable by adding entry points, or leaking sensitive information.\n\n\n## Recommendation\nEnsure that debugging features are not enabled in production builds, such as by guarding calls to `WebView.setWebContentsDebuggingEnabled(true)` by a flag that is only enabled in debug builds.\n\n\n## Example\nIn the first (bad) example, WebView debugging is always enabled. whereas the GOOD case only enables it if the `android:debuggable` attribute is set to `true`.\n\n\n```java\n// BAD - debugging is always enabled \nWebView.setWebContentsDebuggingEnabled(true);\n\n// GOOD - debugging is only enabled when this is a debug build, as indicated by the debuggable flag being set.\nif (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) {\n WebView.setWebContentsDebuggingEnabled(true);\n}\n```\n\n## References\n* Android Developers: [setWebContentsDebuggingEnabled](https://developer.android.com/reference/android/webkit/WebView.html#setWebContentsDebuggingEnabled(boolean)).\n* Android Developers: [Remote debugging WebViews](https://developer.chrome.com/docs/devtools/remote-debugging/webviews/).\n* Common Weakness Enumeration: [CWE-489](https://cwe.mitre.org/data/definitions/489.html).\n"},"properties":{"tags":["security","external/cwe/cwe-489"],"description":"Enabling Webview debugging in production builds can expose entry points or leak sensitive information.","id":"java/android/webview-debugging-enabled","kind":"path-problem","name":"Android Webview debugging enabled","precision":"high","problem.severity":"warning","security-severity":"7.2"}},{"id":"java/tainted-permissions-check","name":"java/tainted-permissions-check","shortDescription":{"text":"User-controlled data used in permissions check"},"fullDescription":{"text":"Using user-controlled data in a permissions check may result in inappropriate permissions being granted."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# User-controlled data used in permissions check\nUsing user-controlled data in a permissions check may allow a user to gain unauthorized access to protected functionality or data.\n\n\n## Recommendation\nWhen checking whether a user is authorized for a particular activity, do not use data that is controlled by that user in the permissions check. If necessary, always validate the input, ideally against a fixed list of expected values.\n\nSimilarly, do not decide which permission to check for based on user data. In particular, avoid using computation to decide which permissions to check for. Use fixed permissions for particular actions, rather than generating the permission to check for.\n\n\n## Example\nThis example, using the Apache Shiro security framework, shows two ways to specify the permissions to check. The first way uses a string, `whatDoTheyWantToDo`, to specify the permissions to check. However, this string is built from user input. This can allow an attacker to force a check against a permission that they know they have, rather than the permission that should be checked. For example, while trying to access the account details of another user, the attacker could force the system to check whether they had permissions to access their *own* account details, which is incorrect, and would allow them to perform the action. The second, more secure way uses a fixed check that does not depend on data that is controlled by the user.\n\n\n```java\npublic static void main(String[] args) {\n\tString whatDoTheyWantToDo = args[0];\n\tSubject subject = SecurityUtils.getSubject();\n\n\t// BAD: permissions decision made using tainted data\n\tif(subject.isPermitted(\"domain:sublevel:\" + whatDoTheyWantToDo))\n\t\tdoIt();\n\n\t// GOOD: use fixed checks\n\tif(subject.isPermitted(\"domain:sublevel:whatTheMethodDoes\"))\n\t\tdoIt();\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SEC02-J. Do not base security checks on untrusted sources](https://wiki.sei.cmu.edu/confluence/display/java/SEC02-J.+Do+not+base+security+checks+on+untrusted+sources).\n* Common Weakness Enumeration: [CWE-807](https://cwe.mitre.org/data/definitions/807.html).\n* Common Weakness Enumeration: [CWE-290](https://cwe.mitre.org/data/definitions/290.html).\n","markdown":"# User-controlled data used in permissions check\nUsing user-controlled data in a permissions check may allow a user to gain unauthorized access to protected functionality or data.\n\n\n## Recommendation\nWhen checking whether a user is authorized for a particular activity, do not use data that is controlled by that user in the permissions check. If necessary, always validate the input, ideally against a fixed list of expected values.\n\nSimilarly, do not decide which permission to check for based on user data. In particular, avoid using computation to decide which permissions to check for. Use fixed permissions for particular actions, rather than generating the permission to check for.\n\n\n## Example\nThis example, using the Apache Shiro security framework, shows two ways to specify the permissions to check. The first way uses a string, `whatDoTheyWantToDo`, to specify the permissions to check. However, this string is built from user input. This can allow an attacker to force a check against a permission that they know they have, rather than the permission that should be checked. For example, while trying to access the account details of another user, the attacker could force the system to check whether they had permissions to access their *own* account details, which is incorrect, and would allow them to perform the action. The second, more secure way uses a fixed check that does not depend on data that is controlled by the user.\n\n\n```java\npublic static void main(String[] args) {\n\tString whatDoTheyWantToDo = args[0];\n\tSubject subject = SecurityUtils.getSubject();\n\n\t// BAD: permissions decision made using tainted data\n\tif(subject.isPermitted(\"domain:sublevel:\" + whatDoTheyWantToDo))\n\t\tdoIt();\n\n\t// GOOD: use fixed checks\n\tif(subject.isPermitted(\"domain:sublevel:whatTheMethodDoes\"))\n\t\tdoIt();\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SEC02-J. Do not base security checks on untrusted sources](https://wiki.sei.cmu.edu/confluence/display/java/SEC02-J.+Do+not+base+security+checks+on+untrusted+sources).\n* Common Weakness Enumeration: [CWE-807](https://cwe.mitre.org/data/definitions/807.html).\n* Common Weakness Enumeration: [CWE-290](https://cwe.mitre.org/data/definitions/290.html).\n"},"properties":{"tags":["security","external/cwe/cwe-807","external/cwe/cwe-290","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Using user-controlled data in a permissions check may result in inappropriate\n permissions being granted.","id":"java/tainted-permissions-check","kind":"path-problem","name":"User-controlled data used in permissions check","precision":"high","problem.severity":"error","security-severity":"7.8"}},{"id":"java/static-initialization-vector","name":"java/static-initialization-vector","shortDescription":{"text":"Using a static initialization vector for encryption"},"fullDescription":{"text":"An initialization vector (IV) used for ciphers of certain modes (such as CBC or GCM) should be unique and unpredictable, to maximize encryption and prevent dictionary attacks."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Using a static initialization vector for encryption\nWhen a cipher is used in certain modes such as CBC or GCM, it requires an initialization vector (IV). Under the same secret key, IVs should be unique and ideally unpredictable. If the same IV is used with the same secret key, then the same plaintext results in the same ciphertext. This can let an attacker learn if the same data pieces are transferred or stored, or help the attacker run a dictionary attack.\n\n\n## Recommendation\nUse a random IV generated by `SecureRandom`.\n\n\n## Example\nThe following example initializes a cipher with a static IV, which is unsafe:\n\n\n```java\nbyte[] iv = new byte[16]; // all zeroes\nGCMParameterSpec params = new GCMParameterSpec(128, iv);\nCipher cipher = Cipher.getInstance(\"AES/GCM/PKCS5PADDING\");\ncipher.init(Cipher.ENCRYPT_MODE, key, params);\n```\nThe next example initializes a cipher with a random IV:\n\n\n```java\nbyte[] iv = new byte[16];\nSecureRandom random = SecureRandom.getInstanceStrong();\nrandom.nextBytes(iv);\nGCMParameterSpec params = new GCMParameterSpec(128, iv);\nCipher cipher = Cipher.getInstance(\"AES/GCM/PKCS5PADDING\");\ncipher.init(Cipher.ENCRYPT_MODE, key, params);\n```\n\n## References\n* Wikipedia: [Initialization vector](https://en.wikipedia.org/wiki/Initialization_vector).\n* National Institute of Standards and Technology: [Recommendation for Block Cipher Modes of Operation](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf).\n* National Institute of Standards and Technology: [FIPS 140-2: Security Requirements for Cryptographic Modules](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.140-2.pdf).\n* Common Weakness Enumeration: [CWE-329](https://cwe.mitre.org/data/definitions/329.html).\n* Common Weakness Enumeration: [CWE-1204](https://cwe.mitre.org/data/definitions/1204.html).\n","markdown":"# Using a static initialization vector for encryption\nWhen a cipher is used in certain modes such as CBC or GCM, it requires an initialization vector (IV). Under the same secret key, IVs should be unique and ideally unpredictable. If the same IV is used with the same secret key, then the same plaintext results in the same ciphertext. This can let an attacker learn if the same data pieces are transferred or stored, or help the attacker run a dictionary attack.\n\n\n## Recommendation\nUse a random IV generated by `SecureRandom`.\n\n\n## Example\nThe following example initializes a cipher with a static IV, which is unsafe:\n\n\n```java\nbyte[] iv = new byte[16]; // all zeroes\nGCMParameterSpec params = new GCMParameterSpec(128, iv);\nCipher cipher = Cipher.getInstance(\"AES/GCM/PKCS5PADDING\");\ncipher.init(Cipher.ENCRYPT_MODE, key, params);\n```\nThe next example initializes a cipher with a random IV:\n\n\n```java\nbyte[] iv = new byte[16];\nSecureRandom random = SecureRandom.getInstanceStrong();\nrandom.nextBytes(iv);\nGCMParameterSpec params = new GCMParameterSpec(128, iv);\nCipher cipher = Cipher.getInstance(\"AES/GCM/PKCS5PADDING\");\ncipher.init(Cipher.ENCRYPT_MODE, key, params);\n```\n\n## References\n* Wikipedia: [Initialization vector](https://en.wikipedia.org/wiki/Initialization_vector).\n* National Institute of Standards and Technology: [Recommendation for Block Cipher Modes of Operation](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf).\n* National Institute of Standards and Technology: [FIPS 140-2: Security Requirements for Cryptographic Modules](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.140-2.pdf).\n* Common Weakness Enumeration: [CWE-329](https://cwe.mitre.org/data/definitions/329.html).\n* Common Weakness Enumeration: [CWE-1204](https://cwe.mitre.org/data/definitions/1204.html).\n"},"properties":{"tags":["security","external/cwe/cwe-329","external/cwe/cwe-1204","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"An initialization vector (IV) used for ciphers of certain modes (such as CBC or GCM) should be unique and unpredictable, to maximize encryption and prevent dictionary attacks.","id":"java/static-initialization-vector","kind":"path-problem","name":"Using a static initialization vector for encryption","precision":"high","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/cleartext-storage-in-cookie","name":"java/cleartext-storage-in-cookie","shortDescription":{"text":"Cleartext storage of sensitive information in cookie"},"fullDescription":{"text":"Storing sensitive information in cleartext can expose it to an attacker."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Cleartext storage of sensitive information in cookie\nSensitive information that is stored unencrypted is accessible to an attacker who gains access to the storage.\n\n\n## Recommendation\nEnsure that sensitive information is always encrypted before being stored. It may be wise to encrypt information before it is put into a heap data structure (such as `Java.util.Properties`) that may be written to disk later. Objects that are serializable or marshallable should also always contain encrypted information unless you are certain that they are not ever going to be serialized.\n\nIn general, decrypt sensitive information only at the point where it is necessary for it to be used in cleartext.\n\n\n## Example\nThe following example shows two ways of storing user credentials in a cookie. In the 'BAD' case, the credentials are simply stored in cleartext. In the 'GOOD' case, the credentials are hashed before storing them.\n\n\n```java\npublic static void main(String[] args) {\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"BP@ssw0rd\".toCharArray());\n\t\tdata = credentials.getUserName() + \":\" + new String(credentials.getPassword());\n\t\n\t\t// BAD: store data in a cookie in cleartext form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n\t\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"GP@ssw0rd\".toCharArray());\n\t\tString salt = \"ThisIsMySalt\";\n\t\tMessageDigest messageDigest = MessageDigest.getInstance(\"SHA-512\");\n\t\tmessageDigest.reset();\n\t\tString credentialsToHash =\n\t\t\t\tcredentials.getUserName() + \":\" + credentials.getPassword();\n\t\tbyte[] hashedCredsAsBytes =\n\t\t\t\tmessageDigest.digest((salt+credentialsToHash).getBytes(\"UTF-8\"));\n\t\tdata = bytesToString(hashedCredsAsBytes);\n\t\t\n\t\t// GOOD: store data in a cookie in encrypted form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n}\n\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* M. Dowd, J. McDonald and J. Schuhm, *The Art of Software Security Assessment*, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.\n* M. Howard and D. LeBlanc, *Writing Secure Code*, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.\n* Common Weakness Enumeration: [CWE-315](https://cwe.mitre.org/data/definitions/315.html).\n","markdown":"# Cleartext storage of sensitive information in cookie\nSensitive information that is stored unencrypted is accessible to an attacker who gains access to the storage.\n\n\n## Recommendation\nEnsure that sensitive information is always encrypted before being stored. It may be wise to encrypt information before it is put into a heap data structure (such as `Java.util.Properties`) that may be written to disk later. Objects that are serializable or marshallable should also always contain encrypted information unless you are certain that they are not ever going to be serialized.\n\nIn general, decrypt sensitive information only at the point where it is necessary for it to be used in cleartext.\n\n\n## Example\nThe following example shows two ways of storing user credentials in a cookie. In the 'BAD' case, the credentials are simply stored in cleartext. In the 'GOOD' case, the credentials are hashed before storing them.\n\n\n```java\npublic static void main(String[] args) {\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"BP@ssw0rd\".toCharArray());\n\t\tdata = credentials.getUserName() + \":\" + new String(credentials.getPassword());\n\t\n\t\t// BAD: store data in a cookie in cleartext form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n\t\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"GP@ssw0rd\".toCharArray());\n\t\tString salt = \"ThisIsMySalt\";\n\t\tMessageDigest messageDigest = MessageDigest.getInstance(\"SHA-512\");\n\t\tmessageDigest.reset();\n\t\tString credentialsToHash =\n\t\t\t\tcredentials.getUserName() + \":\" + credentials.getPassword();\n\t\tbyte[] hashedCredsAsBytes =\n\t\t\t\tmessageDigest.digest((salt+credentialsToHash).getBytes(\"UTF-8\"));\n\t\tdata = bytesToString(hashedCredsAsBytes);\n\t\t\n\t\t// GOOD: store data in a cookie in encrypted form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n}\n\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* M. Dowd, J. McDonald and J. Schuhm, *The Art of Software Security Assessment*, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.\n* M. Howard and D. LeBlanc, *Writing Secure Code*, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.\n* Common Weakness Enumeration: [CWE-315](https://cwe.mitre.org/data/definitions/315.html).\n"},"properties":{"tags":["security","external/cwe/cwe-315","owasp-top10-2021","A05:2021 - Security Misconfiguration"],"description":"Storing sensitive information in cleartext can expose it to an attacker.","id":"java/cleartext-storage-in-cookie","kind":"problem","name":"Cleartext storage of sensitive information in cookie","precision":"high","problem.severity":"error","security-severity":"5.0"}},{"id":"java/android/backup-enabled","name":"java/android/backup-enabled","shortDescription":{"text":"Application backup allowed"},"fullDescription":{"text":"Allowing application backups may allow an attacker to extract sensitive data."},"defaultConfiguration":{"enabled":true,"level":"note"},"help":{"text":"# Application backup allowed\nIn the Android manifest file, you can use the `android:allowBackup` attribute of the `application` element to define whether the application will have automatic backups or not.\n\nIf your application uses any sensitive data, you should disable automatic backups to prevent attackers from extracting it.\n\n\n## Recommendation\nFor Android applications which process sensitive data, set `android:allowBackup` to `false` in the manifest file.\n\nNote: Since Android 6.0 (Marshmallow), automatic backups for applications are switched on by default.\n\n\n## Example\nIn the following two (bad) examples, the `android:allowBackup` setting is enabled:\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\nIn the following (good) example, `android:allowBackup` is set to `false`:\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Documentation: [Back up user data with Auto Backup](https://developer.android.com/guide/topics/data/autobackup#EnablingAutoBackup)\n* OWASP Mobile Security Testing Guide: [ Android Backups ](https://github.com/OWASP/owasp-mstg/blob/b7a93a2e5e0557cc9a12e55fc3f6675f6986bb86/Document/0x05d-Testing-Data-Storage.md#backups)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n","markdown":"# Application backup allowed\nIn the Android manifest file, you can use the `android:allowBackup` attribute of the `application` element to define whether the application will have automatic backups or not.\n\nIf your application uses any sensitive data, you should disable automatic backups to prevent attackers from extracting it.\n\n\n## Recommendation\nFor Android applications which process sensitive data, set `android:allowBackup` to `false` in the manifest file.\n\nNote: Since Android 6.0 (Marshmallow), automatic backups for applications are switched on by default.\n\n\n## Example\nIn the following two (bad) examples, the `android:allowBackup` setting is enabled:\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\nIn the following (good) example, `android:allowBackup` is set to `false`:\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Documentation: [Back up user data with Auto Backup](https://developer.android.com/guide/topics/data/autobackup#EnablingAutoBackup)\n* OWASP Mobile Security Testing Guide: [ Android Backups ](https://github.com/OWASP/owasp-mstg/blob/b7a93a2e5e0557cc9a12e55fc3f6675f6986bb86/Document/0x05d-Testing-Data-Storage.md#backups)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n"},"properties":{"tags":["security","external/cwe/cwe-312","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Allowing application backups may allow an attacker to extract sensitive data.","id":"java/android/backup-enabled","kind":"problem","name":"Application backup allowed","precision":"very-high","problem.severity":"recommendation","security-severity":"7.5"}},{"id":"java/android/intent-redirection","name":"java/android/intent-redirection","shortDescription":{"text":"Android Intent redirection"},"fullDescription":{"text":"Starting Android components with user-provided Intents can provide access to internal components of the application, increasing the attack surface and potentially causing unintended effects."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Android Intent redirection\nAn exported Android component that obtains a user-provided Intent and uses it to launch another component can be exploited to obtain access to private, unexported components of the same app or to launch other apps' components on behalf of the victim app.\n\n\n## Recommendation\nDo not export components that start other components from a user-provided Intent. They can be made private by setting the `android:exported` property to `false` in the app's Android Manifest.\n\nIf this is not possible, restrict either which apps can send Intents to the affected component, or which components can be started from it.\n\n\n## Example\nThe following snippet contains three examples. In the first example, an arbitrary component can be started from the externally provided `forward_intent` Intent. In the second example, the destination component of the Intent is first checked to make sure it is safe. In the third example, the component that created the Intent is first checked to make sure it comes from a trusted origin.\n\n\n```java\n// BAD: A user-provided Intent is used to launch an arbitrary component\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nstartActivity(forwardIntent);\n\n// GOOD: The destination component is checked before launching it\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nComponentName destinationComponent = forwardIntent.resolveActivity(getPackageManager());\nif (destinationComponent.getPackageName().equals(\"safe.package\") && \n destinationComponent.getClassName().equals(\"SafeClass\")) {\n startActivity(forwardIntent);\n}\n\n// GOOD: The component that sent the Intent is checked before launching the destination component\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nComponentName originComponent = getCallingActivity();\nif (originComponent.getPackageName().equals(\"trusted.package\") && originComponent.getClassName().equals(\"TrustedClass\")) {\n startActivity(forwardIntent);\n}\n\n```\n\n## References\n* Google: [Remediation for Intent Redirection Vulnerability](https://support.google.com/faqs/answer/9267555?hl=en).\n* OWASP Mobile Security Testing Guide: [Intents](https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05a-platform-overview#intents).\n* Android Developers: [The android:exported attribute](https://developer.android.com/guide/topics/manifest/activity-element#exported).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n* Common Weakness Enumeration: [CWE-940](https://cwe.mitre.org/data/definitions/940.html).\n","markdown":"# Android Intent redirection\nAn exported Android component that obtains a user-provided Intent and uses it to launch another component can be exploited to obtain access to private, unexported components of the same app or to launch other apps' components on behalf of the victim app.\n\n\n## Recommendation\nDo not export components that start other components from a user-provided Intent. They can be made private by setting the `android:exported` property to `false` in the app's Android Manifest.\n\nIf this is not possible, restrict either which apps can send Intents to the affected component, or which components can be started from it.\n\n\n## Example\nThe following snippet contains three examples. In the first example, an arbitrary component can be started from the externally provided `forward_intent` Intent. In the second example, the destination component of the Intent is first checked to make sure it is safe. In the third example, the component that created the Intent is first checked to make sure it comes from a trusted origin.\n\n\n```java\n// BAD: A user-provided Intent is used to launch an arbitrary component\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nstartActivity(forwardIntent);\n\n// GOOD: The destination component is checked before launching it\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nComponentName destinationComponent = forwardIntent.resolveActivity(getPackageManager());\nif (destinationComponent.getPackageName().equals(\"safe.package\") && \n destinationComponent.getClassName().equals(\"SafeClass\")) {\n startActivity(forwardIntent);\n}\n\n// GOOD: The component that sent the Intent is checked before launching the destination component\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nComponentName originComponent = getCallingActivity();\nif (originComponent.getPackageName().equals(\"trusted.package\") && originComponent.getClassName().equals(\"TrustedClass\")) {\n startActivity(forwardIntent);\n}\n\n```\n\n## References\n* Google: [Remediation for Intent Redirection Vulnerability](https://support.google.com/faqs/answer/9267555?hl=en).\n* OWASP Mobile Security Testing Guide: [Intents](https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05a-platform-overview#intents).\n* Android Developers: [The android:exported attribute](https://developer.android.com/guide/topics/manifest/activity-element#exported).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n* Common Weakness Enumeration: [CWE-940](https://cwe.mitre.org/data/definitions/940.html).\n"},"properties":{"tags":["security","external/cwe/cwe-926","external/cwe/cwe-940","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Starting Android components with user-provided Intents\n can provide access to internal components of the application,\n increasing the attack surface and potentially causing unintended effects.","id":"java/android/intent-redirection","kind":"path-problem","name":"Android Intent redirection","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/insecure-cookie","name":"java/insecure-cookie","shortDescription":{"text":"Failure to use secure cookies"},"fullDescription":{"text":"Insecure cookies may be sent in cleartext, which makes them vulnerable to interception."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Failure to use secure cookies\nFailing to set the 'secure' flag on a cookie can cause it to be sent in cleartext. This makes it easier for an attacker to intercept.\n\n\n## Recommendation\nAlways use `setSecure` to set the 'secure' flag on a cookie before adding it to an `HttpServletResponse`.\n\n\n## Example\nThis example shows two ways of adding a cookie to an `HttpServletResponse`. The first way leaves out the setting of the 'secure' flag; the second way includes the setting of the flag.\n\n\n```java\npublic static void test(HttpServletRequest request, HttpServletResponse response) {\n\t{\n\t\tCookie cookie = new Cookie(\"secret\", \"fakesecret\");\n\t\t\n\t\t// BAD: 'secure' flag not set\n\t\tresponse.addCookie(cookie);\n\t}\n\n\t{\n\t\tCookie cookie = new Cookie(\"secret\", \"fakesecret\");\n\t\t\n\t\t// GOOD: set 'secure' flag\n\t\tcookie.setSecure(true);\n\t\tresponse.addCookie(cookie);\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* Java Platform, Enterprise Edition (Java EE) 7, API Specification: [Class Cookie](https://docs.oracle.com/javaee/7/api/javax/servlet/http/Cookie.html).\n* Common Weakness Enumeration: [CWE-614](https://cwe.mitre.org/data/definitions/614.html).\n","markdown":"# Failure to use secure cookies\nFailing to set the 'secure' flag on a cookie can cause it to be sent in cleartext. This makes it easier for an attacker to intercept.\n\n\n## Recommendation\nAlways use `setSecure` to set the 'secure' flag on a cookie before adding it to an `HttpServletResponse`.\n\n\n## Example\nThis example shows two ways of adding a cookie to an `HttpServletResponse`. The first way leaves out the setting of the 'secure' flag; the second way includes the setting of the flag.\n\n\n```java\npublic static void test(HttpServletRequest request, HttpServletResponse response) {\n\t{\n\t\tCookie cookie = new Cookie(\"secret\", \"fakesecret\");\n\t\t\n\t\t// BAD: 'secure' flag not set\n\t\tresponse.addCookie(cookie);\n\t}\n\n\t{\n\t\tCookie cookie = new Cookie(\"secret\", \"fakesecret\");\n\t\t\n\t\t// GOOD: set 'secure' flag\n\t\tcookie.setSecure(true);\n\t\tresponse.addCookie(cookie);\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* Java Platform, Enterprise Edition (Java EE) 7, API Specification: [Class Cookie](https://docs.oracle.com/javaee/7/api/javax/servlet/http/Cookie.html).\n* Common Weakness Enumeration: [CWE-614](https://cwe.mitre.org/data/definitions/614.html).\n"},"properties":{"tags":["security","external/cwe/cwe-614","owasp-top10-2021","A05:2021 - Security Misconfiguration"],"description":"Insecure cookies may be sent in cleartext, which makes them vulnerable to\n interception.","id":"java/insecure-cookie","kind":"problem","name":"Failure to use secure cookies","precision":"high","problem.severity":"error","security-severity":"5.0"}},{"id":"java/jhipster-prng","name":"java/jhipster-prng","shortDescription":{"text":"Detect JHipster Generator Vulnerability CVE-2019-16303"},"fullDescription":{"text":"Using a vulnerable version of JHipster to generate random numbers makes it easier for attackers to take over accounts."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Detect JHipster Generator Vulnerability CVE-2019-16303\nThis query detects instances of `RandomUtil.java` that were generated by a [JHipster](https://www.jhipster.tech/) version that is vulnerable to [CVE-2019-16303](https://github.com/jhipster/jhipster-kotlin/security/advisories/GHSA-j3rh-8vwq-wh84).\n\nIf an app uses `RandomUtil.java` generated by a vulnerable version of JHipster, attackers can request a password reset token and use this to predict the value of future reset tokens generated by this server. Using this information, they can create a reset link that allows them to take over any account.\n\nThis vulnerability has a [ CVSS v3.0 Base Score of 9.8/10 ](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?name=CVE-2019-16303&vector=AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H&version=3.1&source=NIST).\n\n\n## Example\nThe example below shows the vulnerable `RandomUtil` class generated by [JHipster prior to version 6.3.0](https://www.jhipster.tech/2019/09/13/jhipster-release-6.3.0.html).\n\n\n```java\nimport org.apache.commons.lang3.RandomStringUtils;\n\n/**\n * Utility class for generating random Strings.\n */\npublic final class RandomUtil {\n\n private static final int DEF_COUNT = 20;\n\n private RandomUtil() {\n }\n\n /**\n * Generate a password.\n *\n * @return the generated password.\n */\n public static String generatePassword() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate an activation key.\n *\n * @return the generated activation key.\n */\n public static String generateActivationKey() {\n return RandomStringUtils.randomNumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a reset key.\n *\n * @return the generated reset key.\n */\n public static String generateResetKey() {\n return RandomStringUtils.randomNumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a unique series to validate a persistent token, used in the\n * authentication remember-me mechanism.\n *\n * @return the generated series data.\n */\n public static String generateSeriesData() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a persistent token, used in the authentication remember-me mechanism.\n *\n * @return the generated token data.\n */\n public static String generateTokenData() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n}\n\n```\nBelow is a fixed version of the `RandomUtil` class.\n\n\n```java\nimport org.apache.commons.lang3.RandomStringUtils;\n\nimport java.security.SecureRandom;\n\n/**\n * Utility class for generating random Strings.\n */\npublic final class RandomUtil {\n private static final SecureRandom SECURE_RANDOM = new SecureRandom(); // GOOD: Using SecureRandom\n\n private static final int DEF_COUNT = 20;\n\n static {\n SECURE_RANDOM.nextBytes(new byte[64]);\n }\n\n private RandomUtil() {\n }\n\n private static String generateRandomAlphanumericString() {\n // GOOD: Passing Secure Random to RandomStringUtils::random\n return RandomStringUtils.random(DEF_COUNT, 0, 0, true, true, null, SECURE_RANDOM);\n }\n\n /**\n * Generate a password.\n *\n * @return the generated password.\n */\n public static String generatePassword() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate an activation key.\n *\n * @return the generated activation key.\n */\n public static String generateActivationKey() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a reset key.\n *\n * @return the generated reset key.\n */\n public static String generateResetKey() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a unique series to validate a persistent token, used in the\n * authentication remember-me mechanism.\n *\n * @return the generated series data.\n */\n public static String generateSeriesData() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a persistent token, used in the authentication remember-me mechanism.\n *\n * @return the generated token data.\n */\n public static String generateTokenData() {\n return generateRandomAlphanumericString();\n }\n}\n\n```\n\n## Recommendation\nYou should refactor the `RandomUtil` class and replace every call to `RandomStringUtils.randomAlphaNumeric`. You could regenerate the class using the latest version of JHipster, or use an automated refactoring. For example, using the [Patching JHipster CWE-338](https://github.com/moderneinc/jhipster-cwe-338) for the [Rewrite project](https://github.com/openrewrite/rewrite).\n\n\n## References\n* Cloudflare Blog: [ Why secure systems require random numbers ](https://blog.cloudflare.com/why-randomness-matters/)\n* Hacker News: [ How I Hacked Hacker News (with arc security advisory) ](https://news.ycombinator.com/item?id=639976)\n* Posts by Pucara Information Security Team: [ The Java Soothsayer: A practical application for insecure randomness. (Includes free 0day) ](https://blog.pucarasec.com/2020/05/09/the-java-soothsayer-a-practical-application-for-insecure-randomness-includes-free-0day/)\n* Common Weakness Enumeration: [CWE-338](https://cwe.mitre.org/data/definitions/338.html).\n","markdown":"# Detect JHipster Generator Vulnerability CVE-2019-16303\nThis query detects instances of `RandomUtil.java` that were generated by a [JHipster](https://www.jhipster.tech/) version that is vulnerable to [CVE-2019-16303](https://github.com/jhipster/jhipster-kotlin/security/advisories/GHSA-j3rh-8vwq-wh84).\n\nIf an app uses `RandomUtil.java` generated by a vulnerable version of JHipster, attackers can request a password reset token and use this to predict the value of future reset tokens generated by this server. Using this information, they can create a reset link that allows them to take over any account.\n\nThis vulnerability has a [ CVSS v3.0 Base Score of 9.8/10 ](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?name=CVE-2019-16303&vector=AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H&version=3.1&source=NIST).\n\n\n## Example\nThe example below shows the vulnerable `RandomUtil` class generated by [JHipster prior to version 6.3.0](https://www.jhipster.tech/2019/09/13/jhipster-release-6.3.0.html).\n\n\n```java\nimport org.apache.commons.lang3.RandomStringUtils;\n\n/**\n * Utility class for generating random Strings.\n */\npublic final class RandomUtil {\n\n private static final int DEF_COUNT = 20;\n\n private RandomUtil() {\n }\n\n /**\n * Generate a password.\n *\n * @return the generated password.\n */\n public static String generatePassword() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate an activation key.\n *\n * @return the generated activation key.\n */\n public static String generateActivationKey() {\n return RandomStringUtils.randomNumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a reset key.\n *\n * @return the generated reset key.\n */\n public static String generateResetKey() {\n return RandomStringUtils.randomNumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a unique series to validate a persistent token, used in the\n * authentication remember-me mechanism.\n *\n * @return the generated series data.\n */\n public static String generateSeriesData() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a persistent token, used in the authentication remember-me mechanism.\n *\n * @return the generated token data.\n */\n public static String generateTokenData() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n}\n\n```\nBelow is a fixed version of the `RandomUtil` class.\n\n\n```java\nimport org.apache.commons.lang3.RandomStringUtils;\n\nimport java.security.SecureRandom;\n\n/**\n * Utility class for generating random Strings.\n */\npublic final class RandomUtil {\n private static final SecureRandom SECURE_RANDOM = new SecureRandom(); // GOOD: Using SecureRandom\n\n private static final int DEF_COUNT = 20;\n\n static {\n SECURE_RANDOM.nextBytes(new byte[64]);\n }\n\n private RandomUtil() {\n }\n\n private static String generateRandomAlphanumericString() {\n // GOOD: Passing Secure Random to RandomStringUtils::random\n return RandomStringUtils.random(DEF_COUNT, 0, 0, true, true, null, SECURE_RANDOM);\n }\n\n /**\n * Generate a password.\n *\n * @return the generated password.\n */\n public static String generatePassword() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate an activation key.\n *\n * @return the generated activation key.\n */\n public static String generateActivationKey() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a reset key.\n *\n * @return the generated reset key.\n */\n public static String generateResetKey() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a unique series to validate a persistent token, used in the\n * authentication remember-me mechanism.\n *\n * @return the generated series data.\n */\n public static String generateSeriesData() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a persistent token, used in the authentication remember-me mechanism.\n *\n * @return the generated token data.\n */\n public static String generateTokenData() {\n return generateRandomAlphanumericString();\n }\n}\n\n```\n\n## Recommendation\nYou should refactor the `RandomUtil` class and replace every call to `RandomStringUtils.randomAlphaNumeric`. You could regenerate the class using the latest version of JHipster, or use an automated refactoring. For example, using the [Patching JHipster CWE-338](https://github.com/moderneinc/jhipster-cwe-338) for the [Rewrite project](https://github.com/openrewrite/rewrite).\n\n\n## References\n* Cloudflare Blog: [ Why secure systems require random numbers ](https://blog.cloudflare.com/why-randomness-matters/)\n* Hacker News: [ How I Hacked Hacker News (with arc security advisory) ](https://news.ycombinator.com/item?id=639976)\n* Posts by Pucara Information Security Team: [ The Java Soothsayer: A practical application for insecure randomness. (Includes free 0day) ](https://blog.pucarasec.com/2020/05/09/the-java-soothsayer-a-practical-application-for-insecure-randomness-includes-free-0day/)\n* Common Weakness Enumeration: [CWE-338](https://cwe.mitre.org/data/definitions/338.html).\n"},"properties":{"tags":["security","external/cwe/cwe-338","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using a vulnerable version of JHipster to generate random numbers makes it easier for attackers to take over accounts.","id":"java/jhipster-prng","kind":"problem","name":"Detect JHipster Generator Vulnerability CVE-2019-16303","precision":"very-high","problem.severity":"error","security-severity":"7.8"}},{"id":"java/maven/dependency-upon-bintray","name":"java/maven/dependency-upon-bintray","shortDescription":{"text":"Depending upon JCenter/Bintray as an artifact repository"},"fullDescription":{"text":"Using a deprecated artifact repository may eventually give attackers access for a supply chain attack."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Depending upon JCenter/Bintray as an artifact repository\n[Bintray and JCenter are shutting down on February 1st, 2022](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/). Relying upon repositories that are deprecated or scheduled to be shutdown can have unintended consequences; for example, artifacts being resolved from a different artifact server or a total failure of the CI build.\n\nWhen artifact repositories are left unmaintained for a long period of time, vulnerabilities may emerge. Theoretically, this could allow attackers to inject malicious code into the artifacts that you are resolving and infect build artifacts that are being produced. This can be used by attackers to perform a [supply chain attack](https://en.wikipedia.org/wiki/Supply_chain_attack) against your project's users.\n\n\n## Recommendation\nAlways use the canonical repository for resolving your dependencies.\n\n\n## Example\nThe following example shows locations in a Maven POM file where artifact repository upload/download is configured. The use of Bintray in any of these locations is not advised.\n\n\n```xml\n\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Bintray Usage\n An example of using bintray to download and upload dependencies\n\n \n \n jcenter\n JCenter\n \n https://jcenter.bintray.com\n \n \n jcenter-snapshots\n JCenter\n \n https://jcenter.bintray.com\n \n \n \n \n jcenter\n JCenter\n \n https://jcenter.bintray.com\n \n \n \n \n jcenter\n JCenter\n \n https://dl.bintray.com/groovy/maven\n \n \n \n \n jcenter-plugins\n JCenter\n \n https://jcenter.bintray.com\n \n \n\n\n```\n\n## References\n* JFrog blog: [ Into the Sunset on May 1st: Bintray, JCenter, GoCenter, and ChartCenter ](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/)\n* Common Weakness Enumeration: [CWE-1104](https://cwe.mitre.org/data/definitions/1104.html).\n","markdown":"# Depending upon JCenter/Bintray as an artifact repository\n[Bintray and JCenter are shutting down on February 1st, 2022](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/). Relying upon repositories that are deprecated or scheduled to be shutdown can have unintended consequences; for example, artifacts being resolved from a different artifact server or a total failure of the CI build.\n\nWhen artifact repositories are left unmaintained for a long period of time, vulnerabilities may emerge. Theoretically, this could allow attackers to inject malicious code into the artifacts that you are resolving and infect build artifacts that are being produced. This can be used by attackers to perform a [supply chain attack](https://en.wikipedia.org/wiki/Supply_chain_attack) against your project's users.\n\n\n## Recommendation\nAlways use the canonical repository for resolving your dependencies.\n\n\n## Example\nThe following example shows locations in a Maven POM file where artifact repository upload/download is configured. The use of Bintray in any of these locations is not advised.\n\n\n```xml\n\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Bintray Usage\n An example of using bintray to download and upload dependencies\n\n \n \n jcenter\n JCenter\n \n https://jcenter.bintray.com\n \n \n jcenter-snapshots\n JCenter\n \n https://jcenter.bintray.com\n \n \n \n \n jcenter\n JCenter\n \n https://jcenter.bintray.com\n \n \n \n \n jcenter\n JCenter\n \n https://dl.bintray.com/groovy/maven\n \n \n \n \n jcenter-plugins\n JCenter\n \n https://jcenter.bintray.com\n \n \n\n\n```\n\n## References\n* JFrog blog: [ Into the Sunset on May 1st: Bintray, JCenter, GoCenter, and ChartCenter ](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/)\n* Common Weakness Enumeration: [CWE-1104](https://cwe.mitre.org/data/definitions/1104.html).\n"},"properties":{"tags":["security","external/cwe/cwe-1104","owasp-top10-2021","A06:2021 - Vulnerable and Outdated Components"],"description":"Using a deprecated artifact repository may eventually give attackers access for a supply chain attack.","id":"java/maven/dependency-upon-bintray","kind":"problem","name":"Depending upon JCenter/Bintray as an artifact repository","precision":"very-high","problem.severity":"error","security-severity":"6.5"}},{"id":"java/stack-trace-exposure","name":"java/stack-trace-exposure","shortDescription":{"text":"Information exposure through a stack trace"},"fullDescription":{"text":"Information from a stack trace propagates to an external user. Stack traces can unintentionally reveal implementation details that are useful to an attacker for developing a subsequent exploit."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Information exposure through a stack trace\nSoftware developers often add stack traces to error messages, as a debugging aid. Whenever that error message occurs for an end user, the developer can use the stack trace to help identify how to fix the problem. In particular, stack traces can tell the developer more about the sequence of events that led to a failure, as opposed to merely the final state of the software when the error occurred.\n\nUnfortunately, the same information can be useful to an attacker. The sequence of class names in a stack trace can reveal the structure of the application as well as any internal components it relies on. Furthermore, the error message at the top of a stack trace can include information such as server-side file names and SQL code that the application relies on, allowing an attacker to fine-tune a subsequent injection attack.\n\n\n## Recommendation\nSend the user a more generic error message that reveals less information. Either suppress the stack trace entirely, or log it only on the server.\n\n\n## Example\nIn the following example, an exception is handled in two different ways. In the first version, labeled BAD, the exception is sent back to the remote user using the `sendError()` method. As such, the user is able to see a detailed stack trace, which may contain sensitive information. In the second version, the error message is logged only on the server. That way, the developers can still access and use the error log, but remote users will not see the information.\n\n\n```java\nprotected void doGet(HttpServletRequest request, HttpServletResponse response) {\n\ttry {\n\t\tdoSomeWork();\n\t} catch (NullPointerException ex) {\n\t\t// BAD: printing a stack trace back to the response\n\t\tex.printStackTrace(response.getWriter());\n\t\treturn;\n\t}\n\n\ttry {\n\t\tdoSomeWork();\n\t} catch (NullPointerException ex) {\n\t\t// GOOD: log the stack trace, and send back a non-revealing response\n\t\tlog(\"Exception occurred\", ex);\n\t\tresponse.sendError(\n\t\t\tHttpServletResponse.SC_INTERNAL_SERVER_ERROR,\n\t\t\t\"Exception occurred\");\n\t\treturn;\n\t}\n}\n\n```\n\n## References\n* OWASP: [Improper Error Handling](https://owasp.org/www-community/Improper_Error_Handling).\n* CERT Java Coding Standard: [ERR01-J. Do not allow exceptions to expose sensitive information](https://www.securecoding.cert.org/confluence/display/java/ERR01-J.+Do+not+allow+exceptions+to+expose+sensitive+information).\n* Common Weakness Enumeration: [CWE-209](https://cwe.mitre.org/data/definitions/209.html).\n* Common Weakness Enumeration: [CWE-497](https://cwe.mitre.org/data/definitions/497.html).\n","markdown":"# Information exposure through a stack trace\nSoftware developers often add stack traces to error messages, as a debugging aid. Whenever that error message occurs for an end user, the developer can use the stack trace to help identify how to fix the problem. In particular, stack traces can tell the developer more about the sequence of events that led to a failure, as opposed to merely the final state of the software when the error occurred.\n\nUnfortunately, the same information can be useful to an attacker. The sequence of class names in a stack trace can reveal the structure of the application as well as any internal components it relies on. Furthermore, the error message at the top of a stack trace can include information such as server-side file names and SQL code that the application relies on, allowing an attacker to fine-tune a subsequent injection attack.\n\n\n## Recommendation\nSend the user a more generic error message that reveals less information. Either suppress the stack trace entirely, or log it only on the server.\n\n\n## Example\nIn the following example, an exception is handled in two different ways. In the first version, labeled BAD, the exception is sent back to the remote user using the `sendError()` method. As such, the user is able to see a detailed stack trace, which may contain sensitive information. In the second version, the error message is logged only on the server. That way, the developers can still access and use the error log, but remote users will not see the information.\n\n\n```java\nprotected void doGet(HttpServletRequest request, HttpServletResponse response) {\n\ttry {\n\t\tdoSomeWork();\n\t} catch (NullPointerException ex) {\n\t\t// BAD: printing a stack trace back to the response\n\t\tex.printStackTrace(response.getWriter());\n\t\treturn;\n\t}\n\n\ttry {\n\t\tdoSomeWork();\n\t} catch (NullPointerException ex) {\n\t\t// GOOD: log the stack trace, and send back a non-revealing response\n\t\tlog(\"Exception occurred\", ex);\n\t\tresponse.sendError(\n\t\t\tHttpServletResponse.SC_INTERNAL_SERVER_ERROR,\n\t\t\t\"Exception occurred\");\n\t\treturn;\n\t}\n}\n\n```\n\n## References\n* OWASP: [Improper Error Handling](https://owasp.org/www-community/Improper_Error_Handling).\n* CERT Java Coding Standard: [ERR01-J. Do not allow exceptions to expose sensitive information](https://www.securecoding.cert.org/confluence/display/java/ERR01-J.+Do+not+allow+exceptions+to+expose+sensitive+information).\n* Common Weakness Enumeration: [CWE-209](https://cwe.mitre.org/data/definitions/209.html).\n* Common Weakness Enumeration: [CWE-497](https://cwe.mitre.org/data/definitions/497.html).\n"},"properties":{"tags":["security","external/cwe/cwe-209","external/cwe/cwe-497","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Information from a stack trace propagates to an external user.\n Stack traces can unintentionally reveal implementation details\n that are useful to an attacker for developing a subsequent exploit.","id":"java/stack-trace-exposure","kind":"problem","name":"Information exposure through a stack trace","precision":"high","problem.severity":"error","security-severity":"5.4"}},{"id":"java/tainted-numeric-cast","name":"java/tainted-numeric-cast","shortDescription":{"text":"User-controlled data in numeric cast"},"fullDescription":{"text":"Casting user-controlled numeric data to a narrower type without validation can cause unexpected truncation."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# User-controlled data in numeric cast\nCasting a user-controlled numeric value to a narrower type can result in truncated values unless the input is validated.\n\nNarrowing conversions may cause potentially unintended results. For example, casting the positive integer value `128` to type `byte` yields the negative value `-128`.\n\n\n## Recommendation\nGuard against unexpected truncation of user-controlled arithmetic data by doing one of the following:\n\n* Validate the user input.\n* Define a guard on the cast expression, so that the cast is performed only if the input is known to be within the range of the resulting type.\n* Avoid casting to a narrower type, and instead continue to use a wider type.\n\n## Example\nIn this example, a value is read from standard input into a `long`. Because the value is a user-controlled value, it could be extremely large. Casting this value to a narrower type could therefore cause unexpected truncation. The `scaled2` example uses a guard to avoid this problem and checks the range of the input before performing the cast. If the value is too large to cast to type `int` it is rejected as invalid.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) throws IOException {\n\t\t{\n\t\t\tlong data;\n\n\t\t\tBufferedReader readerBuffered = new BufferedReader(\n\t\t\t\t\tnew InputStreamReader(System.in, \"UTF-8\"));\n\t\t\tString stringNumber = readerBuffered.readLine();\n\t\t\tif (stringNumber != null) {\n\t\t\t\tdata = Long.parseLong(stringNumber.trim());\n\t\t\t} else {\n\t\t\t\tdata = 0;\n\t\t\t}\n\n\t\t\t// AVOID: potential truncation if input data is very large,\n\t\t\t// for example 'Long.MAX_VALUE'\n\t\t\tint scaled = (int)data;\n\n\t\t\t//...\n\n\t\t\t// GOOD: use a guard to ensure no truncation occurs\n\t\t\tint scaled2;\n\t\t\tif (data > Integer.MIN_VALUE && data < Integer.MAX_VALUE)\n\t\t\t\tscaled2 = (int)data;\n\t\t\telse\n\t\t\t\tthrow new IllegalArgumentException(\"Invalid input\");\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM12-J. Ensure conversions of numeric types to narrower types do not result in lost or misinterpreted data](https://wiki.sei.cmu.edu/confluence/display/java/NUM12-J.+Ensure+conversions+of+numeric+types+to+narrower+types+do+not+result+in+lost+or+misinterpreted+data).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n* Common Weakness Enumeration: [CWE-681](https://cwe.mitre.org/data/definitions/681.html).\n","markdown":"# User-controlled data in numeric cast\nCasting a user-controlled numeric value to a narrower type can result in truncated values unless the input is validated.\n\nNarrowing conversions may cause potentially unintended results. For example, casting the positive integer value `128` to type `byte` yields the negative value `-128`.\n\n\n## Recommendation\nGuard against unexpected truncation of user-controlled arithmetic data by doing one of the following:\n\n* Validate the user input.\n* Define a guard on the cast expression, so that the cast is performed only if the input is known to be within the range of the resulting type.\n* Avoid casting to a narrower type, and instead continue to use a wider type.\n\n## Example\nIn this example, a value is read from standard input into a `long`. Because the value is a user-controlled value, it could be extremely large. Casting this value to a narrower type could therefore cause unexpected truncation. The `scaled2` example uses a guard to avoid this problem and checks the range of the input before performing the cast. If the value is too large to cast to type `int` it is rejected as invalid.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) throws IOException {\n\t\t{\n\t\t\tlong data;\n\n\t\t\tBufferedReader readerBuffered = new BufferedReader(\n\t\t\t\t\tnew InputStreamReader(System.in, \"UTF-8\"));\n\t\t\tString stringNumber = readerBuffered.readLine();\n\t\t\tif (stringNumber != null) {\n\t\t\t\tdata = Long.parseLong(stringNumber.trim());\n\t\t\t} else {\n\t\t\t\tdata = 0;\n\t\t\t}\n\n\t\t\t// AVOID: potential truncation if input data is very large,\n\t\t\t// for example 'Long.MAX_VALUE'\n\t\t\tint scaled = (int)data;\n\n\t\t\t//...\n\n\t\t\t// GOOD: use a guard to ensure no truncation occurs\n\t\t\tint scaled2;\n\t\t\tif (data > Integer.MIN_VALUE && data < Integer.MAX_VALUE)\n\t\t\t\tscaled2 = (int)data;\n\t\t\telse\n\t\t\t\tthrow new IllegalArgumentException(\"Invalid input\");\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM12-J. Ensure conversions of numeric types to narrower types do not result in lost or misinterpreted data](https://wiki.sei.cmu.edu/confluence/display/java/NUM12-J.+Ensure+conversions+of+numeric+types+to+narrower+types+do+not+result+in+lost+or+misinterpreted+data).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n* Common Weakness Enumeration: [CWE-681](https://cwe.mitre.org/data/definitions/681.html).\n"},"properties":{"tags":["security","external/cwe/cwe-197","external/cwe/cwe-681"],"description":"Casting user-controlled numeric data to a narrower type without validation\n can cause unexpected truncation.","id":"java/tainted-numeric-cast","kind":"path-problem","name":"User-controlled data in numeric cast","precision":"high","problem.severity":"error","security-severity":"9.0"}},{"id":"java/xss","name":"java/xss","shortDescription":{"text":"Cross-site scripting"},"fullDescription":{"text":"Writing user input directly to a web page allows for a cross-site scripting vulnerability."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Cross-site scripting\nDirectly writing user input (for example, an HTTP request parameter) to a web page, without properly sanitizing the input first, allows for a cross-site scripting vulnerability.\n\n\n## Recommendation\nTo guard against cross-site scripting, consider using contextual output encoding/escaping before writing user input to the page, or one of the other solutions that are mentioned in the reference.\n\n\n## Example\nThe following example shows the `page` parameter being written directly to the page, leaving the website vulnerable to cross-site scripting.\n\n\n```java\npublic class XSS extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: a request parameter is written directly to the Servlet response stream\n\t\tresponse.getWriter().print(\n\t\t\t\t\"The page \\\"\" + request.getParameter(\"page\") + \"\\\" was not found.\");\n\n\t}\n}\n\n```\n\n## References\n* OWASP: [XSS (Cross Site Scripting) Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html).\n* Wikipedia: [Cross-site scripting](http://en.wikipedia.org/wiki/Cross-site_scripting).\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n","markdown":"# Cross-site scripting\nDirectly writing user input (for example, an HTTP request parameter) to a web page, without properly sanitizing the input first, allows for a cross-site scripting vulnerability.\n\n\n## Recommendation\nTo guard against cross-site scripting, consider using contextual output encoding/escaping before writing user input to the page, or one of the other solutions that are mentioned in the reference.\n\n\n## Example\nThe following example shows the `page` parameter being written directly to the page, leaving the website vulnerable to cross-site scripting.\n\n\n```java\npublic class XSS extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: a request parameter is written directly to the Servlet response stream\n\t\tresponse.getWriter().print(\n\t\t\t\t\"The page \\\"\" + request.getParameter(\"page\") + \"\\\" was not found.\");\n\n\t}\n}\n\n```\n\n## References\n* OWASP: [XSS (Cross Site Scripting) Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html).\n* Wikipedia: [Cross-site scripting](http://en.wikipedia.org/wiki/Cross-site_scripting).\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n"},"properties":{"tags":["security","external/cwe/cwe-079"],"description":"Writing user input directly to a web page\n allows for a cross-site scripting vulnerability.","id":"java/xss","kind":"path-problem","name":"Cross-site scripting","precision":"high","problem.severity":"error","security-severity":"6.1"}},{"id":"java/rsa-without-oaep","name":"java/rsa-without-oaep","shortDescription":{"text":"Use of RSA algorithm without OAEP"},"fullDescription":{"text":"Using RSA encryption without OAEP padding can result in a padding oracle attack, leading to a weaker encryption."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Use of RSA algorithm without OAEP\nCryptographic algorithms often use padding schemes to make the plaintext less predictable. The OAEP (Optimal Asymmetric Encryption Padding) scheme should be used with RSA encryption. Using an outdated padding scheme such as PKCS1, or no padding at all, can weaken the encryption by making it vulnerable to a padding oracle attack.\n\n\n## Recommendation\nUse the OAEP scheme when using RSA encryption.\n\n\n## Example\nIn the following example, the BAD case shows no padding being used, whereas the GOOD case shows an OAEP scheme being used.\n\n\n```java\n// BAD: No padding scheme is used\nCipher rsa = Cipher.getInstance(\"RSA/ECB/NoPadding\");\n...\n\n//GOOD: OAEP padding is used\nCipher rsa = Cipher.getInstance(\"RSA/ECB/OAEPWithSHA-1AndMGF1Padding\");\n...\n```\n\n## References\n* [Mobile Security Testing Guide](https://github.com/MobSF/owasp-mstg/blob/master/Document/0x04g-Testing-Cryptography.md#padding-oracle-attacks-due-to-weaker-padding-or-block-operation-implementations).\n* [The Padding Oracle Attack](https://robertheaton.com/2013/07/29/padding-oracle-attack/).\n* Common Weakness Enumeration: [CWE-780](https://cwe.mitre.org/data/definitions/780.html).\n","markdown":"# Use of RSA algorithm without OAEP\nCryptographic algorithms often use padding schemes to make the plaintext less predictable. The OAEP (Optimal Asymmetric Encryption Padding) scheme should be used with RSA encryption. Using an outdated padding scheme such as PKCS1, or no padding at all, can weaken the encryption by making it vulnerable to a padding oracle attack.\n\n\n## Recommendation\nUse the OAEP scheme when using RSA encryption.\n\n\n## Example\nIn the following example, the BAD case shows no padding being used, whereas the GOOD case shows an OAEP scheme being used.\n\n\n```java\n// BAD: No padding scheme is used\nCipher rsa = Cipher.getInstance(\"RSA/ECB/NoPadding\");\n...\n\n//GOOD: OAEP padding is used\nCipher rsa = Cipher.getInstance(\"RSA/ECB/OAEPWithSHA-1AndMGF1Padding\");\n...\n```\n\n## References\n* [Mobile Security Testing Guide](https://github.com/MobSF/owasp-mstg/blob/master/Document/0x04g-Testing-Cryptography.md#padding-oracle-attacks-due-to-weaker-padding-or-block-operation-implementations).\n* [The Padding Oracle Attack](https://robertheaton.com/2013/07/29/padding-oracle-attack/).\n* Common Weakness Enumeration: [CWE-780](https://cwe.mitre.org/data/definitions/780.html).\n"},"properties":{"tags":["security","external/cwe/cwe-780","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using RSA encryption without OAEP padding can result in a padding oracle attack, leading to a weaker encryption.","id":"java/rsa-without-oaep","kind":"path-problem","name":"Use of RSA algorithm without OAEP","precision":"high","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/missing-jwt-signature-check","name":"java/missing-jwt-signature-check","shortDescription":{"text":"Missing JWT signature check"},"fullDescription":{"text":"Failing to check the Json Web Token (JWT) signature may allow an attacker to forge their own tokens."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Missing JWT signature check\nA JSON Web Token (JWT) consists of three parts: header, payload, and signature. The `io.jsonwebtoken.jjwt` library is one of many libraries used for working with JWTs. It offers different methods for parsing tokens like `parse`, `parseClaimsJws`, and `parsePlaintextJws`. The last two correctly verify that the JWT is properly signed. This is done by computing the signature of the combination of header and payload and comparing the locally computed signature with the signature part of the JWT.\n\nTherefore it is necessary to provide the `JwtParser` with a key that is used for signature validation. Unfortunately the `parse` method **accepts** a JWT whose signature is empty although a signing key has been set for the parser. This means that an attacker can create arbitrary JWTs that will be accepted if this method is used.\n\n\n## Recommendation\nAlways verify the signature by using either the `parseClaimsJws` and `parsePlaintextJws` methods or by overriding the `onPlaintextJws` or `onClaimsJws` of `JwtHandlerAdapter`.\n\n\n## Example\nThe following example shows four cases where a signing key is set for a parser. In the first 'BAD' case the `parse` method is used, which will not validate the signature. The second 'BAD' case uses a `JwtHandlerAdapter` where the `onPlaintextJwt` method is overriden, so it will not validate the signature. The third and fourth 'GOOD' cases use `parseClaimsJws` method or override the `onPlaintextJws` method.\n\n\n```java\npublic void badJwt(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(token); // BAD: Does not verify the signature\n}\n\npublic void badJwtHandler(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(plaintextJwt, new JwtHandlerAdapter>() {\n @Override\n public Jwt onPlaintextJwt(Jwt jwt) {\n return jwt;\n }\n }); // BAD: The handler is called on an unverified JWT\n}\n\npublic void goodJwt(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parseClaimsJws(token) // GOOD: Verify the signature\n .getBody();\n}\n\npublic void goodJwtHandler(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(plaintextJwt, new JwtHandlerAdapter>() {\n @Override\n public Jws onPlaintextJws(Jws jws) {\n return jws;\n }\n }); // GOOD: The handler is called on a verified JWS\n}\n```\n\n## References\n* zofrex: [How I Found An alg=none JWT Vulnerability in the NHS Contact Tracing App](https://www.zofrex.com/blog/2020/10/20/alg-none-jwt-nhs-contact-tracing-app/).\n* Common Weakness Enumeration: [CWE-347](https://cwe.mitre.org/data/definitions/347.html).\n","markdown":"# Missing JWT signature check\nA JSON Web Token (JWT) consists of three parts: header, payload, and signature. The `io.jsonwebtoken.jjwt` library is one of many libraries used for working with JWTs. It offers different methods for parsing tokens like `parse`, `parseClaimsJws`, and `parsePlaintextJws`. The last two correctly verify that the JWT is properly signed. This is done by computing the signature of the combination of header and payload and comparing the locally computed signature with the signature part of the JWT.\n\nTherefore it is necessary to provide the `JwtParser` with a key that is used for signature validation. Unfortunately the `parse` method **accepts** a JWT whose signature is empty although a signing key has been set for the parser. This means that an attacker can create arbitrary JWTs that will be accepted if this method is used.\n\n\n## Recommendation\nAlways verify the signature by using either the `parseClaimsJws` and `parsePlaintextJws` methods or by overriding the `onPlaintextJws` or `onClaimsJws` of `JwtHandlerAdapter`.\n\n\n## Example\nThe following example shows four cases where a signing key is set for a parser. In the first 'BAD' case the `parse` method is used, which will not validate the signature. The second 'BAD' case uses a `JwtHandlerAdapter` where the `onPlaintextJwt` method is overriden, so it will not validate the signature. The third and fourth 'GOOD' cases use `parseClaimsJws` method or override the `onPlaintextJws` method.\n\n\n```java\npublic void badJwt(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(token); // BAD: Does not verify the signature\n}\n\npublic void badJwtHandler(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(plaintextJwt, new JwtHandlerAdapter>() {\n @Override\n public Jwt onPlaintextJwt(Jwt jwt) {\n return jwt;\n }\n }); // BAD: The handler is called on an unverified JWT\n}\n\npublic void goodJwt(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parseClaimsJws(token) // GOOD: Verify the signature\n .getBody();\n}\n\npublic void goodJwtHandler(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(plaintextJwt, new JwtHandlerAdapter>() {\n @Override\n public Jws onPlaintextJws(Jws jws) {\n return jws;\n }\n }); // GOOD: The handler is called on a verified JWS\n}\n```\n\n## References\n* zofrex: [How I Found An alg=none JWT Vulnerability in the NHS Contact Tracing App](https://www.zofrex.com/blog/2020/10/20/alg-none-jwt-nhs-contact-tracing-app/).\n* Common Weakness Enumeration: [CWE-347](https://cwe.mitre.org/data/definitions/347.html).\n"},"properties":{"tags":["security","external/cwe/cwe-347","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Failing to check the Json Web Token (JWT) signature may allow an attacker to forge their own tokens.","id":"java/missing-jwt-signature-check","kind":"path-problem","name":"Missing JWT signature check","precision":"high","problem.severity":"error","security-severity":"7.8"}},{"id":"java/insecure-trustmanager","name":"java/insecure-trustmanager","shortDescription":{"text":"`TrustManager` that accepts all certificates"},"fullDescription":{"text":"Trusting all certificates allows an attacker to perform a machine-in-the-middle attack."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# `TrustManager` that accepts all certificates\nIf the `checkServerTrusted` method of a `TrustManager` never throws a `CertificateException`, it trusts every certificate. This allows an attacker to perform a machine-in-the-middle attack against the application, therefore breaking any security Transport Layer Security (TLS) gives.\n\nAn attack might look like this:\n\n1. The vulnerable program connects to `https://example.com`.\n1. The attacker intercepts this connection and presents a valid, self-signed certificate for `https://example.com`.\n1. The vulnerable program calls the `checkServerTrusted` method to check whether it should trust the certificate.\n1. The `checkServerTrusted` method of your `TrustManager` does not throw a `CertificateException`.\n1. The vulnerable program accepts the certificate and proceeds with the connection since your `TrustManager` implicitly trusted it by not throwing an exception.\n1. The attacker can now read the data your program sends to `https://example.com` and/or alter its replies while the program thinks the connection is secure.\n\n## Recommendation\nDo not use a custom `TrustManager` that trusts any certificate. If you have to use a self-signed certificate, don't trust every certificate, but instead only trust this specific certificate. See below for an example of how to do this.\n\n\n## Example\nIn the first (bad) example, the `TrustManager` never throws a `CertificateException` and therefore implicitly trusts any certificate. This allows an attacker to perform a machine-in-the-middle attack. In the second (good) example, the self-signed certificate that should be trusted is loaded into a `KeyStore`. This explicitly defines the certificate as trusted and there is no need to create a custom `TrustManager`.\n\n\n```java\npublic static void main(String[] args) throws Exception {\n {\n class InsecureTrustManager implements X509TrustManager {\n @Override\n public X509Certificate[] getAcceptedIssuers() {\n return null;\n }\n\n @Override\n public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {\n // BAD: Does not verify the certificate chain, allowing any certificate.\n }\n\n @Override\n public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {\n\n }\n }\n SSLContext context = SSLContext.getInstance(\"TLS\");\n TrustManager[] trustManager = new TrustManager[] { new InsecureTrustManager() };\n context.init(null, trustManager, null);\n }\n {\n SSLContext context = SSLContext.getInstance(\"TLS\");\n File certificateFile = new File(\"path/to/self-signed-certificate\");\n // Create a `KeyStore` with default type\n KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());\n // `keyStore` is initially empty\n keyStore.load(null, null);\n X509Certificate generatedCertificate;\n try (InputStream cert = new FileInputStream(certificateFile)) {\n generatedCertificate = (X509Certificate) CertificateFactory.getInstance(\"X509\")\n .generateCertificate(cert);\n }\n // Add the self-signed certificate to the key store\n keyStore.setCertificateEntry(certificateFile.getName(), generatedCertificate);\n // Get default `TrustManagerFactory`\n TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\n // Use it with our key store that trusts our self-signed certificate\n tmf.init(keyStore);\n TrustManager[] trustManagers = tmf.getTrustManagers();\n context.init(null, trustManagers, null);\n // GOOD, we are not using a custom `TrustManager` but instead have\n // added the self-signed certificate we want to trust to the key\n // store. Note, the `trustManagers` will **only** trust this one\n // certificate.\n \n URL url = new URL(\"https://self-signed.badssl.com/\");\n HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();\n conn.setSSLSocketFactory(context.getSocketFactory());\n }\n}\n\n```\n\n## References\n* Android Developers: [Security with HTTPS and SSL](https://developer.android.com/training/articles/security-ssl).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n","markdown":"# `TrustManager` that accepts all certificates\nIf the `checkServerTrusted` method of a `TrustManager` never throws a `CertificateException`, it trusts every certificate. This allows an attacker to perform a machine-in-the-middle attack against the application, therefore breaking any security Transport Layer Security (TLS) gives.\n\nAn attack might look like this:\n\n1. The vulnerable program connects to `https://example.com`.\n1. The attacker intercepts this connection and presents a valid, self-signed certificate for `https://example.com`.\n1. The vulnerable program calls the `checkServerTrusted` method to check whether it should trust the certificate.\n1. The `checkServerTrusted` method of your `TrustManager` does not throw a `CertificateException`.\n1. The vulnerable program accepts the certificate and proceeds with the connection since your `TrustManager` implicitly trusted it by not throwing an exception.\n1. The attacker can now read the data your program sends to `https://example.com` and/or alter its replies while the program thinks the connection is secure.\n\n## Recommendation\nDo not use a custom `TrustManager` that trusts any certificate. If you have to use a self-signed certificate, don't trust every certificate, but instead only trust this specific certificate. See below for an example of how to do this.\n\n\n## Example\nIn the first (bad) example, the `TrustManager` never throws a `CertificateException` and therefore implicitly trusts any certificate. This allows an attacker to perform a machine-in-the-middle attack. In the second (good) example, the self-signed certificate that should be trusted is loaded into a `KeyStore`. This explicitly defines the certificate as trusted and there is no need to create a custom `TrustManager`.\n\n\n```java\npublic static void main(String[] args) throws Exception {\n {\n class InsecureTrustManager implements X509TrustManager {\n @Override\n public X509Certificate[] getAcceptedIssuers() {\n return null;\n }\n\n @Override\n public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {\n // BAD: Does not verify the certificate chain, allowing any certificate.\n }\n\n @Override\n public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {\n\n }\n }\n SSLContext context = SSLContext.getInstance(\"TLS\");\n TrustManager[] trustManager = new TrustManager[] { new InsecureTrustManager() };\n context.init(null, trustManager, null);\n }\n {\n SSLContext context = SSLContext.getInstance(\"TLS\");\n File certificateFile = new File(\"path/to/self-signed-certificate\");\n // Create a `KeyStore` with default type\n KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());\n // `keyStore` is initially empty\n keyStore.load(null, null);\n X509Certificate generatedCertificate;\n try (InputStream cert = new FileInputStream(certificateFile)) {\n generatedCertificate = (X509Certificate) CertificateFactory.getInstance(\"X509\")\n .generateCertificate(cert);\n }\n // Add the self-signed certificate to the key store\n keyStore.setCertificateEntry(certificateFile.getName(), generatedCertificate);\n // Get default `TrustManagerFactory`\n TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\n // Use it with our key store that trusts our self-signed certificate\n tmf.init(keyStore);\n TrustManager[] trustManagers = tmf.getTrustManagers();\n context.init(null, trustManagers, null);\n // GOOD, we are not using a custom `TrustManager` but instead have\n // added the self-signed certificate we want to trust to the key\n // store. Note, the `trustManagers` will **only** trust this one\n // certificate.\n \n URL url = new URL(\"https://self-signed.badssl.com/\");\n HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();\n conn.setSSLSocketFactory(context.getSocketFactory());\n }\n}\n\n```\n\n## References\n* Android Developers: [Security with HTTPS and SSL](https://developer.android.com/training/articles/security-ssl).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n"},"properties":{"tags":["security","external/cwe/cwe-295","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Trusting all certificates allows an attacker to perform a machine-in-the-middle attack.","id":"java/insecure-trustmanager","kind":"path-problem","name":"`TrustManager` that accepts all certificates","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/improper-webview-certificate-validation","name":"java/improper-webview-certificate-validation","shortDescription":{"text":"Android `WebView` that accepts all certificates"},"fullDescription":{"text":"Trusting all certificates allows an attacker to perform a machine-in-the-middle attack."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Android `WebView` that accepts all certificates\nIf the `onReceivedSslError` method of an Android `WebViewClient` always calls `proceed` on the given `SslErrorHandler`, it trusts any certificate. This allows an attacker to perform a machine-in-the-middle attack against the application, therefore breaking any security Transport Layer Security (TLS) gives.\n\nAn attack might look like this:\n\n1. The vulnerable application connects to `https://example.com`.\n1. The attacker intercepts this connection and presents a valid, self-signed certificate for `https://example.com`.\n1. The vulnerable application calls the `onReceivedSslError` method to check whether it should trust the certificate.\n1. The `onReceivedSslError` method of your `WebViewClient` calls `SslErrorHandler.proceed`.\n1. The vulnerable application accepts the certificate and proceeds with the connection since your `WevViewClient` trusted it by proceeding.\n1. The attacker can now read the data your application sends to `https://example.com` and/or alter its replies while the application thinks the connection is secure.\n\n## Recommendation\nDo not use a call `SslerrorHandler.proceed` unconditionally. If you have to use a self-signed certificate, only accept that certificate, not all certificates.\n\n\n## Example\nIn the first (bad) example, the `WebViewClient` trusts all certificates by always calling `SslErrorHandler.proceed`. In the second (good) example, only certificates signed by a certain public key are accepted.\n\n\n```java\nclass Bad extends WebViewClient {\n // BAD: All certificates are trusted.\n public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $hasResult\n handler.proceed(); \n }\n}\n\nclass Good extends WebViewClient {\n PublicKey myPubKey = ...;\n\n // GOOD: Only certificates signed by a certain public key are trusted.\n public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $hasResult\n try {\n X509Certificate cert = error.getCertificate().getX509Certificate();\n cert.verify(this.myPubKey);\n handler.proceed();\n }\n catch (CertificateException|NoSuchAlgorithmException|InvalidKeyException|NoSuchProviderException|SignatureException e) {\n handler.cancel();\n }\n } \n}\n```\n\n## References\n* [WebViewClient.onReceivedSslError documentation](https://developer.android.com/reference/android/webkit/WebViewClient?hl=en#onReceivedSslError(android.webkit.WebView,%20android.webkit.SslErrorHandler,%20android.net.http.SslError)).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n","markdown":"# Android `WebView` that accepts all certificates\nIf the `onReceivedSslError` method of an Android `WebViewClient` always calls `proceed` on the given `SslErrorHandler`, it trusts any certificate. This allows an attacker to perform a machine-in-the-middle attack against the application, therefore breaking any security Transport Layer Security (TLS) gives.\n\nAn attack might look like this:\n\n1. The vulnerable application connects to `https://example.com`.\n1. The attacker intercepts this connection and presents a valid, self-signed certificate for `https://example.com`.\n1. The vulnerable application calls the `onReceivedSslError` method to check whether it should trust the certificate.\n1. The `onReceivedSslError` method of your `WebViewClient` calls `SslErrorHandler.proceed`.\n1. The vulnerable application accepts the certificate and proceeds with the connection since your `WevViewClient` trusted it by proceeding.\n1. The attacker can now read the data your application sends to `https://example.com` and/or alter its replies while the application thinks the connection is secure.\n\n## Recommendation\nDo not use a call `SslerrorHandler.proceed` unconditionally. If you have to use a self-signed certificate, only accept that certificate, not all certificates.\n\n\n## Example\nIn the first (bad) example, the `WebViewClient` trusts all certificates by always calling `SslErrorHandler.proceed`. In the second (good) example, only certificates signed by a certain public key are accepted.\n\n\n```java\nclass Bad extends WebViewClient {\n // BAD: All certificates are trusted.\n public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $hasResult\n handler.proceed(); \n }\n}\n\nclass Good extends WebViewClient {\n PublicKey myPubKey = ...;\n\n // GOOD: Only certificates signed by a certain public key are trusted.\n public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $hasResult\n try {\n X509Certificate cert = error.getCertificate().getX509Certificate();\n cert.verify(this.myPubKey);\n handler.proceed();\n }\n catch (CertificateException|NoSuchAlgorithmException|InvalidKeyException|NoSuchProviderException|SignatureException e) {\n handler.cancel();\n }\n } \n}\n```\n\n## References\n* [WebViewClient.onReceivedSslError documentation](https://developer.android.com/reference/android/webkit/WebViewClient?hl=en#onReceivedSslError(android.webkit.WebView,%20android.webkit.SslErrorHandler,%20android.net.http.SslError)).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n"},"properties":{"tags":["security","external/cwe/cwe-295","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Trusting all certificates allows an attacker to perform a machine-in-the-middle attack.","id":"java/improper-webview-certificate-validation","kind":"problem","name":"Android `WebView` that accepts all certificates","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/ognl-injection","name":"java/ognl-injection","shortDescription":{"text":"OGNL Expression Language statement with user-controlled input"},"fullDescription":{"text":"Evaluation of OGNL Expression Language statement with user-controlled input can lead to execution of arbitrary code."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# OGNL Expression Language statement with user-controlled input\nObject-Graph Navigation Language (OGNL) is an open-source Expression Language (EL) for Java. OGNL can create or change executable code, consequently it can introduce critical security flaws to any application that uses it. Evaluation of unvalidated expressions is a common flaw in OGNL. This exposes the properties of Java objects to modification by an attacker and may allow them to execute arbitrary code.\n\n\n## Recommendation\nThe general recommendation is to avoid evaluating untrusted ONGL expressions. If user-provided OGNL expressions must be evaluated, do this in a sandbox and validate the expressions before evaluation.\n\n\n## Example\nIn the following examples, the code accepts an OGNL expression from the user and evaluates it.\n\nIn the first example, the user-provided OGNL expression is parsed and evaluated.\n\nThe second example validates the expression and evaluates it inside a sandbox. You can add a sandbox by setting a system property, as shown in the example, or by adding `-Dognl.security.manager` to JVM arguments.\n\n\n```java\nimport ognl.Ognl;\nimport ognl.OgnlException;\n\npublic void evaluate(HttpServletRequest request, Object root) throws OgnlException {\n String expression = request.getParameter(\"expression\");\n\n // BAD: User provided expression is evaluated\n Ognl.getValue(expression, root);\n \n // GOOD: The name is validated and expression is evaluated in sandbox\n System.setProperty(\"ognl.security.manager\", \"\"); // Or add -Dognl.security.manager to JVM args\n if (isValid(expression)) {\n Ognl.getValue(expression, root);\n } else {\n // Reject the request\n }\n}\n\npublic void isValid(Strig expression) {\n // Custom method to validate the expression.\n // For instance, make sure it doesn't include unexpected code.\n}\n\n```\n\n## References\n* Apache Commons: [Apache Commons OGNL](https://commons.apache.org/proper/commons-ognl/).\n* Struts security: [Proactively protect from OGNL Expression Injections attacks](https://struts.apache.org/security/#proactively-protect-from-ognl-expression-injections-attacks-if-easily-applicable).\n* Common Weakness Enumeration: [CWE-917](https://cwe.mitre.org/data/definitions/917.html).\n","markdown":"# OGNL Expression Language statement with user-controlled input\nObject-Graph Navigation Language (OGNL) is an open-source Expression Language (EL) for Java. OGNL can create or change executable code, consequently it can introduce critical security flaws to any application that uses it. Evaluation of unvalidated expressions is a common flaw in OGNL. This exposes the properties of Java objects to modification by an attacker and may allow them to execute arbitrary code.\n\n\n## Recommendation\nThe general recommendation is to avoid evaluating untrusted ONGL expressions. If user-provided OGNL expressions must be evaluated, do this in a sandbox and validate the expressions before evaluation.\n\n\n## Example\nIn the following examples, the code accepts an OGNL expression from the user and evaluates it.\n\nIn the first example, the user-provided OGNL expression is parsed and evaluated.\n\nThe second example validates the expression and evaluates it inside a sandbox. You can add a sandbox by setting a system property, as shown in the example, or by adding `-Dognl.security.manager` to JVM arguments.\n\n\n```java\nimport ognl.Ognl;\nimport ognl.OgnlException;\n\npublic void evaluate(HttpServletRequest request, Object root) throws OgnlException {\n String expression = request.getParameter(\"expression\");\n\n // BAD: User provided expression is evaluated\n Ognl.getValue(expression, root);\n \n // GOOD: The name is validated and expression is evaluated in sandbox\n System.setProperty(\"ognl.security.manager\", \"\"); // Or add -Dognl.security.manager to JVM args\n if (isValid(expression)) {\n Ognl.getValue(expression, root);\n } else {\n // Reject the request\n }\n}\n\npublic void isValid(Strig expression) {\n // Custom method to validate the expression.\n // For instance, make sure it doesn't include unexpected code.\n}\n\n```\n\n## References\n* Apache Commons: [Apache Commons OGNL](https://commons.apache.org/proper/commons-ognl/).\n* Struts security: [Proactively protect from OGNL Expression Injections attacks](https://struts.apache.org/security/#proactively-protect-from-ognl-expression-injections-attacks-if-easily-applicable).\n* Common Weakness Enumeration: [CWE-917](https://cwe.mitre.org/data/definitions/917.html).\n"},"properties":{"tags":["security","external/cwe/cwe-917","owasp-top10-2021","A03:2021 - Injection"],"description":"Evaluation of OGNL Expression Language statement with user-controlled input can\n lead to execution of arbitrary code.","id":"java/ognl-injection","kind":"path-problem","name":"OGNL Expression Language statement with user-controlled input","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/netty-http-request-or-response-splitting","name":"java/netty-http-request-or-response-splitting","shortDescription":{"text":"Disabled Netty HTTP header validation"},"fullDescription":{"text":"Disabling HTTP header validation makes code vulnerable to attack by header splitting if user input is written directly to an HTTP header."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Disabled Netty HTTP header validation\nDirectly writing user input (for example, an HTTP request parameter) to an HTTP header can lead to an HTTP request-splitting or response-splitting vulnerability.\n\nHTTP response splitting can lead to vulnerabilities such as XSS and cache poisoning.\n\nHTTP request splitting can allow an attacker to inject an additional HTTP request into a client's outgoing socket connection. This can allow an attacker to perform an SSRF-like attack.\n\nIn the context of a servlet container, if the user input includes blank lines and the servlet container does not escape the blank lines, then a remote user can cause the response to turn into two separate responses. The remote user can then control one or more responses, which is also HTTP response splitting.\n\n\n## Recommendation\nGuard against HTTP header splitting in the same way as guarding against cross-site scripting. Before passing any data into HTTP headers, either check the data for special characters, or escape any special characters that are present.\n\nIf the code calls Netty API's directly, ensure that the `validateHeaders` parameter is set to `true`.\n\n\n## Example\nThe following example shows the 'name' parameter being written to a cookie in two different ways. The first way writes it directly to the cookie, and thus is vulnerable to response-splitting attacks. The second way first removes all special characters, thus avoiding the potential problem.\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: setting a cookie with an unvalidated parameter\n\t\tCookie cookie = new Cookie(\"name\", request.getParameter(\"name\"));\n\t\tresponse.addCookie(cookie);\n\n\t\t// GOOD: remove special characters before putting them in the header\n\t\tString name = removeSpecial(request.getParameter(\"name\"));\n\t\tCookie cookie2 = new Cookie(\"name\", name);\n\t\tresponse.addCookie(cookie2);\n\t}\n\n\tprivate static String removeSpecial(String str) {\n\t\treturn str.replaceAll(\"[^a-zA-Z ]\", \"\");\n\t}\n}\n\n```\n\n## Example\nThe following example shows the use of the library 'netty' with HTTP response-splitting verification configurations. The second way will verify the parameters before using them to build the HTTP response.\n\n\n```java\nimport io.netty.handler.codec.http.DefaultHttpHeaders;\n\npublic class ResponseSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpResponse badResponse = new DefaultHttpResponse(version, httpResponseStatus, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpResponse goodResponse = new DefaultHttpResponse(version, httpResponseStatus);\n}\n\n```\n\n## Example\nThe following example shows the use of the netty library with configurations for verification of HTTP request splitting. The second recommended approach in the example verifies the parameters before using them to build the HTTP request.\n\n\n```java\npublic class NettyRequestSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpRequest badRequest = new DefaultHttpRequest(httpVersion, method, uri, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpRequest goodResponse = new DefaultHttpRequest(httpVersion, method, uri);\n}\n\n```\n\n## References\n* SecLists.org: [HTTP response splitting](https://seclists.org/bugtraq/2005/Apr/187).\n* OWASP: [HTTP Response Splitting](https://www.owasp.org/index.php/HTTP_Response_Splitting).\n* Wikipedia: [HTTP response splitting](http://en.wikipedia.org/wiki/HTTP_response_splitting).\n* CAPEC: [CAPEC-105: HTTP Request Splitting](https://capec.mitre.org/data/definitions/105.html)\n* Common Weakness Enumeration: [CWE-93](https://cwe.mitre.org/data/definitions/93.html).\n* Common Weakness Enumeration: [CWE-113](https://cwe.mitre.org/data/definitions/113.html).\n","markdown":"# Disabled Netty HTTP header validation\nDirectly writing user input (for example, an HTTP request parameter) to an HTTP header can lead to an HTTP request-splitting or response-splitting vulnerability.\n\nHTTP response splitting can lead to vulnerabilities such as XSS and cache poisoning.\n\nHTTP request splitting can allow an attacker to inject an additional HTTP request into a client's outgoing socket connection. This can allow an attacker to perform an SSRF-like attack.\n\nIn the context of a servlet container, if the user input includes blank lines and the servlet container does not escape the blank lines, then a remote user can cause the response to turn into two separate responses. The remote user can then control one or more responses, which is also HTTP response splitting.\n\n\n## Recommendation\nGuard against HTTP header splitting in the same way as guarding against cross-site scripting. Before passing any data into HTTP headers, either check the data for special characters, or escape any special characters that are present.\n\nIf the code calls Netty API's directly, ensure that the `validateHeaders` parameter is set to `true`.\n\n\n## Example\nThe following example shows the 'name' parameter being written to a cookie in two different ways. The first way writes it directly to the cookie, and thus is vulnerable to response-splitting attacks. The second way first removes all special characters, thus avoiding the potential problem.\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: setting a cookie with an unvalidated parameter\n\t\tCookie cookie = new Cookie(\"name\", request.getParameter(\"name\"));\n\t\tresponse.addCookie(cookie);\n\n\t\t// GOOD: remove special characters before putting them in the header\n\t\tString name = removeSpecial(request.getParameter(\"name\"));\n\t\tCookie cookie2 = new Cookie(\"name\", name);\n\t\tresponse.addCookie(cookie2);\n\t}\n\n\tprivate static String removeSpecial(String str) {\n\t\treturn str.replaceAll(\"[^a-zA-Z ]\", \"\");\n\t}\n}\n\n```\n\n## Example\nThe following example shows the use of the library 'netty' with HTTP response-splitting verification configurations. The second way will verify the parameters before using them to build the HTTP response.\n\n\n```java\nimport io.netty.handler.codec.http.DefaultHttpHeaders;\n\npublic class ResponseSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpResponse badResponse = new DefaultHttpResponse(version, httpResponseStatus, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpResponse goodResponse = new DefaultHttpResponse(version, httpResponseStatus);\n}\n\n```\n\n## Example\nThe following example shows the use of the netty library with configurations for verification of HTTP request splitting. The second recommended approach in the example verifies the parameters before using them to build the HTTP request.\n\n\n```java\npublic class NettyRequestSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpRequest badRequest = new DefaultHttpRequest(httpVersion, method, uri, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpRequest goodResponse = new DefaultHttpRequest(httpVersion, method, uri);\n}\n\n```\n\n## References\n* SecLists.org: [HTTP response splitting](https://seclists.org/bugtraq/2005/Apr/187).\n* OWASP: [HTTP Response Splitting](https://www.owasp.org/index.php/HTTP_Response_Splitting).\n* Wikipedia: [HTTP response splitting](http://en.wikipedia.org/wiki/HTTP_response_splitting).\n* CAPEC: [CAPEC-105: HTTP Request Splitting](https://capec.mitre.org/data/definitions/105.html)\n* Common Weakness Enumeration: [CWE-93](https://cwe.mitre.org/data/definitions/93.html).\n* Common Weakness Enumeration: [CWE-113](https://cwe.mitre.org/data/definitions/113.html).\n"},"properties":{"tags":["security","external/cwe/cwe-93","external/cwe/cwe-113","owasp-top10-2021","A03:2021 - Injection"],"description":"Disabling HTTP header validation makes code vulnerable to\n attack by header splitting if user input is written directly to\n an HTTP header.","id":"java/netty-http-request-or-response-splitting","kind":"problem","name":"Disabled Netty HTTP header validation","precision":"high","problem.severity":"error","security-severity":"6.1"}},{"id":"java/http-response-splitting","name":"java/http-response-splitting","shortDescription":{"text":"HTTP response splitting"},"fullDescription":{"text":"Writing user input directly to an HTTP header makes code vulnerable to attack by header splitting."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# HTTP response splitting\nDirectly writing user input (for example, an HTTP request parameter) to an HTTP header can lead to an HTTP request-splitting or response-splitting vulnerability.\n\nHTTP response splitting can lead to vulnerabilities such as XSS and cache poisoning.\n\nHTTP request splitting can allow an attacker to inject an additional HTTP request into a client's outgoing socket connection. This can allow an attacker to perform an SSRF-like attack.\n\nIn the context of a servlet container, if the user input includes blank lines and the servlet container does not escape the blank lines, then a remote user can cause the response to turn into two separate responses. The remote user can then control one or more responses, which is also HTTP response splitting.\n\n\n## Recommendation\nGuard against HTTP header splitting in the same way as guarding against cross-site scripting. Before passing any data into HTTP headers, either check the data for special characters, or escape any special characters that are present.\n\nIf the code calls Netty API's directly, ensure that the `validateHeaders` parameter is set to `true`.\n\n\n## Example\nThe following example shows the 'name' parameter being written to a cookie in two different ways. The first way writes it directly to the cookie, and thus is vulnerable to response-splitting attacks. The second way first removes all special characters, thus avoiding the potential problem.\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: setting a cookie with an unvalidated parameter\n\t\tCookie cookie = new Cookie(\"name\", request.getParameter(\"name\"));\n\t\tresponse.addCookie(cookie);\n\n\t\t// GOOD: remove special characters before putting them in the header\n\t\tString name = removeSpecial(request.getParameter(\"name\"));\n\t\tCookie cookie2 = new Cookie(\"name\", name);\n\t\tresponse.addCookie(cookie2);\n\t}\n\n\tprivate static String removeSpecial(String str) {\n\t\treturn str.replaceAll(\"[^a-zA-Z ]\", \"\");\n\t}\n}\n\n```\n\n## Example\nThe following example shows the use of the library 'netty' with HTTP response-splitting verification configurations. The second way will verify the parameters before using them to build the HTTP response.\n\n\n```java\nimport io.netty.handler.codec.http.DefaultHttpHeaders;\n\npublic class ResponseSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpResponse badResponse = new DefaultHttpResponse(version, httpResponseStatus, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpResponse goodResponse = new DefaultHttpResponse(version, httpResponseStatus);\n}\n\n```\n\n## Example\nThe following example shows the use of the netty library with configurations for verification of HTTP request splitting. The second recommended approach in the example verifies the parameters before using them to build the HTTP request.\n\n\n```java\npublic class NettyRequestSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpRequest badRequest = new DefaultHttpRequest(httpVersion, method, uri, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpRequest goodResponse = new DefaultHttpRequest(httpVersion, method, uri);\n}\n\n```\n\n## References\n* SecLists.org: [HTTP response splitting](https://seclists.org/bugtraq/2005/Apr/187).\n* OWASP: [HTTP Response Splitting](https://www.owasp.org/index.php/HTTP_Response_Splitting).\n* Wikipedia: [HTTP response splitting](http://en.wikipedia.org/wiki/HTTP_response_splitting).\n* CAPEC: [CAPEC-105: HTTP Request Splitting](https://capec.mitre.org/data/definitions/105.html)\n* Common Weakness Enumeration: [CWE-113](https://cwe.mitre.org/data/definitions/113.html).\n","markdown":"# HTTP response splitting\nDirectly writing user input (for example, an HTTP request parameter) to an HTTP header can lead to an HTTP request-splitting or response-splitting vulnerability.\n\nHTTP response splitting can lead to vulnerabilities such as XSS and cache poisoning.\n\nHTTP request splitting can allow an attacker to inject an additional HTTP request into a client's outgoing socket connection. This can allow an attacker to perform an SSRF-like attack.\n\nIn the context of a servlet container, if the user input includes blank lines and the servlet container does not escape the blank lines, then a remote user can cause the response to turn into two separate responses. The remote user can then control one or more responses, which is also HTTP response splitting.\n\n\n## Recommendation\nGuard against HTTP header splitting in the same way as guarding against cross-site scripting. Before passing any data into HTTP headers, either check the data for special characters, or escape any special characters that are present.\n\nIf the code calls Netty API's directly, ensure that the `validateHeaders` parameter is set to `true`.\n\n\n## Example\nThe following example shows the 'name' parameter being written to a cookie in two different ways. The first way writes it directly to the cookie, and thus is vulnerable to response-splitting attacks. The second way first removes all special characters, thus avoiding the potential problem.\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: setting a cookie with an unvalidated parameter\n\t\tCookie cookie = new Cookie(\"name\", request.getParameter(\"name\"));\n\t\tresponse.addCookie(cookie);\n\n\t\t// GOOD: remove special characters before putting them in the header\n\t\tString name = removeSpecial(request.getParameter(\"name\"));\n\t\tCookie cookie2 = new Cookie(\"name\", name);\n\t\tresponse.addCookie(cookie2);\n\t}\n\n\tprivate static String removeSpecial(String str) {\n\t\treturn str.replaceAll(\"[^a-zA-Z ]\", \"\");\n\t}\n}\n\n```\n\n## Example\nThe following example shows the use of the library 'netty' with HTTP response-splitting verification configurations. The second way will verify the parameters before using them to build the HTTP response.\n\n\n```java\nimport io.netty.handler.codec.http.DefaultHttpHeaders;\n\npublic class ResponseSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpResponse badResponse = new DefaultHttpResponse(version, httpResponseStatus, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpResponse goodResponse = new DefaultHttpResponse(version, httpResponseStatus);\n}\n\n```\n\n## Example\nThe following example shows the use of the netty library with configurations for verification of HTTP request splitting. The second recommended approach in the example verifies the parameters before using them to build the HTTP request.\n\n\n```java\npublic class NettyRequestSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpRequest badRequest = new DefaultHttpRequest(httpVersion, method, uri, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpRequest goodResponse = new DefaultHttpRequest(httpVersion, method, uri);\n}\n\n```\n\n## References\n* SecLists.org: [HTTP response splitting](https://seclists.org/bugtraq/2005/Apr/187).\n* OWASP: [HTTP Response Splitting](https://www.owasp.org/index.php/HTTP_Response_Splitting).\n* Wikipedia: [HTTP response splitting](http://en.wikipedia.org/wiki/HTTP_response_splitting).\n* CAPEC: [CAPEC-105: HTTP Request Splitting](https://capec.mitre.org/data/definitions/105.html)\n* Common Weakness Enumeration: [CWE-113](https://cwe.mitre.org/data/definitions/113.html).\n"},"properties":{"tags":["security","external/cwe/cwe-113","owasp-top10-2021","A03:2021 - Injection"],"description":"Writing user input directly to an HTTP header\n makes code vulnerable to attack by header splitting.","id":"java/http-response-splitting","kind":"path-problem","name":"HTTP response splitting","precision":"high","problem.severity":"error","security-severity":"6.1"}},{"id":"java/overly-large-range","name":"java/overly-large-range","shortDescription":{"text":"Overly permissive regular expression range"},"fullDescription":{"text":"Overly permissive regular expression ranges match a wider range of characters than intended. This may allow an attacker to bypass a filter or sanitizer."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Overly permissive regular expression range\nIt's easy to write a regular expression range that matches a wider range of characters than you intended. For example, `/[a-zA-z]/` matches all lowercase and all uppercase letters, as you would expect, but it also matches the characters: `` [ \\ ] ^ _ ` ``.\n\nAnother common problem is failing to escape the dash character in a regular expression. An unescaped dash is interpreted as part of a range. For example, in the character class `[a-zA-Z0-9%=.,-_]` the last character range matches the 55 characters between `,` and `_` (both included), which overlaps with the range `[0-9]` and is clearly not intended by the writer.\n\n\n## Recommendation\nAvoid any confusion about which characters are included in the range by writing unambiguous regular expressions. Always check that character ranges match only the expected characters.\n\n\n## Example\nThe following example code is intended to check whether a string is a valid 6 digit hex color.\n\n```java\n\nimport java.util.regex.Pattern\npublic class Tester {\n public static boolean is_valid_hex_color(String color) {\n return Pattern.matches(\"#[0-9a-fA-f]{6}\", color);\n }\n}\n\n```\nHowever, the `A-f` range is overly large and matches every uppercase character. It would parse a \"color\" like `#XXYYZZ` as valid.\n\nThe fix is to use an uppercase `A-F` range instead.\n\n```javascript\n\nimport java.util.regex.Pattern\npublic class Tester {\n public static boolean is_valid_hex_color(String color) {\n return Pattern.matches(\"#[0-9a-fA-F]{6}\", color);\n }\n}\n\n```\n\n## References\n* GitHub Advisory Database: [CVE-2021-42740: Improper Neutralization of Special Elements used in a Command in Shell-quote](https://github.com/advisories/GHSA-g4rg-993r-mgx7)\n* wh0.github.io: [Exploiting CVE-2021-42740](https://wh0.github.io/2021/10/28/shell-quote-rce-exploiting.html)\n* Yosuke Ota: [no-obscure-range](https://ota-meshi.github.io/eslint-plugin-regexp/rules/no-obscure-range.html)\n* Paul Boyd: [The regex \\[,-.\\]](https://pboyd.io/posts/comma-dash-dot/)\n* Common Weakness Enumeration: [CWE-20](https://cwe.mitre.org/data/definitions/20.html).\n","markdown":"# Overly permissive regular expression range\nIt's easy to write a regular expression range that matches a wider range of characters than you intended. For example, `/[a-zA-z]/` matches all lowercase and all uppercase letters, as you would expect, but it also matches the characters: `` [ \\ ] ^ _ ` ``.\n\nAnother common problem is failing to escape the dash character in a regular expression. An unescaped dash is interpreted as part of a range. For example, in the character class `[a-zA-Z0-9%=.,-_]` the last character range matches the 55 characters between `,` and `_` (both included), which overlaps with the range `[0-9]` and is clearly not intended by the writer.\n\n\n## Recommendation\nAvoid any confusion about which characters are included in the range by writing unambiguous regular expressions. Always check that character ranges match only the expected characters.\n\n\n## Example\nThe following example code is intended to check whether a string is a valid 6 digit hex color.\n\n```java\n\nimport java.util.regex.Pattern\npublic class Tester {\n public static boolean is_valid_hex_color(String color) {\n return Pattern.matches(\"#[0-9a-fA-f]{6}\", color);\n }\n}\n\n```\nHowever, the `A-f` range is overly large and matches every uppercase character. It would parse a \"color\" like `#XXYYZZ` as valid.\n\nThe fix is to use an uppercase `A-F` range instead.\n\n```javascript\n\nimport java.util.regex.Pattern\npublic class Tester {\n public static boolean is_valid_hex_color(String color) {\n return Pattern.matches(\"#[0-9a-fA-F]{6}\", color);\n }\n}\n\n```\n\n## References\n* GitHub Advisory Database: [CVE-2021-42740: Improper Neutralization of Special Elements used in a Command in Shell-quote](https://github.com/advisories/GHSA-g4rg-993r-mgx7)\n* wh0.github.io: [Exploiting CVE-2021-42740](https://wh0.github.io/2021/10/28/shell-quote-rce-exploiting.html)\n* Yosuke Ota: [no-obscure-range](https://ota-meshi.github.io/eslint-plugin-regexp/rules/no-obscure-range.html)\n* Paul Boyd: [The regex \\[,-.\\]](https://pboyd.io/posts/comma-dash-dot/)\n* Common Weakness Enumeration: [CWE-20](https://cwe.mitre.org/data/definitions/20.html).\n"},"properties":{"tags":["correctness","security","external/cwe/cwe-020"],"description":"Overly permissive regular expression ranges match a wider range of characters than intended.\n This may allow an attacker to bypass a filter or sanitizer.","id":"java/overly-large-range","kind":"problem","name":"Overly permissive regular expression range","precision":"high","problem.severity":"warning","security-severity":"5.0"}},{"id":"java/path-injection","name":"java/path-injection","shortDescription":{"text":"Uncontrolled data used in path expression"},"fullDescription":{"text":"Accessing paths influenced by users can allow an attacker to access unexpected resources."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Uncontrolled data used in path expression\nAccessing paths controlled by users can allow an attacker to access unexpected resources. This can result in sensitive information being revealed or deleted, or an attacker being able to influence behavior by modifying unexpected files.\n\nPaths that are naively constructed from data controlled by a user may contain unexpected special characters, such as \"..\". Such a path may potentially point to any directory on the file system.\n\n\n## Recommendation\nValidate user input before using it to construct a file path. Ideally, follow these rules:\n\n* Do not allow more than a single \".\" character.\n* Do not allow directory separators such as \"/\" or \"\\\\\" (depending on the file system).\n* Do not rely on simply replacing problematic sequences such as \"../\". For example, after applying this filter to \".../...//\" the resulting string would still be \"../\".\n* Ideally use a whitelist of known good patterns.\n\n## Example\nIn this example, a file name is read from a `java.net.Socket` and then used to access a file in the user's home directory and send it back over the socket. However, a malicious user could enter a file name which contains special characters. For example, the string \"../../etc/passwd\" will result in the code reading the file located at \"/home/\\[user\\]/../../etc/passwd\", which is the system's password file. This file would then be sent back to the user, giving them access to all the system's passwords.\n\n\n```java\npublic void sendUserFile(Socket sock, String user) {\n\tBufferedReader filenameReader = new BufferedReader(\n\t\t\tnew InputStreamReader(sock.getInputStream(), \"UTF-8\"));\n\tString filename = filenameReader.readLine();\n\t// BAD: read from a file using a path controlled by the user\n\tBufferedReader fileReader = new BufferedReader(\n\t\t\tnew FileReader(\"/home/\" + user + \"/\" + filename));\n\tString fileLine = fileReader.readLine();\n\twhile(fileLine != null) {\n\t\tsock.getOutputStream().write(fileLine.getBytes());\n\t\tfileLine = fileReader.readLine();\n\t}\n}\n\npublic void sendUserFileFixed(Socket sock, String user) {\n\t// ...\n\t\n\t// GOOD: remove all dots and directory delimiters from the filename before using\n\tString filename = filenameReader.readLine().replaceAll(\"\\\\.\", \"\").replaceAll(\"/\", \"\");\n\tBufferedReader fileReader = new BufferedReader(\n\t\t\tnew FileReader(\"/home/\" + user + \"/\" + filename));\n\n\t// ...\n}\n\n```\n\n## References\n* OWASP: [Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* Common Weakness Enumeration: [CWE-22](https://cwe.mitre.org/data/definitions/22.html).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n* Common Weakness Enumeration: [CWE-36](https://cwe.mitre.org/data/definitions/36.html).\n* Common Weakness Enumeration: [CWE-73](https://cwe.mitre.org/data/definitions/73.html).\n","markdown":"# Uncontrolled data used in path expression\nAccessing paths controlled by users can allow an attacker to access unexpected resources. This can result in sensitive information being revealed or deleted, or an attacker being able to influence behavior by modifying unexpected files.\n\nPaths that are naively constructed from data controlled by a user may contain unexpected special characters, such as \"..\". Such a path may potentially point to any directory on the file system.\n\n\n## Recommendation\nValidate user input before using it to construct a file path. Ideally, follow these rules:\n\n* Do not allow more than a single \".\" character.\n* Do not allow directory separators such as \"/\" or \"\\\\\" (depending on the file system).\n* Do not rely on simply replacing problematic sequences such as \"../\". For example, after applying this filter to \".../...//\" the resulting string would still be \"../\".\n* Ideally use a whitelist of known good patterns.\n\n## Example\nIn this example, a file name is read from a `java.net.Socket` and then used to access a file in the user's home directory and send it back over the socket. However, a malicious user could enter a file name which contains special characters. For example, the string \"../../etc/passwd\" will result in the code reading the file located at \"/home/\\[user\\]/../../etc/passwd\", which is the system's password file. This file would then be sent back to the user, giving them access to all the system's passwords.\n\n\n```java\npublic void sendUserFile(Socket sock, String user) {\n\tBufferedReader filenameReader = new BufferedReader(\n\t\t\tnew InputStreamReader(sock.getInputStream(), \"UTF-8\"));\n\tString filename = filenameReader.readLine();\n\t// BAD: read from a file using a path controlled by the user\n\tBufferedReader fileReader = new BufferedReader(\n\t\t\tnew FileReader(\"/home/\" + user + \"/\" + filename));\n\tString fileLine = fileReader.readLine();\n\twhile(fileLine != null) {\n\t\tsock.getOutputStream().write(fileLine.getBytes());\n\t\tfileLine = fileReader.readLine();\n\t}\n}\n\npublic void sendUserFileFixed(Socket sock, String user) {\n\t// ...\n\t\n\t// GOOD: remove all dots and directory delimiters from the filename before using\n\tString filename = filenameReader.readLine().replaceAll(\"\\\\.\", \"\").replaceAll(\"/\", \"\");\n\tBufferedReader fileReader = new BufferedReader(\n\t\t\tnew FileReader(\"/home/\" + user + \"/\" + filename));\n\n\t// ...\n}\n\n```\n\n## References\n* OWASP: [Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* Common Weakness Enumeration: [CWE-22](https://cwe.mitre.org/data/definitions/22.html).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n* Common Weakness Enumeration: [CWE-36](https://cwe.mitre.org/data/definitions/36.html).\n* Common Weakness Enumeration: [CWE-73](https://cwe.mitre.org/data/definitions/73.html).\n"},"properties":{"tags":["security","external/cwe/cwe-022","external/cwe/cwe-023","external/cwe/cwe-036","external/cwe/cwe-073"],"description":"Accessing paths influenced by users can allow an attacker to access unexpected resources.","id":"java/path-injection","kind":"path-problem","name":"Uncontrolled data used in path expression","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/zipslip","name":"java/zipslip","shortDescription":{"text":"Arbitrary file write during archive extraction (\"Zip Slip\")"},"fullDescription":{"text":"Extracting files from a malicious archive without validating that the destination file path is within the destination directory can cause files outside the destination directory to be overwritten."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Arbitrary file write during archive extraction (\"Zip Slip\")\nExtracting files from a malicious zip archive (or another archive format) without validating that the destination file path is within the destination directory can cause files outside the destination directory to be overwritten, due to the possible presence of directory traversal elements (`..`) in archive paths.\n\nZip archives contain archive entries representing each file in the archive. These entries include a file path for the entry, but these file paths are not restricted and may contain unexpected special elements such as the directory traversal element (`..`). If these file paths are used to determine an output file to write the contents of the archive item to, then the file may be written to an unexpected location. This can result in sensitive information being revealed or deleted, or an attacker being able to influence behavior by modifying unexpected files.\n\nFor example, if a zip file contains a file entry `..\\sneaky-file`, and the zip file is extracted to the directory `c:\\output`, then naively combining the paths would result in an output file path of `c:\\output\\..\\sneaky-file`, which would cause the file to be written to `c:\\sneaky-file`.\n\n\n## Recommendation\nEnsure that output paths constructed from zip archive entries are validated to prevent writing files to unexpected locations.\n\nThe recommended way of writing an output file from a zip archive entry is to verify that the normalized full path of the output file starts with a prefix that matches the destination directory. Path normalization can be done with either `java.io.File.getCanonicalFile()` or `java.nio.file.Path.normalize()`. Prefix checking can be done with `String.startsWith(..)`, but it is better to use `java.nio.file.Path.startsWith(..)`, as the latter works on complete path segments.\n\nAnother alternative is to validate archive entries against a whitelist of expected files.\n\n\n## Example\nIn this example, a file path taken from a zip archive item entry is combined with a destination directory. The result is used as the destination file path without verifying that the result is within the destination directory. If provided with a zip file containing an archive path like `..\\sneaky-file`, then this file would be written outside the destination directory.\n\n\n```java\nvoid writeZipEntry(ZipEntry entry, File destinationDir) {\n File file = new File(destinationDir, entry.getName());\n FileOutputStream fos = new FileOutputStream(file); // BAD\n // ... write entry to fos ...\n}\n\n```\nTo fix this vulnerability, we need to verify that the normalized `file` still has `destinationDir` as its prefix, and throw an exception if this is not the case.\n\n\n```java\nvoid writeZipEntry(ZipEntry entry, File destinationDir) {\n File file = new File(destinationDir, entry.getName());\n if (!file.toPath().normalize().startsWith(destinationDir.toPath()))\n throw new Exception(\"Bad zip entry\");\n FileOutputStream fos = new FileOutputStream(file); // OK\n // ... write entry to fos ...\n}\n\n```\n\n## References\n* Snyk: [Zip Slip Vulnerability](https://snyk.io/research/zip-slip-vulnerability).\n* OWASP: [Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* Common Weakness Enumeration: [CWE-22](https://cwe.mitre.org/data/definitions/22.html).\n","markdown":"# Arbitrary file write during archive extraction (\"Zip Slip\")\nExtracting files from a malicious zip archive (or another archive format) without validating that the destination file path is within the destination directory can cause files outside the destination directory to be overwritten, due to the possible presence of directory traversal elements (`..`) in archive paths.\n\nZip archives contain archive entries representing each file in the archive. These entries include a file path for the entry, but these file paths are not restricted and may contain unexpected special elements such as the directory traversal element (`..`). If these file paths are used to determine an output file to write the contents of the archive item to, then the file may be written to an unexpected location. This can result in sensitive information being revealed or deleted, or an attacker being able to influence behavior by modifying unexpected files.\n\nFor example, if a zip file contains a file entry `..\\sneaky-file`, and the zip file is extracted to the directory `c:\\output`, then naively combining the paths would result in an output file path of `c:\\output\\..\\sneaky-file`, which would cause the file to be written to `c:\\sneaky-file`.\n\n\n## Recommendation\nEnsure that output paths constructed from zip archive entries are validated to prevent writing files to unexpected locations.\n\nThe recommended way of writing an output file from a zip archive entry is to verify that the normalized full path of the output file starts with a prefix that matches the destination directory. Path normalization can be done with either `java.io.File.getCanonicalFile()` or `java.nio.file.Path.normalize()`. Prefix checking can be done with `String.startsWith(..)`, but it is better to use `java.nio.file.Path.startsWith(..)`, as the latter works on complete path segments.\n\nAnother alternative is to validate archive entries against a whitelist of expected files.\n\n\n## Example\nIn this example, a file path taken from a zip archive item entry is combined with a destination directory. The result is used as the destination file path without verifying that the result is within the destination directory. If provided with a zip file containing an archive path like `..\\sneaky-file`, then this file would be written outside the destination directory.\n\n\n```java\nvoid writeZipEntry(ZipEntry entry, File destinationDir) {\n File file = new File(destinationDir, entry.getName());\n FileOutputStream fos = new FileOutputStream(file); // BAD\n // ... write entry to fos ...\n}\n\n```\nTo fix this vulnerability, we need to verify that the normalized `file` still has `destinationDir` as its prefix, and throw an exception if this is not the case.\n\n\n```java\nvoid writeZipEntry(ZipEntry entry, File destinationDir) {\n File file = new File(destinationDir, entry.getName());\n if (!file.toPath().normalize().startsWith(destinationDir.toPath()))\n throw new Exception(\"Bad zip entry\");\n FileOutputStream fos = new FileOutputStream(file); // OK\n // ... write entry to fos ...\n}\n\n```\n\n## References\n* Snyk: [Zip Slip Vulnerability](https://snyk.io/research/zip-slip-vulnerability).\n* OWASP: [Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* Common Weakness Enumeration: [CWE-22](https://cwe.mitre.org/data/definitions/22.html).\n"},"properties":{"tags":["security","external/cwe/cwe-022"],"description":"Extracting files from a malicious archive without validating that the\n destination file path is within the destination directory can cause files outside\n the destination directory to be overwritten.","id":"java/zipslip","kind":"path-problem","name":"Arbitrary file write during archive extraction (\"Zip Slip\")","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/android/unsafe-content-uri-resolution","name":"java/android/unsafe-content-uri-resolution","shortDescription":{"text":"Uncontrolled data used in content resolution"},"fullDescription":{"text":"Resolving externally-provided content URIs without validation can allow an attacker to access unexpected resources."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Uncontrolled data used in content resolution\nWhen an Android application wants to access data in a content provider, it uses the `ContentResolver` object. `ContentResolver`s communicate with an instance of a class that implements the `ContentProvider` interface via URIs with the `content://` scheme. The authority part (the first path segment) of the URI, passed as parameter to the `ContentResolver`, determines which content provider is contacted for the operation. Specific operations that act on files also support the `file://` scheme, in which case the local filesystem is queried instead. If an external component, like a malicious or compromised application, controls the URI for a `ContentResolver` operation, it can trick the vulnerable application into accessing its own private files or non-exported content providers. The attacking application might be able to get access to the file by forcing it to be copied to a public directory, like external storage, or tamper with the contents by making the application overwrite the file with unexpected data.\n\n\n## Recommendation\nIf possible, avoid using externally-provided data to determine the URI for a `ContentResolver` to use. If that is not an option, validate that the incoming URI can only reference trusted components, like an allow list of content providers and/or applications, or alternatively make sure that the URI does not reference private directories like `/data/`.\n\n\n## Example\nThis example shows three ways of opening a file using a `ContentResolver`. In the first case, externally-provided data from an intent is used directly in the file-reading operation. This allows an attacker to provide a URI of the form `/data/data/(vulnerable app package)/(private file)` to trick the application into reading it and copying it to the external storage. In the second case, an insufficient check is performed on the externally-provided URI, still leaving room for exploitation. In the third case, the URI is correctly validated before being used, making sure it does not reference any internal application files.\n\n\n```java\nimport android.content.ContentResolver;\nimport android.net.Uri;\n\npublic class Example extends Activity {\n public void onCreate() {\n // BAD: Externally-provided URI directly used in content resolution\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n // BAD: input URI is not normalized, and check can be bypassed with \"..\" characters\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n String path = uri.getPath();\n if (path.startsWith(\"/data\"))\n throw new SecurityException();\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n // GOOD: URI is properly validated to block access to internal files\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n String path = uri.getPath();\n java.nio.file.Path normalized =\n java.nio.file.FileSystems.getDefault().getPath(path).normalize();\n if (normalized.startsWith(\"/data\"))\n throw new SecurityException();\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n }\n\n private void copyToExternalCache(InputStream is) {\n // Reads the contents of is and writes a file in the app's external\n // cache directory, which can be read publicly by applications in the same device.\n }\n}\n\n```\n\n## References\n* Android developers: [Content provider basics](https://developer.android.com/guide/topics/providers/content-provider-basics)\n* [The ContentResolver class](https://developer.android.com/reference/android/content/ContentResolver)\n* Common Weakness Enumeration: [CWE-441](https://cwe.mitre.org/data/definitions/441.html).\n* Common Weakness Enumeration: [CWE-610](https://cwe.mitre.org/data/definitions/610.html).\n","markdown":"# Uncontrolled data used in content resolution\nWhen an Android application wants to access data in a content provider, it uses the `ContentResolver` object. `ContentResolver`s communicate with an instance of a class that implements the `ContentProvider` interface via URIs with the `content://` scheme. The authority part (the first path segment) of the URI, passed as parameter to the `ContentResolver`, determines which content provider is contacted for the operation. Specific operations that act on files also support the `file://` scheme, in which case the local filesystem is queried instead. If an external component, like a malicious or compromised application, controls the URI for a `ContentResolver` operation, it can trick the vulnerable application into accessing its own private files or non-exported content providers. The attacking application might be able to get access to the file by forcing it to be copied to a public directory, like external storage, or tamper with the contents by making the application overwrite the file with unexpected data.\n\n\n## Recommendation\nIf possible, avoid using externally-provided data to determine the URI for a `ContentResolver` to use. If that is not an option, validate that the incoming URI can only reference trusted components, like an allow list of content providers and/or applications, or alternatively make sure that the URI does not reference private directories like `/data/`.\n\n\n## Example\nThis example shows three ways of opening a file using a `ContentResolver`. In the first case, externally-provided data from an intent is used directly in the file-reading operation. This allows an attacker to provide a URI of the form `/data/data/(vulnerable app package)/(private file)` to trick the application into reading it and copying it to the external storage. In the second case, an insufficient check is performed on the externally-provided URI, still leaving room for exploitation. In the third case, the URI is correctly validated before being used, making sure it does not reference any internal application files.\n\n\n```java\nimport android.content.ContentResolver;\nimport android.net.Uri;\n\npublic class Example extends Activity {\n public void onCreate() {\n // BAD: Externally-provided URI directly used in content resolution\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n // BAD: input URI is not normalized, and check can be bypassed with \"..\" characters\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n String path = uri.getPath();\n if (path.startsWith(\"/data\"))\n throw new SecurityException();\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n // GOOD: URI is properly validated to block access to internal files\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n String path = uri.getPath();\n java.nio.file.Path normalized =\n java.nio.file.FileSystems.getDefault().getPath(path).normalize();\n if (normalized.startsWith(\"/data\"))\n throw new SecurityException();\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n }\n\n private void copyToExternalCache(InputStream is) {\n // Reads the contents of is and writes a file in the app's external\n // cache directory, which can be read publicly by applications in the same device.\n }\n}\n\n```\n\n## References\n* Android developers: [Content provider basics](https://developer.android.com/guide/topics/providers/content-provider-basics)\n* [The ContentResolver class](https://developer.android.com/reference/android/content/ContentResolver)\n* Common Weakness Enumeration: [CWE-441](https://cwe.mitre.org/data/definitions/441.html).\n* Common Weakness Enumeration: [CWE-610](https://cwe.mitre.org/data/definitions/610.html).\n"},"properties":{"tags":["security","external/cwe/cwe-441","external/cwe/cwe-610","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Resolving externally-provided content URIs without validation can allow an attacker\n to access unexpected resources.","id":"java/android/unsafe-content-uri-resolution","kind":"path-problem","name":"Uncontrolled data used in content resolution","precision":"high","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/insufficient-key-size","name":"java/insufficient-key-size","shortDescription":{"text":"Use of a cryptographic algorithm with insufficient key size"},"fullDescription":{"text":"Using cryptographic algorithms with too small a key size can allow an attacker to compromise security."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Use of a cryptographic algorithm with insufficient key size\nModern encryption relies on the computational infeasibility of breaking a cipher and decoding its message without the key. As computational power increases, the ability to break ciphers grows, and key sizes need to become larger as a result. Cryptographic algorithms that use too small of a key size are vulnerable to brute force attacks, which can reveal sensitive data.\n\n\n## Recommendation\nUse a key of the recommended size or larger. The key size should be at least 128 bits for AES encryption, 256 bits for elliptic-curve cryptography (ECC), and 2048 bits for RSA, DSA, or DH encryption.\n\n\n## Example\nThe following code uses cryptographic algorithms with insufficient key sizes.\n\n\n```java\n KeyPairGenerator keyPairGen1 = KeyPairGenerator.getInstance(\"RSA\");\n keyPairGen1.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen2 = KeyPairGenerator.getInstance(\"DSA\");\n keyPairGen2.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen3 = KeyPairGenerator.getInstance(\"DH\");\n keyPairGen3.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen4 = KeyPairGenerator.getInstance(\"EC\");\n ECGenParameterSpec ecSpec = new ECGenParameterSpec(\"secp112r1\"); // BAD: Key size is less than 256\n keyPairGen4.initialize(ecSpec);\n\n KeyGenerator keyGen = KeyGenerator.getInstance(\"AES\");\n keyGen.init(64); // BAD: Key size is less than 128\n\n```\nTo fix the code, change the key sizes to be the recommended size or larger for each algorithm.\n\n\n## References\n* Wikipedia: [Key size](http://en.wikipedia.org/wiki/Key_size).\n* Wikipedia: [Strong cryptography](https://en.wikipedia.org/wiki/Strong_cryptography).\n* OWASP: [ Cryptographic Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html#algorithms).\n* OWASP: [ Testing for Weak Encryption](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/04-Testing_for_Weak_Encryption).\n* NIST: [ Transitioning the Use of Cryptographic Algorithms and Key Lengths](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf).\n* Common Weakness Enumeration: [CWE-326](https://cwe.mitre.org/data/definitions/326.html).\n","markdown":"# Use of a cryptographic algorithm with insufficient key size\nModern encryption relies on the computational infeasibility of breaking a cipher and decoding its message without the key. As computational power increases, the ability to break ciphers grows, and key sizes need to become larger as a result. Cryptographic algorithms that use too small of a key size are vulnerable to brute force attacks, which can reveal sensitive data.\n\n\n## Recommendation\nUse a key of the recommended size or larger. The key size should be at least 128 bits for AES encryption, 256 bits for elliptic-curve cryptography (ECC), and 2048 bits for RSA, DSA, or DH encryption.\n\n\n## Example\nThe following code uses cryptographic algorithms with insufficient key sizes.\n\n\n```java\n KeyPairGenerator keyPairGen1 = KeyPairGenerator.getInstance(\"RSA\");\n keyPairGen1.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen2 = KeyPairGenerator.getInstance(\"DSA\");\n keyPairGen2.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen3 = KeyPairGenerator.getInstance(\"DH\");\n keyPairGen3.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen4 = KeyPairGenerator.getInstance(\"EC\");\n ECGenParameterSpec ecSpec = new ECGenParameterSpec(\"secp112r1\"); // BAD: Key size is less than 256\n keyPairGen4.initialize(ecSpec);\n\n KeyGenerator keyGen = KeyGenerator.getInstance(\"AES\");\n keyGen.init(64); // BAD: Key size is less than 128\n\n```\nTo fix the code, change the key sizes to be the recommended size or larger for each algorithm.\n\n\n## References\n* Wikipedia: [Key size](http://en.wikipedia.org/wiki/Key_size).\n* Wikipedia: [Strong cryptography](https://en.wikipedia.org/wiki/Strong_cryptography).\n* OWASP: [ Cryptographic Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html#algorithms).\n* OWASP: [ Testing for Weak Encryption](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/04-Testing_for_Weak_Encryption).\n* NIST: [ Transitioning the Use of Cryptographic Algorithms and Key Lengths](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf).\n* Common Weakness Enumeration: [CWE-326](https://cwe.mitre.org/data/definitions/326.html).\n"},"properties":{"tags":["security","external/cwe/cwe-326","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using cryptographic algorithms with too small a key size can\n allow an attacker to compromise security.","id":"java/insufficient-key-size","kind":"path-problem","name":"Use of a cryptographic algorithm with insufficient key size","precision":"high","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/android/implicit-pendingintents","name":"java/android/implicit-pendingintents","shortDescription":{"text":"Use of implicit PendingIntents"},"fullDescription":{"text":"Sending an implicit and mutable 'PendingIntent' to an unspecified third party component may provide an attacker with access to internal components of the application or cause other unintended effects."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Use of implicit PendingIntents\nA `PendingIntent` is used to wrap an `Intent` that will be supplied and executed by another application. When the `Intent` is executed, it behaves as if it were run directly by the supplying application, using the privileges of that application.\n\nIf a `PendingIntent` is configured to be mutable, the fields of its internal `Intent` can be changed by the receiving application if they were not previously set. This means that a mutable `PendingIntent` that has not defined a destination component (that is, an implicit `PendingIntent`) can be altered to execute an arbitrary action with the privileges of the application that created it.\n\nA malicious application can access an implicit `PendingIntent` as follows:\n\n* It is wrapped and sent as an extra of another implicit `Intent`.\n* It is sent as the action of a `Slide`.\n* It is sent as the action of a `Notification`.\n\n\nOn gaining access, the attacker can modify the underlying `Intent` and execute an arbitrary action with elevated privileges. This could give the malicious application access to private components of the victim application, or the ability to perform actions without having the necessary permissions.\n\n\n## Recommendation\nAvoid creating implicit `PendingIntent`s. This means that the underlying `Intent` should always have an explicit destination component.\n\nWhen you add the `PendingIntent` as an extra of another `Intent`, make sure that this second `Intent` also has an explicit destination component, so that it is not delivered to untrusted applications.\n\nCreate the `PendingIntent` using the flag `FLAG_IMMUTABLE` whenever possible, to prevent the destination component from modifying empty fields of the underlying `Intent`.\n\n\n## Example\nIn the following examples, a `PendingIntent` is created and wrapped as an extra of another `Intent`.\n\nIn the first example, both the `PendingIntent` and the `Intent` it is wrapped in are implicit, making them vulnerable to attack.\n\nIn the second example, the issue is avoided by adding explicit destination components to the `PendingIntent` and the wrapping `Intent`.\n\nThe third example uses the `FLAG_IMMUTABLE` flag to prevent the underlying `Intent` from being modified by the destination component.\n\n\n```java\nimport android.app.Activity;\nimport android.app.PendingIntent;\nimport android.content.Intent;\nimport android.os.Bundle;\n\npublic class ImplicitPendingIntents extends Activity {\n\n\tpublic void onCreate(Bundle savedInstance) {\n\t\t{\n\t\t\t// BAD: an implicit Intent is used to create a PendingIntent.\n\t\t\t// The PendingIntent is then added to another implicit Intent\n\t\t\t// and started.\n\t\t\tIntent baseIntent = new Intent();\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, baseIntent, PendingIntent.FLAG_ONE_SHOT);\n\t\t\tIntent fwdIntent = new Intent(\"SOME_ACTION\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tsendBroadcast(fwdIntent);\n\t\t}\n\n\t\t{\n\t\t\t// GOOD: both the PendingIntent and the wrapping Intent are explicit.\n\t\t\tIntent safeIntent = new Intent(this, AnotherActivity.class);\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, safeIntent, PendingIntent.FLAG_ONE_SHOT);\n\t\t\tIntent fwdIntent = new Intent();\n\t\t\tfwdIntent.setClassName(\"destination.package\", \"DestinationClass\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tstartActivity(fwdIntent);\n\t\t}\n\n\t\t{\n\t\t\t// GOOD: The PendingIntent is created with FLAG_IMMUTABLE.\n\t\t\tIntent baseIntent = new Intent(\"SOME_ACTION\");\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, baseIntent, PendingIntent.FLAG_IMMUTABLE);\n\t\t\tIntent fwdIntent = new Intent();\n\t\t\tfwdIntent.setClassName(\"destination.package\", \"DestinationClass\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tstartActivity(fwdIntent);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* Google Help: [ Remediation for Implicit PendingIntent Vulnerability ](https://support.google.com/faqs/answer/10437428?hl=en)\n* University of Potsdam: [ PIAnalyzer: A precise approach for PendingIntent vulnerability analysis ](https://www.cs.uni-potsdam.de/se/papers/esorics18.pdf)\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n","markdown":"# Use of implicit PendingIntents\nA `PendingIntent` is used to wrap an `Intent` that will be supplied and executed by another application. When the `Intent` is executed, it behaves as if it were run directly by the supplying application, using the privileges of that application.\n\nIf a `PendingIntent` is configured to be mutable, the fields of its internal `Intent` can be changed by the receiving application if they were not previously set. This means that a mutable `PendingIntent` that has not defined a destination component (that is, an implicit `PendingIntent`) can be altered to execute an arbitrary action with the privileges of the application that created it.\n\nA malicious application can access an implicit `PendingIntent` as follows:\n\n* It is wrapped and sent as an extra of another implicit `Intent`.\n* It is sent as the action of a `Slide`.\n* It is sent as the action of a `Notification`.\n\n\nOn gaining access, the attacker can modify the underlying `Intent` and execute an arbitrary action with elevated privileges. This could give the malicious application access to private components of the victim application, or the ability to perform actions without having the necessary permissions.\n\n\n## Recommendation\nAvoid creating implicit `PendingIntent`s. This means that the underlying `Intent` should always have an explicit destination component.\n\nWhen you add the `PendingIntent` as an extra of another `Intent`, make sure that this second `Intent` also has an explicit destination component, so that it is not delivered to untrusted applications.\n\nCreate the `PendingIntent` using the flag `FLAG_IMMUTABLE` whenever possible, to prevent the destination component from modifying empty fields of the underlying `Intent`.\n\n\n## Example\nIn the following examples, a `PendingIntent` is created and wrapped as an extra of another `Intent`.\n\nIn the first example, both the `PendingIntent` and the `Intent` it is wrapped in are implicit, making them vulnerable to attack.\n\nIn the second example, the issue is avoided by adding explicit destination components to the `PendingIntent` and the wrapping `Intent`.\n\nThe third example uses the `FLAG_IMMUTABLE` flag to prevent the underlying `Intent` from being modified by the destination component.\n\n\n```java\nimport android.app.Activity;\nimport android.app.PendingIntent;\nimport android.content.Intent;\nimport android.os.Bundle;\n\npublic class ImplicitPendingIntents extends Activity {\n\n\tpublic void onCreate(Bundle savedInstance) {\n\t\t{\n\t\t\t// BAD: an implicit Intent is used to create a PendingIntent.\n\t\t\t// The PendingIntent is then added to another implicit Intent\n\t\t\t// and started.\n\t\t\tIntent baseIntent = new Intent();\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, baseIntent, PendingIntent.FLAG_ONE_SHOT);\n\t\t\tIntent fwdIntent = new Intent(\"SOME_ACTION\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tsendBroadcast(fwdIntent);\n\t\t}\n\n\t\t{\n\t\t\t// GOOD: both the PendingIntent and the wrapping Intent are explicit.\n\t\t\tIntent safeIntent = new Intent(this, AnotherActivity.class);\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, safeIntent, PendingIntent.FLAG_ONE_SHOT);\n\t\t\tIntent fwdIntent = new Intent();\n\t\t\tfwdIntent.setClassName(\"destination.package\", \"DestinationClass\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tstartActivity(fwdIntent);\n\t\t}\n\n\t\t{\n\t\t\t// GOOD: The PendingIntent is created with FLAG_IMMUTABLE.\n\t\t\tIntent baseIntent = new Intent(\"SOME_ACTION\");\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, baseIntent, PendingIntent.FLAG_IMMUTABLE);\n\t\t\tIntent fwdIntent = new Intent();\n\t\t\tfwdIntent.setClassName(\"destination.package\", \"DestinationClass\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tstartActivity(fwdIntent);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* Google Help: [ Remediation for Implicit PendingIntent Vulnerability ](https://support.google.com/faqs/answer/10437428?hl=en)\n* University of Potsdam: [ PIAnalyzer: A precise approach for PendingIntent vulnerability analysis ](https://www.cs.uni-potsdam.de/se/papers/esorics18.pdf)\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n"},"properties":{"tags":["security","external/cwe/cwe-927","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Sending an implicit and mutable 'PendingIntent' to an unspecified third party\n component may provide an attacker with access to internal components of the\n application or cause other unintended effects.","id":"java/android/implicit-pendingintents","kind":"path-problem","name":"Use of implicit PendingIntents","precision":"high","problem.severity":"error","security-severity":"8.2"}},{"id":"java/ldap-injection","name":"java/ldap-injection","shortDescription":{"text":"LDAP query built from user-controlled sources"},"fullDescription":{"text":"Building an LDAP query from user-controlled sources is vulnerable to insertion of malicious LDAP code by the user."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# LDAP query built from user-controlled sources\nIf an LDAP query is built using string concatenation, and the components of the concatenation include user input, a user is likely to be able to run malicious LDAP queries.\n\n\n## Recommendation\nIf user input must be included in an LDAP query, it should be escaped to avoid a malicious user providing special characters that change the meaning of the query. If possible build the LDAP query using framework helper methods, for example from Spring's `LdapQueryBuilder` and `LdapNameBuilder`, instead of string concatenation. Alternatively, escape user input using an appropriate LDAP encoding method, for example: `encodeForLDAP` or `encodeForDN` from OWASP ESAPI, `LdapEncoder.filterEncode` or `LdapEncoder.nameEncode` from Spring LDAP, or `Filter.encodeValue` from UnboundID library.\n\n\n## Example\nIn the following examples, the code accepts an \"organization name\" and a \"username\" from the user, which it uses to query LDAP.\n\nThe first example concatenates the unvalidated and unencoded user input directly into both the DN (Distinguished Name) and the search filter used for the LDAP query. A malicious user could provide special characters to change the meaning of these queries, and search for a completely different set of values. The LDAP query is executed using Java JNDI API.\n\nThe second example uses the OWASP ESAPI library to encode the user values before they are included in the DN and search filters. This ensures the meaning of the query cannot be changed by a malicious user.\n\n\n```java\nimport javax.naming.directory.DirContext;\nimport org.owasp.esapi.Encoder;\nimport org.owasp.esapi.reference.DefaultEncoder;\n\npublic void ldapQueryBad(HttpServletRequest request, DirContext ctx) throws NamingException {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // BAD: User input used in DN (Distinguished Name) without encoding\n String dn = \"OU=People,O=\" + organizationName;\n\n // BAD: User input used in search filter without encoding\n String filter = \"username=\" + userName;\n\n ctx.search(dn, filter, new SearchControls());\n}\n\npublic void ldapQueryGood(HttpServletRequest request, DirContext ctx) throws NamingException {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // ESAPI encoder\n Encoder encoder = DefaultEncoder.getInstance();\n\n // GOOD: Organization name is encoded before being used in DN\n String safeOrganizationName = encoder.encodeForDN(organizationName);\n String safeDn = \"OU=People,O=\" + safeOrganizationName;\n\n // GOOD: User input is encoded before being used in search filter\n String safeUsername = encoder.encodeForLDAP(username);\n String safeFilter = \"username=\" + safeUsername;\n \n ctx.search(safeDn, safeFilter, new SearchControls());\n}\n```\nThe third example uses Spring `LdapQueryBuilder` to build an LDAP query. In addition to simplifying the building of complex search parameters, it also provides proper escaping of any unsafe characters in search filters. The DN is built using `LdapNameBuilder`, which also provides proper escaping.\n\n\n```java\nimport static org.springframework.ldap.query.LdapQueryBuilder.query;\nimport org.springframework.ldap.support.LdapNameBuilder;\n\npublic void ldapQueryGood(@RequestParam String organizationName, @RequestParam String username) {\n // GOOD: Organization name is encoded before being used in DN\n String safeDn = LdapNameBuilder.newInstance()\n .add(\"O\", organizationName)\n .add(\"OU=People\")\n .build().toString();\n\n // GOOD: User input is encoded before being used in search filter\n LdapQuery query = query()\n .base(safeDn)\n .where(\"username\").is(username);\n\n ldapTemplate.search(query, new AttributeCheckAttributesMapper());\n}\n```\nThe fourth example uses `UnboundID` classes, `Filter` and `DN`, to construct a safe filter and base DN.\n\n\n```java\nimport com.unboundid.ldap.sdk.LDAPConnection;\nimport com.unboundid.ldap.sdk.DN;\nimport com.unboundid.ldap.sdk.RDN;\nimport com.unboundid.ldap.sdk.Filter;\n\npublic void ldapQueryGood(HttpServletRequest request, LDAPConnection c) {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // GOOD: Organization name is encoded before being used in DN\n DN safeDn = new DN(new RDN(\"OU\", \"People\"), new RDN(\"O\", organizationName));\n\n // GOOD: User input is encoded before being used in search filter\n Filter safeFilter = Filter.createEqualityFilter(\"username\", username);\n \n c.search(safeDn.toString(), SearchScope.ONE, safeFilter);\n}\n```\nThe fifth example shows how to build a safe filter and DN using the Apache LDAP API.\n\n\n```java\nimport org.apache.directory.ldap.client.api.LdapConnection;\nimport org.apache.directory.api.ldap.model.name.Dn;\nimport org.apache.directory.api.ldap.model.name.Rdn;\nimport org.apache.directory.api.ldap.model.message.SearchRequest;\nimport org.apache.directory.api.ldap.model.message.SearchRequestImpl;\nimport static org.apache.directory.ldap.client.api.search.FilterBuilder.equal;\n\npublic void ldapQueryGood(HttpServletRequest request, LdapConnection c) {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // GOOD: Organization name is encoded before being used in DN\n Dn safeDn = new Dn(new Rdn(\"OU\", \"People\"), new Rdn(\"O\", organizationName));\n\n // GOOD: User input is encoded before being used in search filter\n String safeFilter = equal(\"username\", username);\n \n SearchRequest searchRequest = new SearchRequestImpl();\n searchRequest.setBase(safeDn);\n searchRequest.setFilter(safeFilter);\n c.search(searchRequest);\n}\n```\n\n## References\n* OWASP: [LDAP Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html).\n* OWASP ESAPI: [OWASP ESAPI](https://owasp.org/www-project-enterprise-security-api/).\n* Spring LdapQueryBuilder doc: [LdapQueryBuilder](https://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/query/LdapQueryBuilder.html).\n* Spring LdapNameBuilder doc: [LdapNameBuilder](https://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/support/LdapNameBuilder.html).\n* UnboundID: [Understanding and Defending Against LDAP Injection Attacks](https://ldap.com/2018/05/04/understanding-and-defending-against-ldap-injection-attacks/).\n* Common Weakness Enumeration: [CWE-90](https://cwe.mitre.org/data/definitions/90.html).\n","markdown":"# LDAP query built from user-controlled sources\nIf an LDAP query is built using string concatenation, and the components of the concatenation include user input, a user is likely to be able to run malicious LDAP queries.\n\n\n## Recommendation\nIf user input must be included in an LDAP query, it should be escaped to avoid a malicious user providing special characters that change the meaning of the query. If possible build the LDAP query using framework helper methods, for example from Spring's `LdapQueryBuilder` and `LdapNameBuilder`, instead of string concatenation. Alternatively, escape user input using an appropriate LDAP encoding method, for example: `encodeForLDAP` or `encodeForDN` from OWASP ESAPI, `LdapEncoder.filterEncode` or `LdapEncoder.nameEncode` from Spring LDAP, or `Filter.encodeValue` from UnboundID library.\n\n\n## Example\nIn the following examples, the code accepts an \"organization name\" and a \"username\" from the user, which it uses to query LDAP.\n\nThe first example concatenates the unvalidated and unencoded user input directly into both the DN (Distinguished Name) and the search filter used for the LDAP query. A malicious user could provide special characters to change the meaning of these queries, and search for a completely different set of values. The LDAP query is executed using Java JNDI API.\n\nThe second example uses the OWASP ESAPI library to encode the user values before they are included in the DN and search filters. This ensures the meaning of the query cannot be changed by a malicious user.\n\n\n```java\nimport javax.naming.directory.DirContext;\nimport org.owasp.esapi.Encoder;\nimport org.owasp.esapi.reference.DefaultEncoder;\n\npublic void ldapQueryBad(HttpServletRequest request, DirContext ctx) throws NamingException {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // BAD: User input used in DN (Distinguished Name) without encoding\n String dn = \"OU=People,O=\" + organizationName;\n\n // BAD: User input used in search filter without encoding\n String filter = \"username=\" + userName;\n\n ctx.search(dn, filter, new SearchControls());\n}\n\npublic void ldapQueryGood(HttpServletRequest request, DirContext ctx) throws NamingException {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // ESAPI encoder\n Encoder encoder = DefaultEncoder.getInstance();\n\n // GOOD: Organization name is encoded before being used in DN\n String safeOrganizationName = encoder.encodeForDN(organizationName);\n String safeDn = \"OU=People,O=\" + safeOrganizationName;\n\n // GOOD: User input is encoded before being used in search filter\n String safeUsername = encoder.encodeForLDAP(username);\n String safeFilter = \"username=\" + safeUsername;\n \n ctx.search(safeDn, safeFilter, new SearchControls());\n}\n```\nThe third example uses Spring `LdapQueryBuilder` to build an LDAP query. In addition to simplifying the building of complex search parameters, it also provides proper escaping of any unsafe characters in search filters. The DN is built using `LdapNameBuilder`, which also provides proper escaping.\n\n\n```java\nimport static org.springframework.ldap.query.LdapQueryBuilder.query;\nimport org.springframework.ldap.support.LdapNameBuilder;\n\npublic void ldapQueryGood(@RequestParam String organizationName, @RequestParam String username) {\n // GOOD: Organization name is encoded before being used in DN\n String safeDn = LdapNameBuilder.newInstance()\n .add(\"O\", organizationName)\n .add(\"OU=People\")\n .build().toString();\n\n // GOOD: User input is encoded before being used in search filter\n LdapQuery query = query()\n .base(safeDn)\n .where(\"username\").is(username);\n\n ldapTemplate.search(query, new AttributeCheckAttributesMapper());\n}\n```\nThe fourth example uses `UnboundID` classes, `Filter` and `DN`, to construct a safe filter and base DN.\n\n\n```java\nimport com.unboundid.ldap.sdk.LDAPConnection;\nimport com.unboundid.ldap.sdk.DN;\nimport com.unboundid.ldap.sdk.RDN;\nimport com.unboundid.ldap.sdk.Filter;\n\npublic void ldapQueryGood(HttpServletRequest request, LDAPConnection c) {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // GOOD: Organization name is encoded before being used in DN\n DN safeDn = new DN(new RDN(\"OU\", \"People\"), new RDN(\"O\", organizationName));\n\n // GOOD: User input is encoded before being used in search filter\n Filter safeFilter = Filter.createEqualityFilter(\"username\", username);\n \n c.search(safeDn.toString(), SearchScope.ONE, safeFilter);\n}\n```\nThe fifth example shows how to build a safe filter and DN using the Apache LDAP API.\n\n\n```java\nimport org.apache.directory.ldap.client.api.LdapConnection;\nimport org.apache.directory.api.ldap.model.name.Dn;\nimport org.apache.directory.api.ldap.model.name.Rdn;\nimport org.apache.directory.api.ldap.model.message.SearchRequest;\nimport org.apache.directory.api.ldap.model.message.SearchRequestImpl;\nimport static org.apache.directory.ldap.client.api.search.FilterBuilder.equal;\n\npublic void ldapQueryGood(HttpServletRequest request, LdapConnection c) {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // GOOD: Organization name is encoded before being used in DN\n Dn safeDn = new Dn(new Rdn(\"OU\", \"People\"), new Rdn(\"O\", organizationName));\n\n // GOOD: User input is encoded before being used in search filter\n String safeFilter = equal(\"username\", username);\n \n SearchRequest searchRequest = new SearchRequestImpl();\n searchRequest.setBase(safeDn);\n searchRequest.setFilter(safeFilter);\n c.search(searchRequest);\n}\n```\n\n## References\n* OWASP: [LDAP Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html).\n* OWASP ESAPI: [OWASP ESAPI](https://owasp.org/www-project-enterprise-security-api/).\n* Spring LdapQueryBuilder doc: [LdapQueryBuilder](https://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/query/LdapQueryBuilder.html).\n* Spring LdapNameBuilder doc: [LdapNameBuilder](https://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/support/LdapNameBuilder.html).\n* UnboundID: [Understanding and Defending Against LDAP Injection Attacks](https://ldap.com/2018/05/04/understanding-and-defending-against-ldap-injection-attacks/).\n* Common Weakness Enumeration: [CWE-90](https://cwe.mitre.org/data/definitions/90.html).\n"},"properties":{"tags":["security","external/cwe/cwe-090"],"description":"Building an LDAP query from user-controlled sources is vulnerable to insertion of\n malicious LDAP code by the user.","id":"java/ldap-injection","kind":"path-problem","name":"LDAP query built from user-controlled sources","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/android/fragment-injection","name":"java/android/fragment-injection","shortDescription":{"text":"Android fragment injection"},"fullDescription":{"text":"Instantiating an Android fragment from a user-provided value may allow a malicious application to bypass access controls, exposing the application to unintended effects."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Android fragment injection\nWhen fragments are instantiated with externally provided names, this exposes any exported activity that dynamically creates and hosts the fragment to fragment injection. A malicious application could provide the name of an arbitrary fragment, even one not designed to be externally accessible, and inject it into the activity. This can bypass access controls and expose the application to unintended effects.\n\nFragments are reusable parts of an Android application's user interface. Even though a fragment controls its own lifecycle and layout, and handles its input events, it cannot exist on its own: it must be hosted either by an activity or another fragment. This means that, normally, a fragment will be accessible by third-party applications (that is, exported) only if its hosting activity is itself exported.\n\n\n## Recommendation\nIn general, do not instantiate classes (including fragments) with user-provided names unless the name has been properly validated. Also, if an exported activity is extending the `PreferenceActivity` class, make sure that the `isValidFragment` method is overriden and only returns `true` when the provided `fragmentName` points to an intended fragment.\n\n\n## Example\nThe following example shows two cases: in the first one, untrusted data is used to instantiate and add a fragment to an activity, while in the second one, a fragment is safely added with a static name.\n\n\n```java\npublic class MyActivity extends FragmentActivity {\n\n @Override\n protected void onCreate(Bundle savedInstance) {\n try {\n super.onCreate(savedInstance);\n // BAD: Fragment instantiated from user input without validation\n {\n String fName = getIntent().getStringExtra(\"fragmentName\");\n getFragmentManager().beginTransaction().replace(com.android.internal.R.id.prefs,\n Fragment.instantiate(this, fName, null)).commit();\n }\n // GOOD: Fragment instantiated statically\n {\n getFragmentManager().beginTransaction()\n .replace(com.android.internal.R.id.prefs, new MyFragment()).commit();\n }\n } catch (Exception e) {\n }\n }\n\n}\n\n```\nThe next example shows two activities that extend `PreferenceActivity`. The first activity overrides `isValidFragment`, but it wrongly returns `true` unconditionally. The second activity correctly overrides `isValidFragment` so that it only returns `true` when `fragmentName` is a trusted fragment name.\n\n\n```java\nclass UnsafeActivity extends PreferenceActivity {\n\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // BAD: any Fragment name can be provided.\n return true;\n }\n}\n\n\nclass SafeActivity extends PreferenceActivity {\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // Good: only trusted Fragment names are allowed.\n return SafeFragment1.class.getName().equals(fragmentName)\n || SafeFragment2.class.getName().equals(fragmentName)\n || SafeFragment3.class.getName().equals(fragmentName);\n }\n\n}\n\n\n```\n\n## References\n* Google Help: [How to fix Fragment Injection vulnerability](https://support.google.com/faqs/answer/7188427?hl=en).\n* IBM Security Systems: [Android collapses into Fragments](https://securityintelligence.com/wp-content/uploads/2013/12/android-collapses-into-fragments.pdf).\n* Android Developers: [Fragments](https://developer.android.com/guide/fragments)\n* Common Weakness Enumeration: [CWE-470](https://cwe.mitre.org/data/definitions/470.html).\n","markdown":"# Android fragment injection\nWhen fragments are instantiated with externally provided names, this exposes any exported activity that dynamically creates and hosts the fragment to fragment injection. A malicious application could provide the name of an arbitrary fragment, even one not designed to be externally accessible, and inject it into the activity. This can bypass access controls and expose the application to unintended effects.\n\nFragments are reusable parts of an Android application's user interface. Even though a fragment controls its own lifecycle and layout, and handles its input events, it cannot exist on its own: it must be hosted either by an activity or another fragment. This means that, normally, a fragment will be accessible by third-party applications (that is, exported) only if its hosting activity is itself exported.\n\n\n## Recommendation\nIn general, do not instantiate classes (including fragments) with user-provided names unless the name has been properly validated. Also, if an exported activity is extending the `PreferenceActivity` class, make sure that the `isValidFragment` method is overriden and only returns `true` when the provided `fragmentName` points to an intended fragment.\n\n\n## Example\nThe following example shows two cases: in the first one, untrusted data is used to instantiate and add a fragment to an activity, while in the second one, a fragment is safely added with a static name.\n\n\n```java\npublic class MyActivity extends FragmentActivity {\n\n @Override\n protected void onCreate(Bundle savedInstance) {\n try {\n super.onCreate(savedInstance);\n // BAD: Fragment instantiated from user input without validation\n {\n String fName = getIntent().getStringExtra(\"fragmentName\");\n getFragmentManager().beginTransaction().replace(com.android.internal.R.id.prefs,\n Fragment.instantiate(this, fName, null)).commit();\n }\n // GOOD: Fragment instantiated statically\n {\n getFragmentManager().beginTransaction()\n .replace(com.android.internal.R.id.prefs, new MyFragment()).commit();\n }\n } catch (Exception e) {\n }\n }\n\n}\n\n```\nThe next example shows two activities that extend `PreferenceActivity`. The first activity overrides `isValidFragment`, but it wrongly returns `true` unconditionally. The second activity correctly overrides `isValidFragment` so that it only returns `true` when `fragmentName` is a trusted fragment name.\n\n\n```java\nclass UnsafeActivity extends PreferenceActivity {\n\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // BAD: any Fragment name can be provided.\n return true;\n }\n}\n\n\nclass SafeActivity extends PreferenceActivity {\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // Good: only trusted Fragment names are allowed.\n return SafeFragment1.class.getName().equals(fragmentName)\n || SafeFragment2.class.getName().equals(fragmentName)\n || SafeFragment3.class.getName().equals(fragmentName);\n }\n\n}\n\n\n```\n\n## References\n* Google Help: [How to fix Fragment Injection vulnerability](https://support.google.com/faqs/answer/7188427?hl=en).\n* IBM Security Systems: [Android collapses into Fragments](https://securityintelligence.com/wp-content/uploads/2013/12/android-collapses-into-fragments.pdf).\n* Android Developers: [Fragments](https://developer.android.com/guide/fragments)\n* Common Weakness Enumeration: [CWE-470](https://cwe.mitre.org/data/definitions/470.html).\n"},"properties":{"tags":["security","external/cwe/cwe-470","owasp-top10-2021","A03:2021 - Injection"],"description":"Instantiating an Android fragment from a user-provided value\n may allow a malicious application to bypass access controls, exposing the application to unintended effects.","id":"java/android/fragment-injection","kind":"path-problem","name":"Android fragment injection","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/android/fragment-injection-preference-activity","name":"java/android/fragment-injection-preference-activity","shortDescription":{"text":"Android fragment injection in PreferenceActivity"},"fullDescription":{"text":"An insecure implementation of the 'isValidFragment' method of the 'PreferenceActivity' class may allow a malicious application to bypass access controls, exposing the application to unintended effects."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Android fragment injection in PreferenceActivity\nWhen fragments are instantiated with externally provided names, this exposes any exported activity that dynamically creates and hosts the fragment to fragment injection. A malicious application could provide the name of an arbitrary fragment, even one not designed to be externally accessible, and inject it into the activity. This can bypass access controls and expose the application to unintended effects.\n\nFragments are reusable parts of an Android application's user interface. Even though a fragment controls its own lifecycle and layout, and handles its input events, it cannot exist on its own: it must be hosted either by an activity or another fragment. This means that, normally, a fragment will be accessible by third-party applications (that is, exported) only if its hosting activity is itself exported.\n\n\n## Recommendation\nIn general, do not instantiate classes (including fragments) with user-provided names unless the name has been properly validated. Also, if an exported activity is extending the `PreferenceActivity` class, make sure that the `isValidFragment` method is overriden and only returns `true` when the provided `fragmentName` points to an intended fragment.\n\n\n## Example\nThe following example shows two cases: in the first one, untrusted data is used to instantiate and add a fragment to an activity, while in the second one, a fragment is safely added with a static name.\n\n\n```java\npublic class MyActivity extends FragmentActivity {\n\n @Override\n protected void onCreate(Bundle savedInstance) {\n try {\n super.onCreate(savedInstance);\n // BAD: Fragment instantiated from user input without validation\n {\n String fName = getIntent().getStringExtra(\"fragmentName\");\n getFragmentManager().beginTransaction().replace(com.android.internal.R.id.prefs,\n Fragment.instantiate(this, fName, null)).commit();\n }\n // GOOD: Fragment instantiated statically\n {\n getFragmentManager().beginTransaction()\n .replace(com.android.internal.R.id.prefs, new MyFragment()).commit();\n }\n } catch (Exception e) {\n }\n }\n\n}\n\n```\nThe next example shows two activities that extend `PreferenceActivity`. The first activity overrides `isValidFragment`, but it wrongly returns `true` unconditionally. The second activity correctly overrides `isValidFragment` so that it only returns `true` when `fragmentName` is a trusted fragment name.\n\n\n```java\nclass UnsafeActivity extends PreferenceActivity {\n\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // BAD: any Fragment name can be provided.\n return true;\n }\n}\n\n\nclass SafeActivity extends PreferenceActivity {\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // Good: only trusted Fragment names are allowed.\n return SafeFragment1.class.getName().equals(fragmentName)\n || SafeFragment2.class.getName().equals(fragmentName)\n || SafeFragment3.class.getName().equals(fragmentName);\n }\n\n}\n\n\n```\n\n## References\n* Google Help: [How to fix Fragment Injection vulnerability](https://support.google.com/faqs/answer/7188427?hl=en).\n* IBM Security Systems: [Android collapses into Fragments](https://securityintelligence.com/wp-content/uploads/2013/12/android-collapses-into-fragments.pdf).\n* Android Developers: [Fragments](https://developer.android.com/guide/fragments)\n* Common Weakness Enumeration: [CWE-470](https://cwe.mitre.org/data/definitions/470.html).\n","markdown":"# Android fragment injection in PreferenceActivity\nWhen fragments are instantiated with externally provided names, this exposes any exported activity that dynamically creates and hosts the fragment to fragment injection. A malicious application could provide the name of an arbitrary fragment, even one not designed to be externally accessible, and inject it into the activity. This can bypass access controls and expose the application to unintended effects.\n\nFragments are reusable parts of an Android application's user interface. Even though a fragment controls its own lifecycle and layout, and handles its input events, it cannot exist on its own: it must be hosted either by an activity or another fragment. This means that, normally, a fragment will be accessible by third-party applications (that is, exported) only if its hosting activity is itself exported.\n\n\n## Recommendation\nIn general, do not instantiate classes (including fragments) with user-provided names unless the name has been properly validated. Also, if an exported activity is extending the `PreferenceActivity` class, make sure that the `isValidFragment` method is overriden and only returns `true` when the provided `fragmentName` points to an intended fragment.\n\n\n## Example\nThe following example shows two cases: in the first one, untrusted data is used to instantiate and add a fragment to an activity, while in the second one, a fragment is safely added with a static name.\n\n\n```java\npublic class MyActivity extends FragmentActivity {\n\n @Override\n protected void onCreate(Bundle savedInstance) {\n try {\n super.onCreate(savedInstance);\n // BAD: Fragment instantiated from user input without validation\n {\n String fName = getIntent().getStringExtra(\"fragmentName\");\n getFragmentManager().beginTransaction().replace(com.android.internal.R.id.prefs,\n Fragment.instantiate(this, fName, null)).commit();\n }\n // GOOD: Fragment instantiated statically\n {\n getFragmentManager().beginTransaction()\n .replace(com.android.internal.R.id.prefs, new MyFragment()).commit();\n }\n } catch (Exception e) {\n }\n }\n\n}\n\n```\nThe next example shows two activities that extend `PreferenceActivity`. The first activity overrides `isValidFragment`, but it wrongly returns `true` unconditionally. The second activity correctly overrides `isValidFragment` so that it only returns `true` when `fragmentName` is a trusted fragment name.\n\n\n```java\nclass UnsafeActivity extends PreferenceActivity {\n\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // BAD: any Fragment name can be provided.\n return true;\n }\n}\n\n\nclass SafeActivity extends PreferenceActivity {\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // Good: only trusted Fragment names are allowed.\n return SafeFragment1.class.getName().equals(fragmentName)\n || SafeFragment2.class.getName().equals(fragmentName)\n || SafeFragment3.class.getName().equals(fragmentName);\n }\n\n}\n\n\n```\n\n## References\n* Google Help: [How to fix Fragment Injection vulnerability](https://support.google.com/faqs/answer/7188427?hl=en).\n* IBM Security Systems: [Android collapses into Fragments](https://securityintelligence.com/wp-content/uploads/2013/12/android-collapses-into-fragments.pdf).\n* Android Developers: [Fragments](https://developer.android.com/guide/fragments)\n* Common Weakness Enumeration: [CWE-470](https://cwe.mitre.org/data/definitions/470.html).\n"},"properties":{"tags":["security","external/cwe/cwe-470","owasp-top10-2021","A03:2021 - Injection"],"description":"An insecure implementation of the 'isValidFragment' method\n of the 'PreferenceActivity' class may allow a malicious application to bypass access controls,\n exposing the application to unintended effects.","id":"java/android/fragment-injection-preference-activity","kind":"problem","name":"Android fragment injection in PreferenceActivity","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/partial-path-traversal-from-remote","name":"java/partial-path-traversal-from-remote","shortDescription":{"text":"Partial path traversal vulnerability from remote"},"fullDescription":{"text":"A prefix used to check that a canonicalised path falls within another must be slash-terminated."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Partial path traversal vulnerability from remote\nA common way to check that a user-supplied path `SUBDIR` falls inside a directory `DIR` is to use `getCanonicalPath()` to remove any path-traversal elements and then check that `DIR` is a prefix. However, if `DIR` is not slash-terminated, this can unexpectedly allow accessing siblings of `DIR`.\n\nSee also `java/partial-path-traversal`, which is similar to this query, but may also flag non-remotely-exploitable instances of partial path traversal vulnerabilities.\n\n\n## Recommendation\nIf the user should only access items within a certain directory `DIR`, ensure that `DIR` is slash-terminated before checking that `DIR` is a prefix of the user-provided path, `SUBDIR`. Note, Java's `getCanonicalPath()` returns a **non**-slash-terminated path string, so a slash must be added to `DIR` if that method is used.\n\n\n## Example\nIn this example, the `if` statement checks if `parent.getCanonicalPath()` is a prefix of `dir.getCanonicalPath()`. However, `parent.getCanonicalPath()` is not slash-terminated. This means that users that supply `dir` may be also allowed to access siblings of `parent` and not just children of `parent`, which is a security issue.\n\n\n```java\npublic class PartialPathTraversalBad {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath())) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\nIn this example, the `if` statement checks if `parent.getCanonicalPath() + File.separator ` is a prefix of `dir.getCanonicalPath()`. Because `parent.getCanonicalPath() + File.separator` is indeed slash-terminated, the user supplying `dir` can only access children of `parent`, as desired.\n\n\n```java\npublic class PartialPathTraversalGood {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath() + File.separator)) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Partial Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* CVE-2022-23457: [ ESAPI Vulnerability Report](https://github.com/ESAPI/esapi-java-legacy/blob/develop/documentation/GHSL-2022-008_The_OWASP_Enterprise_Security_API.md).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n","markdown":"# Partial path traversal vulnerability from remote\nA common way to check that a user-supplied path `SUBDIR` falls inside a directory `DIR` is to use `getCanonicalPath()` to remove any path-traversal elements and then check that `DIR` is a prefix. However, if `DIR` is not slash-terminated, this can unexpectedly allow accessing siblings of `DIR`.\n\nSee also `java/partial-path-traversal`, which is similar to this query, but may also flag non-remotely-exploitable instances of partial path traversal vulnerabilities.\n\n\n## Recommendation\nIf the user should only access items within a certain directory `DIR`, ensure that `DIR` is slash-terminated before checking that `DIR` is a prefix of the user-provided path, `SUBDIR`. Note, Java's `getCanonicalPath()` returns a **non**-slash-terminated path string, so a slash must be added to `DIR` if that method is used.\n\n\n## Example\nIn this example, the `if` statement checks if `parent.getCanonicalPath()` is a prefix of `dir.getCanonicalPath()`. However, `parent.getCanonicalPath()` is not slash-terminated. This means that users that supply `dir` may be also allowed to access siblings of `parent` and not just children of `parent`, which is a security issue.\n\n\n```java\npublic class PartialPathTraversalBad {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath())) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\nIn this example, the `if` statement checks if `parent.getCanonicalPath() + File.separator ` is a prefix of `dir.getCanonicalPath()`. Because `parent.getCanonicalPath() + File.separator` is indeed slash-terminated, the user supplying `dir` can only access children of `parent`, as desired.\n\n\n```java\npublic class PartialPathTraversalGood {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath() + File.separator)) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Partial Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* CVE-2022-23457: [ ESAPI Vulnerability Report](https://github.com/ESAPI/esapi-java-legacy/blob/develop/documentation/GHSL-2022-008_The_OWASP_Enterprise_Security_API.md).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n"},"properties":{"tags":["security","external/cwe/cwe-023"],"description":"A prefix used to check that a canonicalised path falls within another must be slash-terminated.","id":"java/partial-path-traversal-from-remote","kind":"path-problem","name":"Partial path traversal vulnerability from remote","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/tainted-format-string","name":"java/tainted-format-string","shortDescription":{"text":"Use of externally-controlled format string"},"fullDescription":{"text":"Using external input in format strings can lead to exceptions or information leaks."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Use of externally-controlled format string\nThe `String.format` method and related methods, like `PrintStream.printf` and `Formatter.format`, all accept a format string that is used to format the trailing arguments to the format call by providing inline format specifiers. If the format string contains unsanitized input from an untrusted source, then that string may contain extra format specifiers that cause an exception to be thrown or information to be leaked.\n\nThe Java standard library implementation for the format methods throws an exception if either the format specifier does not match the type of the argument, or if there are too few or too many arguments. If unsanitized input is used in the format string, it may contain invalid extra format specifiers which cause an exception to be thrown.\n\nPositional format specifiers may be used to access an argument to the format call by position. Unsanitized input in the format string may use a positional format specifier to access information that was not intended to be visible. For example, when formatting a Calendar instance we may intend to print only the year, but a user-specified format string may include a specifier to access the month and day.\n\n\n## Recommendation\nIf the argument passed as a format string is meant to be a plain string rather than a format string, then pass `%s` as the format string, and pass the original argument as the sole trailing argument.\n\n\n## Example\nThe following program is meant to check a card security code for a stored credit card:\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n Calendar expirationDate = new GregorianCalendar(2017, GregorianCalendar.SEPTEMBER, 1);\n // User provided value\n String cardSecurityCode = request.getParameter(\"cardSecurityCode\");\n \n if (notValid(cardSecurityCode)) {\n \n /*\n * BAD: user provided value is included in the format string.\n * A malicious user could provide an extra format specifier, which causes an\n * exception to be thrown. Or they could provide a %1$tm or %1$te format specifier to\n * access the month or day of the expiration date.\n */\n System.out.format(cardSecurityCode +\n \" is not the right value. Hint: the card expires in %1$ty.\",\n expirationDate);\n \n // GOOD: %s is used to include the user-provided cardSecurityCode in the output\n System.out.format(\"%s is not the right value. Hint: the card expires in %2$ty.\",\n cardSecurityCode,\n expirationDate);\n }\n\n }\n}\n```\nHowever, in the first format call it uses the cardSecurityCode provided by the user in a format string. If the user includes a format specifier in the cardSecurityCode field, they may be able to cause an exception to be thrown, or to be able to access extra information about the stored card expiration date.\n\nThe second format call shows the correct approach. The user-provided value is passed as an argument to the format call. This prevents any format specifiers in the user provided value from being evaluated.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [IDS06-J. Exclude unsanitized user input from format strings](https://wiki.sei.cmu.edu/confluence/display/java/IDS06-J.+Exclude+unsanitized+user+input+from+format+strings).\n* The Java Tutorials: [Formatting Numeric Print Output](https://docs.oracle.com/javase/tutorial/java/data/numberformat.html).\n* Java API Specification: [Formatter](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html).\n* Common Weakness Enumeration: [CWE-134](https://cwe.mitre.org/data/definitions/134.html).\n","markdown":"# Use of externally-controlled format string\nThe `String.format` method and related methods, like `PrintStream.printf` and `Formatter.format`, all accept a format string that is used to format the trailing arguments to the format call by providing inline format specifiers. If the format string contains unsanitized input from an untrusted source, then that string may contain extra format specifiers that cause an exception to be thrown or information to be leaked.\n\nThe Java standard library implementation for the format methods throws an exception if either the format specifier does not match the type of the argument, or if there are too few or too many arguments. If unsanitized input is used in the format string, it may contain invalid extra format specifiers which cause an exception to be thrown.\n\nPositional format specifiers may be used to access an argument to the format call by position. Unsanitized input in the format string may use a positional format specifier to access information that was not intended to be visible. For example, when formatting a Calendar instance we may intend to print only the year, but a user-specified format string may include a specifier to access the month and day.\n\n\n## Recommendation\nIf the argument passed as a format string is meant to be a plain string rather than a format string, then pass `%s` as the format string, and pass the original argument as the sole trailing argument.\n\n\n## Example\nThe following program is meant to check a card security code for a stored credit card:\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n Calendar expirationDate = new GregorianCalendar(2017, GregorianCalendar.SEPTEMBER, 1);\n // User provided value\n String cardSecurityCode = request.getParameter(\"cardSecurityCode\");\n \n if (notValid(cardSecurityCode)) {\n \n /*\n * BAD: user provided value is included in the format string.\n * A malicious user could provide an extra format specifier, which causes an\n * exception to be thrown. Or they could provide a %1$tm or %1$te format specifier to\n * access the month or day of the expiration date.\n */\n System.out.format(cardSecurityCode +\n \" is not the right value. Hint: the card expires in %1$ty.\",\n expirationDate);\n \n // GOOD: %s is used to include the user-provided cardSecurityCode in the output\n System.out.format(\"%s is not the right value. Hint: the card expires in %2$ty.\",\n cardSecurityCode,\n expirationDate);\n }\n\n }\n}\n```\nHowever, in the first format call it uses the cardSecurityCode provided by the user in a format string. If the user includes a format specifier in the cardSecurityCode field, they may be able to cause an exception to be thrown, or to be able to access extra information about the stored card expiration date.\n\nThe second format call shows the correct approach. The user-provided value is passed as an argument to the format call. This prevents any format specifiers in the user provided value from being evaluated.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [IDS06-J. Exclude unsanitized user input from format strings](https://wiki.sei.cmu.edu/confluence/display/java/IDS06-J.+Exclude+unsanitized+user+input+from+format+strings).\n* The Java Tutorials: [Formatting Numeric Print Output](https://docs.oracle.com/javase/tutorial/java/data/numberformat.html).\n* Java API Specification: [Formatter](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html).\n* Common Weakness Enumeration: [CWE-134](https://cwe.mitre.org/data/definitions/134.html).\n"},"properties":{"tags":["security","external/cwe/cwe-134"],"description":"Using external input in format strings can lead to exceptions or information leaks.","id":"java/tainted-format-string","kind":"path-problem","name":"Use of externally-controlled format string","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/xml/xpath-injection","name":"java/xml/xpath-injection","shortDescription":{"text":"XPath injection"},"fullDescription":{"text":"Building an XPath expression from user-controlled sources is vulnerable to insertion of malicious code by the user."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# XPath injection\nIf an XPath expression is built using string concatenation, and the components of the concatenation include user input, it makes it very easy for a user to create a malicious XPath expression.\n\n\n## Recommendation\nIf user input must be included in an XPath expression, either sanitize the data or pre-compile the query and use variable references to include the user input.\n\nXPath injection can also be prevented by using XQuery.\n\n\n## Example\nIn the first three examples, the code accepts a name and password specified by the user, and uses this unvalidated and unsanitized value in an XPath expression. This is vulnerable to the user providing special characters or string sequences that change the meaning of the XPath expression to search for different values.\n\nIn the fourth example, the code uses `setXPathVariableResolver` which prevents XPath injection.\n\nThe final two examples are for dom4j. They show an example of XPath injection and one method of preventing it.\n\n\n```java\nfinal String xmlStr = \"\" + \n \" \" + \n \" \" + \n \"\";\ntry {\n DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();\n domFactory.setNamespaceAware(true);\n DocumentBuilder builder = domFactory.newDocumentBuilder();\n //Document doc = builder.parse(\"user.xml\");\n Document doc = builder.parse(new InputSource(new StringReader(xmlStr)));\n\n XPathFactory factory = XPathFactory.newInstance();\n XPath xpath = factory.newXPath();\n\n // Injectable data\n String user = request.getParameter(\"user\");\n String pass = request.getParameter(\"pass\");\n if (user != null && pass != null) {\n boolean isExist = false;\n\n // Bad expression\n String expression1 = \"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\";\n isExist = (boolean)xpath.evaluate(expression1, doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Bad expression\n XPathExpression expression2 = xpath.compile(\"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\");\n isExist = (boolean)expression2.evaluate(doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Bad expression\n StringBuffer sb = new StringBuffer(\"/users/user[@name=\");\n sb.append(user);\n sb.append(\"' and @pass='\");\n sb.append(pass);\n sb.append(\"']\");\n String query = sb.toString();\n XPathExpression expression3 = xpath.compile(query);\n isExist = (boolean)expression3.evaluate(doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Good expression\n String expression4 = \"/users/user[@name=$user and @pass=$pass]\";\n xpath.setXPathVariableResolver(v -> {\n switch (v.getLocalPart()) {\n case \"user\":\n return user;\n case \"pass\":\n return pass;\n default:\n throw new IllegalArgumentException();\n }\n });\n isExist = (boolean)xpath.evaluate(expression4, doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n\n // Bad Dom4j \n org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader();\n org.dom4j.Document document = reader.read(new InputSource(new StringReader(xmlStr)));\n isExist = document.selectSingleNode(\"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\") != null;\n // or document.selectNodes\n System.out.println(isExist);\n\n // Good Dom4j\n org.jaxen.SimpleVariableContext svc = new org.jaxen.SimpleVariableContext();\n svc.setVariableValue(\"user\", user);\n svc.setVariableValue(\"pass\", pass);\n String xpathString = \"/users/user[@name=$user and @pass=$pass]\";\n org.dom4j.XPath safeXPath = document.createXPath(xpathString);\n safeXPath.setVariableContext(svc);\n isExist = safeXPath.selectSingleNode(document) != null;\n System.out.println(isExist);\n }\n} catch (ParserConfigurationException e) {\n\n} catch (SAXException e) {\n\n} catch (XPathExpressionException e) {\n\n} catch (org.dom4j.DocumentException e) {\n\n}\n```\n\n## References\n* OWASP: [Testing for XPath Injection](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/09-Testing_for_XPath_Injection).\n* OWASP: [XPath Injection](https://owasp.org/www-community/attacks/XPATH_Injection).\n* Common Weakness Enumeration: [CWE-643](https://cwe.mitre.org/data/definitions/643.html).\n","markdown":"# XPath injection\nIf an XPath expression is built using string concatenation, and the components of the concatenation include user input, it makes it very easy for a user to create a malicious XPath expression.\n\n\n## Recommendation\nIf user input must be included in an XPath expression, either sanitize the data or pre-compile the query and use variable references to include the user input.\n\nXPath injection can also be prevented by using XQuery.\n\n\n## Example\nIn the first three examples, the code accepts a name and password specified by the user, and uses this unvalidated and unsanitized value in an XPath expression. This is vulnerable to the user providing special characters or string sequences that change the meaning of the XPath expression to search for different values.\n\nIn the fourth example, the code uses `setXPathVariableResolver` which prevents XPath injection.\n\nThe final two examples are for dom4j. They show an example of XPath injection and one method of preventing it.\n\n\n```java\nfinal String xmlStr = \"\" + \n \" \" + \n \" \" + \n \"\";\ntry {\n DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();\n domFactory.setNamespaceAware(true);\n DocumentBuilder builder = domFactory.newDocumentBuilder();\n //Document doc = builder.parse(\"user.xml\");\n Document doc = builder.parse(new InputSource(new StringReader(xmlStr)));\n\n XPathFactory factory = XPathFactory.newInstance();\n XPath xpath = factory.newXPath();\n\n // Injectable data\n String user = request.getParameter(\"user\");\n String pass = request.getParameter(\"pass\");\n if (user != null && pass != null) {\n boolean isExist = false;\n\n // Bad expression\n String expression1 = \"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\";\n isExist = (boolean)xpath.evaluate(expression1, doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Bad expression\n XPathExpression expression2 = xpath.compile(\"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\");\n isExist = (boolean)expression2.evaluate(doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Bad expression\n StringBuffer sb = new StringBuffer(\"/users/user[@name=\");\n sb.append(user);\n sb.append(\"' and @pass='\");\n sb.append(pass);\n sb.append(\"']\");\n String query = sb.toString();\n XPathExpression expression3 = xpath.compile(query);\n isExist = (boolean)expression3.evaluate(doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Good expression\n String expression4 = \"/users/user[@name=$user and @pass=$pass]\";\n xpath.setXPathVariableResolver(v -> {\n switch (v.getLocalPart()) {\n case \"user\":\n return user;\n case \"pass\":\n return pass;\n default:\n throw new IllegalArgumentException();\n }\n });\n isExist = (boolean)xpath.evaluate(expression4, doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n\n // Bad Dom4j \n org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader();\n org.dom4j.Document document = reader.read(new InputSource(new StringReader(xmlStr)));\n isExist = document.selectSingleNode(\"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\") != null;\n // or document.selectNodes\n System.out.println(isExist);\n\n // Good Dom4j\n org.jaxen.SimpleVariableContext svc = new org.jaxen.SimpleVariableContext();\n svc.setVariableValue(\"user\", user);\n svc.setVariableValue(\"pass\", pass);\n String xpathString = \"/users/user[@name=$user and @pass=$pass]\";\n org.dom4j.XPath safeXPath = document.createXPath(xpathString);\n safeXPath.setVariableContext(svc);\n isExist = safeXPath.selectSingleNode(document) != null;\n System.out.println(isExist);\n }\n} catch (ParserConfigurationException e) {\n\n} catch (SAXException e) {\n\n} catch (XPathExpressionException e) {\n\n} catch (org.dom4j.DocumentException e) {\n\n}\n```\n\n## References\n* OWASP: [Testing for XPath Injection](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/09-Testing_for_XPath_Injection).\n* OWASP: [XPath Injection](https://owasp.org/www-community/attacks/XPATH_Injection).\n* Common Weakness Enumeration: [CWE-643](https://cwe.mitre.org/data/definitions/643.html).\n"},"properties":{"tags":["security","external/cwe/cwe-643","owasp-top10-2021","A03:2021 - Injection"],"description":"Building an XPath expression from user-controlled sources is vulnerable to insertion of\n malicious code by the user.","id":"java/xml/xpath-injection","kind":"path-problem","name":"XPath injection","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/improper-intent-verification","name":"java/improper-intent-verification","shortDescription":{"text":"Improper verification of intent by broadcast receiver"},"fullDescription":{"text":"A broadcast receiver that does not verify intents it receives may be susceptible to unintended behavior by third party applications sending it explicit intents."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Improper verification of intent by broadcast receiver\nWhen an Android application uses a `BroadcastReceiver` to receive intents, it is also able to receive explicit intents that are sent directly to it, regardless of its filter. Certain intent actions are only able to be sent by the operating system, not third-party applications. However, a `BroadcastReceiver` that is registered to receive system intents is still able to receive intents from a third-party application, so it should check that the intent received has the expected action. Otherwise, a third-party application could impersonate the system this way to cause unintended behavior, such as a denial of service.\n\n\n## Example\nIn the following code, the `ShutdownReceiver` initiates a shutdown procedure upon receiving an intent, without checking that the received action is indeed `ACTION_SHUTDOWN`. This allows third-party applications to send explicit intents to this receiver to cause a denial of service.\n\n\n```java\npublic class ShutdownReceiver extends BroadcastReceiver {\n @Override\n public void onReceive(final Context context, final Intent intent) {\n mainActivity.saveLocalData();\n mainActivity.stopActivity();\n }\n}\n```\n\n```xml\n\n \n \n \n \n \n \n \n\n```\n\n## Recommendation\nIn the `onReceive` method of a `BroadcastReceiver`, the action of the received Intent should be checked. The following code demonstrates this.\n\n\n```java\npublic class ShutdownReceiver extends BroadcastReceiver {\n @Override\n public void onReceive(final Context context, final Intent intent) {\n if (!intent.getAction().equals(Intent.ACTION_SHUTDOWN)) {\n return;\n }\n mainActivity.saveLocalData();\n mainActivity.stopActivity();\n }\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-925](https://cwe.mitre.org/data/definitions/925.html).\n","markdown":"# Improper verification of intent by broadcast receiver\nWhen an Android application uses a `BroadcastReceiver` to receive intents, it is also able to receive explicit intents that are sent directly to it, regardless of its filter. Certain intent actions are only able to be sent by the operating system, not third-party applications. However, a `BroadcastReceiver` that is registered to receive system intents is still able to receive intents from a third-party application, so it should check that the intent received has the expected action. Otherwise, a third-party application could impersonate the system this way to cause unintended behavior, such as a denial of service.\n\n\n## Example\nIn the following code, the `ShutdownReceiver` initiates a shutdown procedure upon receiving an intent, without checking that the received action is indeed `ACTION_SHUTDOWN`. This allows third-party applications to send explicit intents to this receiver to cause a denial of service.\n\n\n```java\npublic class ShutdownReceiver extends BroadcastReceiver {\n @Override\n public void onReceive(final Context context, final Intent intent) {\n mainActivity.saveLocalData();\n mainActivity.stopActivity();\n }\n}\n```\n\n```xml\n\n \n \n \n \n \n \n \n\n```\n\n## Recommendation\nIn the `onReceive` method of a `BroadcastReceiver`, the action of the received Intent should be checked. The following code demonstrates this.\n\n\n```java\npublic class ShutdownReceiver extends BroadcastReceiver {\n @Override\n public void onReceive(final Context context, final Intent intent) {\n if (!intent.getAction().equals(Intent.ACTION_SHUTDOWN)) {\n return;\n }\n mainActivity.saveLocalData();\n mainActivity.stopActivity();\n }\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-925](https://cwe.mitre.org/data/definitions/925.html).\n"},"properties":{"tags":["security","external/cwe/cwe-925"],"description":"A broadcast receiver that does not verify intents it receives may be susceptible to unintended behavior by third party applications sending it explicit intents.","id":"java/improper-intent-verification","kind":"problem","name":"Improper verification of intent by broadcast receiver","precision":"high","problem.severity":"warning","security-severity":"8.2"}},{"id":"java/unsafe-hostname-verification","name":"java/unsafe-hostname-verification","shortDescription":{"text":"Unsafe hostname verification"},"fullDescription":{"text":"Marking a certificate as valid for a host without checking the certificate hostname allows an attacker to perform a machine-in-the-middle attack."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Unsafe hostname verification\nIf a `HostnameVerifier` always returns `true` it will not verify the hostname at all. This stops Transport Layer Security (TLS) providing any security and allows an attacker to perform a man-in-the-middle attack against the application.\n\nAn attack might look like this:\n\n1. The program connects to `https://example.com`.\n1. The attacker intercepts this connection and presents an apparently-valid certificate of their choosing.\n1. The `TrustManager` of the program verifies that the certificate has been issued by a trusted certificate authority.\n1. The Java HTTPS library checks whether the certificate has been issued for the host `example.com`. This check fails because the certificate has been issued for a domain controlled by the attacker, for example: `malicious.domain`.\n1. The HTTPS library wants to reject the certificate because the hostname does not match. Before doing this it checks whether a `HostnameVerifier` exists.\n1. Your `HostnameVerifier` is called which returns `true` for any certificate so also for this one.\n1. The program proceeds with the connection since your `HostnameVerifier` accepted it.\n1. The attacker can now read the data your program sends to `https://example.com` and/or alter its replies while the program thinks the connection is secure.\n\n## Recommendation\nDo not use an open `HostnameVerifier`. If you have a configuration problem with TLS/HTTPS, you should always solve the configuration problem instead of using an open verifier.\n\n\n## Example\nIn the first (bad) example, the `HostnameVerifier` always returns `true`. This allows an attacker to perform a man-in-the-middle attack, because any certificate is accepted despite an incorrect hostname. In the second (good) example, the `HostnameVerifier` only returns `true` when the certificate has been correctly checked.\n\n\n```java\npublic static void main(String[] args) {\n\n\t{\n\t\tHostnameVerifier verifier = new HostnameVerifier() {\n\t\t\t@Override\n\t\t\tpublic boolean verify(String hostname, SSLSession session) {\n\t\t\t\treturn true; // BAD: accept even if the hostname doesn't match\n\t\t\t}\n\t\t};\n\t\tHttpsURLConnection.setDefaultHostnameVerifier(verifier);\n\t}\n\n\t{\n\t\tHostnameVerifier verifier = new HostnameVerifier() {\n\t\t\t@Override\n\t\t\tpublic boolean verify(String hostname, SSLSession session) {\n\t\t\t\ttry { // GOOD: verify the certificate\n\t\t\t\t\tCertificate[] certs = session.getPeerCertificates();\n\t\t\t\t\tX509Certificate x509 = (X509Certificate) certs[0];\n\t\t\t\t\tcheck(new String[]{host}, x509);\n\t\t\t\t\treturn true;\n\t\t\t\t} catch (SSLException e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tHttpsURLConnection.setDefaultHostnameVerifier(verifier);\n\t}\n\n}\n```\n\n## References\n* Android developers: [Security with HTTPS and SSL](https://developer.android.com/training/articles/security-ssl).\n* Terse systems blog: [Fixing Hostname Verification](https://tersesystems.com/blog/2014/03/23/fixing-hostname-verification/).\n* Common Weakness Enumeration: [CWE-297](https://cwe.mitre.org/data/definitions/297.html).\n","markdown":"# Unsafe hostname verification\nIf a `HostnameVerifier` always returns `true` it will not verify the hostname at all. This stops Transport Layer Security (TLS) providing any security and allows an attacker to perform a man-in-the-middle attack against the application.\n\nAn attack might look like this:\n\n1. The program connects to `https://example.com`.\n1. The attacker intercepts this connection and presents an apparently-valid certificate of their choosing.\n1. The `TrustManager` of the program verifies that the certificate has been issued by a trusted certificate authority.\n1. The Java HTTPS library checks whether the certificate has been issued for the host `example.com`. This check fails because the certificate has been issued for a domain controlled by the attacker, for example: `malicious.domain`.\n1. The HTTPS library wants to reject the certificate because the hostname does not match. Before doing this it checks whether a `HostnameVerifier` exists.\n1. Your `HostnameVerifier` is called which returns `true` for any certificate so also for this one.\n1. The program proceeds with the connection since your `HostnameVerifier` accepted it.\n1. The attacker can now read the data your program sends to `https://example.com` and/or alter its replies while the program thinks the connection is secure.\n\n## Recommendation\nDo not use an open `HostnameVerifier`. If you have a configuration problem with TLS/HTTPS, you should always solve the configuration problem instead of using an open verifier.\n\n\n## Example\nIn the first (bad) example, the `HostnameVerifier` always returns `true`. This allows an attacker to perform a man-in-the-middle attack, because any certificate is accepted despite an incorrect hostname. In the second (good) example, the `HostnameVerifier` only returns `true` when the certificate has been correctly checked.\n\n\n```java\npublic static void main(String[] args) {\n\n\t{\n\t\tHostnameVerifier verifier = new HostnameVerifier() {\n\t\t\t@Override\n\t\t\tpublic boolean verify(String hostname, SSLSession session) {\n\t\t\t\treturn true; // BAD: accept even if the hostname doesn't match\n\t\t\t}\n\t\t};\n\t\tHttpsURLConnection.setDefaultHostnameVerifier(verifier);\n\t}\n\n\t{\n\t\tHostnameVerifier verifier = new HostnameVerifier() {\n\t\t\t@Override\n\t\t\tpublic boolean verify(String hostname, SSLSession session) {\n\t\t\t\ttry { // GOOD: verify the certificate\n\t\t\t\t\tCertificate[] certs = session.getPeerCertificates();\n\t\t\t\t\tX509Certificate x509 = (X509Certificate) certs[0];\n\t\t\t\t\tcheck(new String[]{host}, x509);\n\t\t\t\t\treturn true;\n\t\t\t\t} catch (SSLException e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tHttpsURLConnection.setDefaultHostnameVerifier(verifier);\n\t}\n\n}\n```\n\n## References\n* Android developers: [Security with HTTPS and SSL](https://developer.android.com/training/articles/security-ssl).\n* Terse systems blog: [Fixing Hostname Verification](https://tersesystems.com/blog/2014/03/23/fixing-hostname-verification/).\n* Common Weakness Enumeration: [CWE-297](https://cwe.mitre.org/data/definitions/297.html).\n"},"properties":{"tags":["security","external/cwe/cwe-297","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Marking a certificate as valid for a host without checking the certificate hostname allows an attacker to perform a machine-in-the-middle attack.","id":"java/unsafe-hostname-verification","kind":"path-problem","name":"Unsafe hostname verification","precision":"high","problem.severity":"error","security-severity":"5.9"}},{"id":"java/xxe","name":"java/xxe","shortDescription":{"text":"Resolving XML external entity in user-controlled data"},"fullDescription":{"text":"Parsing user-controlled XML documents and allowing expansion of external entity references may lead to disclosure of confidential data or denial of service."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Resolving XML external entity in user-controlled data\nParsing untrusted XML files with a weakly configured XML parser may lead to an XML External Entity (XXE) attack. This type of attack uses external entity references to access arbitrary files on a system, carry out denial of service, or server side request forgery. Even when the result of parsing is not returned to the user, out-of-band data retrieval techniques may allow attackers to steal sensitive data. Denial of services can also be carried out in this situation.\n\nThere are many XML parsers for Java, and most of them are vulnerable to XXE because their default settings enable parsing of external entities. This query currently identifies vulnerable XML parsing from the following parsers: `javax.xml.parsers.DocumentBuilder`, `javax.xml.stream.XMLStreamReader`, `org.jdom.input.SAXBuilder`/`org.jdom2.input.SAXBuilder`, `javax.xml.parsers.SAXParser`,`org.dom4j.io.SAXReader`, `org.xml.sax.XMLReader`, `javax.xml.transform.sax.SAXSource`, `javax.xml.transform.TransformerFactory`, `javax.xml.transform.sax.SAXTransformerFactory`, `javax.xml.validation.SchemaFactory`, `javax.xml.bind.Unmarshaller` and `javax.xml.xpath.XPathExpression`.\n\n\n## Recommendation\nThe best way to prevent XXE attacks is to disable the parsing of any Document Type Declarations (DTDs) in untrusted data. If this is not possible you should disable the parsing of external general entities and external parameter entities. This improves security but the code will still be at risk of denial of service and server side request forgery attacks. Protection against denial of service attacks may also be implemented by setting entity expansion limits, which is done by default in recent JDK and JRE implementations. Because there are many different ways to disable external entity retrieval with varying support between different providers, in this query we choose to specifically check for the [OWASP recommended way](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java) to disable external entity retrieval for a particular parser. There may be other ways of making a particular parser safe which deviate from these guidelines, in which case this query will continue to flag the parser as potentially dangerous.\n\n\n## Example\nThe following example calls `parse` on a `DocumentBuilder` that is not safely configured on untrusted data, and is therefore inherently unsafe.\n\n\n```java\npublic void parse(Socket sock) throws Exception {\n DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n DocumentBuilder builder = factory.newDocumentBuilder();\n builder.parse(sock.getInputStream()); //unsafe\n}\n\n```\nIn this example, the `DocumentBuilder` is created with DTD disabled, securing it against XXE attack.\n\n\n```java\npublic void disableDTDParse(Socket sock) throws Exception {\n DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n factory.setFeature(\"http://apache.org/xml/features/disallow-doctype-decl\", true);\n DocumentBuilder builder = factory.newDocumentBuilder();\n builder.parse(sock.getInputStream()); //safe\n}\n\n```\n\n## References\n* OWASP vulnerability description: [XML External Entity (XXE) Processing](https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing).\n* OWASP guidance on parsing xml files: [XXE Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java).\n* Paper by Timothy Morgen: [XML Schema, DTD, and Entity Attacks](https://research.nccgroup.com/2014/05/19/xml-schema-dtd-and-entity-attacks-a-compendium-of-known-techniques/)\n* Out-of-band data retrieval: Timur Yunusov & Alexey Osipov, Black hat EU 2013: [XML Out-Of-Band Data Retrieval](https://www.slideshare.net/qqlan/bh-ready-v4).\n* Denial of service attack (Billion laughs): [Billion Laughs.](https://en.wikipedia.org/wiki/Billion_laughs)\n* The Java Tutorials: [Processing Limit Definitions.](https://docs.oracle.com/javase/tutorial/jaxp/limits/limits.html)\n* Common Weakness Enumeration: [CWE-611](https://cwe.mitre.org/data/definitions/611.html).\n* Common Weakness Enumeration: [CWE-776](https://cwe.mitre.org/data/definitions/776.html).\n* Common Weakness Enumeration: [CWE-827](https://cwe.mitre.org/data/definitions/827.html).\n","markdown":"# Resolving XML external entity in user-controlled data\nParsing untrusted XML files with a weakly configured XML parser may lead to an XML External Entity (XXE) attack. This type of attack uses external entity references to access arbitrary files on a system, carry out denial of service, or server side request forgery. Even when the result of parsing is not returned to the user, out-of-band data retrieval techniques may allow attackers to steal sensitive data. Denial of services can also be carried out in this situation.\n\nThere are many XML parsers for Java, and most of them are vulnerable to XXE because their default settings enable parsing of external entities. This query currently identifies vulnerable XML parsing from the following parsers: `javax.xml.parsers.DocumentBuilder`, `javax.xml.stream.XMLStreamReader`, `org.jdom.input.SAXBuilder`/`org.jdom2.input.SAXBuilder`, `javax.xml.parsers.SAXParser`,`org.dom4j.io.SAXReader`, `org.xml.sax.XMLReader`, `javax.xml.transform.sax.SAXSource`, `javax.xml.transform.TransformerFactory`, `javax.xml.transform.sax.SAXTransformerFactory`, `javax.xml.validation.SchemaFactory`, `javax.xml.bind.Unmarshaller` and `javax.xml.xpath.XPathExpression`.\n\n\n## Recommendation\nThe best way to prevent XXE attacks is to disable the parsing of any Document Type Declarations (DTDs) in untrusted data. If this is not possible you should disable the parsing of external general entities and external parameter entities. This improves security but the code will still be at risk of denial of service and server side request forgery attacks. Protection against denial of service attacks may also be implemented by setting entity expansion limits, which is done by default in recent JDK and JRE implementations. Because there are many different ways to disable external entity retrieval with varying support between different providers, in this query we choose to specifically check for the [OWASP recommended way](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java) to disable external entity retrieval for a particular parser. There may be other ways of making a particular parser safe which deviate from these guidelines, in which case this query will continue to flag the parser as potentially dangerous.\n\n\n## Example\nThe following example calls `parse` on a `DocumentBuilder` that is not safely configured on untrusted data, and is therefore inherently unsafe.\n\n\n```java\npublic void parse(Socket sock) throws Exception {\n DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n DocumentBuilder builder = factory.newDocumentBuilder();\n builder.parse(sock.getInputStream()); //unsafe\n}\n\n```\nIn this example, the `DocumentBuilder` is created with DTD disabled, securing it against XXE attack.\n\n\n```java\npublic void disableDTDParse(Socket sock) throws Exception {\n DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n factory.setFeature(\"http://apache.org/xml/features/disallow-doctype-decl\", true);\n DocumentBuilder builder = factory.newDocumentBuilder();\n builder.parse(sock.getInputStream()); //safe\n}\n\n```\n\n## References\n* OWASP vulnerability description: [XML External Entity (XXE) Processing](https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing).\n* OWASP guidance on parsing xml files: [XXE Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java).\n* Paper by Timothy Morgen: [XML Schema, DTD, and Entity Attacks](https://research.nccgroup.com/2014/05/19/xml-schema-dtd-and-entity-attacks-a-compendium-of-known-techniques/)\n* Out-of-band data retrieval: Timur Yunusov & Alexey Osipov, Black hat EU 2013: [XML Out-Of-Band Data Retrieval](https://www.slideshare.net/qqlan/bh-ready-v4).\n* Denial of service attack (Billion laughs): [Billion Laughs.](https://en.wikipedia.org/wiki/Billion_laughs)\n* The Java Tutorials: [Processing Limit Definitions.](https://docs.oracle.com/javase/tutorial/jaxp/limits/limits.html)\n* Common Weakness Enumeration: [CWE-611](https://cwe.mitre.org/data/definitions/611.html).\n* Common Weakness Enumeration: [CWE-776](https://cwe.mitre.org/data/definitions/776.html).\n* Common Weakness Enumeration: [CWE-827](https://cwe.mitre.org/data/definitions/827.html).\n"},"properties":{"tags":["security","external/cwe/cwe-611","external/cwe/cwe-776","external/cwe/cwe-827","owasp-top10-2021","A05:2021 - Security Misconfiguration"],"description":"Parsing user-controlled XML documents and allowing expansion of external entity\n references may lead to disclosure of confidential data or denial of service.","id":"java/xxe","kind":"path-problem","name":"Resolving XML external entity in user-controlled data","precision":"high","problem.severity":"error","security-severity":"9.1"}},{"id":"java/unvalidated-url-redirection","name":"java/unvalidated-url-redirection","shortDescription":{"text":"URL redirection from remote source"},"fullDescription":{"text":"URL redirection based on unvalidated user-input may cause redirection to malicious web sites."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# URL redirection from remote source\nDirectly incorporating user input into a URL redirect request without validating the input can facilitate phishing attacks. In these attacks, unsuspecting users can be redirected to a malicious site that looks very similar to the real site they intend to visit, but which is controlled by the attacker.\n\n\n## Recommendation\nTo guard against untrusted URL redirection, it is advisable to avoid putting user input directly into a redirect URL. Instead, maintain a list of authorized redirects on the server; then choose from that list based on the user input provided.\n\n\n## Example\nThe following example shows an HTTP request parameter being used directly in a URL redirect without validating the input, which facilitates phishing attacks. It also shows how to remedy the problem by validating the user input against a known fixed string.\n\n\n```java\npublic class UrlRedirect extends HttpServlet {\n\tprivate static final String VALID_REDIRECT = \"http://cwe.mitre.org/data/definitions/601.html\";\n\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: a request parameter is incorporated without validation into a URL redirect\n\t\tresponse.sendRedirect(request.getParameter(\"target\"));\n\n\t\t// GOOD: the request parameter is validated against a known fixed string\n\t\tif (VALID_REDIRECT.equals(request.getParameter(\"target\"))) {\n\t\t\tresponse.sendRedirect(VALID_REDIRECT);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* Common Weakness Enumeration: [CWE-601](https://cwe.mitre.org/data/definitions/601.html).\n","markdown":"# URL redirection from remote source\nDirectly incorporating user input into a URL redirect request without validating the input can facilitate phishing attacks. In these attacks, unsuspecting users can be redirected to a malicious site that looks very similar to the real site they intend to visit, but which is controlled by the attacker.\n\n\n## Recommendation\nTo guard against untrusted URL redirection, it is advisable to avoid putting user input directly into a redirect URL. Instead, maintain a list of authorized redirects on the server; then choose from that list based on the user input provided.\n\n\n## Example\nThe following example shows an HTTP request parameter being used directly in a URL redirect without validating the input, which facilitates phishing attacks. It also shows how to remedy the problem by validating the user input against a known fixed string.\n\n\n```java\npublic class UrlRedirect extends HttpServlet {\n\tprivate static final String VALID_REDIRECT = \"http://cwe.mitre.org/data/definitions/601.html\";\n\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: a request parameter is incorporated without validation into a URL redirect\n\t\tresponse.sendRedirect(request.getParameter(\"target\"));\n\n\t\t// GOOD: the request parameter is validated against a known fixed string\n\t\tif (VALID_REDIRECT.equals(request.getParameter(\"target\"))) {\n\t\t\tresponse.sendRedirect(VALID_REDIRECT);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* Common Weakness Enumeration: [CWE-601](https://cwe.mitre.org/data/definitions/601.html).\n"},"properties":{"tags":["security","external/cwe/cwe-601","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"URL redirection based on unvalidated user-input\n may cause redirection to malicious web sites.","id":"java/unvalidated-url-redirection","kind":"path-problem","name":"URL redirection from remote source","precision":"high","problem.severity":"error","security-severity":"6.1"}},{"id":"java/command-line-injection","name":"java/command-line-injection","shortDescription":{"text":"Uncontrolled command line"},"fullDescription":{"text":"Using externally controlled strings in a command line is vulnerable to malicious changes in the strings."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Uncontrolled command line\nCode that passes user input directly to `Runtime.exec`, or some other library routine that executes a command, allows the user to execute malicious code.\n\n\n## Recommendation\nIf possible, use hard-coded string literals to specify the command to run or library to load. Instead of passing the user input directly to the process or library function, examine the user input and then choose among hard-coded string literals.\n\nIf the applicable libraries or commands cannot be determined at compile time, then add code to verify that the user input string is safe before using it.\n\n\n## Example\nThe following example shows code that takes a shell script that can be changed maliciously by a user, and passes it straight to `Runtime.exec` without examining it first.\n\n\n```java\nclass Test {\n public static void main(String[] args) {\n String script = System.getenv(\"SCRIPTNAME\");\n if (script != null) {\n // BAD: The script to be executed is controlled by the user.\n Runtime.getRuntime().exec(script);\n }\n }\n}\n```\n\n## References\n* OWASP: [Command Injection](https://www.owasp.org/index.php/Command_Injection).\n* SEI CERT Oracle Coding Standard for Java: [IDS07-J. Sanitize untrusted data passed to the Runtime.exec() method](https://wiki.sei.cmu.edu/confluence/display/java/IDS07-J.+Sanitize+untrusted+data+passed+to+the+Runtime.exec()+method).\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n","markdown":"# Uncontrolled command line\nCode that passes user input directly to `Runtime.exec`, or some other library routine that executes a command, allows the user to execute malicious code.\n\n\n## Recommendation\nIf possible, use hard-coded string literals to specify the command to run or library to load. Instead of passing the user input directly to the process or library function, examine the user input and then choose among hard-coded string literals.\n\nIf the applicable libraries or commands cannot be determined at compile time, then add code to verify that the user input string is safe before using it.\n\n\n## Example\nThe following example shows code that takes a shell script that can be changed maliciously by a user, and passes it straight to `Runtime.exec` without examining it first.\n\n\n```java\nclass Test {\n public static void main(String[] args) {\n String script = System.getenv(\"SCRIPTNAME\");\n if (script != null) {\n // BAD: The script to be executed is controlled by the user.\n Runtime.getRuntime().exec(script);\n }\n }\n}\n```\n\n## References\n* OWASP: [Command Injection](https://www.owasp.org/index.php/Command_Injection).\n* SEI CERT Oracle Coding Standard for Java: [IDS07-J. Sanitize untrusted data passed to the Runtime.exec() method](https://wiki.sei.cmu.edu/confluence/display/java/IDS07-J.+Sanitize+untrusted+data+passed+to+the+Runtime.exec()+method).\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n"},"properties":{"tags":["security","external/cwe/cwe-078","external/cwe/cwe-088"],"description":"Using externally controlled strings in a command line is vulnerable to malicious\n changes in the strings.","id":"java/command-line-injection","kind":"path-problem","name":"Uncontrolled command line","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/concatenated-command-line","name":"java/concatenated-command-line","shortDescription":{"text":"Building a command line with string concatenation"},"fullDescription":{"text":"Using concatenated strings in a command line is vulnerable to malicious insertion of special characters in the strings."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Building a command line with string concatenation\nCode that builds a command line by concatenating strings that have been entered by a user allows the user to execute malicious code.\n\n\n## Recommendation\nExecute external commands using an array of strings rather than a single string. By using an array, many possible vulnerabilities in the formatting of the string are avoided.\n\n\n## Example\nIn the following example, `latlonCoords` contains a string that has been entered by a user but not validated by the program. This allows the user to, for example, append an ampersand (&) followed by the command for a malicious program to the end of the string. The ampersand instructs Windows to execute another program. In the block marked 'BAD', `latlonCoords` is passed to `exec` as part of a concatenated string, which allows more than one command to be executed. However, in the block marked 'GOOD', `latlonCoords` is passed as part of an array, which means that `exec` treats it only as an argument.\n\n\n```java\nclass Test {\n public static void main(String[] args) {\n // BAD: user input might include special characters such as ampersands\n {\n String latlonCoords = args[1];\n Runtime rt = Runtime.getRuntime();\n Process exec = rt.exec(\"cmd.exe /C latlon2utm.exe \" + latlonCoords);\n }\n\n // GOOD: use an array of arguments instead of executing a string\n {\n String latlonCoords = args[1];\n Runtime rt = Runtime.getRuntime();\n Process exec = rt.exec(new String[] {\n \"c:\\\\path\\to\\latlon2utm.exe\",\n latlonCoords });\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Command Injection](https://www.owasp.org/index.php/Command_Injection).\n* SEI CERT Oracle Coding Standard for Java: [IDS07-J. Sanitize untrusted data passed to the Runtime.exec() method](https://wiki.sei.cmu.edu/confluence/display/java/IDS07-J.+Sanitize+untrusted+data+passed+to+the+Runtime.exec()+method).\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n","markdown":"# Building a command line with string concatenation\nCode that builds a command line by concatenating strings that have been entered by a user allows the user to execute malicious code.\n\n\n## Recommendation\nExecute external commands using an array of strings rather than a single string. By using an array, many possible vulnerabilities in the formatting of the string are avoided.\n\n\n## Example\nIn the following example, `latlonCoords` contains a string that has been entered by a user but not validated by the program. This allows the user to, for example, append an ampersand (&) followed by the command for a malicious program to the end of the string. The ampersand instructs Windows to execute another program. In the block marked 'BAD', `latlonCoords` is passed to `exec` as part of a concatenated string, which allows more than one command to be executed. However, in the block marked 'GOOD', `latlonCoords` is passed as part of an array, which means that `exec` treats it only as an argument.\n\n\n```java\nclass Test {\n public static void main(String[] args) {\n // BAD: user input might include special characters such as ampersands\n {\n String latlonCoords = args[1];\n Runtime rt = Runtime.getRuntime();\n Process exec = rt.exec(\"cmd.exe /C latlon2utm.exe \" + latlonCoords);\n }\n\n // GOOD: use an array of arguments instead of executing a string\n {\n String latlonCoords = args[1];\n Runtime rt = Runtime.getRuntime();\n Process exec = rt.exec(new String[] {\n \"c:\\\\path\\to\\latlon2utm.exe\",\n latlonCoords });\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Command Injection](https://www.owasp.org/index.php/Command_Injection).\n* SEI CERT Oracle Coding Standard for Java: [IDS07-J. Sanitize untrusted data passed to the Runtime.exec() method](https://wiki.sei.cmu.edu/confluence/display/java/IDS07-J.+Sanitize+untrusted+data+passed+to+the+Runtime.exec()+method).\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n"},"properties":{"tags":["security","external/cwe/cwe-078","external/cwe/cwe-088"],"description":"Using concatenated strings in a command line is vulnerable to malicious\n insertion of special characters in the strings.","id":"java/concatenated-command-line","kind":"problem","name":"Building a command line with string concatenation","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/unsafe-deserialization","name":"java/unsafe-deserialization","shortDescription":{"text":"Deserialization of user-controlled data"},"fullDescription":{"text":"Deserializing user-controlled data may allow attackers to execute arbitrary code."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Deserialization of user-controlled data\nDeserializing untrusted data using any deserialization framework that allows the construction of arbitrary serializable objects is easily exploitable and in many cases allows an attacker to execute arbitrary code. Even before a deserialized object is returned to the caller of a deserialization method a lot of code may have been executed, including static initializers, constructors, and finalizers. Automatic deserialization of fields means that an attacker may craft a nested combination of objects on which the executed initialization code may have unforeseen effects, such as the execution of arbitrary code.\n\nThere are many different serialization frameworks. This query currently supports Kryo, XmlDecoder, XStream, SnakeYaml, JYaml, JsonIO, YAMLBeans, HessianBurlap, Castor, Burlap, Jackson, Jabsorb, Jodd JSON, Flexjson, Gson and Java IO serialization through `ObjectInputStream`/`ObjectOutputStream`.\n\n\n## Recommendation\nAvoid deserialization of untrusted data if at all possible. If the architecture permits it then use other formats instead of serialized objects, for example JSON or XML. However, these formats should not be deserialized into complex objects because this provides further opportunities for attack. For example, XML-based deserialization attacks are possible through libraries such as XStream and XmlDecoder.\n\nAlternatively, a tightly controlled whitelist can limit the vulnerability of code, but be aware of the existence of so-called Bypass Gadgets, which can circumvent such protection measures.\n\nRecommendations specific to particular frameworks supported by this query:\n\n**FastJson** - `com.alibaba:fastjson`\n\n* **Secure by Default**: Partially\n* **Recommendation**: Call `com.alibaba.fastjson.parser.ParserConfig#setSafeMode` with the argument `true` before deserializing untrusted data.\n\n\n**FasterXML** - `com.fasterxml.jackson.core:jackson-databind`\n\n* **Secure by Default**: Yes\n* **Recommendation**: Don't call `com.fasterxml.jackson.databind.ObjectMapper#enableDefaultTyping` and don't annotate any object fields with `com.fasterxml.jackson.annotation.JsonTypeInfo` passing either the `CLASS` or `MINIMAL_CLASS` values to the annotation. Read [this guide](https://cowtowncoder.medium.com/jackson-2-10-safe-default-typing-2d018f0ce2ba).\n\n\n**Kryo** - `com.esotericsoftware:kryo` and `com.esotericsoftware:kryo5`\n\n* **Secure by Default**: Yes for `com.esotericsoftware:kryo5` and for `com.esotericsoftware:kryo` >= v5.0.0\n* **Recommendation**: Don't call `com.esotericsoftware.kryo(5).Kryo#setRegistrationRequired` with the argument `false` on any `Kryo` instance that may deserialize untrusted data.\n\n\n**ObjectInputStream** - `Java Standard Library`\n\n* **Secure by Default**: No\n* **Recommendation**: Use a validating input stream, such as `org.apache.commons.io.serialization.ValidatingObjectInputStream`.\n\n\n**SnakeYAML** - `org.yaml:snakeyaml`\n\n* **Secure by Default**: No\n* **Recommendation**: Pass an instance of `org.yaml.snakeyaml.constructor.SafeConstructor` to `org.yaml.snakeyaml.Yaml`'s constructor before using it to deserialize untrusted data.\n\n\n**XML Decoder** - `Standard Java Library`\n\n* **Secure by Default**: No\n* **Recommendation**: Do not use with untrusted user input.\n\n\n\n## Example\nThe following example calls `readObject` directly on an `ObjectInputStream` that is constructed from untrusted data, and is therefore inherently unsafe.\n\n\n```java\npublic MyObject {\n public int field;\n MyObject(int field) {\n this.field = field;\n }\n}\n\npublic MyObject deserialize(Socket sock) {\n try(ObjectInputStream in = new ObjectInputStream(sock.getInputStream())) {\n return (MyObject)in.readObject(); // unsafe\n }\n}\n\n```\nRewriting the communication protocol to only rely on reading primitive types from the input stream removes the vulnerability.\n\n\n```java\npublic MyObject deserialize(Socket sock) {\n try(DataInputStream in = new DataInputStream(sock.getInputStream())) {\n return new MyObject(in.readInt());\n }\n}\n\n```\n\n## References\n* OWASP vulnerability description: [Deserialization of untrusted data](https://www.owasp.org/index.php/Deserialization_of_untrusted_data).\n* OWASP guidance on deserializing objects: [Deserialization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html).\n* Talks by Chris Frohoff & Gabriel Lawrence: [ AppSecCali 2015: Marshalling Pickles - how deserializing objects will ruin your day](http://frohoff.github.io/appseccali-marshalling-pickles/), [OWASP SD: Deserialize My Shorts: Or How I Learned to Start Worrying and Hate Java Object Deserialization](http://frohoff.github.io/owaspsd-deserialize-my-shorts/).\n* Alvaro Muñoz & Christian Schneider, RSAConference 2016: [Serial Killer: Silently Pwning Your Java Endpoints](https://speakerdeck.com/pwntester/serial-killer-silently-pwning-your-java-endpoints).\n* SnakeYaml documentation on deserialization: [SnakeYaml deserialization](https://bitbucket.org/snakeyaml/snakeyaml/wiki/Documentation#markdown-header-loading-yaml).\n* Hessian deserialization and related gadget chains: [Hessian deserialization](https://paper.seebug.org/1137/).\n* Castor and Hessian java deserialization vulnerabilities: [Castor and Hessian deserialization](https://securitylab.github.com/research/hessian-java-deserialization-castor-vulnerabilities/).\n* Remote code execution in JYaml library: [JYaml deserialization](https://www.cybersecurity-help.cz/vdb/SB2020022512).\n* JsonIO deserialization vulnerabilities: [JsonIO deserialization](https://klezvirus.github.io/Advanced-Web-Hacking/Serialisation/).\n* Research by Moritz Bechler: [Java Unmarshaller Security - Turning your data into code execution](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)\n* Blog posts by the developer of Jackson libraries: [On Jackson CVEs: Don’t Panic — Here is what you need to know](https://cowtowncoder.medium.com/on-jackson-cves-dont-panic-here-is-what-you-need-to-know-54cd0d6e8062) [Jackson 2.10: Safe Default Typing](https://cowtowncoder.medium.com/jackson-2-10-safe-default-typing-2d018f0ce2ba)\n* Jabsorb documentation on deserialization: [Jabsorb JSON Serializer](https://github.com/Servoy/jabsorb/blob/master/src/org/jabsorb/).\n* Jodd JSON documentation on deserialization: [JoddJson Parser](https://json.jodd.org/parser).\n* RCE in Flexjson: [Flexjson deserialization](https://codewhitesec.blogspot.com/2020/03/liferay-portal-json-vulns.html).\n* Android Intent deserialization vulnerabilities with GSON parser: [Insecure use of JSON parsers](https://blog.oversecured.com/Exploiting-memory-corruption-vulnerabilities-on-Android/#insecure-use-of-json-parsers).\n* Common Weakness Enumeration: [CWE-502](https://cwe.mitre.org/data/definitions/502.html).\n","markdown":"# Deserialization of user-controlled data\nDeserializing untrusted data using any deserialization framework that allows the construction of arbitrary serializable objects is easily exploitable and in many cases allows an attacker to execute arbitrary code. Even before a deserialized object is returned to the caller of a deserialization method a lot of code may have been executed, including static initializers, constructors, and finalizers. Automatic deserialization of fields means that an attacker may craft a nested combination of objects on which the executed initialization code may have unforeseen effects, such as the execution of arbitrary code.\n\nThere are many different serialization frameworks. This query currently supports Kryo, XmlDecoder, XStream, SnakeYaml, JYaml, JsonIO, YAMLBeans, HessianBurlap, Castor, Burlap, Jackson, Jabsorb, Jodd JSON, Flexjson, Gson and Java IO serialization through `ObjectInputStream`/`ObjectOutputStream`.\n\n\n## Recommendation\nAvoid deserialization of untrusted data if at all possible. If the architecture permits it then use other formats instead of serialized objects, for example JSON or XML. However, these formats should not be deserialized into complex objects because this provides further opportunities for attack. For example, XML-based deserialization attacks are possible through libraries such as XStream and XmlDecoder.\n\nAlternatively, a tightly controlled whitelist can limit the vulnerability of code, but be aware of the existence of so-called Bypass Gadgets, which can circumvent such protection measures.\n\nRecommendations specific to particular frameworks supported by this query:\n\n**FastJson** - `com.alibaba:fastjson`\n\n* **Secure by Default**: Partially\n* **Recommendation**: Call `com.alibaba.fastjson.parser.ParserConfig#setSafeMode` with the argument `true` before deserializing untrusted data.\n\n\n**FasterXML** - `com.fasterxml.jackson.core:jackson-databind`\n\n* **Secure by Default**: Yes\n* **Recommendation**: Don't call `com.fasterxml.jackson.databind.ObjectMapper#enableDefaultTyping` and don't annotate any object fields with `com.fasterxml.jackson.annotation.JsonTypeInfo` passing either the `CLASS` or `MINIMAL_CLASS` values to the annotation. Read [this guide](https://cowtowncoder.medium.com/jackson-2-10-safe-default-typing-2d018f0ce2ba).\n\n\n**Kryo** - `com.esotericsoftware:kryo` and `com.esotericsoftware:kryo5`\n\n* **Secure by Default**: Yes for `com.esotericsoftware:kryo5` and for `com.esotericsoftware:kryo` >= v5.0.0\n* **Recommendation**: Don't call `com.esotericsoftware.kryo(5).Kryo#setRegistrationRequired` with the argument `false` on any `Kryo` instance that may deserialize untrusted data.\n\n\n**ObjectInputStream** - `Java Standard Library`\n\n* **Secure by Default**: No\n* **Recommendation**: Use a validating input stream, such as `org.apache.commons.io.serialization.ValidatingObjectInputStream`.\n\n\n**SnakeYAML** - `org.yaml:snakeyaml`\n\n* **Secure by Default**: No\n* **Recommendation**: Pass an instance of `org.yaml.snakeyaml.constructor.SafeConstructor` to `org.yaml.snakeyaml.Yaml`'s constructor before using it to deserialize untrusted data.\n\n\n**XML Decoder** - `Standard Java Library`\n\n* **Secure by Default**: No\n* **Recommendation**: Do not use with untrusted user input.\n\n\n\n## Example\nThe following example calls `readObject` directly on an `ObjectInputStream` that is constructed from untrusted data, and is therefore inherently unsafe.\n\n\n```java\npublic MyObject {\n public int field;\n MyObject(int field) {\n this.field = field;\n }\n}\n\npublic MyObject deserialize(Socket sock) {\n try(ObjectInputStream in = new ObjectInputStream(sock.getInputStream())) {\n return (MyObject)in.readObject(); // unsafe\n }\n}\n\n```\nRewriting the communication protocol to only rely on reading primitive types from the input stream removes the vulnerability.\n\n\n```java\npublic MyObject deserialize(Socket sock) {\n try(DataInputStream in = new DataInputStream(sock.getInputStream())) {\n return new MyObject(in.readInt());\n }\n}\n\n```\n\n## References\n* OWASP vulnerability description: [Deserialization of untrusted data](https://www.owasp.org/index.php/Deserialization_of_untrusted_data).\n* OWASP guidance on deserializing objects: [Deserialization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html).\n* Talks by Chris Frohoff & Gabriel Lawrence: [ AppSecCali 2015: Marshalling Pickles - how deserializing objects will ruin your day](http://frohoff.github.io/appseccali-marshalling-pickles/), [OWASP SD: Deserialize My Shorts: Or How I Learned to Start Worrying and Hate Java Object Deserialization](http://frohoff.github.io/owaspsd-deserialize-my-shorts/).\n* Alvaro Muñoz & Christian Schneider, RSAConference 2016: [Serial Killer: Silently Pwning Your Java Endpoints](https://speakerdeck.com/pwntester/serial-killer-silently-pwning-your-java-endpoints).\n* SnakeYaml documentation on deserialization: [SnakeYaml deserialization](https://bitbucket.org/snakeyaml/snakeyaml/wiki/Documentation#markdown-header-loading-yaml).\n* Hessian deserialization and related gadget chains: [Hessian deserialization](https://paper.seebug.org/1137/).\n* Castor and Hessian java deserialization vulnerabilities: [Castor and Hessian deserialization](https://securitylab.github.com/research/hessian-java-deserialization-castor-vulnerabilities/).\n* Remote code execution in JYaml library: [JYaml deserialization](https://www.cybersecurity-help.cz/vdb/SB2020022512).\n* JsonIO deserialization vulnerabilities: [JsonIO deserialization](https://klezvirus.github.io/Advanced-Web-Hacking/Serialisation/).\n* Research by Moritz Bechler: [Java Unmarshaller Security - Turning your data into code execution](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)\n* Blog posts by the developer of Jackson libraries: [On Jackson CVEs: Don’t Panic — Here is what you need to know](https://cowtowncoder.medium.com/on-jackson-cves-dont-panic-here-is-what-you-need-to-know-54cd0d6e8062) [Jackson 2.10: Safe Default Typing](https://cowtowncoder.medium.com/jackson-2-10-safe-default-typing-2d018f0ce2ba)\n* Jabsorb documentation on deserialization: [Jabsorb JSON Serializer](https://github.com/Servoy/jabsorb/blob/master/src/org/jabsorb/).\n* Jodd JSON documentation on deserialization: [JoddJson Parser](https://json.jodd.org/parser).\n* RCE in Flexjson: [Flexjson deserialization](https://codewhitesec.blogspot.com/2020/03/liferay-portal-json-vulns.html).\n* Android Intent deserialization vulnerabilities with GSON parser: [Insecure use of JSON parsers](https://blog.oversecured.com/Exploiting-memory-corruption-vulnerabilities-on-Android/#insecure-use-of-json-parsers).\n* Common Weakness Enumeration: [CWE-502](https://cwe.mitre.org/data/definitions/502.html).\n"},"properties":{"tags":["security","external/cwe/cwe-502","owasp-top10-2021","A08:2021 - Software and Data Integrity Failures"],"description":"Deserializing user-controlled data may allow attackers to\n execute arbitrary code.","id":"java/unsafe-deserialization","kind":"path-problem","name":"Deserialization of user-controlled data","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/world-writable-file-read","name":"java/world-writable-file-read","shortDescription":{"text":"Reading from a world writable file"},"fullDescription":{"text":"Reading from a file which is set as world writable is dangerous because the file may be modified or removed by external actors."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Reading from a world writable file\nReading from a world-writable file is dangerous on a multi-user system because other users may be able to affect program execution by modifying or deleting the file.\n\n\n## Recommendation\nDo not make files explicitly world writable unless the file is intended to be written by multiple users on a multi-user system. In many cases, the file may only need to be writable for the current user.\n\nFor some file systems, there may be alternatives to setting the file to be world writable. For example, POSIX file systems support \"groups\" which may be used to ensure that only subset of all the users can write to the file. Access Control Lists (ACLs) are available for many operating system and file system combinations, and can provide fine-grained read and write support without resorting to world writable permissions.\n\n\n## Example\nIn the following example, we are loading some configuration parameters from a file:\n\n```java\n\nprivate void readConfig(File configFile) {\n if (!configFile.exists()) {\n // Create an empty config file\n configFile.createNewFile();\n // Make the file writable for all\n configFile.setWritable(true, false);\n }\n // Now read the config\n loadConfig(configFile);\n}\n\n```\nIf the configuration file does not yet exist, an empty file is created. Creating an empty file can simplify the later code and is a convenience for the user. However, by setting the file to be world writable, we allow any user on the system to modify the configuration, not just the current user. If there may be untrusted users on the system, this is potentially dangerous.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [FIO01-J. Create files with appropriate access permissions](https://wiki.sei.cmu.edu/confluence/display/java/FIO01-J.+Create+files+with+appropriate+access+permissions).\n* Common Weakness Enumeration: [CWE-732](https://cwe.mitre.org/data/definitions/732.html).\n","markdown":"# Reading from a world writable file\nReading from a world-writable file is dangerous on a multi-user system because other users may be able to affect program execution by modifying or deleting the file.\n\n\n## Recommendation\nDo not make files explicitly world writable unless the file is intended to be written by multiple users on a multi-user system. In many cases, the file may only need to be writable for the current user.\n\nFor some file systems, there may be alternatives to setting the file to be world writable. For example, POSIX file systems support \"groups\" which may be used to ensure that only subset of all the users can write to the file. Access Control Lists (ACLs) are available for many operating system and file system combinations, and can provide fine-grained read and write support without resorting to world writable permissions.\n\n\n## Example\nIn the following example, we are loading some configuration parameters from a file:\n\n```java\n\nprivate void readConfig(File configFile) {\n if (!configFile.exists()) {\n // Create an empty config file\n configFile.createNewFile();\n // Make the file writable for all\n configFile.setWritable(true, false);\n }\n // Now read the config\n loadConfig(configFile);\n}\n\n```\nIf the configuration file does not yet exist, an empty file is created. Creating an empty file can simplify the later code and is a convenience for the user. However, by setting the file to be world writable, we allow any user on the system to modify the configuration, not just the current user. If there may be untrusted users on the system, this is potentially dangerous.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [FIO01-J. Create files with appropriate access permissions](https://wiki.sei.cmu.edu/confluence/display/java/FIO01-J.+Create+files+with+appropriate+access+permissions).\n* Common Weakness Enumeration: [CWE-732](https://cwe.mitre.org/data/definitions/732.html).\n"},"properties":{"tags":["security","external/cwe/cwe-732"],"description":"Reading from a file which is set as world writable is dangerous because\n the file may be modified or removed by external actors.","id":"java/world-writable-file-read","kind":"problem","name":"Reading from a world writable file","precision":"high","problem.severity":"error","security-severity":"7.8"}},{"id":"java/regex-injection","name":"java/regex-injection","shortDescription":{"text":"Regular expression injection"},"fullDescription":{"text":"User input should not be used in regular expressions without first being escaped, otherwise a malicious user may be able to provide a regex that could require exponential time on certain inputs."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Regular expression injection\nConstructing a regular expression with unsanitized user input is dangerous as a malicious user may be able to modify the meaning of the expression. In particular, such a user may be able to provide a regular expression fragment that takes exponential time in the worst case, and use that to perform a Denial of Service attack.\n\n\n## Recommendation\nBefore embedding user input into a regular expression, use a sanitization function such as `Pattern.quote` to escape meta-characters that have special meaning.\n\n\n## Example\nThe following example shows an HTTP request parameter that is used to construct a regular expression.\n\nIn the first case the user-provided regex is not escaped. If a malicious user provides a regex whose worst-case performance is exponential, then this could lead to a Denial of Service.\n\nIn the second case, the user input is escaped using `Pattern.quote` before being included in the regular expression. This ensures that the user cannot insert characters which have a special meaning in regular expressions.\n\n\n```java\nimport java.util.regex.Pattern;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\n\npublic class RegexInjectionDemo extends HttpServlet {\n\n public boolean badExample(javax.servlet.http.HttpServletRequest request) {\n String regex = request.getParameter(\"regex\");\n String input = request.getParameter(\"input\");\n\n // BAD: Unsanitized user input is used to construct a regular expression\n return input.matches(regex);\n }\n\n public boolean goodExample(javax.servlet.http.HttpServletRequest request) {\n String regex = request.getParameter(\"regex\");\n String input = request.getParameter(\"input\");\n\n // GOOD: User input is sanitized before constructing the regex\n return input.matches(Pattern.quote(regex));\n }\n}\n\n```\n\n## References\n* OWASP: [Regular expression Denial of Service - ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS).\n* Wikipedia: [ReDoS](https://en.wikipedia.org/wiki/ReDoS).\n* Java API Specification: [Pattern.quote](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html#quote(java.lang.String)).\n* Common Weakness Enumeration: [CWE-730](https://cwe.mitre.org/data/definitions/730.html).\n* Common Weakness Enumeration: [CWE-400](https://cwe.mitre.org/data/definitions/400.html).\n","markdown":"# Regular expression injection\nConstructing a regular expression with unsanitized user input is dangerous as a malicious user may be able to modify the meaning of the expression. In particular, such a user may be able to provide a regular expression fragment that takes exponential time in the worst case, and use that to perform a Denial of Service attack.\n\n\n## Recommendation\nBefore embedding user input into a regular expression, use a sanitization function such as `Pattern.quote` to escape meta-characters that have special meaning.\n\n\n## Example\nThe following example shows an HTTP request parameter that is used to construct a regular expression.\n\nIn the first case the user-provided regex is not escaped. If a malicious user provides a regex whose worst-case performance is exponential, then this could lead to a Denial of Service.\n\nIn the second case, the user input is escaped using `Pattern.quote` before being included in the regular expression. This ensures that the user cannot insert characters which have a special meaning in regular expressions.\n\n\n```java\nimport java.util.regex.Pattern;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\n\npublic class RegexInjectionDemo extends HttpServlet {\n\n public boolean badExample(javax.servlet.http.HttpServletRequest request) {\n String regex = request.getParameter(\"regex\");\n String input = request.getParameter(\"input\");\n\n // BAD: Unsanitized user input is used to construct a regular expression\n return input.matches(regex);\n }\n\n public boolean goodExample(javax.servlet.http.HttpServletRequest request) {\n String regex = request.getParameter(\"regex\");\n String input = request.getParameter(\"input\");\n\n // GOOD: User input is sanitized before constructing the regex\n return input.matches(Pattern.quote(regex));\n }\n}\n\n```\n\n## References\n* OWASP: [Regular expression Denial of Service - ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS).\n* Wikipedia: [ReDoS](https://en.wikipedia.org/wiki/ReDoS).\n* Java API Specification: [Pattern.quote](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html#quote(java.lang.String)).\n* Common Weakness Enumeration: [CWE-730](https://cwe.mitre.org/data/definitions/730.html).\n* Common Weakness Enumeration: [CWE-400](https://cwe.mitre.org/data/definitions/400.html).\n"},"properties":{"tags":["security","external/cwe/cwe-730","external/cwe/cwe-400"],"description":"User input should not be used in regular expressions without first being escaped,\n otherwise a malicious user may be able to provide a regex that could require\n exponential time on certain inputs.","id":"java/regex-injection","kind":"path-problem","name":"Regular expression injection","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/redos","name":"java/redos","shortDescription":{"text":"Inefficient regular expression"},"fullDescription":{"text":"A regular expression that requires exponential time to match certain inputs can be a performance bottleneck, and may be vulnerable to denial-of-service attacks."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Inefficient regular expression\nSome regular expressions take a long time to match certain input strings to the point where the time it takes to match a string of length *n* is proportional to *nk* or even *2n*. Such regular expressions can negatively affect performance, or even allow a malicious user to perform a Denial of Service (\"DoS\") attack by crafting an expensive input string for the regular expression to match.\n\nThe regular expression engine provided by Java uses a backtracking non-deterministic finite automata to implement regular expression matching. While this approach is space-efficient and allows supporting advanced features like capture groups, it is not time-efficient in general. The worst-case time complexity of such an automaton can be polynomial or even exponential, meaning that for strings of a certain shape, increasing the input length by ten characters may make the automaton about 1000 times slower.\n\nTypically, a regular expression is affected by this problem if it contains a repetition of the form `r*` or `r+` where the sub-expression `r` is ambiguous in the sense that it can match some string in multiple ways. More information about the precise circumstances can be found in the references.\n\nNote that Java versions 9 and above have some mitigations against ReDoS; however they aren't perfect and more complex regular expressions can still be affected by this problem.\n\n\n## Recommendation\nModify the regular expression to remove the ambiguity, or ensure that the strings matched with the regular expression are short enough that the time-complexity does not matter. Alternatively, an alternate regex library that guarantees linear time execution, such as Google's RE2J, may be used.\n\n\n## Example\nConsider this regular expression:\n\n```java\n\n\t\t\t^_(__|.)+_$\n\t\t\n```\nIts sub-expression `\"(__|.)+?\"` can match the string `\"__\"` either by the first alternative `\"__\"` to the left of the `\"|\"` operator, or by two repetitions of the second alternative `\".\"` to the right. Thus, a string consisting of an odd number of underscores followed by some other character will cause the regular expression engine to run for an exponential amount of time before rejecting the input.\n\nThis problem can be avoided by rewriting the regular expression to remove the ambiguity between the two branches of the alternative inside the repetition:\n\n```java\n\n\t\t\t^_(__|[^_])+_$\n\t\t\n```\n\n## References\n* OWASP: [Regular expression Denial of Service - ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS).\n* Wikipedia: [ReDoS](https://en.wikipedia.org/wiki/ReDoS).\n* Wikipedia: [Time complexity](https://en.wikipedia.org/wiki/Time_complexity).\n* James Kirrage, Asiri Rathnayake, Hayo Thielecke: [Static Analysis for Regular Expression Denial-of-Service Attack](http://www.cs.bham.ac.uk/~hxt/research/reg-exp-sec.pdf).\n* Common Weakness Enumeration: [CWE-1333](https://cwe.mitre.org/data/definitions/1333.html).\n* Common Weakness Enumeration: [CWE-730](https://cwe.mitre.org/data/definitions/730.html).\n* Common Weakness Enumeration: [CWE-400](https://cwe.mitre.org/data/definitions/400.html).\n","markdown":"# Inefficient regular expression\nSome regular expressions take a long time to match certain input strings to the point where the time it takes to match a string of length *n* is proportional to *nk* or even *2n*. Such regular expressions can negatively affect performance, or even allow a malicious user to perform a Denial of Service (\"DoS\") attack by crafting an expensive input string for the regular expression to match.\n\nThe regular expression engine provided by Java uses a backtracking non-deterministic finite automata to implement regular expression matching. While this approach is space-efficient and allows supporting advanced features like capture groups, it is not time-efficient in general. The worst-case time complexity of such an automaton can be polynomial or even exponential, meaning that for strings of a certain shape, increasing the input length by ten characters may make the automaton about 1000 times slower.\n\nTypically, a regular expression is affected by this problem if it contains a repetition of the form `r*` or `r+` where the sub-expression `r` is ambiguous in the sense that it can match some string in multiple ways. More information about the precise circumstances can be found in the references.\n\nNote that Java versions 9 and above have some mitigations against ReDoS; however they aren't perfect and more complex regular expressions can still be affected by this problem.\n\n\n## Recommendation\nModify the regular expression to remove the ambiguity, or ensure that the strings matched with the regular expression are short enough that the time-complexity does not matter. Alternatively, an alternate regex library that guarantees linear time execution, such as Google's RE2J, may be used.\n\n\n## Example\nConsider this regular expression:\n\n```java\n\n\t\t\t^_(__|.)+_$\n\t\t\n```\nIts sub-expression `\"(__|.)+?\"` can match the string `\"__\"` either by the first alternative `\"__\"` to the left of the `\"|\"` operator, or by two repetitions of the second alternative `\".\"` to the right. Thus, a string consisting of an odd number of underscores followed by some other character will cause the regular expression engine to run for an exponential amount of time before rejecting the input.\n\nThis problem can be avoided by rewriting the regular expression to remove the ambiguity between the two branches of the alternative inside the repetition:\n\n```java\n\n\t\t\t^_(__|[^_])+_$\n\t\t\n```\n\n## References\n* OWASP: [Regular expression Denial of Service - ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS).\n* Wikipedia: [ReDoS](https://en.wikipedia.org/wiki/ReDoS).\n* Wikipedia: [Time complexity](https://en.wikipedia.org/wiki/Time_complexity).\n* James Kirrage, Asiri Rathnayake, Hayo Thielecke: [Static Analysis for Regular Expression Denial-of-Service Attack](http://www.cs.bham.ac.uk/~hxt/research/reg-exp-sec.pdf).\n* Common Weakness Enumeration: [CWE-1333](https://cwe.mitre.org/data/definitions/1333.html).\n* Common Weakness Enumeration: [CWE-730](https://cwe.mitre.org/data/definitions/730.html).\n* Common Weakness Enumeration: [CWE-400](https://cwe.mitre.org/data/definitions/400.html).\n"},"properties":{"tags":["security","external/cwe/cwe-1333","external/cwe/cwe-730","external/cwe/cwe-400"],"description":"A regular expression that requires exponential time to match certain inputs\n can be a performance bottleneck, and may be vulnerable to denial-of-service\n attacks.","id":"java/redos","kind":"problem","name":"Inefficient regular expression","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/polynomial-redos","name":"java/polynomial-redos","shortDescription":{"text":"Polynomial regular expression used on uncontrolled data"},"fullDescription":{"text":"A regular expression that can require polynomial time to match may be vulnerable to denial-of-service attacks."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Polynomial regular expression used on uncontrolled data\nSome regular expressions take a long time to match certain input strings to the point where the time it takes to match a string of length *n* is proportional to *nk* or even *2n*. Such regular expressions can negatively affect performance, or even allow a malicious user to perform a Denial of Service (\"DoS\") attack by crafting an expensive input string for the regular expression to match.\n\nThe regular expression engine provided by Java uses a backtracking non-deterministic finite automata to implement regular expression matching. While this approach is space-efficient and allows supporting advanced features like capture groups, it is not time-efficient in general. The worst-case time complexity of such an automaton can be polynomial or even exponential, meaning that for strings of a certain shape, increasing the input length by ten characters may make the automaton about 1000 times slower.\n\nTypically, a regular expression is affected by this problem if it contains a repetition of the form `r*` or `r+` where the sub-expression `r` is ambiguous in the sense that it can match some string in multiple ways. More information about the precise circumstances can be found in the references.\n\nNote that Java versions 9 and above have some mitigations against ReDoS; however they aren't perfect and more complex regular expressions can still be affected by this problem.\n\n\n## Recommendation\nModify the regular expression to remove the ambiguity, or ensure that the strings matched with the regular expression are short enough that the time-complexity does not matter. Alternatively, an alternate regex library that guarantees linear time execution, such as Google's RE2J, may be used.\n\n\n## Example\nConsider this use of a regular expression, which removes all leading and trailing whitespace in a string:\n\n```java\n\n\t\t\tPattern.compile(\"^\\\\s+|\\\\s+$\").matcher(text).replaceAll(\"\") // BAD\n\t\t\n```\nThe sub-expression `\"\\\\s+$\"` will match the whitespace characters in `text` from left to right, but it can start matching anywhere within a whitespace sequence. This is problematic for strings that do **not** end with a whitespace character. Such a string will force the regular expression engine to process each whitespace sequence once per whitespace character in the sequence.\n\nThis ultimately means that the time cost of trimming a string is quadratic in the length of the string. So a string like `\"a b\"` will take milliseconds to process, but a similar string with a million spaces instead of just one will take several minutes.\n\nAvoid this problem by rewriting the regular expression to not contain the ambiguity about when to start matching whitespace sequences. For instance, by using a negative look-behind (`\"^\\\\s+|(?k* or even *2n*. Such regular expressions can negatively affect performance, or even allow a malicious user to perform a Denial of Service (\"DoS\") attack by crafting an expensive input string for the regular expression to match.\n\nThe regular expression engine provided by Java uses a backtracking non-deterministic finite automata to implement regular expression matching. While this approach is space-efficient and allows supporting advanced features like capture groups, it is not time-efficient in general. The worst-case time complexity of such an automaton can be polynomial or even exponential, meaning that for strings of a certain shape, increasing the input length by ten characters may make the automaton about 1000 times slower.\n\nTypically, a regular expression is affected by this problem if it contains a repetition of the form `r*` or `r+` where the sub-expression `r` is ambiguous in the sense that it can match some string in multiple ways. More information about the precise circumstances can be found in the references.\n\nNote that Java versions 9 and above have some mitigations against ReDoS; however they aren't perfect and more complex regular expressions can still be affected by this problem.\n\n\n## Recommendation\nModify the regular expression to remove the ambiguity, or ensure that the strings matched with the regular expression are short enough that the time-complexity does not matter. Alternatively, an alternate regex library that guarantees linear time execution, such as Google's RE2J, may be used.\n\n\n## Example\nConsider this use of a regular expression, which removes all leading and trailing whitespace in a string:\n\n```java\n\n\t\t\tPattern.compile(\"^\\\\s+|\\\\s+$\").matcher(text).replaceAll(\"\") // BAD\n\t\t\n```\nThe sub-expression `\"\\\\s+$\"` will match the whitespace characters in `text` from left to right, but it can start matching anywhere within a whitespace sequence. This is problematic for strings that do **not** end with a whitespace character. Such a string will force the regular expression engine to process each whitespace sequence once per whitespace character in the sequence.\n\nThis ultimately means that the time cost of trimming a string is quadratic in the length of the string. So a string like `\"a b\"` will take milliseconds to process, but a similar string with a million spaces instead of just one will take several minutes.\n\nAvoid this problem by rewriting the regular expression to not contain the ambiguity about when to start matching whitespace sequences. For instance, by using a negative look-behind (`\"^\\\\s+|(?\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Security Testing\n An example of insecure download and upload of dependencies\n\n \n \n insecure-releases\n Insecure Repository Releases\n \n http://insecure-repository.example\n \n \n insecure-snapshots\n Insecure Repository Snapshots\n \n http://insecure-repository.example\n \n \n \n \n insecure\n Insecure Repository\n \n http://insecure-repository.example\n \n \n \n \n insecure-plugins\n Insecure Repository Releases\n \n http://insecure-repository.example\n \n \n\n\n```\n\n```xml\n\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Security Testing\n An example of secure download and upload of dependencies\n\n \n \n insecure-releases\n Secure Repository Releases\n \n https://insecure-repository.example\n \n \n insecure-snapshots\n Secure Repository Snapshots\n \n https://insecure-repository.example\n \n \n \n \n insecure\n Secure Repository\n \n https://insecure-repository.example\n \n \n \n \n insecure-plugins\n Secure Repository Releases\n \n https://insecure-repository.example\n \n \n\n\n```\n\n## References\n* Research: [ Want to take over the Java ecosystem? All you need is a MITM! ](https://medium.com/bugbountywriteup/want-to-take-over-the-java-ecosystem-all-you-need-is-a-mitm-1fc329d898fb?source=friends_link&sk=3c99970c55a899ad9ef41f126efcde0e)\n* Research: [ How to take over the computer of any Java (or Closure or Scala) Developer. ](https://max.computer/blog/how-to-take-over-the-computer-of-any-java-or-clojure-or-scala-developer/)\n* Proof of Concept: [ mveytsman/dilettante ](https://github.com/mveytsman/dilettante)\n* Additional Gradle & Maven plugin: [ Announcing nohttp ](https://spring.io/blog/2019/06/10/announcing-nohttp)\n* Java Ecosystem Announcement: [ HTTP Decommission Artifact Server Announcements ](https://gist.github.com/JLLeitschuh/789e49e3d34092a005031a0a1880af99)\n* Common Weakness Enumeration: [CWE-300](https://cwe.mitre.org/data/definitions/300.html).\n* Common Weakness Enumeration: [CWE-319](https://cwe.mitre.org/data/definitions/319.html).\n* Common Weakness Enumeration: [CWE-494](https://cwe.mitre.org/data/definitions/494.html).\n* Common Weakness Enumeration: [CWE-829](https://cwe.mitre.org/data/definitions/829.html).\n","markdown":"# Failure to use HTTPS or SFTP URL in Maven artifact upload/download\nUsing an insecure protocol like HTTP or FTP to download your dependencies leaves your Maven build vulnerable to a [Man in the Middle (MITM)](https://en.wikipedia.org/wiki/Man-in-the-middle_attack). This can allow attackers to inject malicious code into the artifacts that you are resolving and infect build artifacts that are being produced. This can be used by attackers to perform a [Supply chain attack](https://en.wikipedia.org/wiki/Supply_chain_attack) against your project's users.\n\nThis vulnerability has a [ CVSS v3.1 base score of 8.1/10 ](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H&version=3.1).\n\n\n## Recommendation\nAlways use HTTPS or SFTP to download artifacts from artifact servers.\n\n\n## Example\nThese examples show examples of locations in Maven POM files where artifact repository upload/download is configured. The first shows the use of HTTP, the second shows the use of HTTPS.\n\n\n```xml\n\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Security Testing\n An example of insecure download and upload of dependencies\n\n \n \n insecure-releases\n Insecure Repository Releases\n \n http://insecure-repository.example\n \n \n insecure-snapshots\n Insecure Repository Snapshots\n \n http://insecure-repository.example\n \n \n \n \n insecure\n Insecure Repository\n \n http://insecure-repository.example\n \n \n \n \n insecure-plugins\n Insecure Repository Releases\n \n http://insecure-repository.example\n \n \n\n\n```\n\n```xml\n\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Security Testing\n An example of secure download and upload of dependencies\n\n \n \n insecure-releases\n Secure Repository Releases\n \n https://insecure-repository.example\n \n \n insecure-snapshots\n Secure Repository Snapshots\n \n https://insecure-repository.example\n \n \n \n \n insecure\n Secure Repository\n \n https://insecure-repository.example\n \n \n \n \n insecure-plugins\n Secure Repository Releases\n \n https://insecure-repository.example\n \n \n\n\n```\n\n## References\n* Research: [ Want to take over the Java ecosystem? All you need is a MITM! ](https://medium.com/bugbountywriteup/want-to-take-over-the-java-ecosystem-all-you-need-is-a-mitm-1fc329d898fb?source=friends_link&sk=3c99970c55a899ad9ef41f126efcde0e)\n* Research: [ How to take over the computer of any Java (or Closure or Scala) Developer. ](https://max.computer/blog/how-to-take-over-the-computer-of-any-java-or-clojure-or-scala-developer/)\n* Proof of Concept: [ mveytsman/dilettante ](https://github.com/mveytsman/dilettante)\n* Additional Gradle & Maven plugin: [ Announcing nohttp ](https://spring.io/blog/2019/06/10/announcing-nohttp)\n* Java Ecosystem Announcement: [ HTTP Decommission Artifact Server Announcements ](https://gist.github.com/JLLeitschuh/789e49e3d34092a005031a0a1880af99)\n* Common Weakness Enumeration: [CWE-300](https://cwe.mitre.org/data/definitions/300.html).\n* Common Weakness Enumeration: [CWE-319](https://cwe.mitre.org/data/definitions/319.html).\n* Common Weakness Enumeration: [CWE-494](https://cwe.mitre.org/data/definitions/494.html).\n* Common Weakness Enumeration: [CWE-829](https://cwe.mitre.org/data/definitions/829.html).\n"},"properties":{"tags":["security","external/cwe/cwe-300","external/cwe/cwe-319","external/cwe/cwe-494","external/cwe/cwe-829","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Non-HTTPS connections can be intercepted by third parties.","id":"java/maven/non-https-url","kind":"problem","name":"Failure to use HTTPS or SFTP URL in Maven artifact upload/download","precision":"very-high","problem.severity":"error","security-severity":"8.1"}},{"id":"java/sql-injection","name":"java/sql-injection","shortDescription":{"text":"Query built from user-controlled sources"},"fullDescription":{"text":"Building a SQL or Java Persistence query from user-controlled sources is vulnerable to insertion of malicious code by the user."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Query built from user-controlled sources\nIf a database query is built using string concatenation, and the components of the concatenation include user input, a user is likely to be able to run malicious database queries. This applies to various database query languages, including SQL and the Java Persistence Query Language.\n\n\n## Recommendation\nUsually, it is better to use a SQL prepared statement than to build a complete SQL query with string concatenation. A prepared statement can include a wildcard, written as a question mark (?), for each part of the SQL query that is expected to be filled in by a different value each time it is run. When the query is later executed, a value must be supplied for each wildcard in the query.\n\nIn the Java Persistence Query Language, it is better to use queries with parameters than to build a complete query with string concatenation. A Java Persistence query can include a parameter placeholder for each part of the query that is expected to be filled in by a different value when run. A parameter placeholder may be indicated by a colon (:) followed by a parameter name, or by a question mark (?) followed by an integer position. When the query is later executed, a value must be supplied for each parameter in the query, using the `setParameter` method. Specifying the query using the `@NamedQuery` annotation introduces an additional level of safety: the query must be a constant string literal, preventing construction by string concatenation, and the only way to fill in values for parts of the query is by setting positional parameters.\n\nIt is good practice to use prepared statements (in SQL) or query parameters (in the Java Persistence Query Language) for supplying parameter values to a query, whether or not any of the parameters are directly traceable to user input. Doing so avoids any need to worry about quoting and escaping.\n\n\n## Example\nIn the following example, the code runs a simple SQL query in two different ways.\n\nThe first way involves building a query, `query1`, by concatenating an environment variable with some string literals. The environment variable can include special characters, so this code allows for SQL injection attacks.\n\nThe second way, which shows good practice, involves building a query, `query2`, with a single string literal that includes a wildcard (`?`). The wildcard is then given a value by calling `setString`. This version is immune to injection attacks, because any special characters in the environment variable are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have SQL special characters in it\n String category = System.getenv(\"ITEM_CATEGORY\");\n Statement statement = connection.createStatement();\n String query1 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='\"\n + category + \"' ORDER BY PRICE\";\n ResultSet results = statement.executeQuery(query1);\n}\n\n{\n // GOOD: use a prepared query\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query2 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=? ORDER BY PRICE\";\n PreparedStatement statement = connection.prepareStatement(query2);\n statement.setString(1, category);\n ResultSet results = statement.executeQuery();\n}\n```\n\n## Example\nThe following code shows several different ways to run a Java Persistence query.\n\nThe first example involves building a query, `query1`, by concatenating an environment variable with some string literals. Just like the SQL example, the environment variable can include special characters, so this code allows for Java Persistence query injection attacks.\n\nThe remaining examples demonstrate different methods for safely building a Java Persistence query with user-supplied values:\n\n1. `query2` uses a single string literal that includes a placeholder for a parameter, indicated by a colon (`:`) and parameter name (`category`).\n1. `query3` uses a single string literal that includes a placeholder for a parameter, indicated by a question mark (`?`) and position number (`1`).\n1. `namedQuery1` is defined using the `@NamedQuery` annotation, whose `query` attribute is a string literal that includes a placeholder for a parameter, indicated by a colon (`:`) and parameter name (`category`).\n1. `namedQuery2` is defined using the `@NamedQuery` annotation, whose `query` attribute includes a placeholder for a parameter, indicated by a question mark (`?`) and position number (`1`).\nThe parameter is then given a value by calling `setParameter`. These versions are immune to injection attacks, because any special characters in the environment variable or user-supplied value are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have Java Persistence Query Language special characters in it\n String category = System.getenv(\"ITEM_CATEGORY\");\n Statement statement = connection.createStatement();\n String query1 = \"SELECT p FROM Product p WHERE p.category LIKE '\"\n + category + \"' ORDER BY p.price\";\n Query q = entityManager.createQuery(query1);\n}\n\n{\n // GOOD: use a named parameter and set its value\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query2 = \"SELECT p FROM Product p WHERE p.category LIKE :category ORDER BY p.price\"\n Query q = entityManager.createQuery(query2);\n q.setParameter(\"category\", category);\n}\n\n{\n // GOOD: use a positional parameter and set its value\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query3 = \"SELECT p FROM Product p WHERE p.category LIKE ?1 ORDER BY p.price\"\n Query q = entityManager.createQuery(query3);\n q.setParameter(1, category);\n}\n\n{\n // GOOD: use a named query with a named parameter and set its value\n @NamedQuery(\n name=\"lookupByCategory\",\n query=\"SELECT p FROM Product p WHERE p.category LIKE :category ORDER BY p.price\")\n private static class NQ {}\n ...\n String category = System.getenv(\"ITEM_CATEGORY\");\n Query namedQuery1 = entityManager.createNamedQuery(\"lookupByCategory\");\n namedQuery1.setParameter(\"category\", category);\n}\n\n{\n // GOOD: use a named query with a positional parameter and set its value\n @NamedQuery(\n name=\"lookupByCategory\",\n query=\"SELECT p FROM Product p WHERE p.category LIKE ?1 ORDER BY p.price\")\n private static class NQ {}\n ...\n String category = System.getenv(\"ITEM_CATEGORY\");\n Query namedQuery2 = entityManager.createNamedQuery(\"lookupByCategory\");\n namedQuery2.setParameter(1, category);\n}\n```\n\n## References\n* OWASP: [SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html).\n* SEI CERT Oracle Coding Standard for Java: [IDS00-J. Prevent SQL injection](https://wiki.sei.cmu.edu/confluence/display/java/IDS00-J.+Prevent+SQL+injection).\n* The Java Tutorials: [Using Prepared Statements](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html).\n* The Java EE Tutorial: [The Java Persistence Query Language](https://docs.oracle.com/javaee/7/tutorial/persistence-querylanguage.htm).\n* Common Weakness Enumeration: [CWE-89](https://cwe.mitre.org/data/definitions/89.html).\n* Common Weakness Enumeration: [CWE-564](https://cwe.mitre.org/data/definitions/564.html).\n","markdown":"# Query built from user-controlled sources\nIf a database query is built using string concatenation, and the components of the concatenation include user input, a user is likely to be able to run malicious database queries. This applies to various database query languages, including SQL and the Java Persistence Query Language.\n\n\n## Recommendation\nUsually, it is better to use a SQL prepared statement than to build a complete SQL query with string concatenation. A prepared statement can include a wildcard, written as a question mark (?), for each part of the SQL query that is expected to be filled in by a different value each time it is run. When the query is later executed, a value must be supplied for each wildcard in the query.\n\nIn the Java Persistence Query Language, it is better to use queries with parameters than to build a complete query with string concatenation. A Java Persistence query can include a parameter placeholder for each part of the query that is expected to be filled in by a different value when run. A parameter placeholder may be indicated by a colon (:) followed by a parameter name, or by a question mark (?) followed by an integer position. When the query is later executed, a value must be supplied for each parameter in the query, using the `setParameter` method. Specifying the query using the `@NamedQuery` annotation introduces an additional level of safety: the query must be a constant string literal, preventing construction by string concatenation, and the only way to fill in values for parts of the query is by setting positional parameters.\n\nIt is good practice to use prepared statements (in SQL) or query parameters (in the Java Persistence Query Language) for supplying parameter values to a query, whether or not any of the parameters are directly traceable to user input. Doing so avoids any need to worry about quoting and escaping.\n\n\n## Example\nIn the following example, the code runs a simple SQL query in two different ways.\n\nThe first way involves building a query, `query1`, by concatenating an environment variable with some string literals. The environment variable can include special characters, so this code allows for SQL injection attacks.\n\nThe second way, which shows good practice, involves building a query, `query2`, with a single string literal that includes a wildcard (`?`). The wildcard is then given a value by calling `setString`. This version is immune to injection attacks, because any special characters in the environment variable are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have SQL special characters in it\n String category = System.getenv(\"ITEM_CATEGORY\");\n Statement statement = connection.createStatement();\n String query1 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='\"\n + category + \"' ORDER BY PRICE\";\n ResultSet results = statement.executeQuery(query1);\n}\n\n{\n // GOOD: use a prepared query\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query2 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=? ORDER BY PRICE\";\n PreparedStatement statement = connection.prepareStatement(query2);\n statement.setString(1, category);\n ResultSet results = statement.executeQuery();\n}\n```\n\n## Example\nThe following code shows several different ways to run a Java Persistence query.\n\nThe first example involves building a query, `query1`, by concatenating an environment variable with some string literals. Just like the SQL example, the environment variable can include special characters, so this code allows for Java Persistence query injection attacks.\n\nThe remaining examples demonstrate different methods for safely building a Java Persistence query with user-supplied values:\n\n1. `query2` uses a single string literal that includes a placeholder for a parameter, indicated by a colon (`:`) and parameter name (`category`).\n1. `query3` uses a single string literal that includes a placeholder for a parameter, indicated by a question mark (`?`) and position number (`1`).\n1. `namedQuery1` is defined using the `@NamedQuery` annotation, whose `query` attribute is a string literal that includes a placeholder for a parameter, indicated by a colon (`:`) and parameter name (`category`).\n1. `namedQuery2` is defined using the `@NamedQuery` annotation, whose `query` attribute includes a placeholder for a parameter, indicated by a question mark (`?`) and position number (`1`).\nThe parameter is then given a value by calling `setParameter`. These versions are immune to injection attacks, because any special characters in the environment variable or user-supplied value are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have Java Persistence Query Language special characters in it\n String category = System.getenv(\"ITEM_CATEGORY\");\n Statement statement = connection.createStatement();\n String query1 = \"SELECT p FROM Product p WHERE p.category LIKE '\"\n + category + \"' ORDER BY p.price\";\n Query q = entityManager.createQuery(query1);\n}\n\n{\n // GOOD: use a named parameter and set its value\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query2 = \"SELECT p FROM Product p WHERE p.category LIKE :category ORDER BY p.price\"\n Query q = entityManager.createQuery(query2);\n q.setParameter(\"category\", category);\n}\n\n{\n // GOOD: use a positional parameter and set its value\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query3 = \"SELECT p FROM Product p WHERE p.category LIKE ?1 ORDER BY p.price\"\n Query q = entityManager.createQuery(query3);\n q.setParameter(1, category);\n}\n\n{\n // GOOD: use a named query with a named parameter and set its value\n @NamedQuery(\n name=\"lookupByCategory\",\n query=\"SELECT p FROM Product p WHERE p.category LIKE :category ORDER BY p.price\")\n private static class NQ {}\n ...\n String category = System.getenv(\"ITEM_CATEGORY\");\n Query namedQuery1 = entityManager.createNamedQuery(\"lookupByCategory\");\n namedQuery1.setParameter(\"category\", category);\n}\n\n{\n // GOOD: use a named query with a positional parameter and set its value\n @NamedQuery(\n name=\"lookupByCategory\",\n query=\"SELECT p FROM Product p WHERE p.category LIKE ?1 ORDER BY p.price\")\n private static class NQ {}\n ...\n String category = System.getenv(\"ITEM_CATEGORY\");\n Query namedQuery2 = entityManager.createNamedQuery(\"lookupByCategory\");\n namedQuery2.setParameter(1, category);\n}\n```\n\n## References\n* OWASP: [SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html).\n* SEI CERT Oracle Coding Standard for Java: [IDS00-J. Prevent SQL injection](https://wiki.sei.cmu.edu/confluence/display/java/IDS00-J.+Prevent+SQL+injection).\n* The Java Tutorials: [Using Prepared Statements](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html).\n* The Java EE Tutorial: [The Java Persistence Query Language](https://docs.oracle.com/javaee/7/tutorial/persistence-querylanguage.htm).\n* Common Weakness Enumeration: [CWE-89](https://cwe.mitre.org/data/definitions/89.html).\n* Common Weakness Enumeration: [CWE-564](https://cwe.mitre.org/data/definitions/564.html).\n"},"properties":{"tags":["security","external/cwe/cwe-089","external/cwe/cwe-564","owasp-top10-2021","A03:2021 - Injection"],"description":"Building a SQL or Java Persistence query from user-controlled sources is vulnerable to insertion of\n malicious code by the user.","id":"java/sql-injection","kind":"path-problem","name":"Query built from user-controlled sources","precision":"high","problem.severity":"error","security-severity":"8.8"}},{"id":"java/android/implicitly-exported-component","name":"java/android/implicitly-exported-component","shortDescription":{"text":"Implicitly exported Android component"},"fullDescription":{"text":"Android components with an '' and no 'android:exported' attribute are implicitly exported, which can allow for improper access to the components themselves and to their data."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Implicitly exported Android component\nThe Android manifest file defines configuration settings for Android applications. In this file, components can be declared with intent filters which specify what the components can do and what types of intents the components can respond to. If the `android:exported` attribute is omitted from the component when an intent filter is included, then the component will be implicitly exported.\n\nAn implicitly exported component could allow for improper access to the component and its data.\n\n\n## Recommendation\nExplicitly set the `android:exported` attribute for every component or use permissions to limit access to the component.\n\n\n## Example\nIn the example below, the `android:exported` attribute is omitted when an intent filter is used.\n\n\n```xml\n\n \n \n android:name=\".Activity\">\n \n \n \n \n \n\n\n```\nA corrected version sets the `android:exported` attribute to `false`.\n\n\n```xml\n\n \n \n android:name=\".Activity\">\n android:exported=\"false\"\n \n \n \n \n \n\n\n```\n\n## References\n* Android Developers: [App Manifest Overview](https://developer.android.com/guide/topics/manifest/manifest-intro).\n* Android Developers: [The <intent-filter> element](https://developer.android.com/guide/topics/manifest/intent-filter-element).\n* Android Developers: [The android:exported attribute](https://developer.android.com/guide/topics/manifest/activity-element#exported).\n* Android Developers: [The android:permission attribute](https://developer.android.com/guide/topics/manifest/activity-element#prmsn).\n* Android Developers: [Safer component exporting](https://developer.android.com/about/versions/12/behavior-changes-12#exported).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n","markdown":"# Implicitly exported Android component\nThe Android manifest file defines configuration settings for Android applications. In this file, components can be declared with intent filters which specify what the components can do and what types of intents the components can respond to. If the `android:exported` attribute is omitted from the component when an intent filter is included, then the component will be implicitly exported.\n\nAn implicitly exported component could allow for improper access to the component and its data.\n\n\n## Recommendation\nExplicitly set the `android:exported` attribute for every component or use permissions to limit access to the component.\n\n\n## Example\nIn the example below, the `android:exported` attribute is omitted when an intent filter is used.\n\n\n```xml\n\n \n \n android:name=\".Activity\">\n \n \n \n \n \n\n\n```\nA corrected version sets the `android:exported` attribute to `false`.\n\n\n```xml\n\n \n \n android:name=\".Activity\">\n android:exported=\"false\"\n \n \n \n \n \n\n\n```\n\n## References\n* Android Developers: [App Manifest Overview](https://developer.android.com/guide/topics/manifest/manifest-intro).\n* Android Developers: [The <intent-filter> element](https://developer.android.com/guide/topics/manifest/intent-filter-element).\n* Android Developers: [The android:exported attribute](https://developer.android.com/guide/topics/manifest/activity-element#exported).\n* Android Developers: [The android:permission attribute](https://developer.android.com/guide/topics/manifest/activity-element#prmsn).\n* Android Developers: [Safer component exporting](https://developer.android.com/about/versions/12/behavior-changes-12#exported).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n"},"properties":{"tags":["security","external/cwe/cwe-926"],"description":"Android components with an '' and no 'android:exported' attribute are implicitly exported, which can allow for improper access to the components themselves and to their data.","id":"java/android/implicitly-exported-component","kind":"problem","name":"Implicitly exported Android component","precision":"high","problem.severity":"warning","security-severity":"8.2"}},{"id":"java/ssrf","name":"java/ssrf","shortDescription":{"text":"Server-side request forgery"},"fullDescription":{"text":"Making web requests based on unvalidated user-input may cause the server to communicate with malicious servers."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Server-side request forgery\nDirectly incorporating user input into an HTTP request without validating the input can facilitate server-side request forgery (SSRF) attacks. In these attacks, the server may be tricked into making a request and interacting with an attacker-controlled server.\n\n\n## Recommendation\nTo guard against SSRF attacks, you should avoid putting user-provided input directly into a request URL. Instead, maintain a list of authorized URLs on the server; then choose from that list based on the input provided. Alternatively, ensure requests constructed from user input are limited to a particular host or more restrictive URL prefix.\n\n\n## Example\nThe following example shows an HTTP request parameter being used directly to form a new request without validating the input, which facilitates SSRF attacks. It also shows how to remedy the problem by validating the user input against a known fixed string.\n\n\n```java\nimport java.net.http.HttpClient;\n\npublic class SSRF extends HttpServlet {\n\tprivate static final String VALID_URI = \"http://lgtm.com\";\n\tprivate HttpClient client = HttpClient.newHttpClient();\n\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\t\tthrows ServletException, IOException {\n\t\tURI uri = new URI(request.getParameter(\"uri\"));\n\t\t// BAD: a request parameter is incorporated without validation into a Http request\n\t\tHttpRequest r = HttpRequest.newBuilder(uri).build();\n\t\tclient.send(r, null);\n\n\t\t// GOOD: the request parameter is validated against a known fixed string\n\t\tif (VALID_URI.equals(request.getParameter(\"uri\"))) {\n\t\t\tHttpRequest r2 = HttpRequest.newBuilder(uri).build();\n\t\t\tclient.send(r2, null);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* [OWASP SSRF](https://owasp.org/www-community/attacks/Server_Side_Request_Forgery)\n* Common Weakness Enumeration: [CWE-918](https://cwe.mitre.org/data/definitions/918.html).\n","markdown":"# Server-side request forgery\nDirectly incorporating user input into an HTTP request without validating the input can facilitate server-side request forgery (SSRF) attacks. In these attacks, the server may be tricked into making a request and interacting with an attacker-controlled server.\n\n\n## Recommendation\nTo guard against SSRF attacks, you should avoid putting user-provided input directly into a request URL. Instead, maintain a list of authorized URLs on the server; then choose from that list based on the input provided. Alternatively, ensure requests constructed from user input are limited to a particular host or more restrictive URL prefix.\n\n\n## Example\nThe following example shows an HTTP request parameter being used directly to form a new request without validating the input, which facilitates SSRF attacks. It also shows how to remedy the problem by validating the user input against a known fixed string.\n\n\n```java\nimport java.net.http.HttpClient;\n\npublic class SSRF extends HttpServlet {\n\tprivate static final String VALID_URI = \"http://lgtm.com\";\n\tprivate HttpClient client = HttpClient.newHttpClient();\n\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\t\tthrows ServletException, IOException {\n\t\tURI uri = new URI(request.getParameter(\"uri\"));\n\t\t// BAD: a request parameter is incorporated without validation into a Http request\n\t\tHttpRequest r = HttpRequest.newBuilder(uri).build();\n\t\tclient.send(r, null);\n\n\t\t// GOOD: the request parameter is validated against a known fixed string\n\t\tif (VALID_URI.equals(request.getParameter(\"uri\"))) {\n\t\t\tHttpRequest r2 = HttpRequest.newBuilder(uri).build();\n\t\t\tclient.send(r2, null);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* [OWASP SSRF](https://owasp.org/www-community/attacks/Server_Side_Request_Forgery)\n* Common Weakness Enumeration: [CWE-918](https://cwe.mitre.org/data/definitions/918.html).\n"},"properties":{"tags":["security","external/cwe/cwe-918","owasp-top10-2021","A10:2021 - Server-Side Request Forgery (SSRF)"],"description":"Making web requests based on unvalidated user-input\n may cause the server to communicate with malicious servers.","id":"java/ssrf","kind":"path-problem","name":"Server-side request forgery","precision":"high","problem.severity":"error","security-severity":"9.1"}},{"id":"java/insecure-bean-validation","name":"java/insecure-bean-validation","shortDescription":{"text":"Insecure Bean Validation"},"fullDescription":{"text":"User-controlled data may be evaluated as a Java EL expression, leading to arbitrary code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Insecure Bean Validation\nCustom error messages for constraint validators support different types of interpolation, including [Java EL expressions](https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/chapter-message-interpolation.html#section-interpolation-with-message-expressions). Controlling part of the message template being passed to `ConstraintValidatorContext.buildConstraintViolationWithTemplate()` argument can lead to arbitrary Java code execution. Unfortunately, it is common that validated (and therefore, normally untrusted) bean properties flow into the custom error message.\n\n\n## Recommendation\nThere are different approaches to remediate the issue:\n\n* Do not include validated bean properties in the custom error message.\n* Use parameterized messages instead of string concatenation. For example:\n```\nHibernateConstraintValidatorContext context =\n constraintValidatorContext.unwrap(HibernateConstraintValidatorContext.class);\ncontext.addMessageParameter(\"foo\", \"bar\");\ncontext.buildConstraintViolationWithTemplate(\"My violation message contains a parameter {foo}\")\n .addConstraintViolation();\n```\n* Sanitize the validated bean properties to make sure that there are no EL expressions. An example of valid sanitization logic can be found [here](https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/messageinterpolation/util/InterpolationHelper.java#L17).\n* Disable the EL interpolation and only use `ParameterMessageInterpolator`:\n```\nValidator validator = Validation.byDefaultProvider()\n .configure()\n .messageInterpolator(new ParameterMessageInterpolator())\n .buildValidatorFactory()\n .getValidator();\n```\n* Replace Hibernate Validator with Apache BVal, which in its latest version does not interpolate EL expressions by default. Note that this replacement may not be a simple drop-in replacement.\n\n## Example\nThe following validator could result in arbitrary Java code execution:\n\n\n```java\nimport javax.validation.ConstraintValidator;\nimport javax.validation.ConstraintValidatorContext;\nimport org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class TestValidator implements ConstraintValidator {\n\n public static class InterpolationHelper {\n\n public static final char BEGIN_TERM = '{';\n public static final char END_TERM = '}';\n public static final char EL_DESIGNATOR = '$';\n public static final char ESCAPE_CHARACTER = '\\\\';\n\n private static final Pattern ESCAPE_MESSAGE_PARAMETER_PATTERN = Pattern.compile( \"([\\\\\" + ESCAPE_CHARACTER + BEGIN_TERM + END_TERM + EL_DESIGNATOR + \"])\" );\n\n private InterpolationHelper() {\n }\n\n public static String escapeMessageParameter(String messageParameter) {\n if ( messageParameter == null ) {\n return null;\n }\n return ESCAPE_MESSAGE_PARAMETER_PATTERN.matcher( messageParameter ).replaceAll( Matcher.quoteReplacement( String.valueOf( ESCAPE_CHARACTER ) ) + \"$1\" );\n }\n\n }\n\n @Override\n public boolean isValid(String object, ConstraintValidatorContext constraintContext) {\n String value = object + \" is invalid\";\n\n // Bad: Bean properties (normally user-controlled) are passed directly to `buildConstraintViolationWithTemplate`\n constraintContext.buildConstraintViolationWithTemplate(value).addConstraintViolation().disableDefaultConstraintViolation();\n\n // Good: Bean properties (normally user-controlled) are escaped \n String escaped = InterpolationHelper.escapeMessageParameter(value);\n constraintContext.buildConstraintViolationWithTemplate(escaped).addConstraintViolation().disableDefaultConstraintViolation();\n\n // Good: Bean properties (normally user-controlled) are parameterized\n HibernateConstraintValidatorContext context = constraintContext.unwrap( HibernateConstraintValidatorContext.class );\n context.addMessageParameter( \"prop\", object );\n context.buildConstraintViolationWithTemplate( \"{prop} is invalid\").addConstraintViolation();\n return false;\n }\n\n}\n\n```\n\n## References\n* Hibernate Reference Guide: [ConstraintValidatorContext](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#_the_code_constraintvalidatorcontext_code).\n* GitHub Security Lab research: [Bean validation](https://securitylab.github.com/research/bean-validation-RCE).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Insecure Bean Validation\nCustom error messages for constraint validators support different types of interpolation, including [Java EL expressions](https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/chapter-message-interpolation.html#section-interpolation-with-message-expressions). Controlling part of the message template being passed to `ConstraintValidatorContext.buildConstraintViolationWithTemplate()` argument can lead to arbitrary Java code execution. Unfortunately, it is common that validated (and therefore, normally untrusted) bean properties flow into the custom error message.\n\n\n## Recommendation\nThere are different approaches to remediate the issue:\n\n* Do not include validated bean properties in the custom error message.\n* Use parameterized messages instead of string concatenation. For example:\n```\nHibernateConstraintValidatorContext context =\n constraintValidatorContext.unwrap(HibernateConstraintValidatorContext.class);\ncontext.addMessageParameter(\"foo\", \"bar\");\ncontext.buildConstraintViolationWithTemplate(\"My violation message contains a parameter {foo}\")\n .addConstraintViolation();\n```\n* Sanitize the validated bean properties to make sure that there are no EL expressions. An example of valid sanitization logic can be found [here](https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/messageinterpolation/util/InterpolationHelper.java#L17).\n* Disable the EL interpolation and only use `ParameterMessageInterpolator`:\n```\nValidator validator = Validation.byDefaultProvider()\n .configure()\n .messageInterpolator(new ParameterMessageInterpolator())\n .buildValidatorFactory()\n .getValidator();\n```\n* Replace Hibernate Validator with Apache BVal, which in its latest version does not interpolate EL expressions by default. Note that this replacement may not be a simple drop-in replacement.\n\n## Example\nThe following validator could result in arbitrary Java code execution:\n\n\n```java\nimport javax.validation.ConstraintValidator;\nimport javax.validation.ConstraintValidatorContext;\nimport org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class TestValidator implements ConstraintValidator {\n\n public static class InterpolationHelper {\n\n public static final char BEGIN_TERM = '{';\n public static final char END_TERM = '}';\n public static final char EL_DESIGNATOR = '$';\n public static final char ESCAPE_CHARACTER = '\\\\';\n\n private static final Pattern ESCAPE_MESSAGE_PARAMETER_PATTERN = Pattern.compile( \"([\\\\\" + ESCAPE_CHARACTER + BEGIN_TERM + END_TERM + EL_DESIGNATOR + \"])\" );\n\n private InterpolationHelper() {\n }\n\n public static String escapeMessageParameter(String messageParameter) {\n if ( messageParameter == null ) {\n return null;\n }\n return ESCAPE_MESSAGE_PARAMETER_PATTERN.matcher( messageParameter ).replaceAll( Matcher.quoteReplacement( String.valueOf( ESCAPE_CHARACTER ) ) + \"$1\" );\n }\n\n }\n\n @Override\n public boolean isValid(String object, ConstraintValidatorContext constraintContext) {\n String value = object + \" is invalid\";\n\n // Bad: Bean properties (normally user-controlled) are passed directly to `buildConstraintViolationWithTemplate`\n constraintContext.buildConstraintViolationWithTemplate(value).addConstraintViolation().disableDefaultConstraintViolation();\n\n // Good: Bean properties (normally user-controlled) are escaped \n String escaped = InterpolationHelper.escapeMessageParameter(value);\n constraintContext.buildConstraintViolationWithTemplate(escaped).addConstraintViolation().disableDefaultConstraintViolation();\n\n // Good: Bean properties (normally user-controlled) are parameterized\n HibernateConstraintValidatorContext context = constraintContext.unwrap( HibernateConstraintValidatorContext.class );\n context.addMessageParameter( \"prop\", object );\n context.buildConstraintViolationWithTemplate( \"{prop} is invalid\").addConstraintViolation();\n return false;\n }\n\n}\n\n```\n\n## References\n* Hibernate Reference Guide: [ConstraintValidatorContext](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#_the_code_constraintvalidatorcontext_code).\n* GitHub Security Lab research: [Bean validation](https://securitylab.github.com/research/bean-validation-RCE).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-094"],"description":"User-controlled data may be evaluated as a Java EL expression, leading to arbitrary code execution.","id":"java/insecure-bean-validation","kind":"path-problem","name":"Insecure Bean Validation","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/spel-expression-injection","name":"java/spel-expression-injection","shortDescription":{"text":"Expression language injection (Spring)"},"fullDescription":{"text":"Evaluation of a user-controlled Spring Expression Language (SpEL) expression may lead to remote code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Expression language injection (Spring)\nThe Spring Expression Language (SpEL) is a powerful expression language provided by the Spring Framework. The language offers many features including invocation of methods available in the JVM. If a SpEL expression is built using attacker-controlled data, and then evaluated in a powerful context, then it may allow the attacker to run arbitrary code.\n\nThe `SpelExpressionParser` class parses a SpEL expression string and returns an `Expression` instance that can be then evaluated by calling one of its methods. By default, an expression is evaluated in a powerful `StandardEvaluationContext` that allows the expression to access other methods available in the JVM.\n\n\n## Recommendation\nIn general, including user input in a SpEL expression should be avoided. If user input must be included in the expression, it should be then evaluated in a limited context that doesn't allow arbitrary method invocation.\n\n\n## Example\nThe following example uses untrusted data to build a SpEL expression and then runs it in the default powerful context.\n\n\n```java\npublic Object evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n\n String string = reader.readLine();\n ExpressionParser parser = new SpelExpressionParser();\n Expression expression = parser.parseExpression(string);\n return expression.getValue();\n }\n}\n```\nThe next example shows how an untrusted SpEL expression can be run in `SimpleEvaluationContext` that doesn't allow accessing arbitrary methods. However, it's recommended to avoid using untrusted input in SpEL expressions.\n\n\n```java\npublic Object evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n\n String string = reader.readLine();\n ExpressionParser parser = new SpelExpressionParser();\n Expression expression = parser.parseExpression(string);\n SimpleEvaluationContext context \n = SimpleEvaluationContext.forReadWriteDataBinding().build();\n return expression.getValue(context);\n }\n}\n```\n\n## References\n* Spring Framework Reference Documentation: [Spring Expression Language (SpEL)](https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/expressions.html).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Expression language injection (Spring)\nThe Spring Expression Language (SpEL) is a powerful expression language provided by the Spring Framework. The language offers many features including invocation of methods available in the JVM. If a SpEL expression is built using attacker-controlled data, and then evaluated in a powerful context, then it may allow the attacker to run arbitrary code.\n\nThe `SpelExpressionParser` class parses a SpEL expression string and returns an `Expression` instance that can be then evaluated by calling one of its methods. By default, an expression is evaluated in a powerful `StandardEvaluationContext` that allows the expression to access other methods available in the JVM.\n\n\n## Recommendation\nIn general, including user input in a SpEL expression should be avoided. If user input must be included in the expression, it should be then evaluated in a limited context that doesn't allow arbitrary method invocation.\n\n\n## Example\nThe following example uses untrusted data to build a SpEL expression and then runs it in the default powerful context.\n\n\n```java\npublic Object evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n\n String string = reader.readLine();\n ExpressionParser parser = new SpelExpressionParser();\n Expression expression = parser.parseExpression(string);\n return expression.getValue();\n }\n}\n```\nThe next example shows how an untrusted SpEL expression can be run in `SimpleEvaluationContext` that doesn't allow accessing arbitrary methods. However, it's recommended to avoid using untrusted input in SpEL expressions.\n\n\n```java\npublic Object evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n\n String string = reader.readLine();\n ExpressionParser parser = new SpelExpressionParser();\n Expression expression = parser.parseExpression(string);\n SimpleEvaluationContext context \n = SimpleEvaluationContext.forReadWriteDataBinding().build();\n return expression.getValue(context);\n }\n}\n```\n\n## References\n* Spring Framework Reference Documentation: [Spring Expression Language (SpEL)](https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/expressions.html).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-094"],"description":"Evaluation of a user-controlled Spring Expression Language (SpEL) expression\n may lead to remote code execution.","id":"java/spel-expression-injection","kind":"path-problem","name":"Expression language injection (Spring)","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/groovy-injection","name":"java/groovy-injection","shortDescription":{"text":"Groovy Language injection"},"fullDescription":{"text":"Evaluation of a user-controlled Groovy script may lead to arbitrary code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Groovy Language injection\nApache Groovy is a powerful, optionally typed and dynamic language, with static-typing and static compilation capabilities. It integrates smoothly with any Java program, and immediately delivers to your application powerful features, including scripting capabilities, Domain-Specific Language authoring, runtime and compile-time meta-programming and functional programming. If a Groovy script is built using attacker-controlled data, and then evaluated, then it may allow the attacker to achieve RCE.\n\n\n## Recommendation\nIt is generally recommended to avoid using untrusted input in a Groovy evaluation. If this is not possible, use a sandbox solution. Developers must also take care that Groovy compile-time metaprogramming can also lead to RCE: it is possible to achieve RCE by compiling a Groovy script (see the article \"Abusing Meta Programming for Unauthenticated RCE!\" linked below). Groovy's `SecureASTCustomizer` allows securing source code by controlling what code constructs are permitted. This is typically done when using Groovy for its scripting or domain specific language (DSL) features. The fundamental problem is that Groovy is a dynamic language, yet `SecureASTCustomizer` works by looking at Groovy AST statically. This makes it very easy for an attacker to bypass many of the intended checks (see \\[Groovy SecureASTCustomizer is harmful\\](https://kohsuke.org/2012/04/27/groovy-secureastcustomizer-is-harmful/)). Therefore, besides `SecureASTCustomizer`, runtime checks are also necessary before calling Groovy methods (see \\[Improved sandboxing of Groovy scripts\\](https://melix.github.io/blog/2015/03/sandboxing.html)). It is also possible to use a block-list method, excluding unwanted classes from being loaded by the JVM. This method is not always recommended, because block-lists can be bypassed by unexpected values.\n\n\n## Example\nThe following example uses untrusted data to evaluate a Groovy script.\n\n\n```java\npublic class GroovyInjection {\n void injectionViaClassLoader(HttpServletRequest request) { \n String script = request.getParameter(\"script\");\n final GroovyClassLoader classLoader = new GroovyClassLoader();\n Class groovy = classLoader.parseClass(script);\n GroovyObject groovyObj = (GroovyObject) groovy.newInstance();\n }\n\n void injectionViaEval(HttpServletRequest request) {\n String script = request.getParameter(\"script\");\n Eval.me(script);\n }\n\n void injectionViaGroovyShell(HttpServletRequest request) {\n GroovyShell shell = new GroovyShell();\n String script = request.getParameter(\"script\");\n shell.evaluate(script);\n }\n\n void injectionViaGroovyShellGroovyCodeSource(HttpServletRequest request) {\n GroovyShell shell = new GroovyShell();\n String script = request.getParameter(\"script\");\n GroovyCodeSource gcs = new GroovyCodeSource(script, \"test\", \"Test\");\n shell.evaluate(gcs);\n }\n}\n\n\n```\nThe following example uses classloader block-list approach to exclude loading dangerous classes.\n\n\n```java\npublic class SandboxGroovyClassLoader extends ClassLoader {\n public SandboxGroovyClassLoader(ClassLoader parent) {\n super(parent);\n }\n\n /* override `loadClass` here to prevent loading sensitive classes, such as `java.lang.Runtime`, `java.lang.ProcessBuilder`, `java.lang.System`, etc. */\n /* Note we must also block `groovy.transform.ASTTest`, `groovy.lang.GrabConfig` and `org.buildobjects.process.ProcBuilder` to prevent compile-time RCE. */\n\n static void runWithSandboxGroovyClassLoader() throws Exception {\n // GOOD: route all class-loading via sand-boxing classloader.\n SandboxGroovyClassLoader classLoader = new GroovyClassLoader(new SandboxGroovyClassLoader());\n \n Class scriptClass = classLoader.parseClass(untrusted.getQueryString());\n Object scriptInstance = scriptClass.newInstance();\n Object result = scriptClass.getDeclaredMethod(\"bar\", new Class[]{}).invoke(scriptInstance, new Object[]{});\n }\n}\n```\n\n## References\n* Orange Tsai: [Abusing Meta Programming for Unauthenticated RCE!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html).\n* Cédric Champeau: [Improved sandboxing of Groovy scripts](https://melix.github.io/blog/2015/03/sandboxing.html).\n* Kohsuke Kawaguchi: [Groovy SecureASTCustomizer is harmful](https://kohsuke.org/2012/04/27/groovy-secureastcustomizer-is-harmful/).\n* Welk1n: [Groovy Injection payloads](https://github.com/welk1n/exploiting-groovy-in-Java/).\n* Charles Chan: [Secure Groovy Script Execution in a Sandbox](https://levelup.gitconnected.com/secure-groovy-script-execution-in-a-sandbox-ea39f80ee87/).\n* Eugene: [Scripting and sandboxing in a JVM environment](https://stringconcat.com/en/scripting-and-sandboxing/).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Groovy Language injection\nApache Groovy is a powerful, optionally typed and dynamic language, with static-typing and static compilation capabilities. It integrates smoothly with any Java program, and immediately delivers to your application powerful features, including scripting capabilities, Domain-Specific Language authoring, runtime and compile-time meta-programming and functional programming. If a Groovy script is built using attacker-controlled data, and then evaluated, then it may allow the attacker to achieve RCE.\n\n\n## Recommendation\nIt is generally recommended to avoid using untrusted input in a Groovy evaluation. If this is not possible, use a sandbox solution. Developers must also take care that Groovy compile-time metaprogramming can also lead to RCE: it is possible to achieve RCE by compiling a Groovy script (see the article \"Abusing Meta Programming for Unauthenticated RCE!\" linked below). Groovy's `SecureASTCustomizer` allows securing source code by controlling what code constructs are permitted. This is typically done when using Groovy for its scripting or domain specific language (DSL) features. The fundamental problem is that Groovy is a dynamic language, yet `SecureASTCustomizer` works by looking at Groovy AST statically. This makes it very easy for an attacker to bypass many of the intended checks (see \\[Groovy SecureASTCustomizer is harmful\\](https://kohsuke.org/2012/04/27/groovy-secureastcustomizer-is-harmful/)). Therefore, besides `SecureASTCustomizer`, runtime checks are also necessary before calling Groovy methods (see \\[Improved sandboxing of Groovy scripts\\](https://melix.github.io/blog/2015/03/sandboxing.html)). It is also possible to use a block-list method, excluding unwanted classes from being loaded by the JVM. This method is not always recommended, because block-lists can be bypassed by unexpected values.\n\n\n## Example\nThe following example uses untrusted data to evaluate a Groovy script.\n\n\n```java\npublic class GroovyInjection {\n void injectionViaClassLoader(HttpServletRequest request) { \n String script = request.getParameter(\"script\");\n final GroovyClassLoader classLoader = new GroovyClassLoader();\n Class groovy = classLoader.parseClass(script);\n GroovyObject groovyObj = (GroovyObject) groovy.newInstance();\n }\n\n void injectionViaEval(HttpServletRequest request) {\n String script = request.getParameter(\"script\");\n Eval.me(script);\n }\n\n void injectionViaGroovyShell(HttpServletRequest request) {\n GroovyShell shell = new GroovyShell();\n String script = request.getParameter(\"script\");\n shell.evaluate(script);\n }\n\n void injectionViaGroovyShellGroovyCodeSource(HttpServletRequest request) {\n GroovyShell shell = new GroovyShell();\n String script = request.getParameter(\"script\");\n GroovyCodeSource gcs = new GroovyCodeSource(script, \"test\", \"Test\");\n shell.evaluate(gcs);\n }\n}\n\n\n```\nThe following example uses classloader block-list approach to exclude loading dangerous classes.\n\n\n```java\npublic class SandboxGroovyClassLoader extends ClassLoader {\n public SandboxGroovyClassLoader(ClassLoader parent) {\n super(parent);\n }\n\n /* override `loadClass` here to prevent loading sensitive classes, such as `java.lang.Runtime`, `java.lang.ProcessBuilder`, `java.lang.System`, etc. */\n /* Note we must also block `groovy.transform.ASTTest`, `groovy.lang.GrabConfig` and `org.buildobjects.process.ProcBuilder` to prevent compile-time RCE. */\n\n static void runWithSandboxGroovyClassLoader() throws Exception {\n // GOOD: route all class-loading via sand-boxing classloader.\n SandboxGroovyClassLoader classLoader = new GroovyClassLoader(new SandboxGroovyClassLoader());\n \n Class scriptClass = classLoader.parseClass(untrusted.getQueryString());\n Object scriptInstance = scriptClass.newInstance();\n Object result = scriptClass.getDeclaredMethod(\"bar\", new Class[]{}).invoke(scriptInstance, new Object[]{});\n }\n}\n```\n\n## References\n* Orange Tsai: [Abusing Meta Programming for Unauthenticated RCE!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html).\n* Cédric Champeau: [Improved sandboxing of Groovy scripts](https://melix.github.io/blog/2015/03/sandboxing.html).\n* Kohsuke Kawaguchi: [Groovy SecureASTCustomizer is harmful](https://kohsuke.org/2012/04/27/groovy-secureastcustomizer-is-harmful/).\n* Welk1n: [Groovy Injection payloads](https://github.com/welk1n/exploiting-groovy-in-Java/).\n* Charles Chan: [Secure Groovy Script Execution in a Sandbox](https://levelup.gitconnected.com/secure-groovy-script-execution-in-a-sandbox-ea39f80ee87/).\n* Eugene: [Scripting and sandboxing in a JVM environment](https://stringconcat.com/en/scripting-and-sandboxing/).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-094"],"description":"Evaluation of a user-controlled Groovy script\n may lead to arbitrary code execution.","id":"java/groovy-injection","kind":"path-problem","name":"Groovy Language injection","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/mvel-expression-injection","name":"java/mvel-expression-injection","shortDescription":{"text":"Expression language injection (MVEL)"},"fullDescription":{"text":"Evaluation of a user-controlled MVEL expression may lead to remote code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Expression language injection (MVEL)\nMVEL is an expression language based on Java-syntax, which offers many features including invocation of methods available in the JVM. If a MVEL expression is built using attacker-controlled data, and then evaluated, then it may allow attackers to run arbitrary code.\n\n\n## Recommendation\nIncluding user input in a MVEL expression should be avoided.\n\n\n## Example\nIn the following sample, the first example uses untrusted data to build a MVEL expression and then runs it in the default context. In the second example, the untrusted data is validated with a custom method that checks that the expression does not contain unexpected code before evaluating it.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String expression = reader.readLine();\n // BAD: the user-provided expression is directly evaluated\n MVEL.eval(expression);\n }\n}\n\npublic void safeEvaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String expression = reader.readLine();\n // GOOD: the user-provided expression is validated before evaluation\n validateExpression(expression);\n MVEL.eval(expression);\n }\n}\n\nprivate void validateExpression(String expression) {\n // Validate that the expression does not contain unexpected code.\n // For instance, this can be done with allow-lists or deny-lists of code patterns.\n}\n```\n\n## References\n* MVEL Documentation: [Language Guide for 2.0](http://mvel.documentnode.com/).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Expression language injection (MVEL)\nMVEL is an expression language based on Java-syntax, which offers many features including invocation of methods available in the JVM. If a MVEL expression is built using attacker-controlled data, and then evaluated, then it may allow attackers to run arbitrary code.\n\n\n## Recommendation\nIncluding user input in a MVEL expression should be avoided.\n\n\n## Example\nIn the following sample, the first example uses untrusted data to build a MVEL expression and then runs it in the default context. In the second example, the untrusted data is validated with a custom method that checks that the expression does not contain unexpected code before evaluating it.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String expression = reader.readLine();\n // BAD: the user-provided expression is directly evaluated\n MVEL.eval(expression);\n }\n}\n\npublic void safeEvaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String expression = reader.readLine();\n // GOOD: the user-provided expression is validated before evaluation\n validateExpression(expression);\n MVEL.eval(expression);\n }\n}\n\nprivate void validateExpression(String expression) {\n // Validate that the expression does not contain unexpected code.\n // For instance, this can be done with allow-lists or deny-lists of code patterns.\n}\n```\n\n## References\n* MVEL Documentation: [Language Guide for 2.0](http://mvel.documentnode.com/).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-094"],"description":"Evaluation of a user-controlled MVEL expression\n may lead to remote code execution.","id":"java/mvel-expression-injection","kind":"path-problem","name":"Expression language injection (MVEL)","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/jexl-expression-injection","name":"java/jexl-expression-injection","shortDescription":{"text":"Expression language injection (JEXL)"},"fullDescription":{"text":"Evaluation of a user-controlled JEXL expression may lead to arbitrary code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Expression language injection (JEXL)\nJava EXpression Language (JEXL) is a simple expression language provided by the Apache Commons JEXL library. The syntax is close to a mix of ECMAScript and shell-script. The language allows invocation of methods available in the JVM. If a JEXL expression is built using attacker-controlled data, and then evaluated, then it may allow the attacker to run arbitrary code.\n\n\n## Recommendation\nIt is generally recommended to avoid using untrusted input in a JEXL expression. If it is not possible, JEXL expressions should be run in a sandbox that allows accessing only explicitly allowed classes.\n\n\n## Example\nThe following example uses untrusted data to build and run a JEXL expression.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String input = reader.readLine();\n JexlEngine jexl = new JexlBuilder().create();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n}\n```\nThe next example shows how an untrusted JEXL expression can be run in a sandbox that allows accessing only methods in the `java.lang.Math` class. The sandbox is implemented using `JexlSandbox` class that is provided by Apache Commons JEXL 3.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n JexlSandbox onlyMath = new JexlSandbox(false);\n onlyMath.white(\"java.lang.Math\");\n JexlEngine jexl = new JexlBuilder().sandbox(onlyMath).create();\n \n String input = reader.readLine();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n}\n```\nThe next example shows another way how a sandbox can be implemented. It uses a custom implementation of `JexlUberspect` that checks if callees are instances of allowed classes.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n JexlUberspect sandbox = new JexlUberspectSandbox();\n JexlEngine jexl = new JexlBuilder().uberspect(sandbox).create();\n \n String input = reader.readLine();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n\n private static class JexlUberspectSandbox implements JexlUberspect {\n\n private static final List ALLOWED_CLASSES =\n Arrays.asList(\"java.lang.Math\", \"java.util.Random\");\n\n private final JexlUberspect uberspect = new JexlBuilder().create().getUberspect();\n\n private void checkAccess(Object obj) {\n if (!ALLOWED_CLASSES.contains(obj.getClass().getCanonicalName())) {\n throw new AccessControlException(\"Not allowed\");\n }\n }\n\n @Override\n public JexlMethod getMethod(Object obj, String method, Object... args) {\n checkAccess(obj);\n return uberspect.getMethod(obj, method, args);\n }\n\n @Override\n public List getResolvers(JexlOperator op, Object obj) {\n checkAccess(obj);\n return uberspect.getResolvers(op, obj);\n }\n\n @Override\n public void setClassLoader(ClassLoader loader) {\n uberspect.setClassLoader(loader);\n }\n\n @Override\n public int getVersion() {\n return uberspect.getVersion();\n }\n\n @Override\n public JexlMethod getConstructor(Object obj, Object... args) {\n checkAccess(obj);\n return uberspect.getConstructor(obj, args);\n }\n\n @Override\n public JexlPropertyGet getPropertyGet(Object obj, Object identifier) {\n checkAccess(obj);\n return uberspect.getPropertyGet(obj, identifier);\n }\n\n @Override\n public JexlPropertyGet getPropertyGet(List resolvers, Object obj, Object identifier) {\n checkAccess(obj);\n return uberspect.getPropertyGet(resolvers, obj, identifier);\n }\n\n @Override\n public JexlPropertySet getPropertySet(Object obj, Object identifier, Object arg) {\n checkAccess(obj);\n return uberspect.getPropertySet(obj, identifier, arg);\n }\n\n @Override\n public JexlPropertySet getPropertySet(List resolvers, Object obj, Object identifier, Object arg) {\n checkAccess(obj);\n return uberspect.getPropertySet(resolvers, obj, identifier, arg);\n }\n\n @Override\n public Iterator getIterator(Object obj) {\n checkAccess(obj);\n return uberspect.getIterator(obj);\n }\n\n @Override\n public JexlArithmetic.Uberspect getArithmetic(JexlArithmetic arithmetic) {\n return uberspect.getArithmetic(arithmetic);\n } \n }\n}\n```\n\n## References\n* Apache Commons JEXL: [Project page](https://commons.apache.org/proper/commons-jexl/).\n* Apache Commons JEXL documentation: [JEXL 2.1.1 API](https://commons.apache.org/proper/commons-jexl/javadocs/apidocs-2.1.1/).\n* Apache Commons JEXL documentation: [JEXL 3.1 API](https://commons.apache.org/proper/commons-jexl/apidocs/index.html).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Expression language injection (JEXL)\nJava EXpression Language (JEXL) is a simple expression language provided by the Apache Commons JEXL library. The syntax is close to a mix of ECMAScript and shell-script. The language allows invocation of methods available in the JVM. If a JEXL expression is built using attacker-controlled data, and then evaluated, then it may allow the attacker to run arbitrary code.\n\n\n## Recommendation\nIt is generally recommended to avoid using untrusted input in a JEXL expression. If it is not possible, JEXL expressions should be run in a sandbox that allows accessing only explicitly allowed classes.\n\n\n## Example\nThe following example uses untrusted data to build and run a JEXL expression.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String input = reader.readLine();\n JexlEngine jexl = new JexlBuilder().create();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n}\n```\nThe next example shows how an untrusted JEXL expression can be run in a sandbox that allows accessing only methods in the `java.lang.Math` class. The sandbox is implemented using `JexlSandbox` class that is provided by Apache Commons JEXL 3.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n JexlSandbox onlyMath = new JexlSandbox(false);\n onlyMath.white(\"java.lang.Math\");\n JexlEngine jexl = new JexlBuilder().sandbox(onlyMath).create();\n \n String input = reader.readLine();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n}\n```\nThe next example shows another way how a sandbox can be implemented. It uses a custom implementation of `JexlUberspect` that checks if callees are instances of allowed classes.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n JexlUberspect sandbox = new JexlUberspectSandbox();\n JexlEngine jexl = new JexlBuilder().uberspect(sandbox).create();\n \n String input = reader.readLine();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n\n private static class JexlUberspectSandbox implements JexlUberspect {\n\n private static final List ALLOWED_CLASSES =\n Arrays.asList(\"java.lang.Math\", \"java.util.Random\");\n\n private final JexlUberspect uberspect = new JexlBuilder().create().getUberspect();\n\n private void checkAccess(Object obj) {\n if (!ALLOWED_CLASSES.contains(obj.getClass().getCanonicalName())) {\n throw new AccessControlException(\"Not allowed\");\n }\n }\n\n @Override\n public JexlMethod getMethod(Object obj, String method, Object... args) {\n checkAccess(obj);\n return uberspect.getMethod(obj, method, args);\n }\n\n @Override\n public List getResolvers(JexlOperator op, Object obj) {\n checkAccess(obj);\n return uberspect.getResolvers(op, obj);\n }\n\n @Override\n public void setClassLoader(ClassLoader loader) {\n uberspect.setClassLoader(loader);\n }\n\n @Override\n public int getVersion() {\n return uberspect.getVersion();\n }\n\n @Override\n public JexlMethod getConstructor(Object obj, Object... args) {\n checkAccess(obj);\n return uberspect.getConstructor(obj, args);\n }\n\n @Override\n public JexlPropertyGet getPropertyGet(Object obj, Object identifier) {\n checkAccess(obj);\n return uberspect.getPropertyGet(obj, identifier);\n }\n\n @Override\n public JexlPropertyGet getPropertyGet(List resolvers, Object obj, Object identifier) {\n checkAccess(obj);\n return uberspect.getPropertyGet(resolvers, obj, identifier);\n }\n\n @Override\n public JexlPropertySet getPropertySet(Object obj, Object identifier, Object arg) {\n checkAccess(obj);\n return uberspect.getPropertySet(obj, identifier, arg);\n }\n\n @Override\n public JexlPropertySet getPropertySet(List resolvers, Object obj, Object identifier, Object arg) {\n checkAccess(obj);\n return uberspect.getPropertySet(resolvers, obj, identifier, arg);\n }\n\n @Override\n public Iterator getIterator(Object obj) {\n checkAccess(obj);\n return uberspect.getIterator(obj);\n }\n\n @Override\n public JexlArithmetic.Uberspect getArithmetic(JexlArithmetic arithmetic) {\n return uberspect.getArithmetic(arithmetic);\n } \n }\n}\n```\n\n## References\n* Apache Commons JEXL: [Project page](https://commons.apache.org/proper/commons-jexl/).\n* Apache Commons JEXL documentation: [JEXL 2.1.1 API](https://commons.apache.org/proper/commons-jexl/javadocs/apidocs-2.1.1/).\n* Apache Commons JEXL documentation: [JEXL 3.1 API](https://commons.apache.org/proper/commons-jexl/apidocs/index.html).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-094"],"description":"Evaluation of a user-controlled JEXL expression\n may lead to arbitrary code execution.","id":"java/jexl-expression-injection","kind":"path-problem","name":"Expression language injection (JEXL)","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/server-side-template-injection","name":"java/server-side-template-injection","shortDescription":{"text":"Server-side template injection"},"fullDescription":{"text":"Untrusted input interpreted as a template can lead to remote code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Server-side template injection\nTemplate injection occurs when user input is embedded in a template's code in an unsafe manner. An attacker can use native template syntax to inject a malicious payload into a template, which is then executed server-side. This permits the attacker to run arbitrary code in the server's context.\n\n\n## Recommendation\nTo fix this, ensure that untrusted input is not used as part of a template's code. If the application requirements do not allow this, use a sandboxed environment where access to unsafe attributes and methods is prohibited.\n\n\n## Example\nIn the example given below, an untrusted HTTP parameter `code` is used as a Velocity template string. This can lead to remote code execution.\n\n\n```java\n@Controller\npublic class VelocitySSTI {\n\n\t@GetMapping(value = \"bad\")\n\tpublic void bad(HttpServletRequest request) {\n\t\tVelocity.init();\n\n\t\tString code = request.getParameter(\"code\");\n\n\t\tVelocityContext context = new VelocityContext();\n\n\t\tcontext.put(\"name\", \"Velocity\");\n\t\tcontext.put(\"project\", \"Jakarta\");\n\n\t\tStringWriter w = new StringWriter();\n\t\t// evaluate( Context context, Writer out, String logTag, String instring )\n\t\tVelocity.evaluate(context, w, \"mystring\", code);\n\t}\n}\n\n```\nIn the next example, the problem is avoided by using a fixed template string `s`. Since the template's code is not attacker-controlled in this case, this solution prevents the execution of untrusted code.\n\n\n```java\n@Controller\npublic class VelocitySSTI {\n\n\t@GetMapping(value = \"good\")\n\tpublic void good(HttpServletRequest request) {\n\t\tVelocity.init();\n\t\tVelocityContext context = new VelocityContext();\n\n\t\tcontext.put(\"name\", \"Velocity\");\n\t\tcontext.put(\"project\", \"Jakarta\");\n\n\t\tString s = \"We are using $project $name to render this.\";\n\t\tStringWriter w = new StringWriter();\n\t\tVelocity.evaluate(context, w, \"mystring\", s);\n\t\tSystem.out.println(\" string : \" + w);\n\t}\n}\n\n```\n\n## References\n* Portswigger: [Server Side Template Injection](https://portswigger.net/web-security/server-side-template-injection).\n* Common Weakness Enumeration: [CWE-1336](https://cwe.mitre.org/data/definitions/1336.html).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Server-side template injection\nTemplate injection occurs when user input is embedded in a template's code in an unsafe manner. An attacker can use native template syntax to inject a malicious payload into a template, which is then executed server-side. This permits the attacker to run arbitrary code in the server's context.\n\n\n## Recommendation\nTo fix this, ensure that untrusted input is not used as part of a template's code. If the application requirements do not allow this, use a sandboxed environment where access to unsafe attributes and methods is prohibited.\n\n\n## Example\nIn the example given below, an untrusted HTTP parameter `code` is used as a Velocity template string. This can lead to remote code execution.\n\n\n```java\n@Controller\npublic class VelocitySSTI {\n\n\t@GetMapping(value = \"bad\")\n\tpublic void bad(HttpServletRequest request) {\n\t\tVelocity.init();\n\n\t\tString code = request.getParameter(\"code\");\n\n\t\tVelocityContext context = new VelocityContext();\n\n\t\tcontext.put(\"name\", \"Velocity\");\n\t\tcontext.put(\"project\", \"Jakarta\");\n\n\t\tStringWriter w = new StringWriter();\n\t\t// evaluate( Context context, Writer out, String logTag, String instring )\n\t\tVelocity.evaluate(context, w, \"mystring\", code);\n\t}\n}\n\n```\nIn the next example, the problem is avoided by using a fixed template string `s`. Since the template's code is not attacker-controlled in this case, this solution prevents the execution of untrusted code.\n\n\n```java\n@Controller\npublic class VelocitySSTI {\n\n\t@GetMapping(value = \"good\")\n\tpublic void good(HttpServletRequest request) {\n\t\tVelocity.init();\n\t\tVelocityContext context = new VelocityContext();\n\n\t\tcontext.put(\"name\", \"Velocity\");\n\t\tcontext.put(\"project\", \"Jakarta\");\n\n\t\tString s = \"We are using $project $name to render this.\";\n\t\tStringWriter w = new StringWriter();\n\t\tVelocity.evaluate(context, w, \"mystring\", s);\n\t\tSystem.out.println(\" string : \" + w);\n\t}\n}\n\n```\n\n## References\n* Portswigger: [Server Side Template Injection](https://portswigger.net/web-security/server-side-template-injection).\n* Common Weakness Enumeration: [CWE-1336](https://cwe.mitre.org/data/definitions/1336.html).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-1336","external/cwe/cwe-094"],"description":"Untrusted input interpreted as a template can lead to remote code execution.","id":"java/server-side-template-injection","kind":"path-problem","name":"Server-side template injection","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/spring-disabled-csrf-protection","name":"java/spring-disabled-csrf-protection","shortDescription":{"text":"Disabled Spring CSRF protection"},"fullDescription":{"text":"Disabling CSRF protection makes the application vulnerable to a Cross-Site Request Forgery (CSRF) attack."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Disabled Spring CSRF protection\nWhen you set up a web server to receive a request from a client without any mechanism for verifying that it was intentionally sent, then it is vulnerable to attack. An attacker can trick a client into making an unintended request to the web server that will be treated as an authentic request. This can be done via a URL, image load, XMLHttpRequest, etc. and can result in exposure of data or unintended code execution.\n\n\n## Recommendation\nWhen you use Spring, Cross-Site Request Forgery (CSRF) protection is enabled by default. Spring's recommendation is to use CSRF protection for any request that could be processed by a browser client by normal users.\n\n\n## Example\nThe following example shows the Spring Java configuration with CSRF protection disabled. This type of configuration should only be used if you are creating a service that is used only by non-browser clients.\n\n\n```java\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\n\n@EnableWebSecurity\n@Configuration\npublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {\n @Override\n protected void configure(HttpSecurity http) throws Exception {\n http\n .csrf(csrf ->\n // BAD - CSRF protection shouldn't be disabled\n csrf.disable() \n );\n }\n}\n\n```\n\n## References\n* OWASP: [Cross-Site Request Forgery (CSRF)](https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)).\n* Spring Security Reference: [ Cross Site Request Forgery (CSRF) for Servlet Environments ](https://docs.spring.io/spring-security/site/docs/current/reference/html5/#servlet-csrf).\n* Common Weakness Enumeration: [CWE-352](https://cwe.mitre.org/data/definitions/352.html).\n","markdown":"# Disabled Spring CSRF protection\nWhen you set up a web server to receive a request from a client without any mechanism for verifying that it was intentionally sent, then it is vulnerable to attack. An attacker can trick a client into making an unintended request to the web server that will be treated as an authentic request. This can be done via a URL, image load, XMLHttpRequest, etc. and can result in exposure of data or unintended code execution.\n\n\n## Recommendation\nWhen you use Spring, Cross-Site Request Forgery (CSRF) protection is enabled by default. Spring's recommendation is to use CSRF protection for any request that could be processed by a browser client by normal users.\n\n\n## Example\nThe following example shows the Spring Java configuration with CSRF protection disabled. This type of configuration should only be used if you are creating a service that is used only by non-browser clients.\n\n\n```java\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\n\n@EnableWebSecurity\n@Configuration\npublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {\n @Override\n protected void configure(HttpSecurity http) throws Exception {\n http\n .csrf(csrf ->\n // BAD - CSRF protection shouldn't be disabled\n csrf.disable() \n );\n }\n}\n\n```\n\n## References\n* OWASP: [Cross-Site Request Forgery (CSRF)](https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)).\n* Spring Security Reference: [ Cross Site Request Forgery (CSRF) for Servlet Environments ](https://docs.spring.io/spring-security/site/docs/current/reference/html5/#servlet-csrf).\n* Common Weakness Enumeration: [CWE-352](https://cwe.mitre.org/data/definitions/352.html).\n"},"properties":{"tags":["security","external/cwe/cwe-352","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Disabling CSRF protection makes the application vulnerable to\n a Cross-Site Request Forgery (CSRF) attack.","id":"java/spring-disabled-csrf-protection","kind":"problem","name":"Disabled Spring CSRF protection","precision":"high","problem.severity":"error","security-severity":"8.8"}},{"id":"java/weak-cryptographic-algorithm","name":"java/weak-cryptographic-algorithm","shortDescription":{"text":"Use of a broken or risky cryptographic algorithm"},"fullDescription":{"text":"Using broken or weak cryptographic algorithms can allow an attacker to compromise security."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Use of a broken or risky cryptographic algorithm\nUsing broken or weak cryptographic algorithms can leave data vulnerable to being decrypted.\n\nMany cryptographic algorithms provided by cryptography libraries are known to be weak, or flawed. Using such an algorithm means that an attacker may be able to easily decrypt the encrypted data.\n\n\n## Recommendation\nEnsure that you use a strong, modern cryptographic algorithm. Use at least AES-128 or RSA-2048. Do not use the ECB encryption mode since it is vulnerable to replay and other attacks.\n\n\n## Example\nThe following code shows an example of using a java `Cipher` to encrypt some data. When creating a `Cipher` instance, you must specify the encryption algorithm to use. The first example uses DES, which is an older algorithm that is now considered weak. The second example uses AES, which is a strong modern algorithm.\n\n\n```java\n// BAD: DES is a weak algorithm \nCipher des = Cipher.getInstance(\"DES\");\ncipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);\n\nbyte[] encrypted = cipher.doFinal(input.getBytes(\"UTF-8\"));\n\n// ...\n\n// GOOD: AES is a strong algorithm\nCipher aes = Cipher.getInstance(\"AES\");\n\n// ...\n\n```\n\n## References\n* NIST, FIPS 140 Annex a: [ Approved Security Functions](http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf).\n* NIST, SP 800-131A: [ Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf).\n* Common Weakness Enumeration: [CWE-327](https://cwe.mitre.org/data/definitions/327.html).\n* Common Weakness Enumeration: [CWE-328](https://cwe.mitre.org/data/definitions/328.html).\n","markdown":"# Use of a broken or risky cryptographic algorithm\nUsing broken or weak cryptographic algorithms can leave data vulnerable to being decrypted.\n\nMany cryptographic algorithms provided by cryptography libraries are known to be weak, or flawed. Using such an algorithm means that an attacker may be able to easily decrypt the encrypted data.\n\n\n## Recommendation\nEnsure that you use a strong, modern cryptographic algorithm. Use at least AES-128 or RSA-2048. Do not use the ECB encryption mode since it is vulnerable to replay and other attacks.\n\n\n## Example\nThe following code shows an example of using a java `Cipher` to encrypt some data. When creating a `Cipher` instance, you must specify the encryption algorithm to use. The first example uses DES, which is an older algorithm that is now considered weak. The second example uses AES, which is a strong modern algorithm.\n\n\n```java\n// BAD: DES is a weak algorithm \nCipher des = Cipher.getInstance(\"DES\");\ncipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);\n\nbyte[] encrypted = cipher.doFinal(input.getBytes(\"UTF-8\"));\n\n// ...\n\n// GOOD: AES is a strong algorithm\nCipher aes = Cipher.getInstance(\"AES\");\n\n// ...\n\n```\n\n## References\n* NIST, FIPS 140 Annex a: [ Approved Security Functions](http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf).\n* NIST, SP 800-131A: [ Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf).\n* Common Weakness Enumeration: [CWE-327](https://cwe.mitre.org/data/definitions/327.html).\n* Common Weakness Enumeration: [CWE-328](https://cwe.mitre.org/data/definitions/328.html).\n"},"properties":{"tags":["security","external/cwe/cwe-327","external/cwe/cwe-328","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using broken or weak cryptographic algorithms can allow an attacker to compromise security.","id":"java/weak-cryptographic-algorithm","kind":"path-problem","name":"Use of a broken or risky cryptographic algorithm","precision":"high","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/jndi-injection","name":"java/jndi-injection","shortDescription":{"text":"JNDI lookup with user-controlled name"},"fullDescription":{"text":"Performing a JNDI lookup with a user-controlled name can lead to the download of an untrusted object and to execution of arbitrary code."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# JNDI lookup with user-controlled name\nThe Java Naming and Directory Interface (JNDI) is a Java API for a directory service that allows Java software clients to discover and look up data and resources (in the form of Java objects) via a name. If the name being used to look up the data is controlled by the user, it can point to a malicious server, which can return an arbitrary object. In the worst case, this can allow remote code execution.\n\n\n## Recommendation\nThe general recommendation is to avoid passing untrusted data to the `InitialContext.lookup ` method. If the name being used to look up the object must be provided by the user, make sure that it's not in the form of an absolute URL or that it's the URL pointing to a trused server.\n\n\n## Example\nIn the following examples, the code accepts a name from the user, which it uses to look up an object.\n\nIn the first example, the user provided name is used to look up an object.\n\nThe second example validates the name before using it to look up an object.\n\n\n```java\nimport javax.naming.Context;\nimport javax.naming.InitialContext;\n\npublic void jndiLookup(HttpServletRequest request) throws NamingException {\n String name = request.getParameter(\"name\");\n\n Hashtable env = new Hashtable();\n env.put(Context.INITIAL_CONTEXT_FACTORY, \"com.sun.jndi.rmi.registry.RegistryContextFactory\");\n env.put(Context.PROVIDER_URL, \"rmi://trusted-server:1099\");\n InitialContext ctx = new InitialContext(env);\n\n // BAD: User input used in lookup\n ctx.lookup(name);\n\n // GOOD: The name is validated before being used in lookup\n if (isValid(name)) {\n ctx.lookup(name);\n } else {\n // Reject the request\n }\n}\n```\n\n## References\n* Oracle: [Java Naming and Directory Interface (JNDI)](https://docs.oracle.com/javase/8/docs/technotes/guides/jndi/).\n* Black Hat materials: [A Journey from JNDI/LDAP Manipulation to Remote Code Execution Dream Land](https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE-wp.pdf).\n* Veracode: [Exploiting JNDI Injections in Java](https://www.veracode.com/blog/research/exploiting-jndi-injections-java).\n* Common Weakness Enumeration: [CWE-74](https://cwe.mitre.org/data/definitions/74.html).\n","markdown":"# JNDI lookup with user-controlled name\nThe Java Naming and Directory Interface (JNDI) is a Java API for a directory service that allows Java software clients to discover and look up data and resources (in the form of Java objects) via a name. If the name being used to look up the data is controlled by the user, it can point to a malicious server, which can return an arbitrary object. In the worst case, this can allow remote code execution.\n\n\n## Recommendation\nThe general recommendation is to avoid passing untrusted data to the `InitialContext.lookup ` method. If the name being used to look up the object must be provided by the user, make sure that it's not in the form of an absolute URL or that it's the URL pointing to a trused server.\n\n\n## Example\nIn the following examples, the code accepts a name from the user, which it uses to look up an object.\n\nIn the first example, the user provided name is used to look up an object.\n\nThe second example validates the name before using it to look up an object.\n\n\n```java\nimport javax.naming.Context;\nimport javax.naming.InitialContext;\n\npublic void jndiLookup(HttpServletRequest request) throws NamingException {\n String name = request.getParameter(\"name\");\n\n Hashtable env = new Hashtable();\n env.put(Context.INITIAL_CONTEXT_FACTORY, \"com.sun.jndi.rmi.registry.RegistryContextFactory\");\n env.put(Context.PROVIDER_URL, \"rmi://trusted-server:1099\");\n InitialContext ctx = new InitialContext(env);\n\n // BAD: User input used in lookup\n ctx.lookup(name);\n\n // GOOD: The name is validated before being used in lookup\n if (isValid(name)) {\n ctx.lookup(name);\n } else {\n // Reject the request\n }\n}\n```\n\n## References\n* Oracle: [Java Naming and Directory Interface (JNDI)](https://docs.oracle.com/javase/8/docs/technotes/guides/jndi/).\n* Black Hat materials: [A Journey from JNDI/LDAP Manipulation to Remote Code Execution Dream Land](https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE-wp.pdf).\n* Veracode: [Exploiting JNDI Injections in Java](https://www.veracode.com/blog/research/exploiting-jndi-injections-java).\n* Common Weakness Enumeration: [CWE-74](https://cwe.mitre.org/data/definitions/74.html).\n"},"properties":{"tags":["security","external/cwe/cwe-074"],"description":"Performing a JNDI lookup with a user-controlled name can lead to the download of an untrusted\n object and to execution of arbitrary code.","id":"java/jndi-injection","kind":"path-problem","name":"JNDI lookup with user-controlled name","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/xslt-injection","name":"java/xslt-injection","shortDescription":{"text":"XSLT transformation with user-controlled stylesheet"},"fullDescription":{"text":"Performing an XSLT transformation with user-controlled stylesheets can lead to information disclosure or execution of arbitrary code."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# XSLT transformation with user-controlled stylesheet\nXSLT (Extensible Stylesheet Language Transformations) is a language for transforming XML documents into other XML documents or other formats. Processing unvalidated XSLT stylesheets can allow attackers to read arbitrary files from the filesystem or to execute arbitrary code.\n\n\n## Recommendation\nThe general recommendation is to not process untrusted XSLT stylesheets. If user-provided stylesheets must be processed, enable the secure processing mode.\n\n\n## Example\nIn the following examples, the code accepts an XSLT stylesheet from the user and processes it.\n\nIn the first example, the user-provided XSLT stylesheet is parsed and processed.\n\nIn the second example, secure processing mode is enabled.\n\n\n```java\nimport javax.xml.XMLConstants;\nimport javax.xml.transform.TransformerFactory;\nimport javax.xml.transform.stream.StreamResult;\nimport javax.xml.transform.stream.StreamSource;\n\npublic void transform(Socket socket, String inputXml) throws Exception {\n StreamSource xslt = new StreamSource(socket.getInputStream());\n StreamSource xml = new StreamSource(new StringReader(inputXml));\n StringWriter result = new StringWriter();\n TransformerFactory factory = TransformerFactory.newInstance();\n\n // BAD: User provided XSLT stylesheet is processed\n factory.newTransformer(xslt).transform(xml, new StreamResult(result));\n\n // GOOD: The secure processing mode is enabled\n factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);\n factory.newTransformer(xslt).transform(xml, new StreamResult(result));\n} \n```\n\n## References\n* Wikipedia: [XSLT](https://en.wikipedia.org/wiki/XSLT).\n* The Java Tutorials: [Transforming XML Data with XSLT](https://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html).\n* [XSLT Injection Basics](https://blog.hunniccyber.com/ektron-cms-remote-code-execution-xslt-transform-injection-java/).\n* Common Weakness Enumeration: [CWE-74](https://cwe.mitre.org/data/definitions/74.html).\n","markdown":"# XSLT transformation with user-controlled stylesheet\nXSLT (Extensible Stylesheet Language Transformations) is a language for transforming XML documents into other XML documents or other formats. Processing unvalidated XSLT stylesheets can allow attackers to read arbitrary files from the filesystem or to execute arbitrary code.\n\n\n## Recommendation\nThe general recommendation is to not process untrusted XSLT stylesheets. If user-provided stylesheets must be processed, enable the secure processing mode.\n\n\n## Example\nIn the following examples, the code accepts an XSLT stylesheet from the user and processes it.\n\nIn the first example, the user-provided XSLT stylesheet is parsed and processed.\n\nIn the second example, secure processing mode is enabled.\n\n\n```java\nimport javax.xml.XMLConstants;\nimport javax.xml.transform.TransformerFactory;\nimport javax.xml.transform.stream.StreamResult;\nimport javax.xml.transform.stream.StreamSource;\n\npublic void transform(Socket socket, String inputXml) throws Exception {\n StreamSource xslt = new StreamSource(socket.getInputStream());\n StreamSource xml = new StreamSource(new StringReader(inputXml));\n StringWriter result = new StringWriter();\n TransformerFactory factory = TransformerFactory.newInstance();\n\n // BAD: User provided XSLT stylesheet is processed\n factory.newTransformer(xslt).transform(xml, new StreamResult(result));\n\n // GOOD: The secure processing mode is enabled\n factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);\n factory.newTransformer(xslt).transform(xml, new StreamResult(result));\n} \n```\n\n## References\n* Wikipedia: [XSLT](https://en.wikipedia.org/wiki/XSLT).\n* The Java Tutorials: [Transforming XML Data with XSLT](https://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html).\n* [XSLT Injection Basics](https://blog.hunniccyber.com/ektron-cms-remote-code-execution-xslt-transform-injection-java/).\n* Common Weakness Enumeration: [CWE-74](https://cwe.mitre.org/data/definitions/74.html).\n"},"properties":{"tags":["security","external/cwe/cwe-074"],"description":"Performing an XSLT transformation with user-controlled stylesheets can lead to\n information disclosure or execution of arbitrary code.","id":"java/xslt-injection","kind":"path-problem","name":"XSLT transformation with user-controlled stylesheet","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/unreleased-lock","name":"java/unreleased-lock","shortDescription":{"text":"Unreleased lock"},"fullDescription":{"text":"A lock that is acquired one or more times without a matching number of unlocks may cause a deadlock."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Unreleased lock\nWhen a thread acquires a lock it must make sure to unlock it again; failing to do so can lead to deadlocks. If a lock allows a thread to acquire it multiple times, for example `java.util.concurrent.locks.ReentrantLock`, then the number of locks must match the number of unlocks in order to fully release the lock.\n\n\n## Recommendation\nIt is recommended practice always to immediately follow a call to `lock` with a `try` block and place the call to `unlock` inside the `finally` block. Beware of calls inside the `finally` block that could cause exceptions, as this may result in skipping the call to `unlock`.\n\n\n## Example\nThe typical pattern for using locks safely looks like this:\n\n\n```java\npublic void m() {\n lock.lock();\n // A\n try {\n // ... method body\n } finally {\n // B\n lock.unlock();\n }\n}\n```\nIf any code that can cause a premature method exit (for example by throwing an exception) is inserted at either point `A` or `B` then the method might not unlock, so this should be avoided.\n\n\n## References\n* Java API Specification: [java.util.concurrent.locks.Lock](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/Lock.html), [java.util.concurrent.locks.ReentrantLock](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/ReentrantLock.html).\n* Common Weakness Enumeration: [CWE-764](https://cwe.mitre.org/data/definitions/764.html).\n* Common Weakness Enumeration: [CWE-833](https://cwe.mitre.org/data/definitions/833.html).\n","markdown":"# Unreleased lock\nWhen a thread acquires a lock it must make sure to unlock it again; failing to do so can lead to deadlocks. If a lock allows a thread to acquire it multiple times, for example `java.util.concurrent.locks.ReentrantLock`, then the number of locks must match the number of unlocks in order to fully release the lock.\n\n\n## Recommendation\nIt is recommended practice always to immediately follow a call to `lock` with a `try` block and place the call to `unlock` inside the `finally` block. Beware of calls inside the `finally` block that could cause exceptions, as this may result in skipping the call to `unlock`.\n\n\n## Example\nThe typical pattern for using locks safely looks like this:\n\n\n```java\npublic void m() {\n lock.lock();\n // A\n try {\n // ... method body\n } finally {\n // B\n lock.unlock();\n }\n}\n```\nIf any code that can cause a premature method exit (for example by throwing an exception) is inserted at either point `A` or `B` then the method might not unlock, so this should be avoided.\n\n\n## References\n* Java API Specification: [java.util.concurrent.locks.Lock](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/Lock.html), [java.util.concurrent.locks.ReentrantLock](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/ReentrantLock.html).\n* Common Weakness Enumeration: [CWE-764](https://cwe.mitre.org/data/definitions/764.html).\n* Common Weakness Enumeration: [CWE-833](https://cwe.mitre.org/data/definitions/833.html).\n"},"properties":{"tags":["reliability","security","external/cwe/cwe-764","external/cwe/cwe-833"],"description":"A lock that is acquired one or more times without a matching number of unlocks\n may cause a deadlock.","id":"java/unreleased-lock","kind":"problem","name":"Unreleased lock","precision":"medium","problem.severity":"error","security-severity":"5.0"}},{"id":"java/unsafe-cert-trust","name":"java/unsafe-cert-trust","shortDescription":{"text":"Unsafe certificate trust"},"fullDescription":{"text":"SSLSocket/SSLEngine ignores all SSL certificate validation errors when establishing an HTTPS connection, thereby making the app vulnerable to man-in-the-middle attacks."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Unsafe certificate trust\nJava offers two mechanisms for SSL authentication - trust manager and hostname verifier (the later is checked by the `java/insecure-hostname-verifier` query). The trust manager validates the peer's certificate chain while hostname verification establishes that the hostname in the URL matches the hostname in the server's identification.\n\nWhen `SSLSocket` or `SSLEngine` are created without a secure `setEndpointIdentificationAlgorithm`, hostname verification is disabled by default.\n\nThis query checks whether `setEndpointIdentificationAlgorithm` is missing, thereby making the application vulnerable to man-in-the-middle attacks. The query also covers insecure configurations of `com.rabbitmq.client.ConnectionFactory`.\n\n\n## Recommendation\nValidate SSL certificates in SSL authentication.\n\n\n## Example\nThe following two examples show two ways of configuring SSLSocket/SSLEngine. In the 'BAD' case, `setEndpointIdentificationAlgorithm` is not called, thus no hostname verification takes place. In the 'GOOD' case, `setEndpointIdentificationAlgorithm` is called.\n\n\n```java\npublic static void main(String[] args) {\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tSSLEngine sslEngine = sslContext.createSSLEngine();\n\t\tSSLParameters sslParameters = sslEngine.getSSLParameters();\n\t\tsslParameters.setEndpointIdentificationAlgorithm(\"HTTPS\"); //GOOD: Set a valid endpointIdentificationAlgorithm for SSL engine to trigger hostname verification\n\t\tsslEngine.setSSLParameters(sslParameters);\n\t}\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tSSLEngine sslEngine = sslContext.createSSLEngine(); //BAD: No endpointIdentificationAlgorithm set\n\t}\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tfinal SSLSocketFactory socketFactory = sslContext.getSocketFactory();\n\t\tSSLSocket socket = (SSLSocket) socketFactory.createSocket(\"www.example.com\", 443); \n\t\tSSLParameters sslParameters = sslEngine.getSSLParameters();\n\t\tsslParameters.setEndpointIdentificationAlgorithm(\"HTTPS\"); //GOOD: Set a valid endpointIdentificationAlgorithm for SSL socket to trigger hostname verification\n\t\tsocket.setSSLParameters(sslParameters);\n\t}\n\n\t{\n\t\tcom.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();\n\t\tconnectionFactory.useSslProtocol();\n\t\tconnectionFactory.enableHostnameVerification(); //GOOD: Enable hostname verification for rabbitmq ConnectionFactory\n\t}\n\n\t{\n\t\tcom.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();\n\t\tconnectionFactory.useSslProtocol(); //BAD: Hostname verification for rabbitmq ConnectionFactory is not enabled\n\t}\n}\n```\n\n## References\n* [Testing Endpoint Identify Verification (MSTG-NETWORK-3)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05g-Testing-Network-Communication.md).\n* [SSLParameters.setEndpointIdentificationAlgorithm documentation](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/javax/net/ssl/SSLParameters.html#setEndpointIdentificationAlgorithm(java.lang.String)).\n* RabbitMQ: [ConnectionFactory.enableHostnameVerification documentation](https://rabbitmq.github.io/rabbitmq-java-client/api/current/com/rabbitmq/client/ConnectionFactory.html#enableHostnameVerification()).\n* RabbitMQ: [Using TLS in the Java Client](https://www.rabbitmq.com/ssl.html#java-client).\n* [CVE-2018-17187: Apache Qpid Proton-J transport issue with hostname verification](https://github.com/advisories/GHSA-xvch-r4wf-h8w9).\n* [CVE-2018-8034: Apache Tomcat - host name verification when using TLS with the WebSocket client](https://github.com/advisories/GHSA-46j3-r4pj-4835).\n* [CVE-2018-11087: Pivotal Spring AMQP vulnerability due to lack of hostname validation](https://github.com/advisories/GHSA-w4g2-9hj6-5472).\n* [CVE-2018-11775: TLS hostname verification issue when using the Apache ActiveMQ Client](https://github.com/advisories/GHSA-m9w8-v359-9ffr).\n* Common Weakness Enumeration: [CWE-273](https://cwe.mitre.org/data/definitions/273.html).\n","markdown":"# Unsafe certificate trust\nJava offers two mechanisms for SSL authentication - trust manager and hostname verifier (the later is checked by the `java/insecure-hostname-verifier` query). The trust manager validates the peer's certificate chain while hostname verification establishes that the hostname in the URL matches the hostname in the server's identification.\n\nWhen `SSLSocket` or `SSLEngine` are created without a secure `setEndpointIdentificationAlgorithm`, hostname verification is disabled by default.\n\nThis query checks whether `setEndpointIdentificationAlgorithm` is missing, thereby making the application vulnerable to man-in-the-middle attacks. The query also covers insecure configurations of `com.rabbitmq.client.ConnectionFactory`.\n\n\n## Recommendation\nValidate SSL certificates in SSL authentication.\n\n\n## Example\nThe following two examples show two ways of configuring SSLSocket/SSLEngine. In the 'BAD' case, `setEndpointIdentificationAlgorithm` is not called, thus no hostname verification takes place. In the 'GOOD' case, `setEndpointIdentificationAlgorithm` is called.\n\n\n```java\npublic static void main(String[] args) {\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tSSLEngine sslEngine = sslContext.createSSLEngine();\n\t\tSSLParameters sslParameters = sslEngine.getSSLParameters();\n\t\tsslParameters.setEndpointIdentificationAlgorithm(\"HTTPS\"); //GOOD: Set a valid endpointIdentificationAlgorithm for SSL engine to trigger hostname verification\n\t\tsslEngine.setSSLParameters(sslParameters);\n\t}\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tSSLEngine sslEngine = sslContext.createSSLEngine(); //BAD: No endpointIdentificationAlgorithm set\n\t}\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tfinal SSLSocketFactory socketFactory = sslContext.getSocketFactory();\n\t\tSSLSocket socket = (SSLSocket) socketFactory.createSocket(\"www.example.com\", 443); \n\t\tSSLParameters sslParameters = sslEngine.getSSLParameters();\n\t\tsslParameters.setEndpointIdentificationAlgorithm(\"HTTPS\"); //GOOD: Set a valid endpointIdentificationAlgorithm for SSL socket to trigger hostname verification\n\t\tsocket.setSSLParameters(sslParameters);\n\t}\n\n\t{\n\t\tcom.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();\n\t\tconnectionFactory.useSslProtocol();\n\t\tconnectionFactory.enableHostnameVerification(); //GOOD: Enable hostname verification for rabbitmq ConnectionFactory\n\t}\n\n\t{\n\t\tcom.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();\n\t\tconnectionFactory.useSslProtocol(); //BAD: Hostname verification for rabbitmq ConnectionFactory is not enabled\n\t}\n}\n```\n\n## References\n* [Testing Endpoint Identify Verification (MSTG-NETWORK-3)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05g-Testing-Network-Communication.md).\n* [SSLParameters.setEndpointIdentificationAlgorithm documentation](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/javax/net/ssl/SSLParameters.html#setEndpointIdentificationAlgorithm(java.lang.String)).\n* RabbitMQ: [ConnectionFactory.enableHostnameVerification documentation](https://rabbitmq.github.io/rabbitmq-java-client/api/current/com/rabbitmq/client/ConnectionFactory.html#enableHostnameVerification()).\n* RabbitMQ: [Using TLS in the Java Client](https://www.rabbitmq.com/ssl.html#java-client).\n* [CVE-2018-17187: Apache Qpid Proton-J transport issue with hostname verification](https://github.com/advisories/GHSA-xvch-r4wf-h8w9).\n* [CVE-2018-8034: Apache Tomcat - host name verification when using TLS with the WebSocket client](https://github.com/advisories/GHSA-46j3-r4pj-4835).\n* [CVE-2018-11087: Pivotal Spring AMQP vulnerability due to lack of hostname validation](https://github.com/advisories/GHSA-w4g2-9hj6-5472).\n* [CVE-2018-11775: TLS hostname verification issue when using the Apache ActiveMQ Client](https://github.com/advisories/GHSA-m9w8-v359-9ffr).\n* Common Weakness Enumeration: [CWE-273](https://cwe.mitre.org/data/definitions/273.html).\n"},"properties":{"tags":["security","external/cwe/cwe-273"],"description":"SSLSocket/SSLEngine ignores all SSL certificate validation\n errors when establishing an HTTPS connection, thereby making\n the app vulnerable to man-in-the-middle attacks.","id":"java/unsafe-cert-trust","kind":"problem","name":"Unsafe certificate trust","precision":"medium","problem.severity":"warning","security-severity":"9.8"}},{"id":"java/user-controlled-bypass","name":"java/user-controlled-bypass","shortDescription":{"text":"User-controlled bypass of sensitive method"},"fullDescription":{"text":"User-controlled bypassing of sensitive methods may allow attackers to avoid passing through authentication systems."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# User-controlled bypass of sensitive method\nMany Java constructs enable code statements to be executed conditionally, for example `if` statements and `for` statements. If these statements contain important authentication or login code, and the decision about whether to execute this code is based on user-controlled data, it may be possible for an attacker to bypass security systems by preventing this code from executing.\n\n\n## Recommendation\nNever decide whether to authenticate a user based on data that may be controlled by that user. If necessary, ensure that the data is validated extensively when it is input before any authentication checks are performed.\n\nIt is still possible to have a system that \"remembers\" users, thus not requiring the user to login on every interaction. For example, personalization settings can be applied without authentication because this is not sensitive information. However, users should be allowed to take sensitive actions only when they have been fully authenticated.\n\n\n## Example\nThis example shows two ways of deciding whether to authenticate a user. The first way shows a decision that is based on the value of a cookie. Cookies can be easily controlled by the user, and so this allows a user to become authenticated without providing valid credentials. The second, more secure way shows a decision that is based on looking up the user in a security database.\n\n\n```java\npublic boolean doLogin(String user, String password) {\n\tCookie adminCookie = getCookies()[0];\n\n\t// BAD: login is executed only if the value of 'adminCookie' is 'false', \n\t// but 'adminCookie' is controlled by the user\n\tif(adminCookie.getValue()==\"false\")\n\t\treturn login(user, password);\n\t\n\treturn true;\n}\n\npublic boolean doLogin(String user, String password) {\n\tCookie adminCookie = getCookies()[0];\n\t\n\t// GOOD: use server-side information based on the credentials to decide\n\t// whether user has privileges\n\tboolean isAdmin = queryDbForAdminStatus(user, password);\n\tif(!isAdmin)\n\t\treturn login(user, password);\n\t\n\treturn true;\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SEC02-J. Do not base security checks on untrusted sources](https://wiki.sei.cmu.edu/confluence/display/java/SEC02-J.+Do+not+base+security+checks+on+untrusted+sources).\n* Common Weakness Enumeration: [CWE-807](https://cwe.mitre.org/data/definitions/807.html).\n* Common Weakness Enumeration: [CWE-290](https://cwe.mitre.org/data/definitions/290.html).\n","markdown":"# User-controlled bypass of sensitive method\nMany Java constructs enable code statements to be executed conditionally, for example `if` statements and `for` statements. If these statements contain important authentication or login code, and the decision about whether to execute this code is based on user-controlled data, it may be possible for an attacker to bypass security systems by preventing this code from executing.\n\n\n## Recommendation\nNever decide whether to authenticate a user based on data that may be controlled by that user. If necessary, ensure that the data is validated extensively when it is input before any authentication checks are performed.\n\nIt is still possible to have a system that \"remembers\" users, thus not requiring the user to login on every interaction. For example, personalization settings can be applied without authentication because this is not sensitive information. However, users should be allowed to take sensitive actions only when they have been fully authenticated.\n\n\n## Example\nThis example shows two ways of deciding whether to authenticate a user. The first way shows a decision that is based on the value of a cookie. Cookies can be easily controlled by the user, and so this allows a user to become authenticated without providing valid credentials. The second, more secure way shows a decision that is based on looking up the user in a security database.\n\n\n```java\npublic boolean doLogin(String user, String password) {\n\tCookie adminCookie = getCookies()[0];\n\n\t// BAD: login is executed only if the value of 'adminCookie' is 'false', \n\t// but 'adminCookie' is controlled by the user\n\tif(adminCookie.getValue()==\"false\")\n\t\treturn login(user, password);\n\t\n\treturn true;\n}\n\npublic boolean doLogin(String user, String password) {\n\tCookie adminCookie = getCookies()[0];\n\t\n\t// GOOD: use server-side information based on the credentials to decide\n\t// whether user has privileges\n\tboolean isAdmin = queryDbForAdminStatus(user, password);\n\tif(!isAdmin)\n\t\treturn login(user, password);\n\t\n\treturn true;\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SEC02-J. Do not base security checks on untrusted sources](https://wiki.sei.cmu.edu/confluence/display/java/SEC02-J.+Do+not+base+security+checks+on+untrusted+sources).\n* Common Weakness Enumeration: [CWE-807](https://cwe.mitre.org/data/definitions/807.html).\n* Common Weakness Enumeration: [CWE-290](https://cwe.mitre.org/data/definitions/290.html).\n"},"properties":{"tags":["security","external/cwe/cwe-807","external/cwe/cwe-290","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"User-controlled bypassing of sensitive methods may allow attackers to avoid\n passing through authentication systems.","id":"java/user-controlled-bypass","kind":"path-problem","name":"User-controlled bypass of sensitive method","precision":"medium","problem.severity":"error","security-severity":"7.8"}},{"id":"java/cleartext-storage-in-properties","name":"java/cleartext-storage-in-properties","shortDescription":{"text":"Cleartext storage of sensitive information using 'Properties' class"},"fullDescription":{"text":"Storing sensitive information in cleartext can expose it to an attacker."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Cleartext storage of sensitive information using 'Properties' class\nSensitive information that is stored unencrypted is accessible to an attacker who gains access to the storage.\n\n\n## Recommendation\nEnsure that sensitive information is always encrypted before being stored. It may be wise to encrypt information before it is put into a heap data structure (such as `Java.util.Properties`) that may be written to disk later. Objects that are serializable or marshallable should also always contain encrypted information unless you are certain that they are not ever going to be serialized.\n\nIn general, decrypt sensitive information only at the point where it is necessary for it to be used in cleartext.\n\n\n## Example\nThe following example shows two ways of storing user credentials in a cookie. In the 'BAD' case, the credentials are simply stored in cleartext. In the 'GOOD' case, the credentials are hashed before storing them.\n\n\n```java\npublic static void main(String[] args) {\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"BP@ssw0rd\".toCharArray());\n\t\tdata = credentials.getUserName() + \":\" + new String(credentials.getPassword());\n\t\n\t\t// BAD: store data in a cookie in cleartext form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n\t\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"GP@ssw0rd\".toCharArray());\n\t\tString salt = \"ThisIsMySalt\";\n\t\tMessageDigest messageDigest = MessageDigest.getInstance(\"SHA-512\");\n\t\tmessageDigest.reset();\n\t\tString credentialsToHash =\n\t\t\t\tcredentials.getUserName() + \":\" + credentials.getPassword();\n\t\tbyte[] hashedCredsAsBytes =\n\t\t\t\tmessageDigest.digest((salt+credentialsToHash).getBytes(\"UTF-8\"));\n\t\tdata = bytesToString(hashedCredsAsBytes);\n\t\t\n\t\t// GOOD: store data in a cookie in encrypted form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n}\n\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* M. Dowd, J. McDonald and J. Schuhm, *The Art of Software Security Assessment*, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.\n* M. Howard and D. LeBlanc, *Writing Secure Code*, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.\n* Common Weakness Enumeration: [CWE-313](https://cwe.mitre.org/data/definitions/313.html).\n","markdown":"# Cleartext storage of sensitive information using 'Properties' class\nSensitive information that is stored unencrypted is accessible to an attacker who gains access to the storage.\n\n\n## Recommendation\nEnsure that sensitive information is always encrypted before being stored. It may be wise to encrypt information before it is put into a heap data structure (such as `Java.util.Properties`) that may be written to disk later. Objects that are serializable or marshallable should also always contain encrypted information unless you are certain that they are not ever going to be serialized.\n\nIn general, decrypt sensitive information only at the point where it is necessary for it to be used in cleartext.\n\n\n## Example\nThe following example shows two ways of storing user credentials in a cookie. In the 'BAD' case, the credentials are simply stored in cleartext. In the 'GOOD' case, the credentials are hashed before storing them.\n\n\n```java\npublic static void main(String[] args) {\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"BP@ssw0rd\".toCharArray());\n\t\tdata = credentials.getUserName() + \":\" + new String(credentials.getPassword());\n\t\n\t\t// BAD: store data in a cookie in cleartext form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n\t\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"GP@ssw0rd\".toCharArray());\n\t\tString salt = \"ThisIsMySalt\";\n\t\tMessageDigest messageDigest = MessageDigest.getInstance(\"SHA-512\");\n\t\tmessageDigest.reset();\n\t\tString credentialsToHash =\n\t\t\t\tcredentials.getUserName() + \":\" + credentials.getPassword();\n\t\tbyte[] hashedCredsAsBytes =\n\t\t\t\tmessageDigest.digest((salt+credentialsToHash).getBytes(\"UTF-8\"));\n\t\tdata = bytesToString(hashedCredsAsBytes);\n\t\t\n\t\t// GOOD: store data in a cookie in encrypted form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n}\n\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* M. Dowd, J. McDonald and J. Schuhm, *The Art of Software Security Assessment*, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.\n* M. Howard and D. LeBlanc, *Writing Secure Code*, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.\n* Common Weakness Enumeration: [CWE-313](https://cwe.mitre.org/data/definitions/313.html).\n"},"properties":{"tags":["security","external/cwe/cwe-313","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Storing sensitive information in cleartext can expose it to an attacker.","id":"java/cleartext-storage-in-properties","kind":"problem","name":"Cleartext storage of sensitive information using 'Properties' class","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/android/cleartext-storage-filesystem","name":"java/android/cleartext-storage-filesystem","shortDescription":{"text":"Cleartext storage of sensitive information in the Android filesystem"},"fullDescription":{"text":"Cleartext storage of sensitive information in the Android filesystem allows access for users with root privileges or unexpected exposure from chained vulnerabilities."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Cleartext storage of sensitive information in the Android filesystem\nAndroid applications with the appropriate permissions can write files either to the device external storage or the application internal storage, depending on the application's needs. However, sensitive information should not be saved in cleartext. Otherwise it can be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nConsider using the `EncryptedFile` class to work with files containing sensitive data. Alternatively, use encryption algorithms to encrypt the sensitive data being stored.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext using a local file.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the filesystem.\n\n\n```java\npublic void fileSystemStorageUnsafe(String name, String password) {\n\t// BAD - sensitive data stored in cleartext\n FileWriter fw = new FileWriter(\"some_file.txt\");\n fw.write(name + \":\" + password);\n fw.close();\n}\n\npublic void filesystemStorageEncryptedFileSafe(Context context, String name, String password) {\n\t// GOOD - the whole file is encrypted with androidx.security.crypto.EncryptedFile\n File file = new File(\"some_file.txt\");\n String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);\n EncryptedFile encryptedFile = new EncryptedFile.Builder(\n file,\n context,\n masterKeyAlias,\n EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB\n ).build();\n\tFileOutputStream encryptedOutputStream = encryptedFile.openFileOutput();\n\tencryptedOutputStream.write(name + \":\" + password);\n}\n\npublic void fileSystemStorageSafe(String name, String password) {\n\t// GOOD - sensitive data is encrypted using a custom method\n FileWriter fw = new FileWriter(\"some_file.txt\");\n fw.write(name + \":\" + encrypt(password));\n fw.close();\n}\n\nprivate static String encrypt(String cleartext) {\n // Use an encryption or strong hashing algorithm in the real world.\n // The example below just returns a SHA-256 hash.\n MessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n byte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n String encoded = Base64.getEncoder().encodeToString(hash);\n return encoded;\n}\n\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* Android Developers: [EncryptedFile](https://developer.android.com/reference/androidx/security/crypto/EncryptedFile)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n","markdown":"# Cleartext storage of sensitive information in the Android filesystem\nAndroid applications with the appropriate permissions can write files either to the device external storage or the application internal storage, depending on the application's needs. However, sensitive information should not be saved in cleartext. Otherwise it can be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nConsider using the `EncryptedFile` class to work with files containing sensitive data. Alternatively, use encryption algorithms to encrypt the sensitive data being stored.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext using a local file.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the filesystem.\n\n\n```java\npublic void fileSystemStorageUnsafe(String name, String password) {\n\t// BAD - sensitive data stored in cleartext\n FileWriter fw = new FileWriter(\"some_file.txt\");\n fw.write(name + \":\" + password);\n fw.close();\n}\n\npublic void filesystemStorageEncryptedFileSafe(Context context, String name, String password) {\n\t// GOOD - the whole file is encrypted with androidx.security.crypto.EncryptedFile\n File file = new File(\"some_file.txt\");\n String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);\n EncryptedFile encryptedFile = new EncryptedFile.Builder(\n file,\n context,\n masterKeyAlias,\n EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB\n ).build();\n\tFileOutputStream encryptedOutputStream = encryptedFile.openFileOutput();\n\tencryptedOutputStream.write(name + \":\" + password);\n}\n\npublic void fileSystemStorageSafe(String name, String password) {\n\t// GOOD - sensitive data is encrypted using a custom method\n FileWriter fw = new FileWriter(\"some_file.txt\");\n fw.write(name + \":\" + encrypt(password));\n fw.close();\n}\n\nprivate static String encrypt(String cleartext) {\n // Use an encryption or strong hashing algorithm in the real world.\n // The example below just returns a SHA-256 hash.\n MessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n byte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n String encoded = Base64.getEncoder().encodeToString(hash);\n return encoded;\n}\n\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* Android Developers: [EncryptedFile](https://developer.android.com/reference/androidx/security/crypto/EncryptedFile)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n"},"properties":{"tags":["security","external/cwe/cwe-312","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Cleartext storage of sensitive information in the Android filesystem\n allows access for users with root privileges or unexpected exposure\n from chained vulnerabilities.","id":"java/android/cleartext-storage-filesystem","kind":"problem","name":"Cleartext storage of sensitive information in the Android filesystem","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/android/cleartext-storage-shared-prefs","name":"java/android/cleartext-storage-shared-prefs","shortDescription":{"text":"Cleartext storage of sensitive information using `SharedPreferences` on Android"},"fullDescription":{"text":"Cleartext Storage of Sensitive Information using SharedPreferences on Android allows access for users with root privileges or unexpected exposure from chained vulnerabilities."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Cleartext storage of sensitive information using `SharedPreferences` on Android\n`SharedPreferences` is an Android API that stores application preferences using simple sets of data values. It allows you to easily save, alter, and retrieve the values stored in a user's profile. However, sensitive information should not be saved in cleartext. Otherwise it can be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nUse the `EncryptedSharedPreferences` API or other encryption algorithms for storing sensitive information.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the device.\n\n\n```java\npublic void testSetSharedPrefs(Context context, String name, String password)\n{\n\t{\n\t\t// BAD - sensitive information saved in cleartext.\n\t\tSharedPreferences sharedPrefs = context.getSharedPreferences(\"user_prefs\", Context.MODE_PRIVATE);\n\t\tEditor editor = sharedPrefs.edit();\n\t\teditor.putString(\"name\", name);\n\t\teditor.putString(\"password\", password);\n\t\teditor.commit();\n\t}\n\n\t{\n\t\t// GOOD - save sensitive information encrypted with a custom method.\n\t\tSharedPreferences sharedPrefs = context.getSharedPreferences(\"user_prefs\", Context.MODE_PRIVATE);\n\t\tEditor editor = sharedPrefs.edit();\n\t\teditor.putString(\"name\", encrypt(name));\n\t\teditor.putString(\"password\", encrypt(password));\n\t\teditor.commit();\n\t}\n\n\t{\n\t\t// GOOD - sensitive information saved using the built-in `EncryptedSharedPreferences` class in androidx.\n\t\tMasterKey masterKey = new MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)\n\t\t\t.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)\n\t\t\t.build();\n\n\t\tSharedPreferences sharedPreferences = EncryptedSharedPreferences.create(\n\t\t\tcontext,\n\t\t\t\"secret_shared_prefs\",\n\t\t\tmasterKey,\n\t\t\tEncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,\n\t\t\tEncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);\n\n\t\tSharedPreferences.Editor editor = sharedPreferences.edit();\n\t\teditor.putString(\"name\", name);\n\t\teditor.putString(\"password\", password);\n\t\teditor.commit();\n\t}\n}\n\nprivate static String encrypt(String cleartext) throws Exception {\n\t// Use an encryption or hashing algorithm in real world. The demo below just returns its\n\t// hash.\n\tMessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n\tbyte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n\tString encoded = Base64.getEncoder().encodeToString(hash);\n\treturn encoded;\n}\n\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* ProAndroidDev: [Encrypted Preferences in Android](https://proandroiddev.com/encrypted-preferences-in-android-af57a89af7c8)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n","markdown":"# Cleartext storage of sensitive information using `SharedPreferences` on Android\n`SharedPreferences` is an Android API that stores application preferences using simple sets of data values. It allows you to easily save, alter, and retrieve the values stored in a user's profile. However, sensitive information should not be saved in cleartext. Otherwise it can be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nUse the `EncryptedSharedPreferences` API or other encryption algorithms for storing sensitive information.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the device.\n\n\n```java\npublic void testSetSharedPrefs(Context context, String name, String password)\n{\n\t{\n\t\t// BAD - sensitive information saved in cleartext.\n\t\tSharedPreferences sharedPrefs = context.getSharedPreferences(\"user_prefs\", Context.MODE_PRIVATE);\n\t\tEditor editor = sharedPrefs.edit();\n\t\teditor.putString(\"name\", name);\n\t\teditor.putString(\"password\", password);\n\t\teditor.commit();\n\t}\n\n\t{\n\t\t// GOOD - save sensitive information encrypted with a custom method.\n\t\tSharedPreferences sharedPrefs = context.getSharedPreferences(\"user_prefs\", Context.MODE_PRIVATE);\n\t\tEditor editor = sharedPrefs.edit();\n\t\teditor.putString(\"name\", encrypt(name));\n\t\teditor.putString(\"password\", encrypt(password));\n\t\teditor.commit();\n\t}\n\n\t{\n\t\t// GOOD - sensitive information saved using the built-in `EncryptedSharedPreferences` class in androidx.\n\t\tMasterKey masterKey = new MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)\n\t\t\t.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)\n\t\t\t.build();\n\n\t\tSharedPreferences sharedPreferences = EncryptedSharedPreferences.create(\n\t\t\tcontext,\n\t\t\t\"secret_shared_prefs\",\n\t\t\tmasterKey,\n\t\t\tEncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,\n\t\t\tEncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);\n\n\t\tSharedPreferences.Editor editor = sharedPreferences.edit();\n\t\teditor.putString(\"name\", name);\n\t\teditor.putString(\"password\", password);\n\t\teditor.commit();\n\t}\n}\n\nprivate static String encrypt(String cleartext) throws Exception {\n\t// Use an encryption or hashing algorithm in real world. The demo below just returns its\n\t// hash.\n\tMessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n\tbyte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n\tString encoded = Base64.getEncoder().encodeToString(hash);\n\treturn encoded;\n}\n\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* ProAndroidDev: [Encrypted Preferences in Android](https://proandroiddev.com/encrypted-preferences-in-android-af57a89af7c8)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n"},"properties":{"tags":["security","external/cwe/cwe-312","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Cleartext Storage of Sensitive Information using\n SharedPreferences on Android allows access for users with root\n privileges or unexpected exposure from chained vulnerabilities.","id":"java/android/cleartext-storage-shared-prefs","kind":"problem","name":"Cleartext storage of sensitive information using `SharedPreferences` on Android","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/android/cleartext-storage-database","name":"java/android/cleartext-storage-database","shortDescription":{"text":"Cleartext storage of sensitive information using a local database on Android"},"fullDescription":{"text":"Cleartext Storage of Sensitive Information using a local database on Android allows access for users with root privileges or unexpected exposure from chained vulnerabilities."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Cleartext storage of sensitive information using a local database on Android\nSQLite is a lightweight database engine commonly used in Android devices to store data. By itself, SQLite does not offer any encryption mechanism by default and stores all data in cleartext, which introduces a risk if sensitive data like credentials, authentication tokens or personal identifiable information (PII) are directly stored in a SQLite database. The information could be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nUse `SQLCipher` or similar libraries to add encryption capabilities to SQLite. Alternatively, encrypt sensitive data using cryptographically secure algorithms before storing it in the database.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the database.\n\n\n```java\npublic void sqliteStorageUnsafe(Context ctx, String name, String password) {\n\t// BAD - sensitive information saved in cleartext.\n\tSQLiteDatabase db = ctx.openOrCreateDatabase(\"test\", Context.MODE_PRIVATE, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, password});\n}\n\npublic void sqliteStorageSafe(Context ctx, String name, String password) {\n\t// GOOD - sensitive information encrypted with a custom method.\n\tSQLiteDatabase db = ctx.openOrCreateDatabase(\"test\", Context.MODE_PRIVATE, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, encrypt(password)});\n}\n\npublic void sqlCipherStorageSafe(String name, String password, String databasePassword) {\n\t// GOOD - sensitive information saved using SQLCipher.\n\tnet.sqlcipher.database.SQLiteDatabase db = \n\t\tnet.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(\"test\", databasePassword, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, password});\n}\n\nprivate static String encrypt(String cleartext) {\n // Use an encryption or strong hashing algorithm in the real world.\n // The example below just returns a SHA-256 hash.\n MessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n byte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n String encoded = Base64.getEncoder().encodeToString(hash);\n return encoded;\n}\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* SQLCipher: [Android Application Integration](https://www.zetetic.net/sqlcipher/sqlcipher-for-android/)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n","markdown":"# Cleartext storage of sensitive information using a local database on Android\nSQLite is a lightweight database engine commonly used in Android devices to store data. By itself, SQLite does not offer any encryption mechanism by default and stores all data in cleartext, which introduces a risk if sensitive data like credentials, authentication tokens or personal identifiable information (PII) are directly stored in a SQLite database. The information could be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nUse `SQLCipher` or similar libraries to add encryption capabilities to SQLite. Alternatively, encrypt sensitive data using cryptographically secure algorithms before storing it in the database.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the database.\n\n\n```java\npublic void sqliteStorageUnsafe(Context ctx, String name, String password) {\n\t// BAD - sensitive information saved in cleartext.\n\tSQLiteDatabase db = ctx.openOrCreateDatabase(\"test\", Context.MODE_PRIVATE, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, password});\n}\n\npublic void sqliteStorageSafe(Context ctx, String name, String password) {\n\t// GOOD - sensitive information encrypted with a custom method.\n\tSQLiteDatabase db = ctx.openOrCreateDatabase(\"test\", Context.MODE_PRIVATE, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, encrypt(password)});\n}\n\npublic void sqlCipherStorageSafe(String name, String password, String databasePassword) {\n\t// GOOD - sensitive information saved using SQLCipher.\n\tnet.sqlcipher.database.SQLiteDatabase db = \n\t\tnet.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(\"test\", databasePassword, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, password});\n}\n\nprivate static String encrypt(String cleartext) {\n // Use an encryption or strong hashing algorithm in the real world.\n // The example below just returns a SHA-256 hash.\n MessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n byte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n String encoded = Base64.getEncoder().encodeToString(hash);\n return encoded;\n}\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* SQLCipher: [Android Application Integration](https://www.zetetic.net/sqlcipher/sqlcipher-for-android/)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n"},"properties":{"tags":["security","external/cwe/cwe-312","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Cleartext Storage of Sensitive Information using\n a local database on Android allows access for users with root\n privileges or unexpected exposure from chained vulnerabilities.","id":"java/android/cleartext-storage-database","kind":"problem","name":"Cleartext storage of sensitive information using a local database on Android","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/socket-auth-race-condition","name":"java/socket-auth-race-condition","shortDescription":{"text":"Race condition in socket authentication"},"fullDescription":{"text":"Opening a socket after authenticating via a different channel may allow an attacker to connect to the port first."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Race condition in socket authentication\nA common pattern is to have a channel of communication open with a user, and then to open another channel, for example to transfer data. However, if user authentication is done over the original channel rather than the alternate channel, then an attacker may be able to connect to the alternate channel before the legitimate user does. This allows the attacker to impersonate the user by \"piggybacking\" on any previous authentication.\n\n\n## Recommendation\nWhen opening an alternate channel for an authenticated user (for example, a Java `Socket`), always authenticate the user over the new channel.\n\n\n## Example\nThis example shows two ways of opening a connection for a user. In the first example, authentication is determined based on materials that the user has already provided (for example, their username and/or password), and then a new channel is opened. However, no authentication is done over the new channel, and so an attacker could connect to it before the user connects.\n\nIn the second example, authentication is done over the socket channel itself, which verifies that the newly connected user is in fact the user that was expected.\n\n\n```java\npublic void doConnect(int desiredPort, String username) {\n\tServerSocket listenSocket = new ServerSocket(desiredPort);\n\n\tif (isAuthenticated(username)) {\n\t\tSocket connection1 = listenSocket.accept();\n\t\t// BAD: no authentication over the socket connection\n\t\tconnection1.getOutputStream().write(secretData);\n\t}\n}\n\npublic void doConnect(int desiredPort, String username) {\n\tServerSocket listenSocket = new ServerSocket(desiredPort);\n\n\tSocket connection2 = listenSocket.accept();\n\t// GOOD: authentication happens over the socket\n\tif (doAuthenticate(connection2, username)) {\n\t\tconnection2.getOutputStream().write(secretData);\n\t}\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-421](https://cwe.mitre.org/data/definitions/421.html).\n","markdown":"# Race condition in socket authentication\nA common pattern is to have a channel of communication open with a user, and then to open another channel, for example to transfer data. However, if user authentication is done over the original channel rather than the alternate channel, then an attacker may be able to connect to the alternate channel before the legitimate user does. This allows the attacker to impersonate the user by \"piggybacking\" on any previous authentication.\n\n\n## Recommendation\nWhen opening an alternate channel for an authenticated user (for example, a Java `Socket`), always authenticate the user over the new channel.\n\n\n## Example\nThis example shows two ways of opening a connection for a user. In the first example, authentication is determined based on materials that the user has already provided (for example, their username and/or password), and then a new channel is opened. However, no authentication is done over the new channel, and so an attacker could connect to it before the user connects.\n\nIn the second example, authentication is done over the socket channel itself, which verifies that the newly connected user is in fact the user that was expected.\n\n\n```java\npublic void doConnect(int desiredPort, String username) {\n\tServerSocket listenSocket = new ServerSocket(desiredPort);\n\n\tif (isAuthenticated(username)) {\n\t\tSocket connection1 = listenSocket.accept();\n\t\t// BAD: no authentication over the socket connection\n\t\tconnection1.getOutputStream().write(secretData);\n\t}\n}\n\npublic void doConnect(int desiredPort, String username) {\n\tServerSocket listenSocket = new ServerSocket(desiredPort);\n\n\tSocket connection2 = listenSocket.accept();\n\t// GOOD: authentication happens over the socket\n\tif (doAuthenticate(connection2, username)) {\n\t\tconnection2.getOutputStream().write(secretData);\n\t}\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-421](https://cwe.mitre.org/data/definitions/421.html).\n"},"properties":{"tags":["security","external/cwe/cwe-421"],"description":"Opening a socket after authenticating via a different channel may allow an attacker to connect to the port first.","id":"java/socket-auth-race-condition","kind":"problem","name":"Race condition in socket authentication","precision":"medium","problem.severity":"warning","security-severity":"7.2"}},{"id":"java/android/websettings-allow-content-access","name":"java/android/websettings-allow-content-access","shortDescription":{"text":"Android WebView settings allows access to content links"},"fullDescription":{"text":"Access to content providers in a WebView can allow access to protected information by loading content:// links."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android WebView settings allows access to content links\nAndroid can provide access to content providers within a WebView using the `setAllowContentAccess` setting.\n\nAllowing access to content providers via `content://` URLs may allow JavaScript to access protected content.\n\n\n## Recommendation\nIf your app does not require access to the `content://` URL functionality, you should explicitly disable the setting by calling `setAllowContentAccess(false)` on the settings of the WebView.\n\n\n## Example\nIn the following (bad) example, access to `content://` URLs is explicitly allowed.\n\n\n```java\nWebSettings settings = webview.getSettings();\n\nsettings.setAllowContentAccess(true);\n\n```\nIn the following (good) example, access to `content://` URLs is explicitly denied.\n\n\n```java\nWebSettings settings = webview.getSettings();\n\nsettings.setAllowContentAccess(false);\n\n```\n\n## References\n* Android Documentation: [setAllowContentAccess](https://developer.android.com/reference/android/webkit/WebSettings#setAllowContentAccess(boolean)).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n","markdown":"# Android WebView settings allows access to content links\nAndroid can provide access to content providers within a WebView using the `setAllowContentAccess` setting.\n\nAllowing access to content providers via `content://` URLs may allow JavaScript to access protected content.\n\n\n## Recommendation\nIf your app does not require access to the `content://` URL functionality, you should explicitly disable the setting by calling `setAllowContentAccess(false)` on the settings of the WebView.\n\n\n## Example\nIn the following (bad) example, access to `content://` URLs is explicitly allowed.\n\n\n```java\nWebSettings settings = webview.getSettings();\n\nsettings.setAllowContentAccess(true);\n\n```\nIn the following (good) example, access to `content://` URLs is explicitly denied.\n\n\n```java\nWebSettings settings = webview.getSettings();\n\nsettings.setAllowContentAccess(false);\n\n```\n\n## References\n* Android Documentation: [setAllowContentAccess](https://developer.android.com/reference/android/webkit/WebSettings#setAllowContentAccess(boolean)).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n"},"properties":{"tags":["security","external/cwe/cwe-200","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Access to content providers in a WebView can allow access to protected information by loading content:// links.","id":"java/android/websettings-allow-content-access","kind":"problem","name":"Android WebView settings allows access to content links","precision":"medium","problem.severity":"warning","security-severity":"6.5"}},{"id":"java/local-temp-file-or-directory-information-disclosure","name":"java/local-temp-file-or-directory-information-disclosure","shortDescription":{"text":"Local information disclosure in a temporary directory"},"fullDescription":{"text":"Writing information without explicit permissions to a shared temporary directory may disclose it to other users."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Local information disclosure in a temporary directory\nLocal information disclosure can occur when files/directories are written into directories that are shared between all users on the system.\n\nOn most [unix-like](https://en.wikipedia.org/wiki/Unix-like) systems, the system temporary directory is shared between local users. If files/directories are created within the system temporary directory without using APIs that explicitly set the correct file permissions, local information disclosure can occur.\n\nDepending upon the particular file contents exposed, this vulnerability can have a [CVSSv3.1 base score of 6.2/10](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N&version=3.1).\n\n\n## Recommendation\nUse JDK methods that specifically protect against this vulnerability:\n\n* [java.nio.file.Files.createTempDirectory](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempDirectory-java.nio.file.Path-java.lang.String-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createTempFile](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempFile-java.nio.file.Path-java.lang.String-java.lang.String-java.nio.file.attribute.FileAttribute...-)\nOtherwise, create the file/directory by manually specifying the expected posix file permissions. For example: `PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))`\n\n* [java.nio.file.Files.createFile](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createFile-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createDirectory](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createDirectory-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createDirectories](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createDirectories-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n\n## Example\nIn the following example, files and directories are created with file permissions that allow other local users to read their contents.\n\n\n```java\nimport java.io.File;\n\npublic class TempDirUsageVulnerable {\n void exampleVulnerable() {\n File temp1 = File.createTempFile(\"random\", \".txt\"); // BAD: File has permissions `-rw-r--r--`\n\n File temp2 = File.createTempFile(\"random\", \"file\", null); // BAD: File has permissions `-rw-r--r--`\n\n File systemTempDir = new File(System.getProperty(\"java.io.tmpdir\"));\n File temp3 = File.createTempFile(\"random\", \"file\", systemTempDir); // BAD: File has permissions `-rw-r--r--`\n\n File tempDir = com.google.common.io.Files.createTempDir(); // BAD: CVE-2020-8908: Directory has permissions `drwxr-xr-x`\n\n new File(System.getProperty(\"java.io.tmpdir\"), \"/child\").mkdir(); // BAD: Directory has permissions `-rw-r--r--`\n\n File tempDirChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n Files.createFile(tempDirChildFile.toPath()); // BAD: File has permissions `-rw-r--r--`\n\n File tempDirChildDir = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-dir\");\n tempDirChildDir.mkdir(); // BAD: Directory has permissions `drwxr-xr-x`\n Files.createDirectory(tempDirChildDir.toPath()); // BAD: Directory has permissions `drwxr-xr-x`\n }\n}\n\n```\nIn the following example, files and directories are created with file permissions that protect their contents.\n\n\n```java\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.attribute.PosixFilePermission;\nimport java.nio.file.attribute.PosixFilePermissions;\n\nimport java.util.EnumSet;\n\n\npublic class TempDirUsageSafe {\n void exampleSafe() throws IOException {\n Path temp1 = Files.createTempFile(\"random\", \".txt\"); // GOOD: File has permissions `-rw-------`\n\n Path temp2 = Files.createTempDirectory(\"random-directory\"); // GOOD: File has permissions `drwx------`\n\n // Creating a temporary file with a non-randomly generated name\n File tempChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n // Warning: This will fail on windows as it doesn't support PosixFilePermissions.\n // See `exampleSafeWithWindowsSupportFile` if your code needs to support windows and unix-like systems.\n Files.createFile(\n tempChildFile.toPath(),\n PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))\n ); // GOOD: Good has permissions `-rw-------`\n }\n\n /*\n * An example of a safe use of createFile or createDirectory if your code must support windows and unix-like systems.\n */\n void exampleSafeWithWindowsSupportFile() {\n // Creating a temporary file with a non-randomly generated name\n File tempChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n createTempFile(tempChildFile.toPath()); // GOOD: Good has permissions `-rw-------`\n }\n\n static void createTempFile(Path tempDirChild) {\n try {\n if (tempDirChild.getFileSystem().supportedFileAttributeViews().contains(\"posix\")) {\n // Explicit permissions setting is only required on unix-like systems because\n // the temporary directory is shared between all users.\n // This is not necessary on Windows, each user has their own temp directory\n final EnumSet posixFilePermissions =\n EnumSet.of(\n PosixFilePermission.OWNER_READ,\n PosixFilePermission.OWNER_WRITE\n );\n if (!Files.exists(tempDirChild)) {\n Files.createFile(\n tempDirChild,\n PosixFilePermissions.asFileAttribute(posixFilePermissions)\n ); // GOOD: Directory has permissions `-rw-------`\n } else {\n Files.setPosixFilePermissions(\n tempDirChild,\n posixFilePermissions\n ); // GOOD: Good has permissions `-rw-------`, or will throw an exception if this fails\n }\n } else if (!Files.exists(tempDirChild)) {\n // On Windows, we still need to create the directory, when it doesn't already exist.\n Files.createDirectory(tempDirChild); // GOOD: Windows doesn't share the temp directory between users\n }\n } catch (IOException exception) {\n throw new UncheckedIOException(\"Failed to create temp file\", exception);\n }\n }\n\n void exampleSafeWithWindowsSupportDirectory() {\n File tempDirChildDir = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-dir\");\n createTempDirectories(tempDirChildDir.toPath()); // GOOD: Directory has permissions `drwx------`\n }\n\n static void createTempDirectories(Path tempDirChild) {\n try {\n if (tempDirChild.getFileSystem().supportedFileAttributeViews().contains(\"posix\")) {\n // Explicit permissions setting is only required on unix-like systems because\n // the temporary directory is shared between all users.\n // This is not necessary on Windows, each user has their own temp directory\n final EnumSet posixFilePermissions =\n EnumSet.of(\n PosixFilePermission.OWNER_READ,\n PosixFilePermission.OWNER_WRITE,\n PosixFilePermission.OWNER_EXECUTE\n );\n if (!Files.exists(tempDirChild)) {\n Files.createDirectories(\n tempDirChild,\n PosixFilePermissions.asFileAttribute(posixFilePermissions)\n ); // GOOD: Directory has permissions `drwx------`\n } else {\n Files.setPosixFilePermissions(\n tempDirChild,\n posixFilePermissions\n ); // GOOD: Good has permissions `drwx------`, or will throw an exception if this fails\n }\n } else if (!Files.exists(tempDirChild)) {\n // On Windows, we still need to create the directory, when it doesn't already exist.\n Files.createDirectories(tempDirChild); // GOOD: Windows doesn't share the temp directory between users\n }\n } catch (IOException exception) {\n throw new UncheckedIOException(\"Failed to create temp dir\", exception);\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Insecure Temporary File](https://owasp.org/www-community/vulnerabilities/Insecure_Temporary_File).\n* CERT: [FIO00-J. Do not operate on files in shared directories](https://wiki.sei.cmu.edu/confluence/display/java/FIO00-J.+Do+not+operate+on+files+in+shared+directories).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n* Common Weakness Enumeration: [CWE-732](https://cwe.mitre.org/data/definitions/732.html).\n","markdown":"# Local information disclosure in a temporary directory\nLocal information disclosure can occur when files/directories are written into directories that are shared between all users on the system.\n\nOn most [unix-like](https://en.wikipedia.org/wiki/Unix-like) systems, the system temporary directory is shared between local users. If files/directories are created within the system temporary directory without using APIs that explicitly set the correct file permissions, local information disclosure can occur.\n\nDepending upon the particular file contents exposed, this vulnerability can have a [CVSSv3.1 base score of 6.2/10](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N&version=3.1).\n\n\n## Recommendation\nUse JDK methods that specifically protect against this vulnerability:\n\n* [java.nio.file.Files.createTempDirectory](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempDirectory-java.nio.file.Path-java.lang.String-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createTempFile](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempFile-java.nio.file.Path-java.lang.String-java.lang.String-java.nio.file.attribute.FileAttribute...-)\nOtherwise, create the file/directory by manually specifying the expected posix file permissions. For example: `PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))`\n\n* [java.nio.file.Files.createFile](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createFile-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createDirectory](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createDirectory-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createDirectories](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createDirectories-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n\n## Example\nIn the following example, files and directories are created with file permissions that allow other local users to read their contents.\n\n\n```java\nimport java.io.File;\n\npublic class TempDirUsageVulnerable {\n void exampleVulnerable() {\n File temp1 = File.createTempFile(\"random\", \".txt\"); // BAD: File has permissions `-rw-r--r--`\n\n File temp2 = File.createTempFile(\"random\", \"file\", null); // BAD: File has permissions `-rw-r--r--`\n\n File systemTempDir = new File(System.getProperty(\"java.io.tmpdir\"));\n File temp3 = File.createTempFile(\"random\", \"file\", systemTempDir); // BAD: File has permissions `-rw-r--r--`\n\n File tempDir = com.google.common.io.Files.createTempDir(); // BAD: CVE-2020-8908: Directory has permissions `drwxr-xr-x`\n\n new File(System.getProperty(\"java.io.tmpdir\"), \"/child\").mkdir(); // BAD: Directory has permissions `-rw-r--r--`\n\n File tempDirChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n Files.createFile(tempDirChildFile.toPath()); // BAD: File has permissions `-rw-r--r--`\n\n File tempDirChildDir = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-dir\");\n tempDirChildDir.mkdir(); // BAD: Directory has permissions `drwxr-xr-x`\n Files.createDirectory(tempDirChildDir.toPath()); // BAD: Directory has permissions `drwxr-xr-x`\n }\n}\n\n```\nIn the following example, files and directories are created with file permissions that protect their contents.\n\n\n```java\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.attribute.PosixFilePermission;\nimport java.nio.file.attribute.PosixFilePermissions;\n\nimport java.util.EnumSet;\n\n\npublic class TempDirUsageSafe {\n void exampleSafe() throws IOException {\n Path temp1 = Files.createTempFile(\"random\", \".txt\"); // GOOD: File has permissions `-rw-------`\n\n Path temp2 = Files.createTempDirectory(\"random-directory\"); // GOOD: File has permissions `drwx------`\n\n // Creating a temporary file with a non-randomly generated name\n File tempChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n // Warning: This will fail on windows as it doesn't support PosixFilePermissions.\n // See `exampleSafeWithWindowsSupportFile` if your code needs to support windows and unix-like systems.\n Files.createFile(\n tempChildFile.toPath(),\n PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))\n ); // GOOD: Good has permissions `-rw-------`\n }\n\n /*\n * An example of a safe use of createFile or createDirectory if your code must support windows and unix-like systems.\n */\n void exampleSafeWithWindowsSupportFile() {\n // Creating a temporary file with a non-randomly generated name\n File tempChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n createTempFile(tempChildFile.toPath()); // GOOD: Good has permissions `-rw-------`\n }\n\n static void createTempFile(Path tempDirChild) {\n try {\n if (tempDirChild.getFileSystem().supportedFileAttributeViews().contains(\"posix\")) {\n // Explicit permissions setting is only required on unix-like systems because\n // the temporary directory is shared between all users.\n // This is not necessary on Windows, each user has their own temp directory\n final EnumSet posixFilePermissions =\n EnumSet.of(\n PosixFilePermission.OWNER_READ,\n PosixFilePermission.OWNER_WRITE\n );\n if (!Files.exists(tempDirChild)) {\n Files.createFile(\n tempDirChild,\n PosixFilePermissions.asFileAttribute(posixFilePermissions)\n ); // GOOD: Directory has permissions `-rw-------`\n } else {\n Files.setPosixFilePermissions(\n tempDirChild,\n posixFilePermissions\n ); // GOOD: Good has permissions `-rw-------`, or will throw an exception if this fails\n }\n } else if (!Files.exists(tempDirChild)) {\n // On Windows, we still need to create the directory, when it doesn't already exist.\n Files.createDirectory(tempDirChild); // GOOD: Windows doesn't share the temp directory between users\n }\n } catch (IOException exception) {\n throw new UncheckedIOException(\"Failed to create temp file\", exception);\n }\n }\n\n void exampleSafeWithWindowsSupportDirectory() {\n File tempDirChildDir = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-dir\");\n createTempDirectories(tempDirChildDir.toPath()); // GOOD: Directory has permissions `drwx------`\n }\n\n static void createTempDirectories(Path tempDirChild) {\n try {\n if (tempDirChild.getFileSystem().supportedFileAttributeViews().contains(\"posix\")) {\n // Explicit permissions setting is only required on unix-like systems because\n // the temporary directory is shared between all users.\n // This is not necessary on Windows, each user has their own temp directory\n final EnumSet posixFilePermissions =\n EnumSet.of(\n PosixFilePermission.OWNER_READ,\n PosixFilePermission.OWNER_WRITE,\n PosixFilePermission.OWNER_EXECUTE\n );\n if (!Files.exists(tempDirChild)) {\n Files.createDirectories(\n tempDirChild,\n PosixFilePermissions.asFileAttribute(posixFilePermissions)\n ); // GOOD: Directory has permissions `drwx------`\n } else {\n Files.setPosixFilePermissions(\n tempDirChild,\n posixFilePermissions\n ); // GOOD: Good has permissions `drwx------`, or will throw an exception if this fails\n }\n } else if (!Files.exists(tempDirChild)) {\n // On Windows, we still need to create the directory, when it doesn't already exist.\n Files.createDirectories(tempDirChild); // GOOD: Windows doesn't share the temp directory between users\n }\n } catch (IOException exception) {\n throw new UncheckedIOException(\"Failed to create temp dir\", exception);\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Insecure Temporary File](https://owasp.org/www-community/vulnerabilities/Insecure_Temporary_File).\n* CERT: [FIO00-J. Do not operate on files in shared directories](https://wiki.sei.cmu.edu/confluence/display/java/FIO00-J.+Do+not+operate+on+files+in+shared+directories).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n* Common Weakness Enumeration: [CWE-732](https://cwe.mitre.org/data/definitions/732.html).\n"},"properties":{"tags":["security","external/cwe/cwe-200","external/cwe/cwe-732","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Writing information without explicit permissions to a shared temporary directory may disclose it to other users.","id":"java/local-temp-file-or-directory-information-disclosure","kind":"path-problem","name":"Local information disclosure in a temporary directory","precision":"medium","problem.severity":"warning","security-severity":"6.5"}},{"id":"java/android/websettings-file-access","name":"java/android/websettings-file-access","shortDescription":{"text":"Android WebSettings file access"},"fullDescription":{"text":"Enabling access to the file system in a WebView allows attackers to view sensitive information."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android WebSettings file access\nAllowing file access in an Android WebView can expose a device's file system to the JavaScript running in that WebView. If the JavaScript contains vulnerabilities or the WebView loads untrusted content, file access allows an attacker to steal the user's data.\n\n\n## Recommendation\nWhen possible, do not allow file access. The file access settings are disabled by default. You can explicitly disable file access by setting the following settings to `false`:\n\n* `setAllowFileAccess`\n* `setAllowFileAccessFromFileURLs`\n* `setAllowUniversalAccessFromFileURLs`\nIf your application requires access to the file system, it is best to avoid using `file://` URLs. Instead, use an alternative that loads files via HTTPS, such as `androidx.webkit.WebViewAssetLoader`.\n\n\n## Example\nIn the following (bad) example, the WebView is configured with settings that allow local file access.\n\n\n```java\nWebSettings settings = view.getSettings();\n\nsettings.setAllowFileAccess(true);\nsettings.setAllowFileAccessFromURLs(true);\nsettings.setAllowUniversalAccessFromURLs(true);\n\n```\nIn the following (good) example, the WebView is configured to disallow file access.\n\n\n```java\nWebSettings settings = view.getSettings();\n\nsettings.setAllowFileAccess(false);\nsettings.setAllowFileAccessFromURLs(false);\nsettings.setAllowUniversalAccessFromURLs(false);\n\n```\nAs mentioned previously, asset loaders can load files without file system access. In the following (good) example, an asset loader is configured to load assets over HTTPS.\n\n\n```java\nWebViewAssetLoader loader = new WebViewAssetLoader.Builder()\n // Replace the domain with a domain you control, or use the default\n // appassets.androidplatform.com\n .setDomain(\"appassets.example.com\")\n .addPathHandler(\"/resources\", new AssetsPathHandler(this))\n .build();\n\nwebView.setWebViewClient(new WebViewClientCompat() {\n @Override\n public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {\n return assetLoader.shouldInterceptRequest(request.getUrl());\n }\n});\n\nwebView.loadUrl(\"https://appassets.example.com/resources/www/index.html\");\n\n```\n\n## References\n* Android documentation: [WebSettings.setAllowFileAccess](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccess(boolean)).\n* Android documentation: [WebSettings.setAllowFileAccessFromFileURLs](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccessFromFileURLs(boolean)).\n* Android documentation: [WebSettings.setAllowUniversalAccessFromFileURLs](https://developer.android.com/reference/android/webkit/WebSettings#setAllowUniversalAccessFromFileURLs(boolean)).\n* Android documentation: [WebViewAssetLoader](https://developer.android.com/reference/androidx/webkit/WebViewAssetLoader).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n","markdown":"# Android WebSettings file access\nAllowing file access in an Android WebView can expose a device's file system to the JavaScript running in that WebView. If the JavaScript contains vulnerabilities or the WebView loads untrusted content, file access allows an attacker to steal the user's data.\n\n\n## Recommendation\nWhen possible, do not allow file access. The file access settings are disabled by default. You can explicitly disable file access by setting the following settings to `false`:\n\n* `setAllowFileAccess`\n* `setAllowFileAccessFromFileURLs`\n* `setAllowUniversalAccessFromFileURLs`\nIf your application requires access to the file system, it is best to avoid using `file://` URLs. Instead, use an alternative that loads files via HTTPS, such as `androidx.webkit.WebViewAssetLoader`.\n\n\n## Example\nIn the following (bad) example, the WebView is configured with settings that allow local file access.\n\n\n```java\nWebSettings settings = view.getSettings();\n\nsettings.setAllowFileAccess(true);\nsettings.setAllowFileAccessFromURLs(true);\nsettings.setAllowUniversalAccessFromURLs(true);\n\n```\nIn the following (good) example, the WebView is configured to disallow file access.\n\n\n```java\nWebSettings settings = view.getSettings();\n\nsettings.setAllowFileAccess(false);\nsettings.setAllowFileAccessFromURLs(false);\nsettings.setAllowUniversalAccessFromURLs(false);\n\n```\nAs mentioned previously, asset loaders can load files without file system access. In the following (good) example, an asset loader is configured to load assets over HTTPS.\n\n\n```java\nWebViewAssetLoader loader = new WebViewAssetLoader.Builder()\n // Replace the domain with a domain you control, or use the default\n // appassets.androidplatform.com\n .setDomain(\"appassets.example.com\")\n .addPathHandler(\"/resources\", new AssetsPathHandler(this))\n .build();\n\nwebView.setWebViewClient(new WebViewClientCompat() {\n @Override\n public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {\n return assetLoader.shouldInterceptRequest(request.getUrl());\n }\n});\n\nwebView.loadUrl(\"https://appassets.example.com/resources/www/index.html\");\n\n```\n\n## References\n* Android documentation: [WebSettings.setAllowFileAccess](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccess(boolean)).\n* Android documentation: [WebSettings.setAllowFileAccessFromFileURLs](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccessFromFileURLs(boolean)).\n* Android documentation: [WebSettings.setAllowUniversalAccessFromFileURLs](https://developer.android.com/reference/android/webkit/WebSettings#setAllowUniversalAccessFromFileURLs(boolean)).\n* Android documentation: [WebViewAssetLoader](https://developer.android.com/reference/androidx/webkit/WebViewAssetLoader).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n"},"properties":{"tags":["security","external/cwe/cwe-200","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Enabling access to the file system in a WebView allows attackers to view sensitive information.","id":"java/android/websettings-file-access","kind":"problem","name":"Android WebSettings file access","precision":"medium","problem.severity":"warning","security-severity":"6.5"}},{"id":"java/android/webview-addjavascriptinterface","name":"java/android/webview-addjavascriptinterface","shortDescription":{"text":"Access Java object methods through JavaScript exposure"},"fullDescription":{"text":"Exposing a Java object in a WebView with a JavaScript interface can lead to malicious JavaScript controlling the application."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Access Java object methods through JavaScript exposure\nCalling the `addJavascriptInterface` method of the `android.webkit.WebView` class allows the web pages of a WebView to access a Java object's methods via JavaScript.\n\nObjects exposed to JavaScript are available in all frames of the WebView.\n\n\n## Recommendation\nIf you need to expose Java objects to JavaScript, guarantee that no untrusted third-party content is loaded into the WebView.\n\n\n## Example\nIn the following (bad) example, a Java object is exposed to JavaScript.\n\n\n```java\nimport android.webkit.JavascriptInterface;\nimport android.database.sqlite.SQLiteOpenHelper;\n\nclass ExposedObject extends SQLiteOpenHelper {\n @JavascriptInterface\n public String studentEmail(String studentName) {\n // SQL injection\n String query = \"SELECT email FROM students WHERE studentname = '\" + studentName + \"'\";\n\n Cursor cursor = db.rawQuery(query, null);\n cursor.moveToFirst();\n String email = cursor.getString(0);\n\n return email;\n }\n}\n\nwebview.getSettings().setJavaScriptEnabled(true);\nwebview.addJavaScriptInterface(new ExposedObject(), \"exposedObject\");\nwebview.loadData(\"\", \"text/html\", null);\n\nString name = \"Robert'; DROP TABLE students; --\";\nwebview.loadUrl(\"javascript:alert(exposedObject.studentEmail(\\\"\"+ name +\"\\\"))\");\n\n```\n\n## References\n* Android Documentation: [addJavascriptInterface](https://developer.android.com/reference/android/webkit/WebView#addJavascriptInterface(java.lang.Object,%20java.lang.String))\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n","markdown":"# Access Java object methods through JavaScript exposure\nCalling the `addJavascriptInterface` method of the `android.webkit.WebView` class allows the web pages of a WebView to access a Java object's methods via JavaScript.\n\nObjects exposed to JavaScript are available in all frames of the WebView.\n\n\n## Recommendation\nIf you need to expose Java objects to JavaScript, guarantee that no untrusted third-party content is loaded into the WebView.\n\n\n## Example\nIn the following (bad) example, a Java object is exposed to JavaScript.\n\n\n```java\nimport android.webkit.JavascriptInterface;\nimport android.database.sqlite.SQLiteOpenHelper;\n\nclass ExposedObject extends SQLiteOpenHelper {\n @JavascriptInterface\n public String studentEmail(String studentName) {\n // SQL injection\n String query = \"SELECT email FROM students WHERE studentname = '\" + studentName + \"'\";\n\n Cursor cursor = db.rawQuery(query, null);\n cursor.moveToFirst();\n String email = cursor.getString(0);\n\n return email;\n }\n}\n\nwebview.getSettings().setJavaScriptEnabled(true);\nwebview.addJavaScriptInterface(new ExposedObject(), \"exposedObject\");\nwebview.loadData(\"\", \"text/html\", null);\n\nString name = \"Robert'; DROP TABLE students; --\";\nwebview.loadUrl(\"javascript:alert(exposedObject.studentEmail(\\\"\"+ name +\"\\\"))\");\n\n```\n\n## References\n* Android Documentation: [addJavascriptInterface](https://developer.android.com/reference/android/webkit/WebView#addJavascriptInterface(java.lang.Object,%20java.lang.String))\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n"},"properties":{"tags":["security","external/cwe/cwe-079"],"description":"Exposing a Java object in a WebView with a JavaScript interface can lead to malicious JavaScript controlling the application.","id":"java/android/webview-addjavascriptinterface","kind":"problem","name":"Access Java object methods through JavaScript exposure","precision":"medium","problem.severity":"warning","security-severity":"6.1"}},{"id":"java/android/websettings-javascript-enabled","name":"java/android/websettings-javascript-enabled","shortDescription":{"text":"Android WebView JavaScript settings"},"fullDescription":{"text":"Enabling JavaScript execution in a WebView can result in cross-site scripting attacks."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android WebView JavaScript settings\nEnabling JavaScript in an Android WebView allows the execution of JavaScript code in the context of the running application. This creates a cross-site scripting vulnerability.\n\nFor example, if your application's WebView allows for visiting web pages that you do not trust, it is possible for an attacker to lead the user to a page which loads malicious JavaScript.\n\nYou can enable or disable Javascript execution using the `setJavaScriptEnabled` method of the settings of a WebView.\n\n\n## Recommendation\nJavaScript execution is disabled by default. You can explicitly disable it by calling `setJavaScriptEnabled(false)` on the settings of the WebView.\n\nIf JavaScript is necessary, only load content from trusted servers using encrypted channels, such as HTTPS with certificate verification.\n\n\n## Example\nIn the following (bad) example, a WebView has JavaScript enabled in its settings:\n\n\n```java\nWebSettings settings = webview.getSettings();\nsettings.setJavaScriptEnabled(true);\n\n```\nIn the following (good) example, a WebView explicitly disallows JavaScript execution:\n\n\n```java\nWebSettings settings = webview.getSettings();\nsettings.setJavaScriptEnabled(false);\n\n```\n\n## References\n* Android documentation: [setJavaScriptEnabled](https://developer.android.com/reference/android/webkit/WebSettings#setJavaScriptEnabled(boolean))\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n","markdown":"# Android WebView JavaScript settings\nEnabling JavaScript in an Android WebView allows the execution of JavaScript code in the context of the running application. This creates a cross-site scripting vulnerability.\n\nFor example, if your application's WebView allows for visiting web pages that you do not trust, it is possible for an attacker to lead the user to a page which loads malicious JavaScript.\n\nYou can enable or disable Javascript execution using the `setJavaScriptEnabled` method of the settings of a WebView.\n\n\n## Recommendation\nJavaScript execution is disabled by default. You can explicitly disable it by calling `setJavaScriptEnabled(false)` on the settings of the WebView.\n\nIf JavaScript is necessary, only load content from trusted servers using encrypted channels, such as HTTPS with certificate verification.\n\n\n## Example\nIn the following (bad) example, a WebView has JavaScript enabled in its settings:\n\n\n```java\nWebSettings settings = webview.getSettings();\nsettings.setJavaScriptEnabled(true);\n\n```\nIn the following (good) example, a WebView explicitly disallows JavaScript execution:\n\n\n```java\nWebSettings settings = webview.getSettings();\nsettings.setJavaScriptEnabled(false);\n\n```\n\n## References\n* Android documentation: [setJavaScriptEnabled](https://developer.android.com/reference/android/webkit/WebSettings#setJavaScriptEnabled(boolean))\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n"},"properties":{"tags":["security","external/cwe/cwe-079"],"description":"Enabling JavaScript execution in a WebView can result in cross-site scripting attacks.","id":"java/android/websettings-javascript-enabled","kind":"problem","name":"Android WebView JavaScript settings","precision":"medium","problem.severity":"warning","security-severity":"6.1"}},{"id":"java/android/missing-certificate-pinning","name":"java/android/missing-certificate-pinning","shortDescription":{"text":"Android missing certificate pinning"},"fullDescription":{"text":"Network connections that do not use certificate pinning may allow attackers to eavesdrop on communications."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android missing certificate pinning\nCertificate pinning is the practice of only trusting a specific set of SSL certificates, rather than those that the device trusts by default. In Android applications, it is reccomended to use certificate pinning when communicating over the network, in order to minimize the risk of machine-in-the-middle attacks from a compromised CA.\n\n\n## Recommendation\nThe easiest way to implement certificate pinning is to declare your pins in a `network-security-config` XML file. This will automatically provide certificate pinning for any network connection made by the app.\n\nAnother way to implement certificate pinning is to use the \\`CertificatePinner\\` class from the \\`okhttp\\` library.\n\nA final way to implement certificate pinning is to use a `TrustManager`, initialized from a `KeyStore` loaded with only the necessary certificates.\n\n\n## Example\nIn the first (bad) case below, a network call is performed with no certificate pinning implemented. The other (good) cases demonstrate the different ways to implement certificate pinning.\n\n\n```java\n// BAD - By default, this network call does not use certificate pinning\nURLConnection conn = new URL(\"https://example.com\").openConnection();\n```\n\n```xml\n\n\n\n\n\n \n ...\n \n\n\n\n\n\n \n good.example.com\n \n ...\n \n \n\n```\n\n```java\n// GOOD: Certificate pinning implemented via okhttp3.CertificatePinner \nCertificatePinner certificatePinner = new CertificatePinner.Builder()\n .add(\"example.com\", \"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\")\n .build();\nOkHttpClient client = new OkHttpClient.Builder()\n .certificatePinner(certificatePinner)\n .build();\n\nclient.newCall(new Request.Builder().url(\"https://example.com\").build()).execute();\n\n\n\n// GOOD: Certificate pinning implemented via a TrustManager\nKeyStore keyStore = KeyStore.getInstance(\"BKS\");\nkeyStore.load(resources.openRawResource(R.raw.cert), null);\n\nTrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\ntmf.init(keyStore);\n\nSSLContext sslContext = SSLContext.getInstance(\"TLS\");\nsslContext.init(null, tmf.getTrustManagers(), null);\n\nURL url = new URL(\"http://www.example.com/\");\nHttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); \n\nurlConnection.setSSLSocketFactory(sslContext.getSocketFactory());\n```\n\n## References\n* OWASP Mobile Security: [Testing Custom Certificate Stores and Certificate Pinning (MSTG-NETWORK-4)](https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05g-testing-network-communication#testing-custom-certificate-stores-and-certificate-pinning-mstg-network-4).\n* Android Developers: [Network security configuration](https://developer.android.com/training/articles/security-config).\n* OkHttp: [CertificatePinner](https://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n","markdown":"# Android missing certificate pinning\nCertificate pinning is the practice of only trusting a specific set of SSL certificates, rather than those that the device trusts by default. In Android applications, it is reccomended to use certificate pinning when communicating over the network, in order to minimize the risk of machine-in-the-middle attacks from a compromised CA.\n\n\n## Recommendation\nThe easiest way to implement certificate pinning is to declare your pins in a `network-security-config` XML file. This will automatically provide certificate pinning for any network connection made by the app.\n\nAnother way to implement certificate pinning is to use the \\`CertificatePinner\\` class from the \\`okhttp\\` library.\n\nA final way to implement certificate pinning is to use a `TrustManager`, initialized from a `KeyStore` loaded with only the necessary certificates.\n\n\n## Example\nIn the first (bad) case below, a network call is performed with no certificate pinning implemented. The other (good) cases demonstrate the different ways to implement certificate pinning.\n\n\n```java\n// BAD - By default, this network call does not use certificate pinning\nURLConnection conn = new URL(\"https://example.com\").openConnection();\n```\n\n```xml\n\n\n\n\n\n \n ...\n \n\n\n\n\n\n \n good.example.com\n \n ...\n \n \n\n```\n\n```java\n// GOOD: Certificate pinning implemented via okhttp3.CertificatePinner \nCertificatePinner certificatePinner = new CertificatePinner.Builder()\n .add(\"example.com\", \"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\")\n .build();\nOkHttpClient client = new OkHttpClient.Builder()\n .certificatePinner(certificatePinner)\n .build();\n\nclient.newCall(new Request.Builder().url(\"https://example.com\").build()).execute();\n\n\n\n// GOOD: Certificate pinning implemented via a TrustManager\nKeyStore keyStore = KeyStore.getInstance(\"BKS\");\nkeyStore.load(resources.openRawResource(R.raw.cert), null);\n\nTrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\ntmf.init(keyStore);\n\nSSLContext sslContext = SSLContext.getInstance(\"TLS\");\nsslContext.init(null, tmf.getTrustManagers(), null);\n\nURL url = new URL(\"http://www.example.com/\");\nHttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); \n\nurlConnection.setSSLSocketFactory(sslContext.getSocketFactory());\n```\n\n## References\n* OWASP Mobile Security: [Testing Custom Certificate Stores and Certificate Pinning (MSTG-NETWORK-4)](https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05g-testing-network-communication#testing-custom-certificate-stores-and-certificate-pinning-mstg-network-4).\n* Android Developers: [Network security configuration](https://developer.android.com/training/articles/security-config).\n* OkHttp: [CertificatePinner](https://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n"},"properties":{"tags":["security","external/cwe/cwe-295","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Network connections that do not use certificate pinning may allow attackers to eavesdrop on communications.","id":"java/android/missing-certificate-pinning","kind":"problem","name":"Android missing certificate pinning","precision":"medium","problem.severity":"warning","security-severity":"5.9"}},{"id":"java/insecure-basic-auth","name":"java/insecure-basic-auth","shortDescription":{"text":"Insecure basic authentication"},"fullDescription":{"text":"Basic authentication only obfuscates username/password in Base64 encoding, which can be easily recognized and reversed. Transmitting sensitive information without using HTTPS makes the data vulnerable to packet sniffing."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Insecure basic authentication\nBasic authentication only obfuscates usernames and passwords in Base64 encoding, which can be easily recognized and reversed, thus it must not be transmitted over the cleartext HTTP channel. Transmitting sensitive information without using HTTPS makes the data vulnerable to packet sniffing.\n\n\n## Recommendation\nEither use a more secure authentication mechanism like digest authentication or federated authentication, or use the HTTPS communication protocol.\n\n\n## Example\nThe following example shows two ways of using basic authentication. In the 'BAD' case, the credentials are transmitted over HTTP. In the 'GOOD' case, the credentials are transmitted over HTTPS.\n\n\n```java\npublic class InsecureBasicAuth {\n /**\n * Test basic authentication with Apache HTTP request.\n */\n public void testApacheHttpRequest(String username, String password) {\n\n // BAD: basic authentication over HTTP\n String url = \"http://www.example.com/rest/getuser.do?uid=abcdx\";\n\n // GOOD: basic authentication over HTTPS\n url = \"https://www.example.com/rest/getuser.do?uid=abcdx\";\n\n HttpPost post = new HttpPost(url);\n post.setHeader(\"Accept\", \"application/json\");\n post.setHeader(\"Content-type\", \"application/json\");\n\n String authString = username + \":\" + password;\n byte[] authEncBytes = Base64.getEncoder().encode(authString.getBytes());\n String authStringEnc = new String(authEncBytes);\n\n post.addHeader(\"Authorization\", \"Basic \" + authStringEnc);\n }\n\n /**\n * Test basic authentication with Java HTTP URL connection.\n */\n public void testHttpUrlConnection(String username, String password) {\n\n // BAD: basic authentication over HTTP\n String urlStr = \"http://www.example.com/rest/getuser.do?uid=abcdx\";\n\n // GOOD: basic authentication over HTTPS\n urlStr = \"https://www.example.com/rest/getuser.do?uid=abcdx\";\n\n String authString = username + \":\" + password;\n String encoding = Base64.getEncoder().encodeToString(authString.getBytes(\"UTF-8\"));\n URL url = new URL(urlStr);\n HttpURLConnection conn = (HttpURLConnection) url.openConnection();\n conn.setRequestMethod(\"POST\");\n conn.setDoOutput(true);\n conn.setRequestProperty(\"Authorization\", \"Basic \" + encoding);\n }\n}\n\n```\n\n## References\n* SonarSource rule: [Basic authentication should not be used](https://rules.sonarsource.com/java/tag/owasp/RSPEC-2647).\n* Acunetix: [WEB VULNERABILITIES INDEX - Basic authentication over HTTP](https://www.acunetix.com/vulnerabilities/web/basic-authentication-over-http/).\n* Common Weakness Enumeration: [CWE-522](https://cwe.mitre.org/data/definitions/522.html).\n* Common Weakness Enumeration: [CWE-319](https://cwe.mitre.org/data/definitions/319.html).\n","markdown":"# Insecure basic authentication\nBasic authentication only obfuscates usernames and passwords in Base64 encoding, which can be easily recognized and reversed, thus it must not be transmitted over the cleartext HTTP channel. Transmitting sensitive information without using HTTPS makes the data vulnerable to packet sniffing.\n\n\n## Recommendation\nEither use a more secure authentication mechanism like digest authentication or federated authentication, or use the HTTPS communication protocol.\n\n\n## Example\nThe following example shows two ways of using basic authentication. In the 'BAD' case, the credentials are transmitted over HTTP. In the 'GOOD' case, the credentials are transmitted over HTTPS.\n\n\n```java\npublic class InsecureBasicAuth {\n /**\n * Test basic authentication with Apache HTTP request.\n */\n public void testApacheHttpRequest(String username, String password) {\n\n // BAD: basic authentication over HTTP\n String url = \"http://www.example.com/rest/getuser.do?uid=abcdx\";\n\n // GOOD: basic authentication over HTTPS\n url = \"https://www.example.com/rest/getuser.do?uid=abcdx\";\n\n HttpPost post = new HttpPost(url);\n post.setHeader(\"Accept\", \"application/json\");\n post.setHeader(\"Content-type\", \"application/json\");\n\n String authString = username + \":\" + password;\n byte[] authEncBytes = Base64.getEncoder().encode(authString.getBytes());\n String authStringEnc = new String(authEncBytes);\n\n post.addHeader(\"Authorization\", \"Basic \" + authStringEnc);\n }\n\n /**\n * Test basic authentication with Java HTTP URL connection.\n */\n public void testHttpUrlConnection(String username, String password) {\n\n // BAD: basic authentication over HTTP\n String urlStr = \"http://www.example.com/rest/getuser.do?uid=abcdx\";\n\n // GOOD: basic authentication over HTTPS\n urlStr = \"https://www.example.com/rest/getuser.do?uid=abcdx\";\n\n String authString = username + \":\" + password;\n String encoding = Base64.getEncoder().encodeToString(authString.getBytes(\"UTF-8\"));\n URL url = new URL(urlStr);\n HttpURLConnection conn = (HttpURLConnection) url.openConnection();\n conn.setRequestMethod(\"POST\");\n conn.setDoOutput(true);\n conn.setRequestProperty(\"Authorization\", \"Basic \" + encoding);\n }\n}\n\n```\n\n## References\n* SonarSource rule: [Basic authentication should not be used](https://rules.sonarsource.com/java/tag/owasp/RSPEC-2647).\n* Acunetix: [WEB VULNERABILITIES INDEX - Basic authentication over HTTP](https://www.acunetix.com/vulnerabilities/web/basic-authentication-over-http/).\n* Common Weakness Enumeration: [CWE-522](https://cwe.mitre.org/data/definitions/522.html).\n* Common Weakness Enumeration: [CWE-319](https://cwe.mitre.org/data/definitions/319.html).\n"},"properties":{"tags":["security","external/cwe/cwe-522","external/cwe/cwe-319","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Basic authentication only obfuscates username/password in\n Base64 encoding, which can be easily recognized and reversed.\n Transmitting sensitive information without using HTTPS makes\n the data vulnerable to packet sniffing.","id":"java/insecure-basic-auth","kind":"path-problem","name":"Insecure basic authentication","precision":"medium","problem.severity":"warning","security-severity":"8.8"}},{"id":"java/log-injection","name":"java/log-injection","shortDescription":{"text":"Log Injection"},"fullDescription":{"text":"Building log entries from user-controlled data may allow insertion of forged log entries by malicious users."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Log Injection\nIf unsanitized user input is written to a log entry, a malicious user may be able to forge new log entries.\n\nForgery can occur if a user provides some input creating the appearance of multiple log entries. This can include unescaped new-line characters, or HTML or other markup.\n\n\n## Recommendation\nUser input should be suitably sanitized before it is logged.\n\nIf the log entries are plain text then line breaks should be removed from user input, using for example `String replace(char oldChar, char newChar)` or similar. Care should also be taken that user input is clearly marked in log entries, and that a malicious user cannot cause confusion in other ways.\n\nFor log entries that will be displayed in HTML, user input should be HTML encoded before being logged, to prevent forgery and other forms of HTML injection.\n\n\n## Example\nIn the first example, a username, provided by the user, is logged using `logger.warn` (from `org.slf4j.Logger`). In the first case (`/bad` endpoint), the username is logged without any sanitization. If a malicious user provides `Guest'%0AUser:'Admin` as a username parameter, the log entry will be split into two separate lines, where the first line will be `User:'Guest'` and the second one will be `User:'Admin'`.\n\n\n```java\npackage com.example.restservice;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class LogInjection {\n\n private final Logger log = LoggerFactory.getLogger(LogInjection.class);\n\n // /bad?username=Guest'%0AUser:'Admin\n @GetMapping(\"/bad\")\n public String bad(@RequestParam(value = \"username\", defaultValue = \"name\") String username) {\n log.warn(\"User:'{}'\", username);\n // The logging call above would result in multiple log entries as shown below:\n // User:'Guest'\n // User:'Admin'\n return username;\n }\n}\n\n\n```\nIn the second example (`/good` endpoint), `matches()` is used to ensure the user input only has alphanumeric characters. If a malicious user provides \\`Guest'%0AUser:'Admin\\` as a username parameter, the log entry will not be logged at all, preventing the injection.\n\n\n```java\npackage com.example.restservice;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class LogInjection {\n\n private final Logger log = LoggerFactory.getLogger(LogInjection.class);\n\n // /good?username=Guest'%0AUser:'Admin\n @GetMapping(\"/good\")\n public String good(@RequestParam(value = \"username\", defaultValue = \"name\") String username) {\n // The regex check here, allows only alphanumeric characters to pass.\n // Hence, does not result in log injection\n if (username.matches(\"\\\\w*\")) {\n log.warn(\"User:'{}'\", username);\n\n return username;\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Log Injection](https://owasp.org/www-community/attacks/Log_Injection).\n* Common Weakness Enumeration: [CWE-117](https://cwe.mitre.org/data/definitions/117.html).\n","markdown":"# Log Injection\nIf unsanitized user input is written to a log entry, a malicious user may be able to forge new log entries.\n\nForgery can occur if a user provides some input creating the appearance of multiple log entries. This can include unescaped new-line characters, or HTML or other markup.\n\n\n## Recommendation\nUser input should be suitably sanitized before it is logged.\n\nIf the log entries are plain text then line breaks should be removed from user input, using for example `String replace(char oldChar, char newChar)` or similar. Care should also be taken that user input is clearly marked in log entries, and that a malicious user cannot cause confusion in other ways.\n\nFor log entries that will be displayed in HTML, user input should be HTML encoded before being logged, to prevent forgery and other forms of HTML injection.\n\n\n## Example\nIn the first example, a username, provided by the user, is logged using `logger.warn` (from `org.slf4j.Logger`). In the first case (`/bad` endpoint), the username is logged without any sanitization. If a malicious user provides `Guest'%0AUser:'Admin` as a username parameter, the log entry will be split into two separate lines, where the first line will be `User:'Guest'` and the second one will be `User:'Admin'`.\n\n\n```java\npackage com.example.restservice;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class LogInjection {\n\n private final Logger log = LoggerFactory.getLogger(LogInjection.class);\n\n // /bad?username=Guest'%0AUser:'Admin\n @GetMapping(\"/bad\")\n public String bad(@RequestParam(value = \"username\", defaultValue = \"name\") String username) {\n log.warn(\"User:'{}'\", username);\n // The logging call above would result in multiple log entries as shown below:\n // User:'Guest'\n // User:'Admin'\n return username;\n }\n}\n\n\n```\nIn the second example (`/good` endpoint), `matches()` is used to ensure the user input only has alphanumeric characters. If a malicious user provides \\`Guest'%0AUser:'Admin\\` as a username parameter, the log entry will not be logged at all, preventing the injection.\n\n\n```java\npackage com.example.restservice;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class LogInjection {\n\n private final Logger log = LoggerFactory.getLogger(LogInjection.class);\n\n // /good?username=Guest'%0AUser:'Admin\n @GetMapping(\"/good\")\n public String good(@RequestParam(value = \"username\", defaultValue = \"name\") String username) {\n // The regex check here, allows only alphanumeric characters to pass.\n // Hence, does not result in log injection\n if (username.matches(\"\\\\w*\")) {\n log.warn(\"User:'{}'\", username);\n\n return username;\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Log Injection](https://owasp.org/www-community/attacks/Log_Injection).\n* Common Weakness Enumeration: [CWE-117](https://cwe.mitre.org/data/definitions/117.html).\n"},"properties":{"tags":["security","external/cwe/cwe-117","owasp-top10-2021","A09:2021 - Security Logging and Monitoring Failures"],"description":"Building log entries from user-controlled data may allow\n insertion of forged log entries by malicious users.","id":"java/log-injection","kind":"path-problem","name":"Log Injection","precision":"medium","problem.severity":"error","security-severity":"7.8"}},{"id":"java/sensitive-log","name":"java/sensitive-log","shortDescription":{"text":"Insertion of sensitive information into log files"},"fullDescription":{"text":"Writing sensitive information to log files can allow that information to be leaked to an attacker more easily."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Insertion of sensitive information into log files\nInformation written to log files can be of a sensitive nature and give valuable guidance to an attacker or expose sensitive user information. Third-party logging utilities like Log4J and SLF4J are widely used in Java projects. When sensitive information is written to logs without properly set logging levels, it is accessible to potential attackers who can use it to gain access to file storage.\n\n\n## Recommendation\nDo not write secrets into the log files and enforce proper logging level control.\n\n\n## Example\nThe following example shows two ways of logging sensitive information. In the 'BAD' case, the credentials are simply written to a debug log. In the 'GOOD' case, the credentials are never written to debug logs.\n\n\n```java\npublic static void main(String[] args) {\n {\n private static final Logger logger = LogManager.getLogger(SensitiveInfoLog.class);\n\n String password = \"Pass@0rd\";\n\n // BAD: user password is written to debug log\n logger.debug(\"User password is \"+password);\n }\n\t\n {\n private static final Logger logger = LogManager.getLogger(SensitiveInfoLog.class);\n \n String password = \"Pass@0rd\";\n\n // GOOD: user password is never written to debug log\n logger.debug(\"User password changed\")\n }\n}\n\n```\n\n## References\n* [OWASP Logging Guide](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html)\n* Common Weakness Enumeration: [CWE-532](https://cwe.mitre.org/data/definitions/532.html).\n","markdown":"# Insertion of sensitive information into log files\nInformation written to log files can be of a sensitive nature and give valuable guidance to an attacker or expose sensitive user information. Third-party logging utilities like Log4J and SLF4J are widely used in Java projects. When sensitive information is written to logs without properly set logging levels, it is accessible to potential attackers who can use it to gain access to file storage.\n\n\n## Recommendation\nDo not write secrets into the log files and enforce proper logging level control.\n\n\n## Example\nThe following example shows two ways of logging sensitive information. In the 'BAD' case, the credentials are simply written to a debug log. In the 'GOOD' case, the credentials are never written to debug logs.\n\n\n```java\npublic static void main(String[] args) {\n {\n private static final Logger logger = LogManager.getLogger(SensitiveInfoLog.class);\n\n String password = \"Pass@0rd\";\n\n // BAD: user password is written to debug log\n logger.debug(\"User password is \"+password);\n }\n\t\n {\n private static final Logger logger = LogManager.getLogger(SensitiveInfoLog.class);\n \n String password = \"Pass@0rd\";\n\n // GOOD: user password is never written to debug log\n logger.debug(\"User password changed\")\n }\n}\n\n```\n\n## References\n* [OWASP Logging Guide](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html)\n* Common Weakness Enumeration: [CWE-532](https://cwe.mitre.org/data/definitions/532.html).\n"},"properties":{"tags":["security","external/cwe/cwe-532","owasp-top10-2021","A09:2021 - Security Logging and Monitoring Failures"],"description":"Writing sensitive information to log files can allow that\n information to be leaked to an attacker more easily.","id":"java/sensitive-log","kind":"path-problem","name":"Insertion of sensitive information into log files","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/hardcoded-credential-api-call","name":"java/hardcoded-credential-api-call","shortDescription":{"text":"Hard-coded credential in API call"},"fullDescription":{"text":"Using a hard-coded credential in a call to a sensitive Java API may compromise security."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Hard-coded credential in API call\nIncluding unencrypted hard-coded authentication credentials in source code is dangerous because the credentials may be easily discovered. For example, the code may be open source, or it may be leaked or accidentally revealed, making the credentials visible to an attacker. This, in turn, might enable them to gain unauthorized access, or to obtain privileged information.\n\n\n## Recommendation\nRemove hard-coded credentials, such as user names, passwords and certificates, from source code. Instead, place them in configuration files, environment variables or other data stores if necessary. If possible, store configuration files including credential data separately from the source code, in a secure location with restricted access.\n\n\n## Example\nThe following code example connects to a database using a hard-coded user name and password:\n\n\n```java\nprivate static final String p = \"123456\"; // hard-coded credential\n\npublic static void main(String[] args) throws SQLException {\n String url = \"jdbc:mysql://localhost/test\";\n String u = \"admin\"; // hard-coded credential\n\n getConn(url, u, p);\n}\n\npublic static void getConn(String url, String v, String q) throws SQLException {\n DriverManager.getConnection(url, v, q); // sensitive call\n}\n\n```\nInstead, the user name and password could be supplied through environment variables, which can be set externally without hard-coding credentials in the source code.\n\n\n## References\n* OWASP: [Use of hard-coded password](https://www.owasp.org/index.php/Use_of_hard-coded_password).\n* Common Weakness Enumeration: [CWE-798](https://cwe.mitre.org/data/definitions/798.html).\n","markdown":"# Hard-coded credential in API call\nIncluding unencrypted hard-coded authentication credentials in source code is dangerous because the credentials may be easily discovered. For example, the code may be open source, or it may be leaked or accidentally revealed, making the credentials visible to an attacker. This, in turn, might enable them to gain unauthorized access, or to obtain privileged information.\n\n\n## Recommendation\nRemove hard-coded credentials, such as user names, passwords and certificates, from source code. Instead, place them in configuration files, environment variables or other data stores if necessary. If possible, store configuration files including credential data separately from the source code, in a secure location with restricted access.\n\n\n## Example\nThe following code example connects to a database using a hard-coded user name and password:\n\n\n```java\nprivate static final String p = \"123456\"; // hard-coded credential\n\npublic static void main(String[] args) throws SQLException {\n String url = \"jdbc:mysql://localhost/test\";\n String u = \"admin\"; // hard-coded credential\n\n getConn(url, u, p);\n}\n\npublic static void getConn(String url, String v, String q) throws SQLException {\n DriverManager.getConnection(url, v, q); // sensitive call\n}\n\n```\nInstead, the user name and password could be supplied through environment variables, which can be set externally without hard-coding credentials in the source code.\n\n\n## References\n* OWASP: [Use of hard-coded password](https://www.owasp.org/index.php/Use_of_hard-coded_password).\n* Common Weakness Enumeration: [CWE-798](https://cwe.mitre.org/data/definitions/798.html).\n"},"properties":{"tags":["security","external/cwe/cwe-798","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Using a hard-coded credential in a call to a sensitive Java API may compromise security.","id":"java/hardcoded-credential-api-call","kind":"path-problem","name":"Hard-coded credential in API call","precision":"medium","problem.severity":"error","security-severity":"9.8"}},{"id":"java/toctou-race-condition","name":"java/toctou-race-condition","shortDescription":{"text":"Time-of-check time-of-use race condition"},"fullDescription":{"text":"Using a resource after an unsynchronized state check can lead to a race condition, if the state may be changed between the check and use."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Time-of-check time-of-use race condition\nOften it is necessary to check the state of a resource before using it. If the resource is accessed concurrently, then the check and the use need to be performed atomically, otherwise the state of the resource may change between the check and the use. This can lead to a \"time-of-check/time-of-use\" (TOCTOU) race condition.\n\nIn Java, classes may present state inspection methods and operation methods which are synchronized. This prevents multiple threads from executing those methods simultaneously, but it does not prevent a state change in between separate method invocations.\n\n\n## Recommendation\nWhen calling a series of methods which require a consistent view of an object, make sure to synchronize on a monitor that will prevent any other access to the object during your operations.\n\nIf the class that you are using has a well-designed interface, then synchronizing on the object itself will prevent its state being changed inappropriately.\n\n\n## Example\nThe following example shows a resource which has a readiness state, and an action that is only valid if the resource is ready.\n\nIn the bad case, the caller checks the readiness state and then acts, but does not synchronize around the two calls, so the readiness state may be changed by another thread.\n\nIn the good case, the caller jointly synchronizes the check and the use on the resource, so no other thread can modify the state before the use.\n\n\n```java\nclass Resource {\n\tpublic synchronized boolean isReady() { ... }\n\n\tpublic synchronized void setReady(boolean ready) { ... }\n\t\n\tpublic synchronized void act() { \n\t\tif (!isReady())\n\t\t\tthrow new IllegalStateException();\n\t\t...\n\t}\n}\n\t\npublic synchronized void bad(Resource r) {\n\tif (r.isReady()) {\n\t\t// r might no longer be ready, another thread might\n\t\t// have called setReady(false)\n\t\tr.act();\n\t}\n}\n\npublic synchronized void good(Resource r) {\n\tsynchronized(r) {\n\t\tif (r.isReady()) {\n\t\t\tr.act();\n\t\t}\n\t}\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-367](https://cwe.mitre.org/data/definitions/367.html).\n","markdown":"# Time-of-check time-of-use race condition\nOften it is necessary to check the state of a resource before using it. If the resource is accessed concurrently, then the check and the use need to be performed atomically, otherwise the state of the resource may change between the check and the use. This can lead to a \"time-of-check/time-of-use\" (TOCTOU) race condition.\n\nIn Java, classes may present state inspection methods and operation methods which are synchronized. This prevents multiple threads from executing those methods simultaneously, but it does not prevent a state change in between separate method invocations.\n\n\n## Recommendation\nWhen calling a series of methods which require a consistent view of an object, make sure to synchronize on a monitor that will prevent any other access to the object during your operations.\n\nIf the class that you are using has a well-designed interface, then synchronizing on the object itself will prevent its state being changed inappropriately.\n\n\n## Example\nThe following example shows a resource which has a readiness state, and an action that is only valid if the resource is ready.\n\nIn the bad case, the caller checks the readiness state and then acts, but does not synchronize around the two calls, so the readiness state may be changed by another thread.\n\nIn the good case, the caller jointly synchronizes the check and the use on the resource, so no other thread can modify the state before the use.\n\n\n```java\nclass Resource {\n\tpublic synchronized boolean isReady() { ... }\n\n\tpublic synchronized void setReady(boolean ready) { ... }\n\t\n\tpublic synchronized void act() { \n\t\tif (!isReady())\n\t\t\tthrow new IllegalStateException();\n\t\t...\n\t}\n}\n\t\npublic synchronized void bad(Resource r) {\n\tif (r.isReady()) {\n\t\t// r might no longer be ready, another thread might\n\t\t// have called setReady(false)\n\t\tr.act();\n\t}\n}\n\npublic synchronized void good(Resource r) {\n\tsynchronized(r) {\n\t\tif (r.isReady()) {\n\t\t\tr.act();\n\t\t}\n\t}\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-367](https://cwe.mitre.org/data/definitions/367.html).\n"},"properties":{"tags":["security","external/cwe/cwe-367"],"description":"Using a resource after an unsynchronized state check can lead to a race condition,\n if the state may be changed between the check and use.","id":"java/toctou-race-condition","kind":"problem","name":"Time-of-check time-of-use race condition","precision":"medium","problem.severity":"warning","security-severity":"7.7"}},{"id":"java/potentially-dangerous-function","name":"java/potentially-dangerous-function","shortDescription":{"text":"Use of a potentially dangerous function"},"fullDescription":{"text":"Certain standard library routines are dangerous to call."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Use of a potentially dangerous function\nThis rule finds calls to methods that are dangerous to use. Currently, it checks for calls to `Thread.stop`.\n\nStopping a thread with `Thread.stop` causes it to receive a `ThreadDeath` exception. That exception propagates up the stack, releasing all monitors that the thread was holding. In some cases the relevant code will be protected by catching the `ThreadDeath` exception and cleaning up, but because the exception can potentially be thrown from so very many locations, it is impractical to catch all such cases. As a result, calling `Thread.stop` is likely to result in corrupt data.\n\n\n## Recommendation\nThe best solution is usually to provide an alternate communication mechanism for the thread that might need to be interrupted early. For example, Oracle gives the following example of using a volatile variable to communicate whether the worker thread should exit:\n\n\n```java\nprivate volatile Thread blinker;\n\npublic void stop() {\n blinker = null;\n}\n\npublic void run() {\n Thread thisThread = Thread.currentThread();\n while (blinker == thisThread) {\n try {\n Thread.sleep(interval);\n } catch (InterruptedException e){\n }\n repaint();\n }\n}\n\n```\nIt is also possible to use `Thread.interrupt` and to catch and handle `InterruptedException` when it occurs. However, it can be difficult to handle an `InterruptedException` everywhere it might occur; for example, the sample code above simply discards the exception rather than actually exiting the thread.\n\nAnother strategy is to use message passing, for example via a `BlockingQueue`. In addition to passing the worker thread its ordinary work via such a message queue, the worker can be asked to exit by a particular kind of message being sent on the queue.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [THI05-J. Do not use Thread.stop() to terminate threads](https://wiki.sei.cmu.edu/confluence/display/java/THI05-J.+Do+not+use+Thread.stop()+to+terminate+threads).\n* Java API Specification: [Java Thread Primitive Deprecation](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/doc-files/threadPrimitiveDeprecation.html).\n* Java API Specification: [Thread.interrupt](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Thread.html#interrupt()), [BlockingQueue](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/BlockingQueue.html).\n* Common Weakness Enumeration: [CWE-676](https://cwe.mitre.org/data/definitions/676.html).\n","markdown":"# Use of a potentially dangerous function\nThis rule finds calls to methods that are dangerous to use. Currently, it checks for calls to `Thread.stop`.\n\nStopping a thread with `Thread.stop` causes it to receive a `ThreadDeath` exception. That exception propagates up the stack, releasing all monitors that the thread was holding. In some cases the relevant code will be protected by catching the `ThreadDeath` exception and cleaning up, but because the exception can potentially be thrown from so very many locations, it is impractical to catch all such cases. As a result, calling `Thread.stop` is likely to result in corrupt data.\n\n\n## Recommendation\nThe best solution is usually to provide an alternate communication mechanism for the thread that might need to be interrupted early. For example, Oracle gives the following example of using a volatile variable to communicate whether the worker thread should exit:\n\n\n```java\nprivate volatile Thread blinker;\n\npublic void stop() {\n blinker = null;\n}\n\npublic void run() {\n Thread thisThread = Thread.currentThread();\n while (blinker == thisThread) {\n try {\n Thread.sleep(interval);\n } catch (InterruptedException e){\n }\n repaint();\n }\n}\n\n```\nIt is also possible to use `Thread.interrupt` and to catch and handle `InterruptedException` when it occurs. However, it can be difficult to handle an `InterruptedException` everywhere it might occur; for example, the sample code above simply discards the exception rather than actually exiting the thread.\n\nAnother strategy is to use message passing, for example via a `BlockingQueue`. In addition to passing the worker thread its ordinary work via such a message queue, the worker can be asked to exit by a particular kind of message being sent on the queue.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [THI05-J. Do not use Thread.stop() to terminate threads](https://wiki.sei.cmu.edu/confluence/display/java/THI05-J.+Do+not+use+Thread.stop()+to+terminate+threads).\n* Java API Specification: [Java Thread Primitive Deprecation](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/doc-files/threadPrimitiveDeprecation.html).\n* Java API Specification: [Thread.interrupt](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Thread.html#interrupt()), [BlockingQueue](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/BlockingQueue.html).\n* Common Weakness Enumeration: [CWE-676](https://cwe.mitre.org/data/definitions/676.html).\n"},"properties":{"tags":["reliability","security","external/cwe/cwe-676"],"description":"Certain standard library routines are dangerous to call.","id":"java/potentially-dangerous-function","kind":"problem","name":"Use of a potentially dangerous function","precision":"medium","problem.severity":"warning","security-severity":"10.0"}},{"id":"java/improper-validation-of-array-index","name":"java/improper-validation-of-array-index","shortDescription":{"text":"Improper validation of user-provided array index"},"fullDescription":{"text":"Using external input as an index to an array, without proper validation, can lead to index out of bound exceptions."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Improper validation of user-provided array index\nUsing unvalidated input as part of an index into the array can cause the array access to throw an `ArrayIndexOutOfBoundsException`. This is because there is no guarantee that the index provided is within the bounds of the array.\n\nThis problem occurs when user input is used as an array index, either directly or following one or more calculations. If the user input is unsanitized, it may be any value, which could result in either a negative index, or an index which is larger than the size of the array, either of which would result in an `ArrayIndexOutOfBoundsException`.\n\n\n## Recommendation\nThe index used in the array access should be checked against the bounds of the array before being used. The index should be smaller than the array size, and it should not be negative.\n\n\n## Example\nThe following program accesses an element from a fixed size constant array:\n\n\n```java\npublic class ImproperValidationOfArrayIndex extends HttpServlet {\n\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n String[] productDescriptions = new String[] { \"Chocolate bar\", \"Fizzy drink\" };\n\n // User provided value\n String productID = request.getParameter(\"productID\");\n try {\n int productID = Integer.parseInt(userProperty.trim());\n\n /*\n * BAD Array is accessed without checking if the user provided value is out of\n * bounds.\n */\n String productDescription = productDescriptions[productID];\n\n if (productID >= 0 && productID < productDescriptions.length) {\n // GOOD We have checked that the array index is valid first\n productDescription = productDescriptions[productID];\n } else {\n productDescription = \"No product for that ID\";\n }\n\n response.getWriter().write(productDescription);\n\n } catch (NumberFormatException e) { }\n }\n}\n```\nThe first access of the `productDescriptions` array uses the user-provided value as the index without performing any checks. If the user provides a negative value, or a value larger than the size of the array, then an `ArrayIndexOutOfBoundsException` may be thrown.\n\nThe second access of the `productDescriptions` array is contained within a conditional expression that verifies the user-provided value is a valid index into the array. This ensures that the access operation never throws an `ArrayIndexOutOfBoundsException`.\n\n\n## References\n* Java API Specification: [ArrayIndexOutOfBoundsException](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ArrayIndexOutOfBoundsException.html).\n* Common Weakness Enumeration: [CWE-129](https://cwe.mitre.org/data/definitions/129.html).\n","markdown":"# Improper validation of user-provided array index\nUsing unvalidated input as part of an index into the array can cause the array access to throw an `ArrayIndexOutOfBoundsException`. This is because there is no guarantee that the index provided is within the bounds of the array.\n\nThis problem occurs when user input is used as an array index, either directly or following one or more calculations. If the user input is unsanitized, it may be any value, which could result in either a negative index, or an index which is larger than the size of the array, either of which would result in an `ArrayIndexOutOfBoundsException`.\n\n\n## Recommendation\nThe index used in the array access should be checked against the bounds of the array before being used. The index should be smaller than the array size, and it should not be negative.\n\n\n## Example\nThe following program accesses an element from a fixed size constant array:\n\n\n```java\npublic class ImproperValidationOfArrayIndex extends HttpServlet {\n\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n String[] productDescriptions = new String[] { \"Chocolate bar\", \"Fizzy drink\" };\n\n // User provided value\n String productID = request.getParameter(\"productID\");\n try {\n int productID = Integer.parseInt(userProperty.trim());\n\n /*\n * BAD Array is accessed without checking if the user provided value is out of\n * bounds.\n */\n String productDescription = productDescriptions[productID];\n\n if (productID >= 0 && productID < productDescriptions.length) {\n // GOOD We have checked that the array index is valid first\n productDescription = productDescriptions[productID];\n } else {\n productDescription = \"No product for that ID\";\n }\n\n response.getWriter().write(productDescription);\n\n } catch (NumberFormatException e) { }\n }\n}\n```\nThe first access of the `productDescriptions` array uses the user-provided value as the index without performing any checks. If the user provides a negative value, or a value larger than the size of the array, then an `ArrayIndexOutOfBoundsException` may be thrown.\n\nThe second access of the `productDescriptions` array is contained within a conditional expression that verifies the user-provided value is a valid index into the array. This ensures that the access operation never throws an `ArrayIndexOutOfBoundsException`.\n\n\n## References\n* Java API Specification: [ArrayIndexOutOfBoundsException](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ArrayIndexOutOfBoundsException.html).\n* Common Weakness Enumeration: [CWE-129](https://cwe.mitre.org/data/definitions/129.html).\n"},"properties":{"tags":["security","external/cwe/cwe-129"],"description":"Using external input as an index to an array, without proper validation, can lead to index out of bound exceptions.","id":"java/improper-validation-of-array-index","kind":"path-problem","name":"Improper validation of user-provided array index","precision":"medium","problem.severity":"warning","security-severity":"8.8"}},{"id":"java/improper-validation-of-array-construction","name":"java/improper-validation-of-array-construction","shortDescription":{"text":"Improper validation of user-provided size used for array construction"},"fullDescription":{"text":"Using unvalidated external input as the argument to a construction of an array can lead to index out of bound exceptions."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Improper validation of user-provided size used for array construction\nUsing unvalidated input when specifying the size of a newly created array can result in the creation of an array with size zero. If this array is subsequently accessed without further checks, an `ArrayIndexOutOfBoundsException` may be thrown, because there is no guarantee that the array is not empty.\n\nThis problem occurs when user input is used as the size during array initialization, either directly or following one or more calculations. If the user input is unvalidated, it may cause the size of the array to be zero.\n\n\n## Recommendation\nThe size used in the array initialization should be verified to be greater than zero before being used. Alternatively, the array access may be protected by a conditional check that ensures it is only accessed if the index is less than the array size.\n\n\n## Example\nThe following program constructs an array with the size specified by some user input:\n\n\n```java\npublic class ImproperValidationOfArrayIndex extends HttpServlet {\n\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n try {\n // User provided value\n int numberOfItems = Integer.parseInt(request.getParameter(\"numberOfItems\").trim());\n\n if (numberOfItems >= 0) {\n /*\n * BAD numberOfItems may be zero, which would cause the array indexing operation to\n * throw an ArrayIndexOutOfBoundsException\n */\n String items = new String[numberOfItems];\n items[0] = \"Item 1\";\n }\n\n if (numberOfItems > 0) {\n /*\n * GOOD numberOfItems must be greater than zero, so the indexing succeeds.\n */\n String items = new String[numberOfItems];\n items[0] = \"Item 1\";\n }\n\n } catch (NumberFormatException e) { }\n }\n}\n```\nThe first array construction is protected by a condition that checks if the user input is zero or more. However, if the user provides `0` as the `numberOfItems` parameter, then an empty array is created, and any array access would fail with an `ArrayIndexOutOfBoundsException`.\n\nThe second array construction is protected by a condition that checks if the user input is greater than zero. The array will therefore never be empty, and the following array access will not throw an `ArrayIndexOutOfBoundsException`.\n\n\n## References\n* Java API Specification: [ArrayIndexOutOfBoundsException](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ArrayIndexOutOfBoundsException.html).\n* Common Weakness Enumeration: [CWE-129](https://cwe.mitre.org/data/definitions/129.html).\n","markdown":"# Improper validation of user-provided size used for array construction\nUsing unvalidated input when specifying the size of a newly created array can result in the creation of an array with size zero. If this array is subsequently accessed without further checks, an `ArrayIndexOutOfBoundsException` may be thrown, because there is no guarantee that the array is not empty.\n\nThis problem occurs when user input is used as the size during array initialization, either directly or following one or more calculations. If the user input is unvalidated, it may cause the size of the array to be zero.\n\n\n## Recommendation\nThe size used in the array initialization should be verified to be greater than zero before being used. Alternatively, the array access may be protected by a conditional check that ensures it is only accessed if the index is less than the array size.\n\n\n## Example\nThe following program constructs an array with the size specified by some user input:\n\n\n```java\npublic class ImproperValidationOfArrayIndex extends HttpServlet {\n\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n try {\n // User provided value\n int numberOfItems = Integer.parseInt(request.getParameter(\"numberOfItems\").trim());\n\n if (numberOfItems >= 0) {\n /*\n * BAD numberOfItems may be zero, which would cause the array indexing operation to\n * throw an ArrayIndexOutOfBoundsException\n */\n String items = new String[numberOfItems];\n items[0] = \"Item 1\";\n }\n\n if (numberOfItems > 0) {\n /*\n * GOOD numberOfItems must be greater than zero, so the indexing succeeds.\n */\n String items = new String[numberOfItems];\n items[0] = \"Item 1\";\n }\n\n } catch (NumberFormatException e) { }\n }\n}\n```\nThe first array construction is protected by a condition that checks if the user input is zero or more. However, if the user provides `0` as the `numberOfItems` parameter, then an empty array is created, and any array access would fail with an `ArrayIndexOutOfBoundsException`.\n\nThe second array construction is protected by a condition that checks if the user input is greater than zero. The array will therefore never be empty, and the following array access will not throw an `ArrayIndexOutOfBoundsException`.\n\n\n## References\n* Java API Specification: [ArrayIndexOutOfBoundsException](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ArrayIndexOutOfBoundsException.html).\n* Common Weakness Enumeration: [CWE-129](https://cwe.mitre.org/data/definitions/129.html).\n"},"properties":{"tags":["security","external/cwe/cwe-129"],"description":"Using unvalidated external input as the argument to a construction of an array can lead to index out of bound exceptions.","id":"java/improper-validation-of-array-construction","kind":"path-problem","name":"Improper validation of user-provided size used for array construction","precision":"medium","problem.severity":"warning","security-severity":"8.8"}},{"id":"java/android/sensitive-result-receiver","name":"java/android/sensitive-result-receiver","shortDescription":{"text":"Leaking sensitive information through a ResultReceiver"},"fullDescription":{"text":"Sending sensitive data to a 'ResultReceiver' obtained from an untrusted source can allow malicious actors access to your information."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Leaking sensitive information through a ResultReceiver\nIf a `ResultReceiver` is obtained from an untrusted source, such as an `Intent` received by an exported component, do not send it sensitive data. Otherwise, the information may be leaked to a malicious application.\n\n\n## Recommendation\nDo not send sensitive data to an untrusted `ResultReceiver`.\n\n\n## Example\nIn the following (bad) example, sensitive data is sent to an untrusted `ResultReceiver`.\n\n\n```java\n// BAD: Sensitive data is sent to an untrusted result receiver \nvoid bad(String password) {\n Intent intent = getIntent();\n ResultReceiver rec = intent.getParcelableExtra(\"Receiver\");\n Bundle b = new Bundle();\n b.putCharSequence(\"pass\", password);\n rec.send(0, b); \n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n","markdown":"# Leaking sensitive information through a ResultReceiver\nIf a `ResultReceiver` is obtained from an untrusted source, such as an `Intent` received by an exported component, do not send it sensitive data. Otherwise, the information may be leaked to a malicious application.\n\n\n## Recommendation\nDo not send sensitive data to an untrusted `ResultReceiver`.\n\n\n## Example\nIn the following (bad) example, sensitive data is sent to an untrusted `ResultReceiver`.\n\n\n```java\n// BAD: Sensitive data is sent to an untrusted result receiver \nvoid bad(String password) {\n Intent intent = getIntent();\n ResultReceiver rec = intent.getParcelableExtra(\"Receiver\");\n Bundle b = new Bundle();\n b.putCharSequence(\"pass\", password);\n rec.send(0, b); \n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n"},"properties":{"tags":["security","external/cwe/cwe-927","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Sending sensitive data to a 'ResultReceiver' obtained from an untrusted source\n can allow malicious actors access to your information.","id":"java/android/sensitive-result-receiver","kind":"path-problem","name":"Leaking sensitive information through a ResultReceiver","precision":"medium","problem.severity":"error","security-severity":"8.2"}},{"id":"java/android/sensitive-communication","name":"java/android/sensitive-communication","shortDescription":{"text":"Leaking sensitive information through an implicit Intent"},"fullDescription":{"text":"An Android application uses implicit Intents containing sensitive data in a way that exposes it to arbitrary applications on the device."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Leaking sensitive information through an implicit Intent\nWhen an implicit Intent is used with a method such as `startActivity`, `startService`, or `sendBroadcast`, it may be read by other applications on the device.\n\nThis means that sensitive data in these Intents may be leaked.\n\n\n## Recommendation\nFor `sendBroadcast` methods, a receiver permission may be specified so that only applications with a certain permission may receive the Intent; or a `LocalBroadcastManager` may be used. Otherwise, ensure that Intents containing sensitive data have an explicit receiver class set.\n\n\n## Example\nThe following example shows two ways of broadcasting Intents. In the 'BAD' case, no \"receiver permission\" is specified. In the 'GOOD' case, \"receiver permission\" or \"receiver application\" is specified.\n\n\n```java\npublic void sendBroadcast1(Context context, String token, String refreshToken) \n{\n {\n // BAD: broadcast sensitive information to all listeners\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent);\n }\n\n {\n // GOOD: broadcast sensitive information only to those with permission\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent, \"com.example.user_permission\");\n }\n\n {\n // GOOD: broadcast sensitive information to a specific application\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.setClassName(\"com.example2\", \"com.example2.UserInfoHandler\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent);\n }\n}\n```\n\n## References\n* Android Developers: [Security considerations and best practices for sending and receiving broadcasts](https://developer.android.com/guide/components/broadcasts)\n* SonarSource: [Broadcasting intents is security-sensitive](https://rules.sonarsource.com/java/type/Security%20Hotspot/RSPEC-5320)\n* Android Developer Fundamentals: [Restricting broadcasts](https://google-developer-training.github.io/android-developer-fundamentals-course-concepts-v2/unit-3-working-in-the-background/lesson-7-background-tasks/7-3-c-broadcasts/7-3-c-broadcasts.html)\n* Carnegie Mellon University: [DRD03-J. Do not broadcast sensitive information using an implicit intent](https://wiki.sei.cmu.edu/confluence/display/android/DRD03-J.+Do+not+broadcast+sensitive+information+using+an+implicit+intent)\n* Android Developers: [Android LiveData Overview](https://developer.android.com/topic/libraries/architecture/livedata)\n* Oversecured: [Interception of Android implicit intents](https://blog.oversecured.com/Interception-of-Android-implicit-intents/)\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n","markdown":"# Leaking sensitive information through an implicit Intent\nWhen an implicit Intent is used with a method such as `startActivity`, `startService`, or `sendBroadcast`, it may be read by other applications on the device.\n\nThis means that sensitive data in these Intents may be leaked.\n\n\n## Recommendation\nFor `sendBroadcast` methods, a receiver permission may be specified so that only applications with a certain permission may receive the Intent; or a `LocalBroadcastManager` may be used. Otherwise, ensure that Intents containing sensitive data have an explicit receiver class set.\n\n\n## Example\nThe following example shows two ways of broadcasting Intents. In the 'BAD' case, no \"receiver permission\" is specified. In the 'GOOD' case, \"receiver permission\" or \"receiver application\" is specified.\n\n\n```java\npublic void sendBroadcast1(Context context, String token, String refreshToken) \n{\n {\n // BAD: broadcast sensitive information to all listeners\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent);\n }\n\n {\n // GOOD: broadcast sensitive information only to those with permission\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent, \"com.example.user_permission\");\n }\n\n {\n // GOOD: broadcast sensitive information to a specific application\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.setClassName(\"com.example2\", \"com.example2.UserInfoHandler\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent);\n }\n}\n```\n\n## References\n* Android Developers: [Security considerations and best practices for sending and receiving broadcasts](https://developer.android.com/guide/components/broadcasts)\n* SonarSource: [Broadcasting intents is security-sensitive](https://rules.sonarsource.com/java/type/Security%20Hotspot/RSPEC-5320)\n* Android Developer Fundamentals: [Restricting broadcasts](https://google-developer-training.github.io/android-developer-fundamentals-course-concepts-v2/unit-3-working-in-the-background/lesson-7-background-tasks/7-3-c-broadcasts/7-3-c-broadcasts.html)\n* Carnegie Mellon University: [DRD03-J. Do not broadcast sensitive information using an implicit intent](https://wiki.sei.cmu.edu/confluence/display/android/DRD03-J.+Do+not+broadcast+sensitive+information+using+an+implicit+intent)\n* Android Developers: [Android LiveData Overview](https://developer.android.com/topic/libraries/architecture/livedata)\n* Oversecured: [Interception of Android implicit intents](https://blog.oversecured.com/Interception-of-Android-implicit-intents/)\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n"},"properties":{"tags":["security","external/cwe/cwe-927","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"An Android application uses implicit Intents containing sensitive data\n in a way that exposes it to arbitrary applications on the device.","id":"java/android/sensitive-communication","kind":"path-problem","name":"Leaking sensitive information through an implicit Intent","precision":"medium","problem.severity":"warning","security-severity":"8.2"}},{"id":"java/partial-path-traversal","name":"java/partial-path-traversal","shortDescription":{"text":"Partial path traversal vulnerability"},"fullDescription":{"text":"A prefix used to check that a canonicalised path falls within another must be slash-terminated."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Partial path traversal vulnerability\nA common way to check that a user-supplied path `SUBDIR` falls inside a directory `DIR` is to use `getCanonicalPath()` to remove any path-traversal elements and then check that `DIR` is a prefix. However, if `DIR` is not slash-terminated, this can unexpectedly allow access to siblings of `DIR`.\n\nSee also `java/partial-path-traversal-from-remote`, which is similar to this query but only flags instances with evidence of remote exploitability.\n\n\n## Recommendation\nIf the user should only access items within a certain directory `DIR`, ensure that `DIR` is slash-terminated before checking that `DIR` is a prefix of the user-provided path, `SUBDIR`. Note, Java's `getCanonicalPath()` returns a **non**-slash-terminated path string, so a slash must be added to `DIR` if that method is used.\n\n\n## Example\nIn this example, the `if` statement checks if `parent.getCanonicalPath()` is a prefix of `dir.getCanonicalPath()`. However, `parent.getCanonicalPath()` is not slash-terminated. This means that users that supply `dir` may be also allowed to access siblings of `parent` and not just children of `parent`, which is a security issue.\n\n\n```java\npublic class PartialPathTraversalBad {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath())) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\nIn this example, the `if` statement checks if `parent.getCanonicalPath() + File.separator ` is a prefix of `dir.getCanonicalPath()`. Because `parent.getCanonicalPath() + File.separator` is indeed slash-terminated, the user supplying `dir` can only access children of `parent`, as desired.\n\n\n```java\npublic class PartialPathTraversalGood {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath() + File.separator)) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Partial Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* CVE-2022-23457: [ ESAPI Vulnerability Report](https://github.com/ESAPI/esapi-java-legacy/blob/develop/documentation/GHSL-2022-008_The_OWASP_Enterprise_Security_API.md).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n","markdown":"# Partial path traversal vulnerability\nA common way to check that a user-supplied path `SUBDIR` falls inside a directory `DIR` is to use `getCanonicalPath()` to remove any path-traversal elements and then check that `DIR` is a prefix. However, if `DIR` is not slash-terminated, this can unexpectedly allow access to siblings of `DIR`.\n\nSee also `java/partial-path-traversal-from-remote`, which is similar to this query but only flags instances with evidence of remote exploitability.\n\n\n## Recommendation\nIf the user should only access items within a certain directory `DIR`, ensure that `DIR` is slash-terminated before checking that `DIR` is a prefix of the user-provided path, `SUBDIR`. Note, Java's `getCanonicalPath()` returns a **non**-slash-terminated path string, so a slash must be added to `DIR` if that method is used.\n\n\n## Example\nIn this example, the `if` statement checks if `parent.getCanonicalPath()` is a prefix of `dir.getCanonicalPath()`. However, `parent.getCanonicalPath()` is not slash-terminated. This means that users that supply `dir` may be also allowed to access siblings of `parent` and not just children of `parent`, which is a security issue.\n\n\n```java\npublic class PartialPathTraversalBad {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath())) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\nIn this example, the `if` statement checks if `parent.getCanonicalPath() + File.separator ` is a prefix of `dir.getCanonicalPath()`. Because `parent.getCanonicalPath() + File.separator` is indeed slash-terminated, the user supplying `dir` can only access children of `parent`, as desired.\n\n\n```java\npublic class PartialPathTraversalGood {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath() + File.separator)) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Partial Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* CVE-2022-23457: [ ESAPI Vulnerability Report](https://github.com/ESAPI/esapi-java-legacy/blob/develop/documentation/GHSL-2022-008_The_OWASP_Enterprise_Security_API.md).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n"},"properties":{"tags":["security","external/cwe/cwe-023"],"description":"A prefix used to check that a canonicalised path falls within another must be slash-terminated.","id":"java/partial-path-traversal","kind":"problem","name":"Partial path traversal vulnerability","precision":"medium","problem.severity":"error","security-severity":"9.3"}},{"id":"java/uncontrolled-arithmetic","name":"java/uncontrolled-arithmetic","shortDescription":{"text":"Uncontrolled data in arithmetic expression"},"fullDescription":{"text":"Arithmetic operations on uncontrolled data that is not validated can cause overflows."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Uncontrolled data in arithmetic expression\nPerforming calculations on uncontrolled data can result in integer overflows unless the input is validated.\n\nIf the data is not under your control, and can take extremely large values, even arithmetic operations that would usually result in a small change in magnitude may result in overflows.\n\n\n## Recommendation\nAlways guard against overflow in arithmetic operations on uncontrolled data by doing one of the following:\n\n* Validate the data.\n* Define a guard on the arithmetic expression, so that the operation is performed only if the result can be known to be less than, or equal to, the maximum value for the type, for example `MAX_VALUE`.\n* Use a wider type, so that larger input values do not cause overflow.\n\n## Example\nIn this example, a random integer is generated. Because the value is not controlled by the programmer, it could be extremely large. Performing arithmetic operations on this value could therefore cause an overflow. To avoid this happening, the example shows how to perform a check before performing a multiplication.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t{\n\t\t\tint data = (new java.security.SecureRandom()).nextInt();\n\n\t\t\t// BAD: may overflow if data is large\n\t\t\tint scaled = data * 10;\n\n\t\t\t// ...\n\n\t\t\t// GOOD: use a guard to ensure no overflows occur\n\t\t\tint scaled2;\n\t\t\tif (data < Integer.MAX_VALUE/10)\n\t\t\t\tscaled2 = data * 10;\n\t\t\telse \n\t\t\t\tscaled2 = Integer.MAX_VALUE;\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-191](https://cwe.mitre.org/data/definitions/191.html).\n","markdown":"# Uncontrolled data in arithmetic expression\nPerforming calculations on uncontrolled data can result in integer overflows unless the input is validated.\n\nIf the data is not under your control, and can take extremely large values, even arithmetic operations that would usually result in a small change in magnitude may result in overflows.\n\n\n## Recommendation\nAlways guard against overflow in arithmetic operations on uncontrolled data by doing one of the following:\n\n* Validate the data.\n* Define a guard on the arithmetic expression, so that the operation is performed only if the result can be known to be less than, or equal to, the maximum value for the type, for example `MAX_VALUE`.\n* Use a wider type, so that larger input values do not cause overflow.\n\n## Example\nIn this example, a random integer is generated. Because the value is not controlled by the programmer, it could be extremely large. Performing arithmetic operations on this value could therefore cause an overflow. To avoid this happening, the example shows how to perform a check before performing a multiplication.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t{\n\t\t\tint data = (new java.security.SecureRandom()).nextInt();\n\n\t\t\t// BAD: may overflow if data is large\n\t\t\tint scaled = data * 10;\n\n\t\t\t// ...\n\n\t\t\t// GOOD: use a guard to ensure no overflows occur\n\t\t\tint scaled2;\n\t\t\tif (data < Integer.MAX_VALUE/10)\n\t\t\t\tscaled2 = data * 10;\n\t\t\telse \n\t\t\t\tscaled2 = Integer.MAX_VALUE;\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-191](https://cwe.mitre.org/data/definitions/191.html).\n"},"properties":{"tags":["security","external/cwe/cwe-190","external/cwe/cwe-191"],"description":"Arithmetic operations on uncontrolled data that is not validated can cause\n overflows.","id":"java/uncontrolled-arithmetic","kind":"path-problem","name":"Uncontrolled data in arithmetic expression","precision":"medium","problem.severity":"warning","security-severity":"8.6"}},{"id":"java/tainted-arithmetic","name":"java/tainted-arithmetic","shortDescription":{"text":"User-controlled data in arithmetic expression"},"fullDescription":{"text":"Arithmetic operations on user-controlled data that is not validated can cause overflows."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# User-controlled data in arithmetic expression\nPerforming calculations on user-controlled data can result in integer overflows unless the input is validated.\n\nIf the user is free to enter very large numbers, even arithmetic operations that would usually result in a small change in magnitude may result in overflows.\n\n\n## Recommendation\nAlways guard against overflow in arithmetic operations on user-controlled data by doing one of the following:\n\n* Validate the user input.\n* Define a guard on the arithmetic expression, so that the operation is performed only if the result can be known to be less than, or equal to, the maximum value for the type, for example `MAX_VALUE`.\n* Use a wider type, so that larger input values do not cause overflow.\n\n## Example\nIn this example, a value is read from standard input into an `int`. Because the value is a user-controlled value, it could be extremely large. Performing arithmetic operations on this value could therefore cause an overflow. To avoid this happening, the example shows how to perform a check before performing a multiplication.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t{\n\t\t\tint data;\n\n\t\t\tBufferedReader readerBuffered = new BufferedReader(\n\t\t\t\t\tnew InputStreamReader(System.in, \"UTF-8\"));\n\t\t\tString stringNumber = readerBuffered.readLine();\n\t\t\tif (stringNumber != null) {\n\t\t\t\tdata = Integer.parseInt(stringNumber.trim());\n\t\t\t} else {\n\t\t\t\tdata = 0;\n\t\t\t}\n\n\t\t\t// BAD: may overflow if input data is very large, for example\n\t\t\t// 'Integer.MAX_VALUE'\n\t\t\tint scaled = data * 10;\n\n\t\t\t//...\n\t\t\t\n\t\t\t// GOOD: use a guard to ensure no overflows occur\n\t\t\tint scaled2;\n\t\t\tif (data < Integer.MAX_VALUE / 10)\n\t\t\t\tscaled2 = data * 10;\n\t\t\telse\n\t\t\t\tscaled2 = Integer.MAX_VALUE;\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-191](https://cwe.mitre.org/data/definitions/191.html).\n","markdown":"# User-controlled data in arithmetic expression\nPerforming calculations on user-controlled data can result in integer overflows unless the input is validated.\n\nIf the user is free to enter very large numbers, even arithmetic operations that would usually result in a small change in magnitude may result in overflows.\n\n\n## Recommendation\nAlways guard against overflow in arithmetic operations on user-controlled data by doing one of the following:\n\n* Validate the user input.\n* Define a guard on the arithmetic expression, so that the operation is performed only if the result can be known to be less than, or equal to, the maximum value for the type, for example `MAX_VALUE`.\n* Use a wider type, so that larger input values do not cause overflow.\n\n## Example\nIn this example, a value is read from standard input into an `int`. Because the value is a user-controlled value, it could be extremely large. Performing arithmetic operations on this value could therefore cause an overflow. To avoid this happening, the example shows how to perform a check before performing a multiplication.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t{\n\t\t\tint data;\n\n\t\t\tBufferedReader readerBuffered = new BufferedReader(\n\t\t\t\t\tnew InputStreamReader(System.in, \"UTF-8\"));\n\t\t\tString stringNumber = readerBuffered.readLine();\n\t\t\tif (stringNumber != null) {\n\t\t\t\tdata = Integer.parseInt(stringNumber.trim());\n\t\t\t} else {\n\t\t\t\tdata = 0;\n\t\t\t}\n\n\t\t\t// BAD: may overflow if input data is very large, for example\n\t\t\t// 'Integer.MAX_VALUE'\n\t\t\tint scaled = data * 10;\n\n\t\t\t//...\n\t\t\t\n\t\t\t// GOOD: use a guard to ensure no overflows occur\n\t\t\tint scaled2;\n\t\t\tif (data < Integer.MAX_VALUE / 10)\n\t\t\t\tscaled2 = data * 10;\n\t\t\telse\n\t\t\t\tscaled2 = Integer.MAX_VALUE;\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-191](https://cwe.mitre.org/data/definitions/191.html).\n"},"properties":{"tags":["security","external/cwe/cwe-190","external/cwe/cwe-191"],"description":"Arithmetic operations on user-controlled data that is not validated can cause\n overflows.","id":"java/tainted-arithmetic","kind":"path-problem","name":"User-controlled data in arithmetic expression","precision":"medium","problem.severity":"warning","security-severity":"8.6"}},{"id":"java/comparison-with-wider-type","name":"java/comparison-with-wider-type","shortDescription":{"text":"Comparison of narrow type with wide type in loop condition"},"fullDescription":{"text":"Comparisons between types of different widths in a loop condition can cause the loop to behave unexpectedly."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Comparison of narrow type with wide type in loop condition\nIn a loop condition, comparison of a value of a narrow type with a value of a wide type may always evaluate to `true` if the wider value is sufficiently large (or small). This is because the narrower value may overflow. This can lead to an infinite loop.\n\n\n## Recommendation\nChange the types of the compared values so that the value on the narrower side of the comparison is at least as wide as the value it is being compared with.\n\n\n## Example\nIn this example, `bytesReceived` is compared against `MAXGET` in a `while` loop. However, `bytesReceived` is a `short`, and `MAXGET` is a `long`. Because `MAXGET` is larger than `Short.MAX_VALUE`, the loop condition is always `true`, so the loop never terminates.\n\nThis problem is avoided in the 'GOOD' case because `bytesReceived2` is a `long`, which is as wide as the type of `MAXGET`.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t\n\t\t{\t\t\n\t\t\tint BIGNUM = Integer.MAX_VALUE;\n\t\t\tlong MAXGET = Short.MAX_VALUE + 1;\n\t\t\t\n\t\t\tchar[] buf = new char[BIGNUM];\n\n\t\t\tshort bytesReceived = 0;\n\t\t\t\n\t\t\t// BAD: 'bytesReceived' is compared with a value of wider type.\n\t\t\t// 'bytesReceived' overflows before reaching MAXGET,\n\t\t\t// causing an infinite loop.\n\t\t\twhile (bytesReceived < MAXGET) {\n\t\t\t\tbytesReceived += getFromInput(buf, bytesReceived);\n\t\t\t}\n\t\t}\n\t\t\n\t\t{\n\t\t\tlong bytesReceived2 = 0;\n\t\t\t\n\t\t\t// GOOD: 'bytesReceived2' has a type at least as wide as MAXGET.\n\t\t\twhile (bytesReceived2 < MAXGET) {\n\t\t\t\tbytesReceived2 += getFromInput(buf, bytesReceived2);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tpublic static int getFromInput(char[] buf, short pos) {\n\t\t// write to buf\n\t\t// ...\n\t\treturn 1;\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n","markdown":"# Comparison of narrow type with wide type in loop condition\nIn a loop condition, comparison of a value of a narrow type with a value of a wide type may always evaluate to `true` if the wider value is sufficiently large (or small). This is because the narrower value may overflow. This can lead to an infinite loop.\n\n\n## Recommendation\nChange the types of the compared values so that the value on the narrower side of the comparison is at least as wide as the value it is being compared with.\n\n\n## Example\nIn this example, `bytesReceived` is compared against `MAXGET` in a `while` loop. However, `bytesReceived` is a `short`, and `MAXGET` is a `long`. Because `MAXGET` is larger than `Short.MAX_VALUE`, the loop condition is always `true`, so the loop never terminates.\n\nThis problem is avoided in the 'GOOD' case because `bytesReceived2` is a `long`, which is as wide as the type of `MAXGET`.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t\n\t\t{\t\t\n\t\t\tint BIGNUM = Integer.MAX_VALUE;\n\t\t\tlong MAXGET = Short.MAX_VALUE + 1;\n\t\t\t\n\t\t\tchar[] buf = new char[BIGNUM];\n\n\t\t\tshort bytesReceived = 0;\n\t\t\t\n\t\t\t// BAD: 'bytesReceived' is compared with a value of wider type.\n\t\t\t// 'bytesReceived' overflows before reaching MAXGET,\n\t\t\t// causing an infinite loop.\n\t\t\twhile (bytesReceived < MAXGET) {\n\t\t\t\tbytesReceived += getFromInput(buf, bytesReceived);\n\t\t\t}\n\t\t}\n\t\t\n\t\t{\n\t\t\tlong bytesReceived2 = 0;\n\t\t\t\n\t\t\t// GOOD: 'bytesReceived2' has a type at least as wide as MAXGET.\n\t\t\twhile (bytesReceived2 < MAXGET) {\n\t\t\t\tbytesReceived2 += getFromInput(buf, bytesReceived2);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tpublic static int getFromInput(char[] buf, short pos) {\n\t\t// write to buf\n\t\t// ...\n\t\treturn 1;\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n"},"properties":{"tags":["reliability","security","external/cwe/cwe-190","external/cwe/cwe-197"],"description":"Comparisons between types of different widths in a loop condition can cause the loop\n to behave unexpectedly.","id":"java/comparison-with-wider-type","kind":"problem","name":"Comparison of narrow type with wide type in loop condition","precision":"medium","problem.severity":"warning","security-severity":"8.1"}},{"id":"java/android/sensitive-keyboard-cache","name":"java/android/sensitive-keyboard-cache","shortDescription":{"text":"Android sensitive keyboard cache"},"fullDescription":{"text":"Allowing the keyboard to cache sensitive information may result in information leaks to other applications."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android sensitive keyboard cache\nWhen a user enters information in a text input field on an Android application, their input is saved to a keyboard cache which provides autocomplete suggestions and predictions. There is a risk that sensitive user data, such as passwords or banking information, may be leaked to other applications via the keyboard cache.\n\n\n## Recommendation\nFor input fields expected to accept sensitive information, use input types such as `\"textNoSuggestions\"` (or `\"textPassword\"` for a password) to ensure the input does not get stored in the keyboard cache.\n\nOptionally, instead of declaring an input type through XML, you can set the input type in your code using `TextView.setInputType()`.\n\n\n## Example\nIn the following example, the field labeled BAD allows the password to be saved to the keyboard cache, whereas the field labeled GOOD uses the `\"textPassword\"` input type to ensure the password is not cached.\n\n\n```xml\n\n\n\n \n \n\n \n \n\n```\n\n## References\n* OWASP Mobile Application Security Testing Guide: [Determining Whether the Keyboard Cache Is Disabled for Text Input Fields](https://github.com/OWASP/owasp-mastg/blob/b7a93a2e5e0557cc9a12e55fc3f6675f6986bb86/Document/0x05d-Testing-Data-Storage.md#determining-whether-the-keyboard-cache-is-disabled-for-text-input-fields-mstg-storage-5).\n* Android Developers: [android:inputType attribute documentation.](https://developer.android.com/reference/android/widget/TextView#attr_android:inputType)\n* Common Weakness Enumeration: [CWE-524](https://cwe.mitre.org/data/definitions/524.html).\n","markdown":"# Android sensitive keyboard cache\nWhen a user enters information in a text input field on an Android application, their input is saved to a keyboard cache which provides autocomplete suggestions and predictions. There is a risk that sensitive user data, such as passwords or banking information, may be leaked to other applications via the keyboard cache.\n\n\n## Recommendation\nFor input fields expected to accept sensitive information, use input types such as `\"textNoSuggestions\"` (or `\"textPassword\"` for a password) to ensure the input does not get stored in the keyboard cache.\n\nOptionally, instead of declaring an input type through XML, you can set the input type in your code using `TextView.setInputType()`.\n\n\n## Example\nIn the following example, the field labeled BAD allows the password to be saved to the keyboard cache, whereas the field labeled GOOD uses the `\"textPassword\"` input type to ensure the password is not cached.\n\n\n```xml\n\n\n\n \n \n\n \n \n\n```\n\n## References\n* OWASP Mobile Application Security Testing Guide: [Determining Whether the Keyboard Cache Is Disabled for Text Input Fields](https://github.com/OWASP/owasp-mastg/blob/b7a93a2e5e0557cc9a12e55fc3f6675f6986bb86/Document/0x05d-Testing-Data-Storage.md#determining-whether-the-keyboard-cache-is-disabled-for-text-input-fields-mstg-storage-5).\n* Android Developers: [android:inputType attribute documentation.](https://developer.android.com/reference/android/widget/TextView#attr_android:inputType)\n* Common Weakness Enumeration: [CWE-524](https://cwe.mitre.org/data/definitions/524.html).\n"},"properties":{"tags":["security","external/cwe/cwe-524"],"description":"Allowing the keyboard to cache sensitive information may result in information leaks to other applications.","id":"java/android/sensitive-keyboard-cache","kind":"problem","name":"Android sensitive keyboard cache","precision":"medium","problem.severity":"warning","security-severity":"8.1"}},{"id":"java/insecure-smtp-ssl","name":"java/insecure-smtp-ssl","shortDescription":{"text":"Insecure JavaMail SSL Configuration"},"fullDescription":{"text":"Configuring a Java application to use authenticated mail session over SSL without certificate validation makes the session susceptible to a man-in-the-middle attack."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Insecure JavaMail SSL Configuration\nJavaMail is commonly used in Java applications to send emails. There are popular third-party libraries like Apache Commons Email which are built on JavaMail and facilitate integration. Authenticated mail sessions require user credentials and mail sessions can require SSL/TLS authentication. It is a common security vulnerability that host-specific certificate data is not validated or is incorrectly validated. Failing to validate the certificate makes the SSL session susceptible to a man-in-the-middle attack.\n\nThis query checks whether the SSL certificate is validated when credentials are used and SSL is enabled in email communications.\n\nThe query has code for both plain JavaMail invocation and mailing through Apache SimpleMail to make it more comprehensive.\n\n\n## Recommendation\nValidate SSL certificate when sensitive information is sent in email communications.\n\n\n## Example\nThe following two examples show two ways of configuring secure emails through JavaMail or Apache SimpleMail. In the 'BAD' case, credentials are sent in an SSL session without certificate validation. In the 'GOOD' case, the certificate is validated.\n\n\n```java\nimport java.util.Properties;\n\nimport javax.activation.DataSource;\nimport javax.mail.Authenticator;\nimport javax.mail.Message;\nimport javax.mail.MessagingException;\nimport javax.mail.PasswordAuthentication;\nimport javax.mail.Session;\n\nimport org.apache.logging.log4j.util.PropertiesUtil;\n\nclass JavaMail {\n public static void main(String[] args) {\n // BAD: Don't have server certificate check\n {\n\t\tfinal Properties properties = PropertiesUtil.getSystemProperties();\n\t\tproperties.put(\"mail.transport.protocol\", \"protocol\");\n\t\tproperties.put(\"mail.smtp.host\", \"hostname\");\n\t\tproperties.put(\"mail.smtp.socketFactory.class\", \"classname\");\n\n\t\tfinal Authenticator authenticator = buildAuthenticator(\"username\", \"password\");\n\t\tif (null != authenticator) {\n\t\t\tproperties.put(\"mail.smtp.auth\", \"true\");\n\t\t}\n\t\tfinal Session session = Session.getInstance(properties, authenticator);\n }\n\n // GOOD: Have server certificate check\n {\n\t\tfinal Properties properties = PropertiesUtil.getSystemProperties();\n\t\tproperties.put(\"mail.transport.protocol\", \"protocol\");\n\t\tproperties.put(\"mail.smtp.host\", \"hostname\");\n\t\tproperties.put(\"mail.smtp.socketFactory.class\", \"classname\");\n\n\t\tfinal Authenticator authenticator = buildAuthenticator(\"username\", \"password\");\n\t\tif (null != authenticator) {\n\t\t\tproperties.put(\"mail.smtp.auth\", \"true\");\n\t\t\tproperties.put(\"mail.smtp.ssl.checkserveridentity\", \"true\");\n\t\t}\n\t\tfinal Session session = Session.getInstance(properties, authenticator);\n }\n }\n}\n```\n\n```java\nimport org.apache.commons.mail.DefaultAuthenticator;\nimport org.apache.commons.mail.Email;\nimport org.apache.commons.mail.EmailException;\nimport org.apache.commons.mail.SimpleEmail;\n\nclass SimpleMail {\n public static void main(String[] args) throws EmailException {\n // BAD: Don't have setSSLCheckServerIdentity set or set as false \n {\n Email email = new SimpleEmail();\n email.setHostName(\"hostName\");\n email.setSmtpPort(25);\n email.setAuthenticator(new DefaultAuthenticator(\"username\", \"password\"));\n email.setSSLOnConnect(true);\n \n //email.setSSLCheckServerIdentity(false);\n email.setFrom(\"fromAddress\");\n email.setSubject(\"subject\");\n email.setMsg(\"body\");\n email.addTo(\"toAddress\");\n email.send();\n }\n\n // GOOD: Have setSSLCheckServerIdentity set to true\n {\n Email email = new SimpleEmail();\n email.setHostName(\"hostName\");\n email.setSmtpPort(25);\n email.setAuthenticator(new DefaultAuthenticator(\"username\", \"password\"));\n email.setSSLOnConnect(true);\n\n email.setSSLCheckServerIdentity(true);\n email.setFrom(\"fromAddress\");\n email.setSubject(\"subject\");\n email.setMsg(\"body\");\n email.addTo(\"toAddress\");\n email.send();\n }\n }\n}\n```\n\n## References\n* Jakarta Mail: [SSL Notes](https://eclipse-ee4j.github.io/mail/docs/SSLNOTES.txt).\n* Apache Commons: [Email security](https://commons.apache.org/proper/commons-email/userguide.html#Security).\n* Log4j2: [Add support for specifying an SSL configuration for SmtpAppender (CVE-2020-9488)](https://issues.apache.org/jira/browse/LOG4J2-2819).\n* Common Weakness Enumeration: [CWE-297](https://cwe.mitre.org/data/definitions/297.html).\n","markdown":"# Insecure JavaMail SSL Configuration\nJavaMail is commonly used in Java applications to send emails. There are popular third-party libraries like Apache Commons Email which are built on JavaMail and facilitate integration. Authenticated mail sessions require user credentials and mail sessions can require SSL/TLS authentication. It is a common security vulnerability that host-specific certificate data is not validated or is incorrectly validated. Failing to validate the certificate makes the SSL session susceptible to a man-in-the-middle attack.\n\nThis query checks whether the SSL certificate is validated when credentials are used and SSL is enabled in email communications.\n\nThe query has code for both plain JavaMail invocation and mailing through Apache SimpleMail to make it more comprehensive.\n\n\n## Recommendation\nValidate SSL certificate when sensitive information is sent in email communications.\n\n\n## Example\nThe following two examples show two ways of configuring secure emails through JavaMail or Apache SimpleMail. In the 'BAD' case, credentials are sent in an SSL session without certificate validation. In the 'GOOD' case, the certificate is validated.\n\n\n```java\nimport java.util.Properties;\n\nimport javax.activation.DataSource;\nimport javax.mail.Authenticator;\nimport javax.mail.Message;\nimport javax.mail.MessagingException;\nimport javax.mail.PasswordAuthentication;\nimport javax.mail.Session;\n\nimport org.apache.logging.log4j.util.PropertiesUtil;\n\nclass JavaMail {\n public static void main(String[] args) {\n // BAD: Don't have server certificate check\n {\n\t\tfinal Properties properties = PropertiesUtil.getSystemProperties();\n\t\tproperties.put(\"mail.transport.protocol\", \"protocol\");\n\t\tproperties.put(\"mail.smtp.host\", \"hostname\");\n\t\tproperties.put(\"mail.smtp.socketFactory.class\", \"classname\");\n\n\t\tfinal Authenticator authenticator = buildAuthenticator(\"username\", \"password\");\n\t\tif (null != authenticator) {\n\t\t\tproperties.put(\"mail.smtp.auth\", \"true\");\n\t\t}\n\t\tfinal Session session = Session.getInstance(properties, authenticator);\n }\n\n // GOOD: Have server certificate check\n {\n\t\tfinal Properties properties = PropertiesUtil.getSystemProperties();\n\t\tproperties.put(\"mail.transport.protocol\", \"protocol\");\n\t\tproperties.put(\"mail.smtp.host\", \"hostname\");\n\t\tproperties.put(\"mail.smtp.socketFactory.class\", \"classname\");\n\n\t\tfinal Authenticator authenticator = buildAuthenticator(\"username\", \"password\");\n\t\tif (null != authenticator) {\n\t\t\tproperties.put(\"mail.smtp.auth\", \"true\");\n\t\t\tproperties.put(\"mail.smtp.ssl.checkserveridentity\", \"true\");\n\t\t}\n\t\tfinal Session session = Session.getInstance(properties, authenticator);\n }\n }\n}\n```\n\n```java\nimport org.apache.commons.mail.DefaultAuthenticator;\nimport org.apache.commons.mail.Email;\nimport org.apache.commons.mail.EmailException;\nimport org.apache.commons.mail.SimpleEmail;\n\nclass SimpleMail {\n public static void main(String[] args) throws EmailException {\n // BAD: Don't have setSSLCheckServerIdentity set or set as false \n {\n Email email = new SimpleEmail();\n email.setHostName(\"hostName\");\n email.setSmtpPort(25);\n email.setAuthenticator(new DefaultAuthenticator(\"username\", \"password\"));\n email.setSSLOnConnect(true);\n \n //email.setSSLCheckServerIdentity(false);\n email.setFrom(\"fromAddress\");\n email.setSubject(\"subject\");\n email.setMsg(\"body\");\n email.addTo(\"toAddress\");\n email.send();\n }\n\n // GOOD: Have setSSLCheckServerIdentity set to true\n {\n Email email = new SimpleEmail();\n email.setHostName(\"hostName\");\n email.setSmtpPort(25);\n email.setAuthenticator(new DefaultAuthenticator(\"username\", \"password\"));\n email.setSSLOnConnect(true);\n\n email.setSSLCheckServerIdentity(true);\n email.setFrom(\"fromAddress\");\n email.setSubject(\"subject\");\n email.setMsg(\"body\");\n email.addTo(\"toAddress\");\n email.send();\n }\n }\n}\n```\n\n## References\n* Jakarta Mail: [SSL Notes](https://eclipse-ee4j.github.io/mail/docs/SSLNOTES.txt).\n* Apache Commons: [Email security](https://commons.apache.org/proper/commons-email/userguide.html#Security).\n* Log4j2: [Add support for specifying an SSL configuration for SmtpAppender (CVE-2020-9488)](https://issues.apache.org/jira/browse/LOG4J2-2819).\n* Common Weakness Enumeration: [CWE-297](https://cwe.mitre.org/data/definitions/297.html).\n"},"properties":{"tags":["security","external/cwe/cwe-297","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Configuring a Java application to use authenticated mail session\n over SSL without certificate validation\n makes the session susceptible to a man-in-the-middle attack.","id":"java/insecure-smtp-ssl","kind":"problem","name":"Insecure JavaMail SSL Configuration","precision":"medium","problem.severity":"warning","security-severity":"5.9"}},{"id":"java/relative-path-command","name":"java/relative-path-command","shortDescription":{"text":"Executing a command with a relative path"},"fullDescription":{"text":"Executing a command with a relative path is vulnerable to malicious changes in the PATH environment variable."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Executing a command with a relative path\nWhen a command is executed with a relative path, the runtime uses the PATH environment variable to find which executable to run. Therefore, any user who can change the PATH environment variable can cause the software to run a different, malicious executable.\n\n\n## Recommendation\nIn most cases, simply use a command that has an absolute path instead of a relative path.\n\nIn some cases, the location of the executable might be different on different installations. In such cases, consider specifying the location of key executables with some form of configuration. When using this approach, be careful that the configuration system is not itself vulnerable to malicious modifications.\n\n\n## Example\n\n```java\nclass Test {\n public static void main(String[] args) {\n // BAD: relative path\n Runtime.getRuntime().exec(\"make\");\n \n // GOOD: absolute path\n Runtime.getRuntime().exec(\"/usr/bin/make\");\n\n // GOOD: build an absolute path from known values\n Runtime.getRuntime().exec(Paths.MAKE_PREFIX + \"/bin/make\");\n }\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n","markdown":"# Executing a command with a relative path\nWhen a command is executed with a relative path, the runtime uses the PATH environment variable to find which executable to run. Therefore, any user who can change the PATH environment variable can cause the software to run a different, malicious executable.\n\n\n## Recommendation\nIn most cases, simply use a command that has an absolute path instead of a relative path.\n\nIn some cases, the location of the executable might be different on different installations. In such cases, consider specifying the location of key executables with some form of configuration. When using this approach, be careful that the configuration system is not itself vulnerable to malicious modifications.\n\n\n## Example\n\n```java\nclass Test {\n public static void main(String[] args) {\n // BAD: relative path\n Runtime.getRuntime().exec(\"make\");\n \n // GOOD: absolute path\n Runtime.getRuntime().exec(\"/usr/bin/make\");\n\n // GOOD: build an absolute path from known values\n Runtime.getRuntime().exec(Paths.MAKE_PREFIX + \"/bin/make\");\n }\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n"},"properties":{"tags":["security","external/cwe/cwe-078","external/cwe/cwe-088"],"description":"Executing a command with a relative path is vulnerable to\n malicious changes in the PATH environment variable.","id":"java/relative-path-command","kind":"problem","name":"Executing a command with a relative path","precision":"medium","problem.severity":"warning","security-severity":"9.8"}},{"id":"java/android/unsafe-android-webview-fetch","name":"java/android/unsafe-android-webview-fetch","shortDescription":{"text":"Unsafe resource fetching in Android WebView"},"fullDescription":{"text":"JavaScript rendered inside WebViews can access protected application files and web resources from any origin exposing them to attack."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Unsafe resource fetching in Android WebView\nAndroid WebViews that allow externally controlled URLs to be loaded, and whose JavaScript interface is enabled, are potentially vulnerable to cross-site scripting and sensitive resource disclosure attacks.\n\nA `WebView` whose `WebSettings` object has called `setAllowFileAccessFromFileURLs(true)` or `setAllowUniversalAccessFromFileURLs(true)` must not load any untrusted web content.\n\nEnabling these settings allows malicious scripts loaded in a `file://` context to launch cross-site scripting attacks, accessing arbitrary local files including WebView cookies, session tokens, private app data or even credentials used on arbitrary web sites.\n\nThis query detects the following two scenarios:\n\n1. A vulnerability introduced by WebViews when JavaScript is enabled and remote inputs are allowed.\n1. A more severe vulnerability when \"allow cross-origin resource access\" is also enabled. This setting was deprecated in API level 30 (Android 11), but most devices are still affected, especially since some Android phones are updated slowly or no longer updated at all.\n\n## Recommendation\nOnly allow trusted web content to be displayed in WebViews when JavaScript is enabled. Disallow cross-origin resource access in WebSettings to reduce the attack surface.\n\n\n## Example\nThe following example shows both 'BAD' and 'GOOD' configurations. In the 'BAD' configuration, JavaScript and the allow access setting are enabled and URLs are loaded from externally controlled inputs. In the 'GOOD' configuration, JavaScript is disabled or only trusted web content is allowed to be loaded.\n\n\n```java\npublic class UnsafeAndroidAccess extends Activity {\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\tsetContentView(R.layout.webview);\n\n\t\t// BAD: Have both JavaScript and cross-origin resource access enabled in webview while\n\t\t// taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(R.id.my_webview);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\t\t\twebSettings.setAllowUniversalAccessFromFileURLs(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getExtras().getString(\"url\"); // dangerous remote input from the intent's Bundle of extras\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// BAD: Have both JavaScript and cross-origin resource access enabled in webview while\n\t\t// taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(R.id.my_webview);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\t\t\twebSettings.setAllowUniversalAccessFromFileURLs(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getStringExtra(\"url\"); //dangerous remote input from intent extra\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// GOOD: Have JavaScript and cross-origin resource access disabled by default on modern Android (Jellybean+) while taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(-1);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getExtras().getString(\"url\"); // remote input\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// GOOD: Have JavaScript enabled in webview but remote user input is not allowed\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(-1);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\twv.loadUrl(\"https://www.mycorp.com\");\n\t\t}\n\t}\n}\n```\n\n## References\n* Google Help: [Fixing a File-based XSS Vulnerability](https://support.google.com/faqs/answer/7668153?hl=en)\n* OWASP: [Testing JavaScript Execution in WebViews (MSTG-PLATFORM-5)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#testing-javascript-execution-in-webviews-mstg-platform-5)\n* OWASP: [Testing WebView Protocol Handlers (MSTG-PLATFORM-6)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#testing-webview-protocol-handlers-mstg-platform-6)\n* Common Weakness Enumeration: [CWE-749](https://cwe.mitre.org/data/definitions/749.html).\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n","markdown":"# Unsafe resource fetching in Android WebView\nAndroid WebViews that allow externally controlled URLs to be loaded, and whose JavaScript interface is enabled, are potentially vulnerable to cross-site scripting and sensitive resource disclosure attacks.\n\nA `WebView` whose `WebSettings` object has called `setAllowFileAccessFromFileURLs(true)` or `setAllowUniversalAccessFromFileURLs(true)` must not load any untrusted web content.\n\nEnabling these settings allows malicious scripts loaded in a `file://` context to launch cross-site scripting attacks, accessing arbitrary local files including WebView cookies, session tokens, private app data or even credentials used on arbitrary web sites.\n\nThis query detects the following two scenarios:\n\n1. A vulnerability introduced by WebViews when JavaScript is enabled and remote inputs are allowed.\n1. A more severe vulnerability when \"allow cross-origin resource access\" is also enabled. This setting was deprecated in API level 30 (Android 11), but most devices are still affected, especially since some Android phones are updated slowly or no longer updated at all.\n\n## Recommendation\nOnly allow trusted web content to be displayed in WebViews when JavaScript is enabled. Disallow cross-origin resource access in WebSettings to reduce the attack surface.\n\n\n## Example\nThe following example shows both 'BAD' and 'GOOD' configurations. In the 'BAD' configuration, JavaScript and the allow access setting are enabled and URLs are loaded from externally controlled inputs. In the 'GOOD' configuration, JavaScript is disabled or only trusted web content is allowed to be loaded.\n\n\n```java\npublic class UnsafeAndroidAccess extends Activity {\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\tsetContentView(R.layout.webview);\n\n\t\t// BAD: Have both JavaScript and cross-origin resource access enabled in webview while\n\t\t// taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(R.id.my_webview);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\t\t\twebSettings.setAllowUniversalAccessFromFileURLs(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getExtras().getString(\"url\"); // dangerous remote input from the intent's Bundle of extras\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// BAD: Have both JavaScript and cross-origin resource access enabled in webview while\n\t\t// taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(R.id.my_webview);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\t\t\twebSettings.setAllowUniversalAccessFromFileURLs(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getStringExtra(\"url\"); //dangerous remote input from intent extra\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// GOOD: Have JavaScript and cross-origin resource access disabled by default on modern Android (Jellybean+) while taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(-1);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getExtras().getString(\"url\"); // remote input\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// GOOD: Have JavaScript enabled in webview but remote user input is not allowed\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(-1);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\twv.loadUrl(\"https://www.mycorp.com\");\n\t\t}\n\t}\n}\n```\n\n## References\n* Google Help: [Fixing a File-based XSS Vulnerability](https://support.google.com/faqs/answer/7668153?hl=en)\n* OWASP: [Testing JavaScript Execution in WebViews (MSTG-PLATFORM-5)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#testing-javascript-execution-in-webviews-mstg-platform-5)\n* OWASP: [Testing WebView Protocol Handlers (MSTG-PLATFORM-6)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#testing-webview-protocol-handlers-mstg-platform-6)\n* Common Weakness Enumeration: [CWE-749](https://cwe.mitre.org/data/definitions/749.html).\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n"},"properties":{"tags":["security","external/cwe/cwe-749","external/cwe/cwe-079"],"description":"JavaScript rendered inside WebViews can access protected\n application files and web resources from any origin exposing them to attack.","id":"java/android/unsafe-android-webview-fetch","kind":"path-problem","name":"Unsafe resource fetching in Android WebView","precision":"medium","problem.severity":"warning","security-severity":"6.1"}},{"id":"java/concatenated-sql-query","name":"java/concatenated-sql-query","shortDescription":{"text":"Query built by concatenation with a possibly-untrusted string"},"fullDescription":{"text":"Building a SQL or Java Persistence query by concatenating a possibly-untrusted string is vulnerable to insertion of malicious code."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Query built by concatenation with a possibly-untrusted string\nEven when the components of a SQL query are not fully controlled by a user, it is a vulnerability to build the query by directly concatenating those components. Perhaps a separate vulnerability will allow the user to gain control of the component. As well, a user who cannot gain full control of an input might influence it enough to cause the SQL query to fail to run.\n\n\n## Recommendation\nUsually, it is better to use a SQL prepared statement than to build a complete SQL query with string concatenation. A prepared statement can include a wildcard, written as a question mark (?), for each part of the SQL query that is expected to be filled in by a different value each time it is run. When the query is later executed, a value must be supplied for each wildcard in the query.\n\nIn the Java Persistence Query Language, it is better to use queries with parameters than to build a complete query with string concatenation. A Java Persistence query can include a parameter placeholder for each part of the query that is expected to be filled in by a different value when run. A parameter placeholder may be indicated by a colon (:) followed by a parameter name, or by a question mark (?) followed by an integer position. When the query is later executed, a value must be supplied for each parameter in the query, using the `setParameter` method. Specifying the query using the `@NamedQuery` annotation introduces an additional level of safety: the query must be a constant string literal, preventing construction by string concatenation, and the only way to fill in values for parts of the query is by setting positional parameters.\n\nIt is good practice to use prepared statements (in SQL) or query parameters (in the Java Persistence Query Language) for supplying parameter values to a query, whether or not any of the parameters are directly traceable to user input. Doing so avoids any need to worry about quoting and escaping.\n\n\n## Example\nIn the following example, the code runs a simple SQL query in two different ways.\n\nThe first way involves building a query, `query1`, by concatenating the result of `getCategory` with some string literals. The result of `getCategory` can include special characters, or it might be refactored later so that it may return something that contains special characters.\n\nThe second way, which shows good practice, involves building a query, `query2`, with a single string literal that includes a wildcard (`?`). The wildcard is then given a value by calling `setString`. This version is immune to injection attacks, because any special characters in the result of `getCategory` are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have SQL special characters in it\n String category = getCategory();\n Statement statement = connection.createStatement();\n String query1 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='\"\n + category + \"' ORDER BY PRICE\";\n ResultSet results = statement.executeQuery(query1);\n}\n\n{\n // GOOD: use a prepared query\n String category = getCategory();\n String query2 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=? ORDER BY PRICE\";\n PreparedStatement statement = connection.prepareStatement(query2);\n statement.setString(1, category);\n ResultSet results = statement.executeQuery();\n}\n```\n\n## References\n* OWASP: [SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html).\n* SEI CERT Oracle Coding Standard for Java: [IDS00-J. Prevent SQL injection](https://wiki.sei.cmu.edu/confluence/display/java/IDS00-J.+Prevent+SQL+injection).\n* The Java Tutorials: [Using Prepared Statements](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html).\n* Common Weakness Enumeration: [CWE-89](https://cwe.mitre.org/data/definitions/89.html).\n* Common Weakness Enumeration: [CWE-564](https://cwe.mitre.org/data/definitions/564.html).\n","markdown":"# Query built by concatenation with a possibly-untrusted string\nEven when the components of a SQL query are not fully controlled by a user, it is a vulnerability to build the query by directly concatenating those components. Perhaps a separate vulnerability will allow the user to gain control of the component. As well, a user who cannot gain full control of an input might influence it enough to cause the SQL query to fail to run.\n\n\n## Recommendation\nUsually, it is better to use a SQL prepared statement than to build a complete SQL query with string concatenation. A prepared statement can include a wildcard, written as a question mark (?), for each part of the SQL query that is expected to be filled in by a different value each time it is run. When the query is later executed, a value must be supplied for each wildcard in the query.\n\nIn the Java Persistence Query Language, it is better to use queries with parameters than to build a complete query with string concatenation. A Java Persistence query can include a parameter placeholder for each part of the query that is expected to be filled in by a different value when run. A parameter placeholder may be indicated by a colon (:) followed by a parameter name, or by a question mark (?) followed by an integer position. When the query is later executed, a value must be supplied for each parameter in the query, using the `setParameter` method. Specifying the query using the `@NamedQuery` annotation introduces an additional level of safety: the query must be a constant string literal, preventing construction by string concatenation, and the only way to fill in values for parts of the query is by setting positional parameters.\n\nIt is good practice to use prepared statements (in SQL) or query parameters (in the Java Persistence Query Language) for supplying parameter values to a query, whether or not any of the parameters are directly traceable to user input. Doing so avoids any need to worry about quoting and escaping.\n\n\n## Example\nIn the following example, the code runs a simple SQL query in two different ways.\n\nThe first way involves building a query, `query1`, by concatenating the result of `getCategory` with some string literals. The result of `getCategory` can include special characters, or it might be refactored later so that it may return something that contains special characters.\n\nThe second way, which shows good practice, involves building a query, `query2`, with a single string literal that includes a wildcard (`?`). The wildcard is then given a value by calling `setString`. This version is immune to injection attacks, because any special characters in the result of `getCategory` are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have SQL special characters in it\n String category = getCategory();\n Statement statement = connection.createStatement();\n String query1 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='\"\n + category + \"' ORDER BY PRICE\";\n ResultSet results = statement.executeQuery(query1);\n}\n\n{\n // GOOD: use a prepared query\n String category = getCategory();\n String query2 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=? ORDER BY PRICE\";\n PreparedStatement statement = connection.prepareStatement(query2);\n statement.setString(1, category);\n ResultSet results = statement.executeQuery();\n}\n```\n\n## References\n* OWASP: [SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html).\n* SEI CERT Oracle Coding Standard for Java: [IDS00-J. Prevent SQL injection](https://wiki.sei.cmu.edu/confluence/display/java/IDS00-J.+Prevent+SQL+injection).\n* The Java Tutorials: [Using Prepared Statements](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html).\n* Common Weakness Enumeration: [CWE-89](https://cwe.mitre.org/data/definitions/89.html).\n* Common Weakness Enumeration: [CWE-564](https://cwe.mitre.org/data/definitions/564.html).\n"},"properties":{"tags":["security","external/cwe/cwe-089","external/cwe/cwe-564","owasp-top10-2021","A03:2021 - Injection"],"description":"Building a SQL or Java Persistence query by concatenating a possibly-untrusted string\n is vulnerable to insertion of malicious code.","id":"java/concatenated-sql-query","kind":"problem","name":"Query built by concatenation with a possibly-untrusted string","precision":"medium","problem.severity":"error","security-severity":"8.8"}},{"id":"java/unreachable-exit-in-loop","name":"java/unreachable-exit-in-loop","shortDescription":{"text":"Loop with unreachable exit condition"},"fullDescription":{"text":"An iteration or loop with an exit condition that cannot be reached is an indication of faulty logic and can likely lead to infinite looping."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Loop with unreachable exit condition\nLoops can contain multiple exit conditions, either directly in the loop condition or as guards around `break` or `return` statements. If an exit condition cannot be satisfied, then the code is misleading at best, and the loop might not terminate.\n\n\n## Recommendation\nWhen writing a loop that is intended to terminate, make sure that all the necessary exit conditions can be satisfied and that loop termination is clear.\n\n\n## Example\nThe following example shows a potentially infinite loop, since the inner loop condition is constantly true. Of course, the loop may or may not be infinite depending on the behavior of `shouldBreak`, but if this was intended as the only exit condition the loop should be rewritten to make this clear.\n\n\n```java\nfor (int i=0; i<10; i++) {\n for (int j=0; i<10; j++) {\n // do stuff\n if (shouldBreak()) break;\n }\n}\n\n```\nTo fix the loop the condition is corrected to check the right variable.\n\n\n```java\nfor (int i=0; i<10; i++) {\n for (int j=0; j<10; j++) {\n // do stuff\n if (shouldBreak()) break;\n }\n}\n\n```\n\n## References\n* Java Language Specification: [Blocks and Statements](https://docs.oracle.com/javase/specs/jls/se11/html/jls-14.html).\n* Common Weakness Enumeration: [CWE-835](https://cwe.mitre.org/data/definitions/835.html).\n","markdown":"# Loop with unreachable exit condition\nLoops can contain multiple exit conditions, either directly in the loop condition or as guards around `break` or `return` statements. If an exit condition cannot be satisfied, then the code is misleading at best, and the loop might not terminate.\n\n\n## Recommendation\nWhen writing a loop that is intended to terminate, make sure that all the necessary exit conditions can be satisfied and that loop termination is clear.\n\n\n## Example\nThe following example shows a potentially infinite loop, since the inner loop condition is constantly true. Of course, the loop may or may not be infinite depending on the behavior of `shouldBreak`, but if this was intended as the only exit condition the loop should be rewritten to make this clear.\n\n\n```java\nfor (int i=0; i<10; i++) {\n for (int j=0; i<10; j++) {\n // do stuff\n if (shouldBreak()) break;\n }\n}\n\n```\nTo fix the loop the condition is corrected to check the right variable.\n\n\n```java\nfor (int i=0; i<10; i++) {\n for (int j=0; j<10; j++) {\n // do stuff\n if (shouldBreak()) break;\n }\n}\n\n```\n\n## References\n* Java Language Specification: [Blocks and Statements](https://docs.oracle.com/javase/specs/jls/se11/html/jls-14.html).\n* Common Weakness Enumeration: [CWE-835](https://cwe.mitre.org/data/definitions/835.html).\n"},"properties":{"tags":["security","external/cwe/cwe-835"],"description":"An iteration or loop with an exit condition that cannot be\n reached is an indication of faulty logic and can likely lead to infinite\n looping.","id":"java/unreachable-exit-in-loop","kind":"problem","name":"Loop with unreachable exit condition","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/android/incomplete-provider-permissions","name":"java/android/incomplete-provider-permissions","shortDescription":{"text":"Missing read or write permission in a content provider"},"fullDescription":{"text":"Android content providers which do not configure both read and write permissions can allow permission bypass."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Missing read or write permission in a content provider\nThe Android manifest file specifies the content providers for the application using `provider` elements. The `provider` element specifies the explicit permissions an application requires in order to access a resource using that provider. You specify the permissions using the `android:readPermission`, `android:writePermission`, or `android:permission` attributes. If you do not specify the permission required to perform an operation, the application will implicitly have access to perform that operation. For example, if you specify only `android:readPermission`, the application must have explicit permission to read data, but requires no permission to write data.\n\n\n## Recommendation\nTo prevent permission bypass, you should create `provider` elements that either specify both the `android:readPermission` and `android:writePermission` attributes, or specify the `android:permission` attribute.\n\n\n## Example\nIn the following two (bad) examples, the provider is configured with only read or write permissions. This allows a malicious application to bypass the permission check by requesting access to the unrestricted operation.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\nIn the following (good) examples, the provider is configured with full permissions, protecting it from a permissions bypass.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Documentation: [Provider element](https://developer.android.com/guide/topics/manifest/provider-element)\n* CVE-2021-41166: [Insufficient permission control in Nextcloud Android app](https://nvd.nist.gov/vuln/detail/CVE-2021-41166)\n* GitHub Security Lab Research: [Insufficient permission control in Nextcloud Android app](https://securitylab.github.com/advisories/GHSL-2021-1007-Nextcloud_Android_app/#issue-2-permission-bypass-in-disklruimagecachefileprovider-ghsl-2021-1008)\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n","markdown":"# Missing read or write permission in a content provider\nThe Android manifest file specifies the content providers for the application using `provider` elements. The `provider` element specifies the explicit permissions an application requires in order to access a resource using that provider. You specify the permissions using the `android:readPermission`, `android:writePermission`, or `android:permission` attributes. If you do not specify the permission required to perform an operation, the application will implicitly have access to perform that operation. For example, if you specify only `android:readPermission`, the application must have explicit permission to read data, but requires no permission to write data.\n\n\n## Recommendation\nTo prevent permission bypass, you should create `provider` elements that either specify both the `android:readPermission` and `android:writePermission` attributes, or specify the `android:permission` attribute.\n\n\n## Example\nIn the following two (bad) examples, the provider is configured with only read or write permissions. This allows a malicious application to bypass the permission check by requesting access to the unrestricted operation.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\nIn the following (good) examples, the provider is configured with full permissions, protecting it from a permissions bypass.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Documentation: [Provider element](https://developer.android.com/guide/topics/manifest/provider-element)\n* CVE-2021-41166: [Insufficient permission control in Nextcloud Android app](https://nvd.nist.gov/vuln/detail/CVE-2021-41166)\n* GitHub Security Lab Research: [Insufficient permission control in Nextcloud Android app](https://securitylab.github.com/advisories/GHSL-2021-1007-Nextcloud_Android_app/#issue-2-permission-bypass-in-disklruimagecachefileprovider-ghsl-2021-1008)\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n"},"properties":{"tags":["security","external/cwe/cwe-926"],"description":"Android content providers which do not configure both read and write permissions can allow permission bypass.","id":"java/android/incomplete-provider-permissions","kind":"problem","name":"Missing read or write permission in a content provider","precision":"medium","problem.severity":"warning","security-severity":"8.2"}},{"id":"java/potentially-weak-cryptographic-algorithm","name":"java/potentially-weak-cryptographic-algorithm","shortDescription":{"text":"Use of a potentially broken or risky cryptographic algorithm"},"fullDescription":{"text":"Using broken or weak cryptographic algorithms can allow an attacker to compromise security."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Use of a potentially broken or risky cryptographic algorithm\nUsing broken or weak cryptographic algorithms can leave data vulnerable to being decrypted.\n\nMany cryptographic algorithms provided by cryptography libraries are known to be weak, or flawed. Using such an algorithm means that an attacker may be able to easily decrypt the encrypted data.\n\n\n## Recommendation\nEnsure that you use a strong, modern cryptographic algorithm. Use at least AES-128 or RSA-2048. Do not use the ECB encryption mode since it is vulnerable to replay and other attacks.\n\n\n## Example\nThe following code shows an example of using a java `Cipher` to encrypt some data. When creating a `Cipher` instance, you must specify the encryption algorithm to use. The first example uses DES, which is an older algorithm that is now considered weak. The second example uses AES, which is a strong modern algorithm.\n\n\n```java\n// BAD: DES is a weak algorithm \nCipher des = Cipher.getInstance(\"DES\");\ncipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);\n\nbyte[] encrypted = cipher.doFinal(input.getBytes(\"UTF-8\"));\n\n// ...\n\n// GOOD: AES is a strong algorithm\nCipher aes = Cipher.getInstance(\"AES\");\n\n// ...\n\n```\n\n## References\n* NIST, FIPS 140 Annex a: [ Approved Security Functions](http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf).\n* NIST, SP 800-131A: [ Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf).\n* Common Weakness Enumeration: [CWE-327](https://cwe.mitre.org/data/definitions/327.html).\n* Common Weakness Enumeration: [CWE-328](https://cwe.mitre.org/data/definitions/328.html).\n","markdown":"# Use of a potentially broken or risky cryptographic algorithm\nUsing broken or weak cryptographic algorithms can leave data vulnerable to being decrypted.\n\nMany cryptographic algorithms provided by cryptography libraries are known to be weak, or flawed. Using such an algorithm means that an attacker may be able to easily decrypt the encrypted data.\n\n\n## Recommendation\nEnsure that you use a strong, modern cryptographic algorithm. Use at least AES-128 or RSA-2048. Do not use the ECB encryption mode since it is vulnerable to replay and other attacks.\n\n\n## Example\nThe following code shows an example of using a java `Cipher` to encrypt some data. When creating a `Cipher` instance, you must specify the encryption algorithm to use. The first example uses DES, which is an older algorithm that is now considered weak. The second example uses AES, which is a strong modern algorithm.\n\n\n```java\n// BAD: DES is a weak algorithm \nCipher des = Cipher.getInstance(\"DES\");\ncipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);\n\nbyte[] encrypted = cipher.doFinal(input.getBytes(\"UTF-8\"));\n\n// ...\n\n// GOOD: AES is a strong algorithm\nCipher aes = Cipher.getInstance(\"AES\");\n\n// ...\n\n```\n\n## References\n* NIST, FIPS 140 Annex a: [ Approved Security Functions](http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf).\n* NIST, SP 800-131A: [ Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf).\n* Common Weakness Enumeration: [CWE-327](https://cwe.mitre.org/data/definitions/327.html).\n* Common Weakness Enumeration: [CWE-328](https://cwe.mitre.org/data/definitions/328.html).\n"},"properties":{"tags":["security","external/cwe/cwe-327","external/cwe/cwe-328","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using broken or weak cryptographic algorithms can allow an attacker to compromise security.","id":"java/potentially-weak-cryptographic-algorithm","kind":"path-problem","name":"Use of a potentially broken or risky cryptographic algorithm","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/summary/lines-of-code","name":"java/summary/lines-of-code","shortDescription":{"text":"Total lines of Java code in the database"},"fullDescription":{"text":"The total number of lines of code across all files. This is a useful metric of the size of a database. For all files that were seen during the build, this query counts the lines of code, excluding whitespace or comments."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","lines-of-code"],"description":"The total number of lines of code across all files. This is a useful metric of the size of a database.\n For all files that were seen during the build, this query counts the lines of code, excluding whitespace\n or comments.","id":"java/summary/lines-of-code","kind":"metric","name":"Total lines of Java code in the database"}},{"id":"java/telemetry/supported-external-api","name":"java/telemetry/supported-external-api","shortDescription":{"text":"Usage of supported APIs coming from external libraries"},"fullDescription":{"text":"A list of supported 3rd party APIs used in the codebase. Excludes test and generated code."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of supported 3rd party APIs used in the codebase. Excludes test and generated code.","id":"java/telemetry/supported-external-api","kind":"metric","name":"Usage of supported APIs coming from external libraries"}},{"id":"java/telemetry/supported-external-api-taint","name":"java/telemetry/supported-external-api-taint","shortDescription":{"text":"Supported flow steps in external libraries"},"fullDescription":{"text":"A list of 3rd party APIs detected as flow steps. Excludes test and generated code."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of 3rd party APIs detected as flow steps. Excludes test and generated code.","id":"java/telemetry/supported-external-api-taint","kind":"metric","name":"Supported flow steps in external libraries"}},{"id":"java/telemetry/supported-external-api-sinks","name":"java/telemetry/supported-external-api-sinks","shortDescription":{"text":"Supported sinks in external libraries"},"fullDescription":{"text":"A list of 3rd party APIs detected as sinks. Excludes test and generated code."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of 3rd party APIs detected as sinks. Excludes test and generated code.","id":"java/telemetry/supported-external-api-sinks","kind":"metric","name":"Supported sinks in external libraries"}},{"id":"java/telemetry/external-libs","name":"java/telemetry/external-libs","shortDescription":{"text":"External libraries"},"fullDescription":{"text":"A list of external libraries used in the code"},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of external libraries used in the code","id":"java/telemetry/external-libs","kind":"metric","name":"External libraries"}},{"id":"java/telemetry/unsupported-external-api","name":"java/telemetry/unsupported-external-api","shortDescription":{"text":"Usage of unsupported APIs coming from external libraries"},"fullDescription":{"text":"A list of 3rd party APIs used in the codebase. Excludes test and generated code."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of 3rd party APIs used in the codebase. Excludes test and generated code.","id":"java/telemetry/unsupported-external-api","kind":"metric","name":"Usage of unsupported APIs coming from external libraries"}},{"id":"java/telemetry/extraction-information","name":"java/telemetry/extraction-information","shortDescription":{"text":"Java extraction information"},"fullDescription":{"text":"Information about the extraction for a Java database"},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"Information about the extraction for a Java database","id":"java/telemetry/extraction-information","kind":"metric","name":"Java extraction information"}},{"id":"java/telemetry/supported-external-api-sources","name":"java/telemetry/supported-external-api-sources","shortDescription":{"text":"Supported sources in external libraries"},"fullDescription":{"text":"A list of 3rd party APIs detected as sources. Excludes test and generated code."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of 3rd party APIs detected as sources. Excludes test and generated code.","id":"java/telemetry/supported-external-api-sources","kind":"metric","name":"Supported sources in external libraries"}}],"locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-queries/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-queries/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/python-all","semanticVersion":"0.7.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-all/0.7.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-all/0.7.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/cpp-queries","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-queries/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-queries/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/go-queries","semanticVersion":"0.4.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-queries/0.4.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-queries/0.4.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/suite-helpers","semanticVersion":"0.4.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/suite-helpers/0.4.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/suite-helpers/0.4.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/python-queries","semanticVersion":"0.6.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-queries/0.6.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-queries/0.6.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/cpp-all","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-all/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-all/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/ruby-queries","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-queries/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-queries/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/swift-all","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/swift-all/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/swift-all/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/typetracking","semanticVersion":"0.0.3+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/typetracking/0.0.3/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/typetracking/0.0.3/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/go-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/swift-queries","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/swift-queries/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/swift-queries/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/javascript-queries","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-queries/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-queries/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]}]},"invocations":[{"toolExecutionNotifications":[{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/FlagController.java","uriBaseId":"%SRCROOT%","index":54}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/SimpleXXETest.java","uriBaseId":"%SRCROOT%","index":55}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsersTest.java","uriBaseId":"%SRCROOT%","index":56}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/StoredXssCommentsTest.java","uriBaseId":"%SRCROOT%","index":57}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignmentTest.java","uriBaseId":"%SRCROOT%","index":58}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/PasswordResetLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":59}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6aTest.java","uriBaseId":"%SRCROOT%","index":60}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/session/LessonTrackerTest.java","uriBaseId":"%SRCROOT%","index":61}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/IDORIntegrationTest.java","uriBaseId":"%SRCROOT%","index":62}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrievalTest.java","uriBaseId":"%SRCROOT%","index":63}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpointTest.java","uriBaseId":"%SRCROOT%","index":64}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequestTest.java","uriBaseId":"%SRCROOT%","index":65}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLessonTest.java","uriBaseId":"%SRCROOT%","index":66}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProviderTest.java","uriBaseId":"%SRCROOT%","index":67}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13Test.java","uriBaseId":"%SRCROOT%","index":68}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdminTest.java","uriBaseId":"%SRCROOT%","index":69}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java","uriBaseId":"%SRCROOT%","index":70}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/authbypass/BypassVerificationTest.java","uriBaseId":"%SRCROOT%","index":71}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxControllerTest.java","uriBaseId":"%SRCROOT%","index":72}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/ProgressRaceConditionIntegrationTest.java","uriBaseId":"%SRCROOT%","index":73}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/DeserializationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":74}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonMenuServiceTest.java","uriBaseId":"%SRCROOT%","index":75}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFixTest.java","uriBaseId":"%SRCROOT%","index":76}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/XSSIntegrationTest.java","uriBaseId":"%SRCROOT%","index":77}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":3}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/CryptoIntegrationTest.java","uriBaseId":"%SRCROOT%","index":78}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/ReportCardServiceTest.java","uriBaseId":"%SRCROOT%","index":79}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/plugins/LessonTest.java","uriBaseId":"%SRCROOT%","index":80}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/cia/CIAQuizTest.java","uriBaseId":"%SRCROOT%","index":81}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":82}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/csrf/CSRFFeedbackTest.java","uriBaseId":"%SRCROOT%","index":83}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/DisplayUserTest.java","uriBaseId":"%SRCROOT%","index":84}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpointTest.java","uriBaseId":"%SRCROOT%","index":85}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationTest.java","uriBaseId":"%SRCROOT%","index":86}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5Test.java","uriBaseId":"%SRCROOT%","index":87}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenusTest.java","uriBaseId":"%SRCROOT%","index":88}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1Test.java","uriBaseId":"%SRCROOT%","index":89}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionAdvancedIntegrationTest.java","uriBaseId":"%SRCROOT%","index":90}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest2.java","uriBaseId":"%SRCROOT%","index":91}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":92}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserValidatorTest.java","uriBaseId":"%SRCROOT%","index":93}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/WebGoatApplication.java","uriBaseId":"%SRCROOT%","index":94}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/CSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":95}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignmentTest.java","uriBaseId":"%SRCROOT%","index":96}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5aTest.java","uriBaseId":"%SRCROOT%","index":97}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/AccessControlIntegrationTest.java","uriBaseId":"%SRCROOT%","index":98}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/SqlLessonTest.java","uriBaseId":"%SRCROOT%","index":99}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/user/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":100}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserTrackerRepositoryTest.java","uriBaseId":"%SRCROOT%","index":101}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":102}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/WebWolfApplication.java","uriBaseId":"%SRCROOT%","index":103}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignmentTest.java","uriBaseId":"%SRCROOT%","index":104}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInputTest.java","uriBaseId":"%SRCROOT%","index":105}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingTest.java","uriBaseId":"%SRCROOT%","index":106}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevToolsTest.java","uriBaseId":"%SRCROOT%","index":107}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/WebWolfIntegrationTest.java","uriBaseId":"%SRCROOT%","index":108}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10Test.java","uriBaseId":"%SRCROOT%","index":109}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonProgressServiceTest.java","uriBaseId":"%SRCROOT%","index":110}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6bTest.java","uriBaseId":"%SRCROOT%","index":111}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2Test.java","uriBaseId":"%SRCROOT%","index":112}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionMitigationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":113}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":114}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpointTest.java","uriBaseId":"%SRCROOT%","index":115}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/cryptography/CryptoUtilTest.java","uriBaseId":"%SRCROOT%","index":116}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/PathTraversalIntegrationTest.java","uriBaseId":"%SRCROOT%","index":117}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpointTest.java","uriBaseId":"%SRCROOT%","index":118}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/session/LabelDebuggerTest.java","uriBaseId":"%SRCROOT%","index":119}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpointTest.java","uriBaseId":"%SRCROOT%","index":120}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDecTest.java","uriBaseId":"%SRCROOT%","index":121}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":122}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidationTest.java","uriBaseId":"%SRCROOT%","index":123}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SessionManagementIntegrationTest.java","uriBaseId":"%SRCROOT%","index":124}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionYourHashTest.java","uriBaseId":"%SRCROOT%","index":125}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/GeneralLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":126}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepositoryTest.java","uriBaseId":"%SRCROOT%","index":127}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserRepositoryTest.java","uriBaseId":"%SRCROOT%","index":128}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentTest.java","uriBaseId":"%SRCROOT%","index":129}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/deserialization/DeserializeTest.java","uriBaseId":"%SRCROOT%","index":130}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":131}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/challenges/Assignment1Test.java","uriBaseId":"%SRCROOT%","index":132}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9Test.java","uriBaseId":"%SRCROOT%","index":133}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest1.java","uriBaseId":"%SRCROOT%","index":134}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywordsTest.java","uriBaseId":"%SRCROOT%","index":135}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadTest.java","uriBaseId":"%SRCROOT%","index":136}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8Test.java","uriBaseId":"%SRCROOT%","index":137}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpointTest.java","uriBaseId":"%SRCROOT%","index":138}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/assignments/AssignmentEndpointTest.java","uriBaseId":"%SRCROOT%","index":139}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/ChallengeIntegrationTest.java","uriBaseId":"%SRCROOT%","index":140}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/IntegrationTest.java","uriBaseId":"%SRCROOT%","index":141}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/XXEIntegrationTest.java","uriBaseId":"%SRCROOT%","index":142}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/jwt/JWTTokenTest.java","uriBaseId":"%SRCROOT%","index":143}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":144}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/HintServiceTest.java","uriBaseId":"%SRCROOT%","index":145}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/WebSession.java","uriBaseId":"%SRCROOT%","index":146}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/CourseConfiguration.java","uriBaseId":"%SRCROOT%","index":147}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonMenuService.java","uriBaseId":"%SRCROOT%","index":148}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelDebugService.java","uriBaseId":"%SRCROOT%","index":149}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItem.java","uriBaseId":"%SRCROOT%","index":150}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdmin.java","uriBaseId":"%SRCROOT%","index":151}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Language.java","uriBaseId":"%SRCROOT%","index":152}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/EnvironmentService.java","uriBaseId":"%SRCROOT%","index":153}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofingTask.java","uriBaseId":"%SRCROOT%","index":154}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfileAltUrl.java","uriBaseId":"%SRCROOT%","index":155}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/ParentConfig.java","uriBaseId":"%SRCROOT%","index":156}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java","uriBaseId":"%SRCROOT%","index":157}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/controller/StartLesson.java","uriBaseId":"%SRCROOT%","index":158}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserRepository.java","uriBaseId":"%SRCROOT%","index":159}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":52}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjection.java","uriBaseId":"%SRCROOT%","index":160}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordResetEmail.java","uriBaseId":"%SRCROOT%","index":161}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Assignment1.java","uriBaseId":"%SRCROOT%","index":162}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTController.java","uriBaseId":"%SRCROOT%","index":163}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserService.java","uriBaseId":"%SRCROOT%","index":164}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevTools.java","uriBaseId":"%SRCROOT%","index":165}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":166}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/Salaries.java","uriBaseId":"%SRCROOT%","index":167}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/LessonTemplateResolver.java","uriBaseId":"%SRCROOT%","index":168}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/resetlink/PasswordChangeForm.java","uriBaseId":"%SRCROOT%","index":169}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/Authentication.java","uriBaseId":"%SRCROOT%","index":170}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsers.java","uriBaseId":"%SRCROOT%","index":171}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/SessionService.java","uriBaseId":"%SRCROOT%","index":172}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Ping.java","uriBaseId":"%SRCROOT%","index":173}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxController.java","uriBaseId":"%SRCROOT%","index":174}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRF.java","uriBaseId":"%SRCROOT%","index":175}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AttackResult.java","uriBaseId":"%SRCROOT%","index":176}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenus.java","uriBaseId":"%SRCROOT%","index":177}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/UsernameMacro.java","uriBaseId":"%SRCROOT%","index":178}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/LessonTracker.java","uriBaseId":"%SRCROOT%","index":179}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfMacro.java","uriBaseId":"%SRCROOT%","index":180}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/Requests.java","uriBaseId":"%SRCROOT%","index":181}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":182}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/OperatingSystemMacro.java","uriBaseId":"%SRCROOT%","index":183}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpoint.java","uriBaseId":"%SRCROOT%","index":184}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":41}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfile.java","uriBaseId":"%SRCROOT%","index":185}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookie.java","uriBaseId":"%SRCROOT%","index":186}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebWolf.java","uriBaseId":"%SRCROOT%","index":187}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java","uriBaseId":"%SRCROOT%","index":188}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignment.java","uriBaseId":"%SRCROOT%","index":189}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebGoat.java","uriBaseId":"%SRCROOT%","index":190}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRF.java","uriBaseId":"%SRCROOT%","index":191}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/HammerHead.java","uriBaseId":"%SRCROOT%","index":192}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkLesson.java","uriBaseId":"%SRCROOT%","index":193}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelService.java","uriBaseId":"%SRCROOT%","index":194}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonTitleService.java","uriBaseId":"%SRCROOT%","index":195}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordReset.java","uriBaseId":"%SRCROOT%","index":196}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswordsAssignment.java","uriBaseId":"%SRCROOT%","index":197}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java","uriBaseId":"%SRCROOT%","index":198}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingMitigation.java","uriBaseId":"%SRCROOT%","index":199}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/LessonTrackerInterceptor.java","uriBaseId":"%SRCROOT%","index":200}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionAC.java","uriBaseId":"%SRCROOT%","index":201}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Category.java","uriBaseId":"%SRCROOT%","index":202}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFFeedback.java","uriBaseId":"%SRCROOT%","index":203}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepository.java","uriBaseId":"%SRCROOT%","index":204}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/Review.java","uriBaseId":"%SRCROOT%","index":205}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingAccessControlUserRepository.java","uriBaseId":"%SRCROOT%","index":206}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/ForgedReviews.java","uriBaseId":"%SRCROOT%","index":207}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/dummy/insecure/framework/VulnerableTaskHolder.java","uriBaseId":"%SRCROOT%","index":208}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":2}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignment.java","uriBaseId":"%SRCROOT%","index":209}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofing.java","uriBaseId":"%SRCROOT%","index":210}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":211}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfRootMacro.java","uriBaseId":"%SRCROOT%","index":212}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpoint.java","uriBaseId":"%SRCROOT%","index":213}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItemType.java","uriBaseId":"%SRCROOT%","index":214}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":215}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatTmpDirMacro.java","uriBaseId":"%SRCROOT%","index":216}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWT.java","uriBaseId":"%SRCROOT%","index":217}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/UserSessionData.java","uriBaseId":"%SRCROOT%","index":218}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":51}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentEndpoint.java","uriBaseId":"%SRCROOT%","index":219}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTampering.java","uriBaseId":"%SRCROOT%","index":220}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flags.java","uriBaseId":"%SRCROOT%","index":221}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpProxies.java","uriBaseId":"%SRCROOT%","index":222}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsEndpoint.java","uriBaseId":"%SRCROOT%","index":223}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Hint.java","uriBaseId":"%SRCROOT%","index":224}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/controller/Welcome.java","uriBaseId":"%SRCROOT%","index":225}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":27}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Comment.java","uriBaseId":"%SRCROOT%","index":226}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/PathTraversal.java","uriBaseId":"%SRCROOT%","index":227}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonInfoService.java","uriBaseId":"%SRCROOT%","index":228}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonScanner.java","uriBaseId":"%SRCROOT%","index":229}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java","uriBaseId":"%SRCROOT%","index":230}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":42}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/VerifyAccount.java","uriBaseId":"%SRCROOT%","index":231}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/DatabaseConfiguration.java","uriBaseId":"%SRCROOT%","index":232}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonProgressService.java","uriBaseId":"%SRCROOT%","index":233}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasics.java","uriBaseId":"%SRCROOT%","index":234}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignment.java","uriBaseId":"%SRCROOT%","index":235}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFieldRestrictions.java","uriBaseId":"%SRCROOT%","index":236}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Challenge5.java","uriBaseId":"%SRCROOT%","index":237}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Challenge7.java","uriBaseId":"%SRCROOT%","index":238}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictions.java","uriBaseId":"%SRCROOT%","index":239}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Vote.java","uriBaseId":"%SRCROOT%","index":240}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/ImageServlet.java","uriBaseId":"%SRCROOT%","index":241}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Challenge1.java","uriBaseId":"%SRCROOT%","index":242}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":243}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/ReportCardService.java","uriBaseId":"%SRCROOT%","index":244}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpoint.java","uriBaseId":"%SRCROOT%","index":245}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":1}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTQuiz.java","uriBaseId":"%SRCROOT%","index":246}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/TriedQuestions.java","uriBaseId":"%SRCROOT%","index":247}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":248}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/SolutionConstants.java","uriBaseId":"%SRCROOT%","index":249}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDec.java","uriBaseId":"%SRCROOT%","index":250}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatVersionMacro.java","uriBaseId":"%SRCROOT%","index":251}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Email.java","uriBaseId":"%SRCROOT%","index":252}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson3.java","uriBaseId":"%SRCROOT%","index":253}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFLogin.java","uriBaseId":"%SRCROOT%","index":254}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/QuestionsAssignment.java","uriBaseId":"%SRCROOT%","index":255}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/Contact.java","uriBaseId":"%SRCROOT%","index":256}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/Comment.java","uriBaseId":"%SRCROOT%","index":257}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":53}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/WebWolfIntroduction.java","uriBaseId":"%SRCROOT%","index":258}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORLogin.java","uriBaseId":"%SRCROOT%","index":259}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/RestartLessonService.java","uriBaseId":"%SRCROOT%","index":260}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponents.java","uriBaseId":"%SRCROOT%","index":261}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/Cryptography.java","uriBaseId":"%SRCROOT%","index":262}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/SerializationHelper.java","uriBaseId":"%SRCROOT%","index":263}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserValidator.java","uriBaseId":"%SRCROOT%","index":264}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java","uriBaseId":"%SRCROOT%","index":265}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Assignment8.java","uriBaseId":"%SRCROOT%","index":266}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":50}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson4.java","uriBaseId":"%SRCROOT%","index":267}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/UserProfile.java","uriBaseId":"%SRCROOT%","index":268}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Assignment.java","uriBaseId":"%SRCROOT%","index":269}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSession.java","uriBaseId":"%SRCROOT%","index":270}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webgoatintroduction/WebGoatIntroduction.java","uriBaseId":"%SRCROOT%","index":271}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentHints.java","uriBaseId":"%SRCROOT%","index":272}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignment.java","uriBaseId":"%SRCROOT%","index":273}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserialization.java","uriBaseId":"%SRCROOT%","index":274}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHash.java","uriBaseId":"%SRCROOT%","index":275}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":46}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/SampleAttack.java","uriBaseId":"%SRCROOT%","index":276}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/User.java","uriBaseId":"%SRCROOT%","index":277}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOREditOtherProfiile.java","uriBaseId":"%SRCROOT%","index":278}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserRepository.java","uriBaseId":"%SRCROOT%","index":279}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java","uriBaseId":"%SRCROOT%","index":280}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignment.java","uriBaseId":"%SRCROOT%","index":281}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOR.java","uriBaseId":"%SRCROOT%","index":282}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOtherProfile.java","uriBaseId":"%SRCROOT%","index":283}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/AuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":284}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswords.java","uriBaseId":"%SRCROOT%","index":285}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/StartWebGoat.java","uriBaseId":"%SRCROOT%","index":286}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/LabelDebugger.java","uriBaseId":"%SRCROOT%","index":287}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/ContactImpl.java","uriBaseId":"%SRCROOT%","index":288}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Messages.java","uriBaseId":"%SRCROOT%","index":289}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsLesson.java","uriBaseId":"%SRCROOT%","index":290}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/EncodingAssignment.java","uriBaseId":"%SRCROOT%","index":291}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AuthBypass.java","uriBaseId":"%SRCROOT%","index":292}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Lesson.java","uriBaseId":"%SRCROOT%","index":293}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkDummy.java","uriBaseId":"%SRCROOT%","index":294}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/PluginMessages.java","uriBaseId":"%SRCROOT%","index":295}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidation.java","uriBaseId":"%SRCROOT%","index":296}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTamperingTask.java","uriBaseId":"%SRCROOT%","index":297}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentForgotPassword.java","uriBaseId":"%SRCROOT%","index":298}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionAdvanced.java","uriBaseId":"%SRCROOT%","index":299}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentPath.java","uriBaseId":"%SRCROOT%","index":300}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIA.java","uriBaseId":"%SRCROOT%","index":301}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLoginTask.java","uriBaseId":"%SRCROOT%","index":302}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingQuiz.java","uriBaseId":"%SRCROOT%","index":303}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLogin.java","uriBaseId":"%SRCROOT%","index":304}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/Email.java","uriBaseId":"%SRCROOT%","index":305}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonInfoModel.java","uriBaseId":"%SRCROOT%","index":306}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Challenge8.java","uriBaseId":"%SRCROOT%","index":307}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebWolfRedirect.java","uriBaseId":"%SRCROOT%","index":308}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/LessonTemplate.java","uriBaseId":"%SRCROOT%","index":309}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":310}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORDiffAttributes.java","uriBaseId":"%SRCROOT%","index":311}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1.java","uriBaseId":"%SRCROOT%","index":312}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/StartupMessage.java","uriBaseId":"%SRCROOT%","index":313}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFiltering.java","uriBaseId":"%SRCROOT%","index":314}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionMitigations.java","uriBaseId":"%SRCROOT%","index":315}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallengeLogin.java","uriBaseId":"%SRCROOT%","index":316}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10a.java","uriBaseId":"%SRCROOT%","index":317}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFGetFlag.java","uriBaseId":"%SRCROOT%","index":318}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/CrossSiteScriptingStored.java","uriBaseId":"%SRCROOT%","index":319}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flag.java","uriBaseId":"%SRCROOT%","index":320}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Views.java","uriBaseId":"%SRCROOT%","index":321}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/XXE.java","uriBaseId":"%SRCROOT%","index":322}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/WebWolfTraceRepository.java","uriBaseId":"%SRCROOT%","index":323}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonConnectionInvocationHandler.java","uriBaseId":"%SRCROOT%","index":324}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/HintService.java","uriBaseId":"%SRCROOT%","index":325}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTrackerRepository.java","uriBaseId":"%SRCROOT%","index":326}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/LessonDataSource.java","uriBaseId":"%SRCROOT%","index":327}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/Scoreboard.java","uriBaseId":"%SRCROOT%","index":328}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.java","uriBaseId":"%SRCROOT%","index":329}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIAQuiz.java","uriBaseId":"%SRCROOT%","index":330}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":331}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/XOREncodingAssignment.java","uriBaseId":"%SRCROOT%","index":332}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTracker.java","uriBaseId":"%SRCROOT%","index":333}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserSession.java","uriBaseId":"%SRCROOT%","index":334}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/Course.java","uriBaseId":"%SRCROOT%","index":335}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequest.java","uriBaseId":"%SRCROOT%","index":336}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6b.java","uriBaseId":"%SRCROOT%","index":337}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionQuiz.java","uriBaseId":"%SRCROOT%","index":338}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Initializeable.java","uriBaseId":"%SRCROOT%","index":339}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SimpleMailAssignment.java","uriBaseId":"%SRCROOT%","index":340}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/EnvironmentExposure.java","uriBaseId":"%SRCROOT%","index":341}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/ChallengeIntro.java","uriBaseId":"%SRCROOT%","index":342}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsQuiz.java","uriBaseId":"%SRCROOT%","index":343}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/CryptoUtil.java","uriBaseId":"%SRCROOT%","index":344}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFConfirmFlag1.java","uriBaseId":"%SRCROOT%","index":345}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTToken.java","uriBaseId":"%SRCROOT%","index":346}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/Email.java","uriBaseId":"%SRCROOT%","index":347}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/User.java","uriBaseId":"%SRCROOT%","index":348}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":1}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/HintService.java","uriBaseId":"%SRCROOT%","index":325}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/StartupMessage.java","uriBaseId":"%SRCROOT%","index":349}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/XOREncodingAssignment.java","uriBaseId":"%SRCROOT%","index":332}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpoint.java","uriBaseId":"%SRCROOT%","index":245}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/QuestionsAssignment.java","uriBaseId":"%SRCROOT%","index":255}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Initializeable.java","uriBaseId":"%SRCROOT%","index":339}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserRepository.java","uriBaseId":"%SRCROOT%","index":279}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasics.java","uriBaseId":"%SRCROOT%","index":234}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Assignment.java","uriBaseId":"%SRCROOT%","index":269}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":350}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java","uriBaseId":"%SRCROOT%","index":157}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/CommentsEndpoint.java","uriBaseId":"%SRCROOT%","index":351}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/CryptoUtil.java","uriBaseId":"%SRCROOT%","index":344}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":182}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxControllerTest.java","uriBaseId":"%SRCROOT%","index":352}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/CourseConfiguration.java","uriBaseId":"%SRCROOT%","index":353}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfMacro.java","uriBaseId":"%SRCROOT%","index":180}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenus.java","uriBaseId":"%SRCROOT%","index":177}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/WebWolfIntegrationTest.java","uriBaseId":"%SRCROOT%","index":108}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/SerializationHelper.java","uriBaseId":"%SRCROOT%","index":263}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionAdvanced.java","uriBaseId":"%SRCROOT%","index":299}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":354}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":355}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Views.java","uriBaseId":"%SRCROOT%","index":321}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/ReportCardServiceTest.java","uriBaseId":"%SRCROOT%","index":356}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Initializeable.java","uriBaseId":"%SRCROOT%","index":357}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/dummy/insecure/framework/VulnerableTaskHolder.java","uriBaseId":"%SRCROOT%","index":358}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignment.java","uriBaseId":"%SRCROOT%","index":359}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson3.java","uriBaseId":"%SRCROOT%","index":360}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswords.java","uriBaseId":"%SRCROOT%","index":361}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/SolutionConstants.java","uriBaseId":"%SRCROOT%","index":362}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6b.java","uriBaseId":"%SRCROOT%","index":337}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFieldRestrictions.java","uriBaseId":"%SRCROOT%","index":363}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/QuestionsAssignment.java","uriBaseId":"%SRCROOT%","index":364}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":365}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonTitleService.java","uriBaseId":"%SRCROOT%","index":195}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/HammerHead.java","uriBaseId":"%SRCROOT%","index":366}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/controller/StartLesson.java","uriBaseId":"%SRCROOT%","index":158}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Challenge8.java","uriBaseId":"%SRCROOT%","index":367}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Challenge7.java","uriBaseId":"%SRCROOT%","index":368}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/challenges/Assignment1Test.java","uriBaseId":"%SRCROOT%","index":369}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":370}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIA.java","uriBaseId":"%SRCROOT%","index":301}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2Test.java","uriBaseId":"%SRCROOT%","index":371}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/User.java","uriBaseId":"%SRCROOT%","index":277}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxController.java","uriBaseId":"%SRCROOT%","index":174}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingAccessControlUserRepository.java","uriBaseId":"%SRCROOT%","index":206}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":52}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFieldRestrictions.java","uriBaseId":"%SRCROOT%","index":236}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTController.java","uriBaseId":"%SRCROOT%","index":163}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingTest.java","uriBaseId":"%SRCROOT%","index":106}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Assignment.java","uriBaseId":"%SRCROOT%","index":372}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentEndpoint.java","uriBaseId":"%SRCROOT%","index":219}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":373}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFixTest.java","uriBaseId":"%SRCROOT%","index":76}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsEndpoint.java","uriBaseId":"%SRCROOT%","index":223}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/IDORIntegrationTest.java","uriBaseId":"%SRCROOT%","index":62}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":374}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/HintService.java","uriBaseId":"%SRCROOT%","index":375}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flags.java","uriBaseId":"%SRCROOT%","index":221}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/.mvn/wrapper/MavenWrapperDownloader.java","uriBaseId":"%SRCROOT%","index":376}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Hint.java","uriBaseId":"%SRCROOT%","index":377}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserTracker.java","uriBaseId":"%SRCROOT%","index":378}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasics.java","uriBaseId":"%SRCROOT%","index":379}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfileAltUrl.java","uriBaseId":"%SRCROOT%","index":380}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingMitigation.java","uriBaseId":"%SRCROOT%","index":199}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1.java","uriBaseId":"%SRCROOT%","index":312}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":381}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/VerifyAccount.java","uriBaseId":"%SRCROOT%","index":382}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/StartWebGoat.java","uriBaseId":"%SRCROOT%","index":383}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/DisplayUserTest.java","uriBaseId":"%SRCROOT%","index":84}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpoint.java","uriBaseId":"%SRCROOT%","index":384}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHash.java","uriBaseId":"%SRCROOT%","index":275}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AttackResult.java","uriBaseId":"%SRCROOT%","index":385}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWT.java","uriBaseId":"%SRCROOT%","index":386}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordReset.java","uriBaseId":"%SRCROOT%","index":196}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofingTask.java","uriBaseId":"%SRCROOT%","index":154}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebWolf.java","uriBaseId":"%SRCROOT%","index":187}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallengeLogin.java","uriBaseId":"%SRCROOT%","index":316}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/jwt/JWTController.java","uriBaseId":"%SRCROOT%","index":387}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":388}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":389}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":390}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenusTest.java","uriBaseId":"%SRCROOT%","index":391}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookie.java","uriBaseId":"%SRCROOT%","index":186}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenus.java","uriBaseId":"%SRCROOT%","index":392}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsLesson.java","uriBaseId":"%SRCROOT%","index":393}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/CrossSiteScriptingStored.java","uriBaseId":"%SRCROOT%","index":394}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/authbypass/BypassVerificationTest.java","uriBaseId":"%SRCROOT%","index":395}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":396}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/PluginMessages.java","uriBaseId":"%SRCROOT%","index":295}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentForgotPassword.java","uriBaseId":"%SRCROOT%","index":397}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/UserProfile.java","uriBaseId":"%SRCROOT%","index":398}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/StartupMessage.java","uriBaseId":"%SRCROOT%","index":313}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/authbypass/BypassVerificationTest.java","uriBaseId":"%SRCROOT%","index":71}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/AccessControlIntegrationTest.java","uriBaseId":"%SRCROOT%","index":98}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Flags.java","uriBaseId":"%SRCROOT%","index":399}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/Review.java","uriBaseId":"%SRCROOT%","index":400}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":401}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":402}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Category.java","uriBaseId":"%SRCROOT%","index":202}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/EncodingAssignment.java","uriBaseId":"%SRCROOT%","index":291}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/ContactImpl.java","uriBaseId":"%SRCROOT%","index":288}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProviderTest.java","uriBaseId":"%SRCROOT%","index":403}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserValidator.java","uriBaseId":"%SRCROOT%","index":404}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingAccessControlUserRepository.java","uriBaseId":"%SRCROOT%","index":405}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/ChallengeIntro.java","uriBaseId":"%SRCROOT%","index":406}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadTest.java","uriBaseId":"%SRCROOT%","index":136}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/DeserializationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":407}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsers.java","uriBaseId":"%SRCROOT%","index":408}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/TriedQuestions.java","uriBaseId":"%SRCROOT%","index":409}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":410}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/PasswordResetLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":411}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6bTest.java","uriBaseId":"%SRCROOT%","index":111}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/PluginMessages.java","uriBaseId":"%SRCROOT%","index":412}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/GeneralLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":413}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/OperatingSystemMacro.java","uriBaseId":"%SRCROOT%","index":183}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTampering.java","uriBaseId":"%SRCROOT%","index":414}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.java","uriBaseId":"%SRCROOT%","index":329}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Challenge5.java","uriBaseId":"%SRCROOT%","index":237}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserService.java","uriBaseId":"%SRCROOT%","index":164}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionMitigations.java","uriBaseId":"%SRCROOT%","index":415}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpointTest.java","uriBaseId":"%SRCROOT%","index":64}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/lessontemplate/SampleAttack.java","uriBaseId":"%SRCROOT%","index":416}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionMitigations.java","uriBaseId":"%SRCROOT%","index":315}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/SimpleMailAssignment.java","uriBaseId":"%SRCROOT%","index":417}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/LessonMenuServiceTest.java","uriBaseId":"%SRCROOT%","index":418}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":419}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Challenge5.java","uriBaseId":"%SRCROOT%","index":420}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Challenge1.java","uriBaseId":"%SRCROOT%","index":242}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLogin.java","uriBaseId":"%SRCROOT%","index":304}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":215}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelDebugService.java","uriBaseId":"%SRCROOT%","index":149}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/Email.java","uriBaseId":"%SRCROOT%","index":421}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/cia/CIAQuizTest.java","uriBaseId":"%SRCROOT%","index":81}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOtherProfile.java","uriBaseId":"%SRCROOT%","index":283}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":122}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":422}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignment.java","uriBaseId":"%SRCROOT%","index":423}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Comment.java","uriBaseId":"%SRCROOT%","index":226}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTrackerRepository.java","uriBaseId":"%SRCROOT%","index":326}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/cryptography/CryptoUtilTest.java","uriBaseId":"%SRCROOT%","index":424}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/ReportCardService.java","uriBaseId":"%SRCROOT%","index":425}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webgoatintroduction/WebGoatIntroduction.java","uriBaseId":"%SRCROOT%","index":271}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentEndpoint.java","uriBaseId":"%SRCROOT%","index":426}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/session/LessonTrackerTest.java","uriBaseId":"%SRCROOT%","index":61}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfRootMacro.java","uriBaseId":"%SRCROOT%","index":427}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":428}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/Email.java","uriBaseId":"%SRCROOT%","index":429}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8Test.java","uriBaseId":"%SRCROOT%","index":137}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdminTest.java","uriBaseId":"%SRCROOT%","index":69}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonMenuService.java","uriBaseId":"%SRCROOT%","index":148}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":430}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":431}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/SerializationHelper.java","uriBaseId":"%SRCROOT%","index":432}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/user/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":100}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/ParentConfig.java","uriBaseId":"%SRCROOT%","index":156}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/RestartLessonService.java","uriBaseId":"%SRCROOT%","index":260}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/controller/StartLesson.java","uriBaseId":"%SRCROOT%","index":433}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java","uriBaseId":"%SRCROOT%","index":434}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequestTest.java","uriBaseId":"%SRCROOT%","index":65}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6aTest.java","uriBaseId":"%SRCROOT%","index":435}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/WebWolfTraceRepository.java","uriBaseId":"%SRCROOT%","index":323}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Flag.java","uriBaseId":"%SRCROOT%","index":436}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Assignment1.java","uriBaseId":"%SRCROOT%","index":437}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORDiffAttributes.java","uriBaseId":"%SRCROOT%","index":311}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/PathTraversalIntegrationTest.java","uriBaseId":"%SRCROOT%","index":438}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/WebGoatApplication.java","uriBaseId":"%SRCROOT%","index":439}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevTools.java","uriBaseId":"%SRCROOT%","index":440}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDecTest.java","uriBaseId":"%SRCROOT%","index":121}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentPath.java","uriBaseId":"%SRCROOT%","index":300}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFixTest.java","uriBaseId":"%SRCROOT%","index":441}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":92}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/XSSIntegrationTest.java","uriBaseId":"%SRCROOT%","index":442}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingMitigation.java","uriBaseId":"%SRCROOT%","index":443}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponents.java","uriBaseId":"%SRCROOT%","index":261}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":53}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/Language.java","uriBaseId":"%SRCROOT%","index":444}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDec.java","uriBaseId":"%SRCROOT%","index":445}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentHints.java","uriBaseId":"%SRCROOT%","index":446}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Assignment8.java","uriBaseId":"%SRCROOT%","index":266}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/Course.java","uriBaseId":"%SRCROOT%","index":335}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":447}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepository.java","uriBaseId":"%SRCROOT%","index":204}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":131}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/Contact.java","uriBaseId":"%SRCROOT%","index":448}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Messages.java","uriBaseId":"%SRCROOT%","index":289}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/LessonTracker.java","uriBaseId":"%SRCROOT%","index":179}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":449}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/WebGoatApplication.java","uriBaseId":"%SRCROOT%","index":94}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5aTest.java","uriBaseId":"%SRCROOT%","index":97}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":144}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignment.java","uriBaseId":"%SRCROOT%","index":273}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/Salaries.java","uriBaseId":"%SRCROOT%","index":450}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10a.java","uriBaseId":"%SRCROOT%","index":317}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LabelDebugService.java","uriBaseId":"%SRCROOT%","index":451}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequest.java","uriBaseId":"%SRCROOT%","index":336}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionQuiz.java","uriBaseId":"%SRCROOT%","index":338}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/WebWolfIntroduction.java","uriBaseId":"%SRCROOT%","index":258}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/deserialization/DeserializeTest.java","uriBaseId":"%SRCROOT%","index":452}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SessionManagementIntegrationTest.java","uriBaseId":"%SRCROOT%","index":453}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/GeneralLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":126}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItemType.java","uriBaseId":"%SRCROOT%","index":454}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/XOREncodingAssignment.java","uriBaseId":"%SRCROOT%","index":455}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFFeedback.java","uriBaseId":"%SRCROOT%","index":203}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonProgressService.java","uriBaseId":"%SRCROOT%","index":233}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserRepository.java","uriBaseId":"%SRCROOT%","index":456}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":457}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":27}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/csrf/CSRFFeedbackTest.java","uriBaseId":"%SRCROOT%","index":83}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":211}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6aTest.java","uriBaseId":"%SRCROOT%","index":60}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/Messages.java","uriBaseId":"%SRCROOT%","index":458}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":459}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/ForgedReviews.java","uriBaseId":"%SRCROOT%","index":460}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionYourHashTest.java","uriBaseId":"%SRCROOT%","index":125}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrievalTest.java","uriBaseId":"%SRCROOT%","index":461}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":462}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonScanner.java","uriBaseId":"%SRCROOT%","index":463}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":82}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java","uriBaseId":"%SRCROOT%","index":464}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":465}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest2.java","uriBaseId":"%SRCROOT%","index":466}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORDiffAttributes.java","uriBaseId":"%SRCROOT%","index":467}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/CSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":468}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/XXEIntegrationTest.java","uriBaseId":"%SRCROOT%","index":469}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrievalTest.java","uriBaseId":"%SRCROOT%","index":63}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/CryptoUtil.java","uriBaseId":"%SRCROOT%","index":470}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/LessonDataSource.java","uriBaseId":"%SRCROOT%","index":327}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserValidatorTest.java","uriBaseId":"%SRCROOT%","index":93}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8Test.java","uriBaseId":"%SRCROOT%","index":471}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java","uriBaseId":"%SRCROOT%","index":472}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cia/CIA.java","uriBaseId":"%SRCROOT%","index":473}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5aTest.java","uriBaseId":"%SRCROOT%","index":474}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":475}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWT.java","uriBaseId":"%SRCROOT%","index":217}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentPath.java","uriBaseId":"%SRCROOT%","index":476}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/plugins/LessonTest.java","uriBaseId":"%SRCROOT%","index":477}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Email.java","uriBaseId":"%SRCROOT%","index":478}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/UserService.java","uriBaseId":"%SRCROOT%","index":479}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTQuiz.java","uriBaseId":"%SRCROOT%","index":246}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/UserSessionData.java","uriBaseId":"%SRCROOT%","index":480}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java","uriBaseId":"%SRCROOT%","index":280}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTracker.java","uriBaseId":"%SRCROOT%","index":333}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/AuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":284}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpoint.java","uriBaseId":"%SRCROOT%","index":481}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java","uriBaseId":"%SRCROOT%","index":70}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/ParentConfig.java","uriBaseId":"%SRCROOT%","index":482}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLoginTask.java","uriBaseId":"%SRCROOT%","index":302}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/PasswordResetLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":59}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":248}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonConnectionInvocationHandler.java","uriBaseId":"%SRCROOT%","index":483}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":484}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignment.java","uriBaseId":"%SRCROOT%","index":485}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponents.java","uriBaseId":"%SRCROOT%","index":486}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/WebWolfIntegrationTest.java","uriBaseId":"%SRCROOT%","index":487}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/UserRepository.java","uriBaseId":"%SRCROOT%","index":488}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentHints.java","uriBaseId":"%SRCROOT%","index":272}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsLesson.java","uriBaseId":"%SRCROOT%","index":290}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignmentTest.java","uriBaseId":"%SRCROOT%","index":489}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/csrf/CSRFFeedbackTest.java","uriBaseId":"%SRCROOT%","index":490}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6bTest.java","uriBaseId":"%SRCROOT%","index":491}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":492}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHash.java","uriBaseId":"%SRCROOT%","index":493}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/Cryptography.java","uriBaseId":"%SRCROOT%","index":262}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/LabelDebugger.java","uriBaseId":"%SRCROOT%","index":494}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/user/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":495}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/LessonDataSource.java","uriBaseId":"%SRCROOT%","index":496}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionAdvancedIntegrationTest.java","uriBaseId":"%SRCROOT%","index":497}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9Test.java","uriBaseId":"%SRCROOT%","index":133}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest2.java","uriBaseId":"%SRCROOT%","index":91}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpointTest.java","uriBaseId":"%SRCROOT%","index":498}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRF.java","uriBaseId":"%SRCROOT%","index":175}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/ForgedReviews.java","uriBaseId":"%SRCROOT%","index":207}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java","uriBaseId":"%SRCROOT%","index":188}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationTest.java","uriBaseId":"%SRCROOT%","index":86}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTamperingTask.java","uriBaseId":"%SRCROOT%","index":297}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/ContactImpl.java","uriBaseId":"%SRCROOT%","index":499}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/IntegrationTest.java","uriBaseId":"%SRCROOT%","index":500}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1Test.java","uriBaseId":"%SRCROOT%","index":89}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/CryptoIntegrationTest.java","uriBaseId":"%SRCROOT%","index":78}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/LessonTemplate.java","uriBaseId":"%SRCROOT%","index":309}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java","uriBaseId":"%SRCROOT%","index":230}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserValidator.java","uriBaseId":"%SRCROOT%","index":264}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10Test.java","uriBaseId":"%SRCROOT%","index":501}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevToolsTest.java","uriBaseId":"%SRCROOT%","index":502}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDOR.java","uriBaseId":"%SRCROOT%","index":503}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/session/LessonTrackerTest.java","uriBaseId":"%SRCROOT%","index":504}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionMitigationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":113}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/CryptoIntegrationTest.java","uriBaseId":"%SRCROOT%","index":505}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserTrackerRepository.java","uriBaseId":"%SRCROOT%","index":506}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidationTest.java","uriBaseId":"%SRCROOT%","index":123}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/jwt/JWTToken.java","uriBaseId":"%SRCROOT%","index":507}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/DatabaseConfiguration.java","uriBaseId":"%SRCROOT%","index":232}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/cryptography/CryptoUtilTest.java","uriBaseId":"%SRCROOT%","index":116}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":508}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpointTest.java","uriBaseId":"%SRCROOT%","index":115}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTampering.java","uriBaseId":"%SRCROOT%","index":220}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFGetFlag.java","uriBaseId":"%SRCROOT%","index":318}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/TriedQuestions.java","uriBaseId":"%SRCROOT%","index":247}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/PathTraversal.java","uriBaseId":"%SRCROOT%","index":227}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/Email.java","uriBaseId":"%SRCROOT%","index":305}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Lesson.java","uriBaseId":"%SRCROOT%","index":509}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":102}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Hint.java","uriBaseId":"%SRCROOT%","index":224}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Assignment1.java","uriBaseId":"%SRCROOT%","index":162}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepository.java","uriBaseId":"%SRCROOT%","index":510}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/votes/Vote.java","uriBaseId":"%SRCROOT%","index":511}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/DeserializationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":74}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/Cryptography.java","uriBaseId":"%SRCROOT%","index":512}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/Requests.java","uriBaseId":"%SRCROOT%","index":181}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/Course.java","uriBaseId":"%SRCROOT%","index":513}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentTest.java","uriBaseId":"%SRCROOT%","index":129}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionAdvancedIntegrationTest.java","uriBaseId":"%SRCROOT%","index":90}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LabelService.java","uriBaseId":"%SRCROOT%","index":514}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignment.java","uriBaseId":"%SRCROOT%","index":189}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Lesson.java","uriBaseId":"%SRCROOT%","index":293}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":515}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItemType.java","uriBaseId":"%SRCROOT%","index":214}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.java","uriBaseId":"%SRCROOT%","index":516}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepositoryTest.java","uriBaseId":"%SRCROOT%","index":517}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookie.java","uriBaseId":"%SRCROOT%","index":518}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/WebSession.java","uriBaseId":"%SRCROOT%","index":519}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/Salaries.java","uriBaseId":"%SRCROOT%","index":167}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordResetEmail.java","uriBaseId":"%SRCROOT%","index":520}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10Test.java","uriBaseId":"%SRCROOT%","index":109}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java","uriBaseId":"%SRCROOT%","index":521}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebGoat.java","uriBaseId":"%SRCROOT%","index":190}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRF.java","uriBaseId":"%SRCROOT%","index":191}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpointTest.java","uriBaseId":"%SRCROOT%","index":522}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFGetFlag.java","uriBaseId":"%SRCROOT%","index":523}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":524}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictions.java","uriBaseId":"%SRCROOT%","index":239}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":525}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/session/LabelDebuggerTest.java","uriBaseId":"%SRCROOT%","index":526}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpoint.java","uriBaseId":"%SRCROOT%","index":184}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/dummy/insecure/framework/VulnerableTaskHolder.java","uriBaseId":"%SRCROOT%","index":208}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignmentTest.java","uriBaseId":"%SRCROOT%","index":104}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":527}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":528}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":529}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserTrackerRepositoryTest.java","uriBaseId":"%SRCROOT%","index":530}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkLesson.java","uriBaseId":"%SRCROOT%","index":193}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/XXE.java","uriBaseId":"%SRCROOT%","index":322}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFConfirmFlag1.java","uriBaseId":"%SRCROOT%","index":345}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/CourseConfiguration.java","uriBaseId":"%SRCROOT%","index":147}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserValidatorTest.java","uriBaseId":"%SRCROOT%","index":531}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":532}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Vote.java","uriBaseId":"%SRCROOT%","index":240}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/UsernameMacro.java","uriBaseId":"%SRCROOT%","index":178}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignmentTest.java","uriBaseId":"%SRCROOT%","index":58}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java","uriBaseId":"%SRCROOT%","index":265}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfileAltUrl.java","uriBaseId":"%SRCROOT%","index":155}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/LessonTemplateResolver.java","uriBaseId":"%SRCROOT%","index":168}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionYourHashTest.java","uriBaseId":"%SRCROOT%","index":533}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserTrackerRepositoryTest.java","uriBaseId":"%SRCROOT%","index":101}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidation.java","uriBaseId":"%SRCROOT%","index":534}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxControllerTest.java","uriBaseId":"%SRCROOT%","index":72}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":535}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/cia/CIAQuizTest.java","uriBaseId":"%SRCROOT%","index":536}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserialization.java","uriBaseId":"%SRCROOT%","index":537}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepositoryTest.java","uriBaseId":"%SRCROOT%","index":127}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonConnectionInvocationHandler.java","uriBaseId":"%SRCROOT%","index":324}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSession.java","uriBaseId":"%SRCROOT%","index":538}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdmin.java","uriBaseId":"%SRCROOT%","index":539}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFConfirmFlag1.java","uriBaseId":"%SRCROOT%","index":540}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/Contact.java","uriBaseId":"%SRCROOT%","index":256}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/UsernameMacro.java","uriBaseId":"%SRCROOT%","index":541}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItem.java","uriBaseId":"%SRCROOT%","index":542}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/ImageServlet.java","uriBaseId":"%SRCROOT%","index":241}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":543}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/ChallengeIntro.java","uriBaseId":"%SRCROOT%","index":342}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/Email.java","uriBaseId":"%SRCROOT%","index":347}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":544}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORLogin.java","uriBaseId":"%SRCROOT%","index":259}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson3.java","uriBaseId":"%SRCROOT%","index":253}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/CSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":95}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpointTest.java","uriBaseId":"%SRCROOT%","index":545}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":546}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/EnvironmentService.java","uriBaseId":"%SRCROOT%","index":153}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":547}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5Test.java","uriBaseId":"%SRCROOT%","index":548}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/Review.java","uriBaseId":"%SRCROOT%","index":205}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonScanner.java","uriBaseId":"%SRCROOT%","index":229}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java","uriBaseId":"%SRCROOT%","index":549}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/ReportCardServiceTest.java","uriBaseId":"%SRCROOT%","index":79}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/User.java","uriBaseId":"%SRCROOT%","index":348}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1.java","uriBaseId":"%SRCROOT%","index":550}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdmin.java","uriBaseId":"%SRCROOT%","index":151}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":42}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":551}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":2}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingTest.java","uriBaseId":"%SRCROOT%","index":552}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/WebWolfTraceRepository.java","uriBaseId":"%SRCROOT%","index":553}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonInfoModel.java","uriBaseId":"%SRCROOT%","index":554}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest1.java","uriBaseId":"%SRCROOT%","index":555}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpointTest.java","uriBaseId":"%SRCROOT%","index":556}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/SqlLessonTest.java","uriBaseId":"%SRCROOT%","index":99}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationTest.java","uriBaseId":"%SRCROOT%","index":557}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswordsAssignment.java","uriBaseId":"%SRCROOT%","index":558}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/UserSessionData.java","uriBaseId":"%SRCROOT%","index":218}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":559}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkDummy.java","uriBaseId":"%SRCROOT%","index":560}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/SessionService.java","uriBaseId":"%SRCROOT%","index":561}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":562}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInputTest.java","uriBaseId":"%SRCROOT%","index":105}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatVersionMacro.java","uriBaseId":"%SRCROOT%","index":251}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/ChallengeIntegrationTest.java","uriBaseId":"%SRCROOT%","index":563}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenusTest.java","uriBaseId":"%SRCROOT%","index":88}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Email.java","uriBaseId":"%SRCROOT%","index":252}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/DisplayUserTest.java","uriBaseId":"%SRCROOT%","index":564}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/WebWolfIntroduction.java","uriBaseId":"%SRCROOT%","index":565}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/votes/Views.java","uriBaseId":"%SRCROOT%","index":566}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItem.java","uriBaseId":"%SRCROOT%","index":150}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AttackResult.java","uriBaseId":"%SRCROOT%","index":176}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignment.java","uriBaseId":"%SRCROOT%","index":281}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswords.java","uriBaseId":"%SRCROOT%","index":285}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/LessonProgressServiceTest.java","uriBaseId":"%SRCROOT%","index":567}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":568}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AuthBypass.java","uriBaseId":"%SRCROOT%","index":292}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/LessonTemplateResolver.java","uriBaseId":"%SRCROOT%","index":569}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonMenuServiceTest.java","uriBaseId":"%SRCROOT%","index":75}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/jwt/JWTTokenTest.java","uriBaseId":"%SRCROOT%","index":143}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/controller/Welcome.java","uriBaseId":"%SRCROOT%","index":570}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/jwt/JWTTokenTest.java","uriBaseId":"%SRCROOT%","index":571}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/StoredXssCommentsTest.java","uriBaseId":"%SRCROOT%","index":57}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":572}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1Test.java","uriBaseId":"%SRCROOT%","index":573}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserSession.java","uriBaseId":"%SRCROOT%","index":334}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOtherProfile.java","uriBaseId":"%SRCROOT%","index":574}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/lessontemplate/LessonTemplate.java","uriBaseId":"%SRCROOT%","index":575}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/plugins/LessonTest.java","uriBaseId":"%SRCROOT%","index":80}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/User.java","uriBaseId":"%SRCROOT%","index":576}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":3}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/assignments/AssignmentEndpointTest.java","uriBaseId":"%SRCROOT%","index":139}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/AccessControlIntegrationTest.java","uriBaseId":"%SRCROOT%","index":577}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":578}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonInfoService.java","uriBaseId":"%SRCROOT%","index":579}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/Comment.java","uriBaseId":"%SRCROOT%","index":580}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/controller/Welcome.java","uriBaseId":"%SRCROOT%","index":225}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/SessionService.java","uriBaseId":"%SRCROOT%","index":172}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInputTest.java","uriBaseId":"%SRCROOT%","index":581}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpointTest.java","uriBaseId":"%SRCROOT%","index":120}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/challenges/Assignment1Test.java","uriBaseId":"%SRCROOT%","index":132}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevToolsTest.java","uriBaseId":"%SRCROOT%","index":107}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserSession.java","uriBaseId":"%SRCROOT%","index":582}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/HintServiceTest.java","uriBaseId":"%SRCROOT%","index":145}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTQuiz.java","uriBaseId":"%SRCROOT%","index":583}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfMacro.java","uriBaseId":"%SRCROOT%","index":584}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProviderTest.java","uriBaseId":"%SRCROOT%","index":67}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/StartWebGoat.java","uriBaseId":"%SRCROOT%","index":286}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDecTest.java","uriBaseId":"%SRCROOT%","index":585}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/AuthBypass.java","uriBaseId":"%SRCROOT%","index":586}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Language.java","uriBaseId":"%SRCROOT%","index":152}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionAdvanced.java","uriBaseId":"%SRCROOT%","index":587}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserRepository.java","uriBaseId":"%SRCROOT%","index":159}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjection.java","uriBaseId":"%SRCROOT%","index":588}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsQuiz.java","uriBaseId":"%SRCROOT%","index":343}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLessonTest.java","uriBaseId":"%SRCROOT%","index":66}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignmentTest.java","uriBaseId":"%SRCROOT%","index":589}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpProxies.java","uriBaseId":"%SRCROOT%","index":590}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/PathTraversal.java","uriBaseId":"%SRCROOT%","index":591}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionAC.java","uriBaseId":"%SRCROOT%","index":592}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":593}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Challenge1.java","uriBaseId":"%SRCROOT%","index":594}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfile.java","uriBaseId":"%SRCROOT%","index":595}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadTest.java","uriBaseId":"%SRCROOT%","index":596}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallengeLogin.java","uriBaseId":"%SRCROOT%","index":597}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/OperatingSystemMacro.java","uriBaseId":"%SRCROOT%","index":598}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionMitigationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":599}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Ping.java","uriBaseId":"%SRCROOT%","index":173}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/AuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":600}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":601}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":51}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFiltering.java","uriBaseId":"%SRCROOT%","index":314}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofingTask.java","uriBaseId":"%SRCROOT%","index":602}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidation.java","uriBaseId":"%SRCROOT%","index":296}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/HammerHead.java","uriBaseId":"%SRCROOT%","index":192}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/Requests.java","uriBaseId":"%SRCROOT%","index":603}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/PathTraversalIntegrationTest.java","uriBaseId":"%SRCROOT%","index":117}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/Authentication.java","uriBaseId":"%SRCROOT%","index":604}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjection.java","uriBaseId":"%SRCROOT%","index":160}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsQuiz.java","uriBaseId":"%SRCROOT%","index":605}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java","uriBaseId":"%SRCROOT%","index":606}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/SimpleXXETest.java","uriBaseId":"%SRCROOT%","index":607}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":608}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6b.java","uriBaseId":"%SRCROOT%","index":609}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsersTest.java","uriBaseId":"%SRCROOT%","index":56}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":114}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10a.java","uriBaseId":"%SRCROOT%","index":610}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/IDORIntegrationTest.java","uriBaseId":"%SRCROOT%","index":611}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/HintServiceTest.java","uriBaseId":"%SRCROOT%","index":612}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/EncodingAssignment.java","uriBaseId":"%SRCROOT%","index":613}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/session/LabelDebuggerTest.java","uriBaseId":"%SRCROOT%","index":119}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatTmpDirMacro.java","uriBaseId":"%SRCROOT%","index":614}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentForgotPassword.java","uriBaseId":"%SRCROOT%","index":298}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonProgressServiceTest.java","uriBaseId":"%SRCROOT%","index":110}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":615}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpointTest.java","uriBaseId":"%SRCROOT%","index":616}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionQuiz.java","uriBaseId":"%SRCROOT%","index":617}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequest.java","uriBaseId":"%SRCROOT%","index":618}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/WebWolfApplication.java","uriBaseId":"%SRCROOT%","index":103}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywordsTest.java","uriBaseId":"%SRCROOT%","index":619}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Category.java","uriBaseId":"%SRCROOT%","index":620}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkDummy.java","uriBaseId":"%SRCROOT%","index":294}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/XXE.java","uriBaseId":"%SRCROOT%","index":621}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpointTest.java","uriBaseId":"%SRCROOT%","index":622}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxController.java","uriBaseId":"%SRCROOT%","index":623}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSession.java","uriBaseId":"%SRCROOT%","index":270}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":41}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/assignments/AssignmentEndpointTest.java","uriBaseId":"%SRCROOT%","index":624}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":625}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/IntegrationTest.java","uriBaseId":"%SRCROOT%","index":141}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswordsAssignment.java","uriBaseId":"%SRCROOT%","index":197}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonTitleService.java","uriBaseId":"%SRCROOT%","index":626}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOR.java","uriBaseId":"%SRCROOT%","index":282}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpoint.java","uriBaseId":"%SRCROOT%","index":627}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13Test.java","uriBaseId":"%SRCROOT%","index":68}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/WebWolfApplication.java","uriBaseId":"%SRCROOT%","index":628}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingQuiz.java","uriBaseId":"%SRCROOT%","index":303}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserialization.java","uriBaseId":"%SRCROOT%","index":274}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flag.java","uriBaseId":"%SRCROOT%","index":320}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonMenuService.java","uriBaseId":"%SRCROOT%","index":629}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFiltering.java","uriBaseId":"%SRCROOT%","index":630}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/Comment.java","uriBaseId":"%SRCROOT%","index":631}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpProxies.java","uriBaseId":"%SRCROOT%","index":222}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequestTest.java","uriBaseId":"%SRCROOT%","index":632}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/WebSession.java","uriBaseId":"%SRCROOT%","index":146}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserRepositoryTest.java","uriBaseId":"%SRCROOT%","index":128}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/UserProfile.java","uriBaseId":"%SRCROOT%","index":268}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Assignment8.java","uriBaseId":"%SRCROOT%","index":633}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Challenge8.java","uriBaseId":"%SRCROOT%","index":307}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebWolfRedirect.java","uriBaseId":"%SRCROOT%","index":308}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRF.java","uriBaseId":"%SRCROOT%","index":634}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":635}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpoint.java","uriBaseId":"%SRCROOT%","index":213}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/EnvironmentService.java","uriBaseId":"%SRCROOT%","index":636}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/XXEIntegrationTest.java","uriBaseId":"%SRCROOT%","index":142}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":637}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/Ping.java","uriBaseId":"%SRCROOT%","index":638}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/DatabaseConfiguration.java","uriBaseId":"%SRCROOT%","index":639}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java","uriBaseId":"%SRCROOT%","index":198}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/LessonTrackerInterceptor.java","uriBaseId":"%SRCROOT%","index":640}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Challenge7.java","uriBaseId":"%SRCROOT%","index":238}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLoginTask.java","uriBaseId":"%SRCROOT%","index":641}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/LessonTracker.java","uriBaseId":"%SRCROOT%","index":642}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":50}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":331}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFFeedback.java","uriBaseId":"%SRCROOT%","index":643}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":644}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/deserialization/DeserializeTest.java","uriBaseId":"%SRCROOT%","index":130}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/LessonTrackerInterceptor.java","uriBaseId":"%SRCROOT%","index":200}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":645}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/Authentication.java","uriBaseId":"%SRCROOT%","index":170}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/User.java","uriBaseId":"%SRCROOT%","index":646}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebWolfRedirect.java","uriBaseId":"%SRCROOT%","index":647}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SessionManagementIntegrationTest.java","uriBaseId":"%SRCROOT%","index":124}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":648}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/RestartLessonService.java","uriBaseId":"%SRCROOT%","index":649}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpointTest.java","uriBaseId":"%SRCROOT%","index":118}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordReset.java","uriBaseId":"%SRCROOT%","index":650}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkLesson.java","uriBaseId":"%SRCROOT%","index":651}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5Test.java","uriBaseId":"%SRCROOT%","index":87}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":243}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignmentTest.java","uriBaseId":"%SRCROOT%","index":96}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdminTest.java","uriBaseId":"%SRCROOT%","index":652}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywordsTest.java","uriBaseId":"%SRCROOT%","index":135}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/LabelDebugger.java","uriBaseId":"%SRCROOT%","index":287}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordResetEmail.java","uriBaseId":"%SRCROOT%","index":161}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/StoredXssCommentsTest.java","uriBaseId":"%SRCROOT%","index":653}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignment.java","uriBaseId":"%SRCROOT%","index":654}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson4.java","uriBaseId":"%SRCROOT%","index":267}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/EnvironmentExposure.java","uriBaseId":"%SRCROOT%","index":655}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/ProgressRaceConditionIntegrationTest.java","uriBaseId":"%SRCROOT%","index":73}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFLogin.java","uriBaseId":"%SRCROOT%","index":254}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":166}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTToken.java","uriBaseId":"%SRCROOT%","index":346}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2Test.java","uriBaseId":"%SRCROOT%","index":112}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":656}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofing.java","uriBaseId":"%SRCROOT%","index":210}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonProgressService.java","uriBaseId":"%SRCROOT%","index":657}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingQuiz.java","uriBaseId":"%SRCROOT%","index":658}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/Comment.java","uriBaseId":"%SRCROOT%","index":257}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRF.java","uriBaseId":"%SRCROOT%","index":659}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonInfoModel.java","uriBaseId":"%SRCROOT%","index":306}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignment.java","uriBaseId":"%SRCROOT%","index":660}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/resetlink/PasswordChangeForm.java","uriBaseId":"%SRCROOT%","index":169}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson4.java","uriBaseId":"%SRCROOT%","index":661}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/WebWolf.java","uriBaseId":"%SRCROOT%","index":662}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/ProgressRaceConditionIntegrationTest.java","uriBaseId":"%SRCROOT%","index":663}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/SqlLessonTest.java","uriBaseId":"%SRCROOT%","index":664}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/resetlink/PasswordChangeForm.java","uriBaseId":"%SRCROOT%","index":665}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/CrossSiteScriptingStored.java","uriBaseId":"%SRCROOT%","index":319}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":666}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatVersionMacro.java","uriBaseId":"%SRCROOT%","index":667}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/FlagController.java","uriBaseId":"%SRCROOT%","index":54}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webgoatintroduction/WebGoatIntroduction.java","uriBaseId":"%SRCROOT%","index":668}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":669}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonInfoService.java","uriBaseId":"%SRCROOT%","index":228}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java","uriBaseId":"%SRCROOT%","index":670}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfile.java","uriBaseId":"%SRCROOT%","index":185}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebGoat.java","uriBaseId":"%SRCROOT%","index":671}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserRepositoryTest.java","uriBaseId":"%SRCROOT%","index":672}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsers.java","uriBaseId":"%SRCROOT%","index":171}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/ReportCardService.java","uriBaseId":"%SRCROOT%","index":244}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/EnvironmentExposure.java","uriBaseId":"%SRCROOT%","index":341}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":673}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":674}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9Test.java","uriBaseId":"%SRCROOT%","index":675}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidationTest.java","uriBaseId":"%SRCROOT%","index":676}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":310}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIAQuiz.java","uriBaseId":"%SRCROOT%","index":330}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDOREditOtherProfiile.java","uriBaseId":"%SRCROOT%","index":677}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLogin.java","uriBaseId":"%SRCROOT%","index":678}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/Scoreboard.java","uriBaseId":"%SRCROOT%","index":679}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsersTest.java","uriBaseId":"%SRCROOT%","index":680}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORLogin.java","uriBaseId":"%SRCROOT%","index":681}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignmentTest.java","uriBaseId":"%SRCROOT%","index":682}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofing.java","uriBaseId":"%SRCROOT%","index":683}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/SampleAttack.java","uriBaseId":"%SRCROOT%","index":276}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionAC.java","uriBaseId":"%SRCROOT%","index":201}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLessonTest.java","uriBaseId":"%SRCROOT%","index":684}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignment.java","uriBaseId":"%SRCROOT%","index":209}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":".mvn/wrapper/MavenWrapperDownloader.java","uriBaseId":"%SRCROOT%","index":685}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/SolutionConstants.java","uriBaseId":"%SRCROOT%","index":249}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":686}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SimpleMailAssignment.java","uriBaseId":"%SRCROOT%","index":340}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":687}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13Test.java","uriBaseId":"%SRCROOT%","index":688}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cia/CIAQuiz.java","uriBaseId":"%SRCROOT%","index":689}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/ImageServlet.java","uriBaseId":"%SRCROOT%","index":690}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOREditOtherProfiile.java","uriBaseId":"%SRCROOT%","index":278}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelService.java","uriBaseId":"%SRCROOT%","index":194}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":691}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":692}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/FlagController.java","uriBaseId":"%SRCROOT%","index":693}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfRootMacro.java","uriBaseId":"%SRCROOT%","index":212}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpointTest.java","uriBaseId":"%SRCROOT%","index":138}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/Scoreboard.java","uriBaseId":"%SRCROOT%","index":328}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/VerifyAccount.java","uriBaseId":"%SRCROOT%","index":231}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentTest.java","uriBaseId":"%SRCROOT%","index":694}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":46}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest1.java","uriBaseId":"%SRCROOT%","index":134}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/XSSIntegrationTest.java","uriBaseId":"%SRCROOT%","index":77}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDec.java","uriBaseId":"%SRCROOT%","index":250}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":695}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/ChallengeIntegrationTest.java","uriBaseId":"%SRCROOT%","index":140}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatTmpDirMacro.java","uriBaseId":"%SRCROOT%","index":216}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFLogin.java","uriBaseId":"%SRCROOT%","index":696}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevTools.java","uriBaseId":"%SRCROOT%","index":165}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/SimpleXXETest.java","uriBaseId":"%SRCROOT%","index":55}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpointTest.java","uriBaseId":"%SRCROOT%","index":85}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictions.java","uriBaseId":"%SRCROOT%","index":697}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTamperingTask.java","uriBaseId":"%SRCROOT%","index":698}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignment.java","uriBaseId":"%SRCROOT%","index":235}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":699}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/scoreboardApp.js","uriBaseId":"%SRCROOT%","index":700}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/assignment3.js","uriBaseId":"%SRCROOT%","index":701}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/csrf/js/csrf-review.js","uriBaseId":"%SRCROOT%","index":702}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/xxe/js/xxe.js","uriBaseId":"%SRCROOT%","index":703}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/jwt/js/jwt-buy.js","uriBaseId":"%SRCROOT%","index":704}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/challenges/js/challenge8.js","uriBaseId":"%SRCROOT%","index":705}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/mode-java.js","uriBaseId":"%SRCROOT%","index":706}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/assignment10b.js","uriBaseId":"%SRCROOT%","index":707}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/TitleView.js","uriBaseId":"%SRCROOT%","index":708}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/idor/js/idor.js","uriBaseId":"%SRCROOT%","index":709}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery_form/jquery.form.js","uriBaseId":"%SRCROOT%","index":710}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/pathtraversal/js/path_traversal.js","uriBaseId":"%SRCROOT%","index":711}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/controller/MenuController.js","uriBaseId":"%SRCROOT%","index":712}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ErrorNotificationView.js","uriBaseId":"%SRCROOT%","index":713}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuButtonView.js","uriBaseId":"%SRCROOT%","index":714}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuData.js","uriBaseId":"%SRCROOT%","index":715}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/jquery/jquery-1.10.2.min.js","uriBaseId":"%SRCROOT%","index":716}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-slider/js/bootstrap-slider.js","uriBaseId":"%SRCROOT%","index":717}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/UserAndInfoView.js","uriBaseId":"%SRCROOT%","index":718}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/text.js","uriBaseId":"%SRCROOT%","index":719}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuModel.js","uriBaseId":"%SRCROOT%","index":720}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-base.js","uriBaseId":"%SRCROOT%","index":721}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/wysihtml5-0.3.0.js","uriBaseId":"%SRCROOT%","index":722}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/jwt/js/jwt-refresh.js","uriBaseId":"%SRCROOT%","index":723}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-ui-1.10.4.js","uriBaseId":"%SRCROOT%","index":724}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/challenge.js","uriBaseId":"%SRCROOT%","index":725}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/theme-monokai.js","uriBaseId":"%SRCROOT%","index":726}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/AssignmentStatusModel.js","uriBaseId":"%SRCROOT%","index":727}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonOverviewCollection.js","uriBaseId":"%SRCROOT%","index":728}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HTMLContentModel.js","uriBaseId":"%SRCROOT%","index":729}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/ssrf/js/credentials.js","uriBaseId":"%SRCROOT%","index":730}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/clientsidefiltering/js/clientSideFilteringFree.js","uriBaseId":"%SRCROOT%","index":731}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/authbypass/js/bypass.js","uriBaseId":"%SRCROOT%","index":732}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuCollection.js","uriBaseId":"%SRCROOT%","index":733}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/GoatUtils.js","uriBaseId":"%SRCROOT%","index":734}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonInfoModel.js","uriBaseId":"%SRCROOT%","index":735}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/idor/js/idor.js","uriBaseId":"%SRCROOT%","index":736}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/TitleView.js","uriBaseId":"%SRCROOT%","index":737}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/PaginationControlView.js","uriBaseId":"%SRCROOT%","index":738}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonContentModel.js","uriBaseId":"%SRCROOT%","index":739}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HintModel.js","uriBaseId":"%SRCROOT%","index":740}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/jwt/js/jwt-voting.js","uriBaseId":"%SRCROOT%","index":741}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/goatApp.js","uriBaseId":"%SRCROOT%","index":742}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuModel.js","uriBaseId":"%SRCROOT%","index":743}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/FlagModel.js","uriBaseId":"%SRCROOT%","index":744}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/PaginationControlView.js","uriBaseId":"%SRCROOT%","index":745}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/jwt.js","uriBaseId":"%SRCROOT%","index":746}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webwolf/static/js/jwt.js","uriBaseId":"%SRCROOT%","index":747}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/csrf/js/csrf-review.js","uriBaseId":"%SRCROOT%","index":748}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/csrf/js/feedback.js","uriBaseId":"%SRCROOT%","index":749}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/quiz.js","uriBaseId":"%SRCROOT%","index":750}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/search.js","uriBaseId":"%SRCROOT%","index":751}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/jquery_form/jquery.form.js","uriBaseId":"%SRCROOT%","index":752}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-final.js","uriBaseId":"%SRCROOT%","index":753}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/challenges/js/challenge6.js","uriBaseId":"%SRCROOT%","index":754}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/underscore-min.js","uriBaseId":"%SRCROOT%","index":755}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/xss/js/assignment4.js","uriBaseId":"%SRCROOT%","index":756}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/sqlinjection/js/assignment10b.js","uriBaseId":"%SRCROOT%","index":757}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-refresh.js","uriBaseId":"%SRCROOT%","index":758}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/nanoScroller/jquery.nanoscroller.min.js","uriBaseId":"%SRCROOT%","index":759}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LabelDebugModel.js","uriBaseId":"%SRCROOT%","index":760}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuView.js","uriBaseId":"%SRCROOT%","index":761}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/pathtraversal/js/path_traversal.js","uriBaseId":"%SRCROOT%","index":762}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/GoatRouter.js","uriBaseId":"%SRCROOT%","index":763}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/insecurelogin/js/credentials.js","uriBaseId":"%SRCROOT%","index":764}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuData.js","uriBaseId":"%SRCROOT%","index":765}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ScoreboardView.js","uriBaseId":"%SRCROOT%","index":766}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webwolf/static/js/mail.js","uriBaseId":"%SRCROOT%","index":767}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-weak-keys.js","uriBaseId":"%SRCROOT%","index":768}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-ui.min.js","uriBaseId":"%SRCROOT%","index":769}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/controller/LessonController.js","uriBaseId":"%SRCROOT%","index":770}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/passwordreset/js/password-reset-simple.js","uriBaseId":"%SRCROOT%","index":771}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/controller/MenuController.js","uriBaseId":"%SRCROOT%","index":772}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonInfoModel.js","uriBaseId":"%SRCROOT%","index":773}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HTMLContentModel.js","uriBaseId":"%SRCROOT%","index":774}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/clientsidefiltering/js/clientSideFilteringFree.js","uriBaseId":"%SRCROOT%","index":775}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/CustomGoat.js","uriBaseId":"%SRCROOT%","index":776}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/toggle.js","uriBaseId":"%SRCROOT%","index":777}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/theme-monokai.js","uriBaseId":"%SRCROOT%","index":778}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/ssrf/js/credentials.js","uriBaseId":"%SRCROOT%","index":779}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webwolf/static/js/fileUpload.js","uriBaseId":"%SRCROOT%","index":780}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery.min.js","uriBaseId":"%SRCROOT%","index":781}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/GoatRouter.js","uriBaseId":"%SRCROOT%","index":782}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/goatConstants.js","uriBaseId":"%SRCROOT%","index":783}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-ui.min.js","uriBaseId":"%SRCROOT%","index":784}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/plugins/nanoScroller/jquery.nanoscroller.min.js","uriBaseId":"%SRCROOT%","index":785}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/goatAsyncErrorHandler.js","uriBaseId":"%SRCROOT%","index":786}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/clientsidefiltering/js/clientSideFiltering.js","uriBaseId":"%SRCROOT%","index":787}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/polyglot.min.js","uriBaseId":"%SRCROOT%","index":788}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/clientsidefiltering/js/clientSideFiltering.js","uriBaseId":"%SRCROOT%","index":789}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/ReportCardModel.js","uriBaseId":"%SRCROOT%","index":790}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/FlagsCollection.js","uriBaseId":"%SRCROOT%","index":791}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/ace.js","uriBaseId":"%SRCROOT%","index":792}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":793}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/insecurelogin/js/credentials.js","uriBaseId":"%SRCROOT%","index":794}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-buy.js","uriBaseId":"%SRCROOT%","index":795}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/goatApp.js","uriBaseId":"%SRCROOT%","index":796}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/AssignmentStatusModel.js","uriBaseId":"%SRCROOT%","index":797}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery.form.js","uriBaseId":"%SRCROOT%","index":798}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/ace.js","uriBaseId":"%SRCROOT%","index":799}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/backbone-min.js","uriBaseId":"%SRCROOT%","index":800}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuView.js","uriBaseId":"%SRCROOT%","index":801}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/LessonContentView.js","uriBaseId":"%SRCROOT%","index":802}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/authbypass/js/bypass.js","uriBaseId":"%SRCROOT%","index":803}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HintCollection.js","uriBaseId":"%SRCROOT%","index":804}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/sqlinjection/js/assignment13.js","uriBaseId":"%SRCROOT%","index":805}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/csrf/js/feedback.js","uriBaseId":"%SRCROOT%","index":806}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/application.js","uriBaseId":"%SRCROOT%","index":807}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/main.js","uriBaseId":"%SRCROOT%","index":808}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuCollection.js","uriBaseId":"%SRCROOT%","index":809}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/wysihtml5-0.3.0.js","uriBaseId":"%SRCROOT%","index":810}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/bootstrap3-wysihtml5.js","uriBaseId":"%SRCROOT%","index":811}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-2.1.4.min.js","uriBaseId":"%SRCROOT%","index":812}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/polyglot.min.js","uriBaseId":"%SRCROOT%","index":813}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/jwt/js/jwt-final.js","uriBaseId":"%SRCROOT%","index":814}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/HelpControlsView.js","uriBaseId":"%SRCROOT%","index":815}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/lessontemplate/js/idor.js","uriBaseId":"%SRCROOT%","index":816}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/require.min.js","uriBaseId":"%SRCROOT%","index":817}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HintModel.js","uriBaseId":"%SRCROOT%","index":818}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/ReportCardModel.js","uriBaseId":"%SRCROOT%","index":819}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/assignment4.js","uriBaseId":"%SRCROOT%","index":820}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/challenge8.js","uriBaseId":"%SRCROOT%","index":821}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/spoofcookie/js/handler.js","uriBaseId":"%SRCROOT%","index":822}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuItemView.js","uriBaseId":"%SRCROOT%","index":823}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/underscore-min.js","uriBaseId":"%SRCROOT%","index":824}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/search.js","uriBaseId":"%SRCROOT%","index":825}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonContentModel.js","uriBaseId":"%SRCROOT%","index":826}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/HintView.js","uriBaseId":"%SRCROOT%","index":827}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuItemView.js","uriBaseId":"%SRCROOT%","index":828}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-vuln.js","uriBaseId":"%SRCROOT%","index":829}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ScoreboardView.js","uriBaseId":"%SRCROOT%","index":830}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/assignment13.js","uriBaseId":"%SRCROOT%","index":831}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/lessontemplate/js/idor.js","uriBaseId":"%SRCROOT%","index":832}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/HelpControlsView.js","uriBaseId":"%SRCROOT%","index":833}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-slider/js/bootstrap-slider.js","uriBaseId":"%SRCROOT%","index":834}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/xss/js/stored-xss.js","uriBaseId":"%SRCROOT%","index":835}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/UserAndInfoView.js","uriBaseId":"%SRCROOT%","index":836}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery.min.js","uriBaseId":"%SRCROOT%","index":837}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":838}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery/jquery-1.10.2.min.js","uriBaseId":"%SRCROOT%","index":839}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/text.js","uriBaseId":"%SRCROOT%","index":840}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/backbone-min.js","uriBaseId":"%SRCROOT%","index":841}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/toggle.js","uriBaseId":"%SRCROOT%","index":842}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/fileUpload.js","uriBaseId":"%SRCROOT%","index":843}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-base.js","uriBaseId":"%SRCROOT%","index":844}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/jquery/jquery-ui-1.10.4.custom.min.js","uriBaseId":"%SRCROOT%","index":845}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/jwt/js/jwt-weak-keys.js","uriBaseId":"%SRCROOT%","index":846}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HintCollection.js","uriBaseId":"%SRCROOT%","index":847}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/bootstrap3-wysihtml5.js","uriBaseId":"%SRCROOT%","index":848}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/goatConstants.js","uriBaseId":"%SRCROOT%","index":849}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-voting.js","uriBaseId":"%SRCROOT%","index":850}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-2.1.4.min.js","uriBaseId":"%SRCROOT%","index":851}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ReportCardView.js","uriBaseId":"%SRCROOT%","index":852}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LabelDebugModel.js","uriBaseId":"%SRCROOT%","index":853}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/challenges/js/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":854}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/scoreboardApp.js","uriBaseId":"%SRCROOT%","index":855}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/controller/LessonController.js","uriBaseId":"%SRCROOT%","index":856}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/sqlinjection/js/challenge.js","uriBaseId":"%SRCROOT%","index":857}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery/jquery-ui-1.10.4.custom.min.js","uriBaseId":"%SRCROOT%","index":858}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/FlagsCollection.js","uriBaseId":"%SRCROOT%","index":859}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonOverviewCollection.js","uriBaseId":"%SRCROOT%","index":860}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/xxe/js/xxe.js","uriBaseId":"%SRCROOT%","index":861}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/FlagModel.js","uriBaseId":"%SRCROOT%","index":862}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/passwordreset/js/password-reset-simple.js","uriBaseId":"%SRCROOT%","index":863}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ReportCardView.js","uriBaseId":"%SRCROOT%","index":864}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/scoreboard.js","uriBaseId":"%SRCROOT%","index":865}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":866}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/GoatUtils.js","uriBaseId":"%SRCROOT%","index":867}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/CustomGoat.js","uriBaseId":"%SRCROOT%","index":868}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/scoreboard.js","uriBaseId":"%SRCROOT%","index":869}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/modernizr.min.js","uriBaseId":"%SRCROOT%","index":870}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/mode-java.js","uriBaseId":"%SRCROOT%","index":871}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ErrorNotificationView.js","uriBaseId":"%SRCROOT%","index":872}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/HintView.js","uriBaseId":"%SRCROOT%","index":873}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/stored-xss.js","uriBaseId":"%SRCROOT%","index":874}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/challenge6.js","uriBaseId":"%SRCROOT%","index":875}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/spoofcookie/js/handler.js","uriBaseId":"%SRCROOT%","index":876}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/main.js","uriBaseId":"%SRCROOT%","index":877}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/application.js","uriBaseId":"%SRCROOT%","index":878}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuButtonView.js","uriBaseId":"%SRCROOT%","index":879}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/xss/js/assignment3.js","uriBaseId":"%SRCROOT%","index":880}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/mail.js","uriBaseId":"%SRCROOT%","index":881}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/LessonContentView.js","uriBaseId":"%SRCROOT%","index":882}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/require.min.js","uriBaseId":"%SRCROOT%","index":883}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-vuln.js","uriBaseId":"%SRCROOT%","index":884}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/quiz.js","uriBaseId":"%SRCROOT%","index":885}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-ui-1.10.4.js","uriBaseId":"%SRCROOT%","index":886}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/goatAsyncErrorHandler.js","uriBaseId":"%SRCROOT%","index":887}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery.form.js","uriBaseId":"%SRCROOT%","index":888}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/modernizr.min.js","uriBaseId":"%SRCROOT%","index":889}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}}],"executionSuccessful":true}],"artifacts":[{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":1}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":2}},{"location":{"uri":"src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":3}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":27}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":41}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":42}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":46}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":50}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":51}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":52}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":53}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/FlagController.java","uriBaseId":"%SRCROOT%","index":54}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/SimpleXXETest.java","uriBaseId":"%SRCROOT%","index":55}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsersTest.java","uriBaseId":"%SRCROOT%","index":56}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/StoredXssCommentsTest.java","uriBaseId":"%SRCROOT%","index":57}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignmentTest.java","uriBaseId":"%SRCROOT%","index":58}},{"location":{"uri":"src/it/java/org/owasp/webgoat/PasswordResetLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":59}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6aTest.java","uriBaseId":"%SRCROOT%","index":60}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/session/LessonTrackerTest.java","uriBaseId":"%SRCROOT%","index":61}},{"location":{"uri":"src/it/java/org/owasp/webgoat/IDORIntegrationTest.java","uriBaseId":"%SRCROOT%","index":62}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrievalTest.java","uriBaseId":"%SRCROOT%","index":63}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpointTest.java","uriBaseId":"%SRCROOT%","index":64}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequestTest.java","uriBaseId":"%SRCROOT%","index":65}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLessonTest.java","uriBaseId":"%SRCROOT%","index":66}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProviderTest.java","uriBaseId":"%SRCROOT%","index":67}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13Test.java","uriBaseId":"%SRCROOT%","index":68}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdminTest.java","uriBaseId":"%SRCROOT%","index":69}},{"location":{"uri":"src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java","uriBaseId":"%SRCROOT%","index":70}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/authbypass/BypassVerificationTest.java","uriBaseId":"%SRCROOT%","index":71}},{"location":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxControllerTest.java","uriBaseId":"%SRCROOT%","index":72}},{"location":{"uri":"src/it/java/org/owasp/webgoat/ProgressRaceConditionIntegrationTest.java","uriBaseId":"%SRCROOT%","index":73}},{"location":{"uri":"src/it/java/org/owasp/webgoat/DeserializationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":74}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonMenuServiceTest.java","uriBaseId":"%SRCROOT%","index":75}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFixTest.java","uriBaseId":"%SRCROOT%","index":76}},{"location":{"uri":"src/it/java/org/owasp/webgoat/XSSIntegrationTest.java","uriBaseId":"%SRCROOT%","index":77}},{"location":{"uri":"src/it/java/org/owasp/webgoat/CryptoIntegrationTest.java","uriBaseId":"%SRCROOT%","index":78}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/service/ReportCardServiceTest.java","uriBaseId":"%SRCROOT%","index":79}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/plugins/LessonTest.java","uriBaseId":"%SRCROOT%","index":80}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/cia/CIAQuizTest.java","uriBaseId":"%SRCROOT%","index":81}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":82}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/csrf/CSRFFeedbackTest.java","uriBaseId":"%SRCROOT%","index":83}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/DisplayUserTest.java","uriBaseId":"%SRCROOT%","index":84}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpointTest.java","uriBaseId":"%SRCROOT%","index":85}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationTest.java","uriBaseId":"%SRCROOT%","index":86}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5Test.java","uriBaseId":"%SRCROOT%","index":87}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenusTest.java","uriBaseId":"%SRCROOT%","index":88}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1Test.java","uriBaseId":"%SRCROOT%","index":89}},{"location":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionAdvancedIntegrationTest.java","uriBaseId":"%SRCROOT%","index":90}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest2.java","uriBaseId":"%SRCROOT%","index":91}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":92}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserValidatorTest.java","uriBaseId":"%SRCROOT%","index":93}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/WebGoatApplication.java","uriBaseId":"%SRCROOT%","index":94}},{"location":{"uri":"src/it/java/org/owasp/webgoat/CSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":95}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignmentTest.java","uriBaseId":"%SRCROOT%","index":96}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5aTest.java","uriBaseId":"%SRCROOT%","index":97}},{"location":{"uri":"src/it/java/org/owasp/webgoat/AccessControlIntegrationTest.java","uriBaseId":"%SRCROOT%","index":98}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/SqlLessonTest.java","uriBaseId":"%SRCROOT%","index":99}},{"location":{"uri":"src/test/java/org/owasp/webgoat/webwolf/user/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":100}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserTrackerRepositoryTest.java","uriBaseId":"%SRCROOT%","index":101}},{"location":{"uri":"src/it/java/org/owasp/webgoat/SSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":102}},{"location":{"uri":"src/test/java/org/owasp/webgoat/webwolf/WebWolfApplication.java","uriBaseId":"%SRCROOT%","index":103}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignmentTest.java","uriBaseId":"%SRCROOT%","index":104}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInputTest.java","uriBaseId":"%SRCROOT%","index":105}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingTest.java","uriBaseId":"%SRCROOT%","index":106}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevToolsTest.java","uriBaseId":"%SRCROOT%","index":107}},{"location":{"uri":"src/it/java/org/owasp/webgoat/WebWolfIntegrationTest.java","uriBaseId":"%SRCROOT%","index":108}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10Test.java","uriBaseId":"%SRCROOT%","index":109}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonProgressServiceTest.java","uriBaseId":"%SRCROOT%","index":110}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6bTest.java","uriBaseId":"%SRCROOT%","index":111}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2Test.java","uriBaseId":"%SRCROOT%","index":112}},{"location":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionMitigationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":113}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":114}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpointTest.java","uriBaseId":"%SRCROOT%","index":115}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/cryptography/CryptoUtilTest.java","uriBaseId":"%SRCROOT%","index":116}},{"location":{"uri":"src/it/java/org/owasp/webgoat/PathTraversalIntegrationTest.java","uriBaseId":"%SRCROOT%","index":117}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpointTest.java","uriBaseId":"%SRCROOT%","index":118}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/session/LabelDebuggerTest.java","uriBaseId":"%SRCROOT%","index":119}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpointTest.java","uriBaseId":"%SRCROOT%","index":120}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDecTest.java","uriBaseId":"%SRCROOT%","index":121}},{"location":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":122}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidationTest.java","uriBaseId":"%SRCROOT%","index":123}},{"location":{"uri":"src/it/java/org/owasp/webgoat/SessionManagementIntegrationTest.java","uriBaseId":"%SRCROOT%","index":124}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionYourHashTest.java","uriBaseId":"%SRCROOT%","index":125}},{"location":{"uri":"src/it/java/org/owasp/webgoat/GeneralLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":126}},{"location":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepositoryTest.java","uriBaseId":"%SRCROOT%","index":127}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserRepositoryTest.java","uriBaseId":"%SRCROOT%","index":128}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentTest.java","uriBaseId":"%SRCROOT%","index":129}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/deserialization/DeserializeTest.java","uriBaseId":"%SRCROOT%","index":130}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":131}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/challenges/Assignment1Test.java","uriBaseId":"%SRCROOT%","index":132}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9Test.java","uriBaseId":"%SRCROOT%","index":133}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest1.java","uriBaseId":"%SRCROOT%","index":134}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywordsTest.java","uriBaseId":"%SRCROOT%","index":135}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadTest.java","uriBaseId":"%SRCROOT%","index":136}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8Test.java","uriBaseId":"%SRCROOT%","index":137}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpointTest.java","uriBaseId":"%SRCROOT%","index":138}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/assignments/AssignmentEndpointTest.java","uriBaseId":"%SRCROOT%","index":139}},{"location":{"uri":"src/it/java/org/owasp/webgoat/ChallengeIntegrationTest.java","uriBaseId":"%SRCROOT%","index":140}},{"location":{"uri":"src/it/java/org/owasp/webgoat/IntegrationTest.java","uriBaseId":"%SRCROOT%","index":141}},{"location":{"uri":"src/it/java/org/owasp/webgoat/XXEIntegrationTest.java","uriBaseId":"%SRCROOT%","index":142}},{"location":{"uri":"src/test/java/org/owasp/webgoat/webwolf/jwt/JWTTokenTest.java","uriBaseId":"%SRCROOT%","index":143}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":144}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/service/HintServiceTest.java","uriBaseId":"%SRCROOT%","index":145}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/session/WebSession.java","uriBaseId":"%SRCROOT%","index":146}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/CourseConfiguration.java","uriBaseId":"%SRCROOT%","index":147}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonMenuService.java","uriBaseId":"%SRCROOT%","index":148}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelDebugService.java","uriBaseId":"%SRCROOT%","index":149}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItem.java","uriBaseId":"%SRCROOT%","index":150}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdmin.java","uriBaseId":"%SRCROOT%","index":151}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Language.java","uriBaseId":"%SRCROOT%","index":152}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/EnvironmentService.java","uriBaseId":"%SRCROOT%","index":153}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofingTask.java","uriBaseId":"%SRCROOT%","index":154}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfileAltUrl.java","uriBaseId":"%SRCROOT%","index":155}},{"location":{"uri":"src/main/java/org/owasp/webgoat/server/ParentConfig.java","uriBaseId":"%SRCROOT%","index":156}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java","uriBaseId":"%SRCROOT%","index":157}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/controller/StartLesson.java","uriBaseId":"%SRCROOT%","index":158}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserRepository.java","uriBaseId":"%SRCROOT%","index":159}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjection.java","uriBaseId":"%SRCROOT%","index":160}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordResetEmail.java","uriBaseId":"%SRCROOT%","index":161}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Assignment1.java","uriBaseId":"%SRCROOT%","index":162}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTController.java","uriBaseId":"%SRCROOT%","index":163}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserService.java","uriBaseId":"%SRCROOT%","index":164}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevTools.java","uriBaseId":"%SRCROOT%","index":165}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":166}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/Salaries.java","uriBaseId":"%SRCROOT%","index":167}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/LessonTemplateResolver.java","uriBaseId":"%SRCROOT%","index":168}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/resetlink/PasswordChangeForm.java","uriBaseId":"%SRCROOT%","index":169}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/Authentication.java","uriBaseId":"%SRCROOT%","index":170}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsers.java","uriBaseId":"%SRCROOT%","index":171}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/SessionService.java","uriBaseId":"%SRCROOT%","index":172}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Ping.java","uriBaseId":"%SRCROOT%","index":173}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxController.java","uriBaseId":"%SRCROOT%","index":174}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRF.java","uriBaseId":"%SRCROOT%","index":175}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AttackResult.java","uriBaseId":"%SRCROOT%","index":176}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenus.java","uriBaseId":"%SRCROOT%","index":177}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/UsernameMacro.java","uriBaseId":"%SRCROOT%","index":178}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/LessonTracker.java","uriBaseId":"%SRCROOT%","index":179}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfMacro.java","uriBaseId":"%SRCROOT%","index":180}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/Requests.java","uriBaseId":"%SRCROOT%","index":181}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":182}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/OperatingSystemMacro.java","uriBaseId":"%SRCROOT%","index":183}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpoint.java","uriBaseId":"%SRCROOT%","index":184}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfile.java","uriBaseId":"%SRCROOT%","index":185}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookie.java","uriBaseId":"%SRCROOT%","index":186}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebWolf.java","uriBaseId":"%SRCROOT%","index":187}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java","uriBaseId":"%SRCROOT%","index":188}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignment.java","uriBaseId":"%SRCROOT%","index":189}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/WebGoat.java","uriBaseId":"%SRCROOT%","index":190}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRF.java","uriBaseId":"%SRCROOT%","index":191}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/HammerHead.java","uriBaseId":"%SRCROOT%","index":192}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkLesson.java","uriBaseId":"%SRCROOT%","index":193}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelService.java","uriBaseId":"%SRCROOT%","index":194}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonTitleService.java","uriBaseId":"%SRCROOT%","index":195}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordReset.java","uriBaseId":"%SRCROOT%","index":196}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswordsAssignment.java","uriBaseId":"%SRCROOT%","index":197}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java","uriBaseId":"%SRCROOT%","index":198}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingMitigation.java","uriBaseId":"%SRCROOT%","index":199}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/LessonTrackerInterceptor.java","uriBaseId":"%SRCROOT%","index":200}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionAC.java","uriBaseId":"%SRCROOT%","index":201}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Category.java","uriBaseId":"%SRCROOT%","index":202}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFFeedback.java","uriBaseId":"%SRCROOT%","index":203}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepository.java","uriBaseId":"%SRCROOT%","index":204}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/Review.java","uriBaseId":"%SRCROOT%","index":205}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingAccessControlUserRepository.java","uriBaseId":"%SRCROOT%","index":206}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/ForgedReviews.java","uriBaseId":"%SRCROOT%","index":207}},{"location":{"uri":"src/main/java/org/dummy/insecure/framework/VulnerableTaskHolder.java","uriBaseId":"%SRCROOT%","index":208}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignment.java","uriBaseId":"%SRCROOT%","index":209}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofing.java","uriBaseId":"%SRCROOT%","index":210}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":211}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfRootMacro.java","uriBaseId":"%SRCROOT%","index":212}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpoint.java","uriBaseId":"%SRCROOT%","index":213}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItemType.java","uriBaseId":"%SRCROOT%","index":214}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":215}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatTmpDirMacro.java","uriBaseId":"%SRCROOT%","index":216}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWT.java","uriBaseId":"%SRCROOT%","index":217}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/session/UserSessionData.java","uriBaseId":"%SRCROOT%","index":218}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentEndpoint.java","uriBaseId":"%SRCROOT%","index":219}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTampering.java","uriBaseId":"%SRCROOT%","index":220}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flags.java","uriBaseId":"%SRCROOT%","index":221}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpProxies.java","uriBaseId":"%SRCROOT%","index":222}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsEndpoint.java","uriBaseId":"%SRCROOT%","index":223}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Hint.java","uriBaseId":"%SRCROOT%","index":224}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/controller/Welcome.java","uriBaseId":"%SRCROOT%","index":225}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Comment.java","uriBaseId":"%SRCROOT%","index":226}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/PathTraversal.java","uriBaseId":"%SRCROOT%","index":227}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonInfoService.java","uriBaseId":"%SRCROOT%","index":228}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonScanner.java","uriBaseId":"%SRCROOT%","index":229}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java","uriBaseId":"%SRCROOT%","index":230}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/VerifyAccount.java","uriBaseId":"%SRCROOT%","index":231}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/DatabaseConfiguration.java","uriBaseId":"%SRCROOT%","index":232}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonProgressService.java","uriBaseId":"%SRCROOT%","index":233}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasics.java","uriBaseId":"%SRCROOT%","index":234}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignment.java","uriBaseId":"%SRCROOT%","index":235}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFieldRestrictions.java","uriBaseId":"%SRCROOT%","index":236}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Challenge5.java","uriBaseId":"%SRCROOT%","index":237}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Challenge7.java","uriBaseId":"%SRCROOT%","index":238}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictions.java","uriBaseId":"%SRCROOT%","index":239}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Vote.java","uriBaseId":"%SRCROOT%","index":240}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/ImageServlet.java","uriBaseId":"%SRCROOT%","index":241}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Challenge1.java","uriBaseId":"%SRCROOT%","index":242}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":243}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/ReportCardService.java","uriBaseId":"%SRCROOT%","index":244}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpoint.java","uriBaseId":"%SRCROOT%","index":245}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTQuiz.java","uriBaseId":"%SRCROOT%","index":246}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/TriedQuestions.java","uriBaseId":"%SRCROOT%","index":247}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":248}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/SolutionConstants.java","uriBaseId":"%SRCROOT%","index":249}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDec.java","uriBaseId":"%SRCROOT%","index":250}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatVersionMacro.java","uriBaseId":"%SRCROOT%","index":251}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Email.java","uriBaseId":"%SRCROOT%","index":252}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson3.java","uriBaseId":"%SRCROOT%","index":253}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFLogin.java","uriBaseId":"%SRCROOT%","index":254}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/QuestionsAssignment.java","uriBaseId":"%SRCROOT%","index":255}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/Contact.java","uriBaseId":"%SRCROOT%","index":256}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/Comment.java","uriBaseId":"%SRCROOT%","index":257}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/WebWolfIntroduction.java","uriBaseId":"%SRCROOT%","index":258}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORLogin.java","uriBaseId":"%SRCROOT%","index":259}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/RestartLessonService.java","uriBaseId":"%SRCROOT%","index":260}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponents.java","uriBaseId":"%SRCROOT%","index":261}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/Cryptography.java","uriBaseId":"%SRCROOT%","index":262}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/SerializationHelper.java","uriBaseId":"%SRCROOT%","index":263}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserValidator.java","uriBaseId":"%SRCROOT%","index":264}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java","uriBaseId":"%SRCROOT%","index":265}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Assignment8.java","uriBaseId":"%SRCROOT%","index":266}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson4.java","uriBaseId":"%SRCROOT%","index":267}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/UserProfile.java","uriBaseId":"%SRCROOT%","index":268}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Assignment.java","uriBaseId":"%SRCROOT%","index":269}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSession.java","uriBaseId":"%SRCROOT%","index":270}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/webgoatintroduction/WebGoatIntroduction.java","uriBaseId":"%SRCROOT%","index":271}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentHints.java","uriBaseId":"%SRCROOT%","index":272}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignment.java","uriBaseId":"%SRCROOT%","index":273}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserialization.java","uriBaseId":"%SRCROOT%","index":274}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHash.java","uriBaseId":"%SRCROOT%","index":275}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/SampleAttack.java","uriBaseId":"%SRCROOT%","index":276}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/User.java","uriBaseId":"%SRCROOT%","index":277}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOREditOtherProfiile.java","uriBaseId":"%SRCROOT%","index":278}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserRepository.java","uriBaseId":"%SRCROOT%","index":279}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java","uriBaseId":"%SRCROOT%","index":280}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignment.java","uriBaseId":"%SRCROOT%","index":281}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOR.java","uriBaseId":"%SRCROOT%","index":282}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOtherProfile.java","uriBaseId":"%SRCROOT%","index":283}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/AuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":284}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswords.java","uriBaseId":"%SRCROOT%","index":285}},{"location":{"uri":"src/main/java/org/owasp/webgoat/server/StartWebGoat.java","uriBaseId":"%SRCROOT%","index":286}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/session/LabelDebugger.java","uriBaseId":"%SRCROOT%","index":287}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/ContactImpl.java","uriBaseId":"%SRCROOT%","index":288}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Messages.java","uriBaseId":"%SRCROOT%","index":289}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsLesson.java","uriBaseId":"%SRCROOT%","index":290}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/EncodingAssignment.java","uriBaseId":"%SRCROOT%","index":291}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AuthBypass.java","uriBaseId":"%SRCROOT%","index":292}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Lesson.java","uriBaseId":"%SRCROOT%","index":293}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkDummy.java","uriBaseId":"%SRCROOT%","index":294}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/PluginMessages.java","uriBaseId":"%SRCROOT%","index":295}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidation.java","uriBaseId":"%SRCROOT%","index":296}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTamperingTask.java","uriBaseId":"%SRCROOT%","index":297}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentForgotPassword.java","uriBaseId":"%SRCROOT%","index":298}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionAdvanced.java","uriBaseId":"%SRCROOT%","index":299}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentPath.java","uriBaseId":"%SRCROOT%","index":300}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIA.java","uriBaseId":"%SRCROOT%","index":301}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLoginTask.java","uriBaseId":"%SRCROOT%","index":302}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingQuiz.java","uriBaseId":"%SRCROOT%","index":303}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLogin.java","uriBaseId":"%SRCROOT%","index":304}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/Email.java","uriBaseId":"%SRCROOT%","index":305}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonInfoModel.java","uriBaseId":"%SRCROOT%","index":306}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Challenge8.java","uriBaseId":"%SRCROOT%","index":307}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/WebWolfRedirect.java","uriBaseId":"%SRCROOT%","index":308}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/LessonTemplate.java","uriBaseId":"%SRCROOT%","index":309}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":310}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORDiffAttributes.java","uriBaseId":"%SRCROOT%","index":311}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1.java","uriBaseId":"%SRCROOT%","index":312}},{"location":{"uri":"src/main/java/org/owasp/webgoat/server/StartupMessage.java","uriBaseId":"%SRCROOT%","index":313}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFiltering.java","uriBaseId":"%SRCROOT%","index":314}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionMitigations.java","uriBaseId":"%SRCROOT%","index":315}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallengeLogin.java","uriBaseId":"%SRCROOT%","index":316}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10a.java","uriBaseId":"%SRCROOT%","index":317}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFGetFlag.java","uriBaseId":"%SRCROOT%","index":318}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/CrossSiteScriptingStored.java","uriBaseId":"%SRCROOT%","index":319}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flag.java","uriBaseId":"%SRCROOT%","index":320}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Views.java","uriBaseId":"%SRCROOT%","index":321}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/XXE.java","uriBaseId":"%SRCROOT%","index":322}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/WebWolfTraceRepository.java","uriBaseId":"%SRCROOT%","index":323}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonConnectionInvocationHandler.java","uriBaseId":"%SRCROOT%","index":324}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/HintService.java","uriBaseId":"%SRCROOT%","index":325}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTrackerRepository.java","uriBaseId":"%SRCROOT%","index":326}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/LessonDataSource.java","uriBaseId":"%SRCROOT%","index":327}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/Scoreboard.java","uriBaseId":"%SRCROOT%","index":328}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.java","uriBaseId":"%SRCROOT%","index":329}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIAQuiz.java","uriBaseId":"%SRCROOT%","index":330}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":331}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/XOREncodingAssignment.java","uriBaseId":"%SRCROOT%","index":332}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTracker.java","uriBaseId":"%SRCROOT%","index":333}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserSession.java","uriBaseId":"%SRCROOT%","index":334}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/session/Course.java","uriBaseId":"%SRCROOT%","index":335}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequest.java","uriBaseId":"%SRCROOT%","index":336}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6b.java","uriBaseId":"%SRCROOT%","index":337}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionQuiz.java","uriBaseId":"%SRCROOT%","index":338}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Initializeable.java","uriBaseId":"%SRCROOT%","index":339}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SimpleMailAssignment.java","uriBaseId":"%SRCROOT%","index":340}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/EnvironmentExposure.java","uriBaseId":"%SRCROOT%","index":341}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/ChallengeIntro.java","uriBaseId":"%SRCROOT%","index":342}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsQuiz.java","uriBaseId":"%SRCROOT%","index":343}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/CryptoUtil.java","uriBaseId":"%SRCROOT%","index":344}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFConfirmFlag1.java","uriBaseId":"%SRCROOT%","index":345}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTToken.java","uriBaseId":"%SRCROOT%","index":346}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/Email.java","uriBaseId":"%SRCROOT%","index":347}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/User.java","uriBaseId":"%SRCROOT%","index":348}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/StartupMessage.java","uriBaseId":"%SRCROOT%","index":349}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":350}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/CommentsEndpoint.java","uriBaseId":"%SRCROOT%","index":351}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxControllerTest.java","uriBaseId":"%SRCROOT%","index":352}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/CourseConfiguration.java","uriBaseId":"%SRCROOT%","index":353}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":354}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":355}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/ReportCardServiceTest.java","uriBaseId":"%SRCROOT%","index":356}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Initializeable.java","uriBaseId":"%SRCROOT%","index":357}},{"location":{"uri":"src-delomboked/src/main/java/org/dummy/insecure/framework/VulnerableTaskHolder.java","uriBaseId":"%SRCROOT%","index":358}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignment.java","uriBaseId":"%SRCROOT%","index":359}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson3.java","uriBaseId":"%SRCROOT%","index":360}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswords.java","uriBaseId":"%SRCROOT%","index":361}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/SolutionConstants.java","uriBaseId":"%SRCROOT%","index":362}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFieldRestrictions.java","uriBaseId":"%SRCROOT%","index":363}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/QuestionsAssignment.java","uriBaseId":"%SRCROOT%","index":364}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":365}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/HammerHead.java","uriBaseId":"%SRCROOT%","index":366}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Challenge8.java","uriBaseId":"%SRCROOT%","index":367}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Challenge7.java","uriBaseId":"%SRCROOT%","index":368}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/challenges/Assignment1Test.java","uriBaseId":"%SRCROOT%","index":369}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":370}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2Test.java","uriBaseId":"%SRCROOT%","index":371}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Assignment.java","uriBaseId":"%SRCROOT%","index":372}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":373}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":374}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/HintService.java","uriBaseId":"%SRCROOT%","index":375}},{"location":{"uri":"src-delomboked/.mvn/wrapper/MavenWrapperDownloader.java","uriBaseId":"%SRCROOT%","index":376}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Hint.java","uriBaseId":"%SRCROOT%","index":377}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserTracker.java","uriBaseId":"%SRCROOT%","index":378}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasics.java","uriBaseId":"%SRCROOT%","index":379}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfileAltUrl.java","uriBaseId":"%SRCROOT%","index":380}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":381}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/VerifyAccount.java","uriBaseId":"%SRCROOT%","index":382}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/StartWebGoat.java","uriBaseId":"%SRCROOT%","index":383}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpoint.java","uriBaseId":"%SRCROOT%","index":384}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AttackResult.java","uriBaseId":"%SRCROOT%","index":385}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWT.java","uriBaseId":"%SRCROOT%","index":386}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/jwt/JWTController.java","uriBaseId":"%SRCROOT%","index":387}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":388}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":389}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":390}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenusTest.java","uriBaseId":"%SRCROOT%","index":391}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenus.java","uriBaseId":"%SRCROOT%","index":392}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsLesson.java","uriBaseId":"%SRCROOT%","index":393}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/CrossSiteScriptingStored.java","uriBaseId":"%SRCROOT%","index":394}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/authbypass/BypassVerificationTest.java","uriBaseId":"%SRCROOT%","index":395}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":396}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentForgotPassword.java","uriBaseId":"%SRCROOT%","index":397}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/UserProfile.java","uriBaseId":"%SRCROOT%","index":398}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Flags.java","uriBaseId":"%SRCROOT%","index":399}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/Review.java","uriBaseId":"%SRCROOT%","index":400}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":401}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":402}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProviderTest.java","uriBaseId":"%SRCROOT%","index":403}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserValidator.java","uriBaseId":"%SRCROOT%","index":404}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingAccessControlUserRepository.java","uriBaseId":"%SRCROOT%","index":405}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/ChallengeIntro.java","uriBaseId":"%SRCROOT%","index":406}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/DeserializationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":407}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsers.java","uriBaseId":"%SRCROOT%","index":408}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/TriedQuestions.java","uriBaseId":"%SRCROOT%","index":409}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":410}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/PasswordResetLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":411}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/PluginMessages.java","uriBaseId":"%SRCROOT%","index":412}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/GeneralLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":413}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTampering.java","uriBaseId":"%SRCROOT%","index":414}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionMitigations.java","uriBaseId":"%SRCROOT%","index":415}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/lessontemplate/SampleAttack.java","uriBaseId":"%SRCROOT%","index":416}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/SimpleMailAssignment.java","uriBaseId":"%SRCROOT%","index":417}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/LessonMenuServiceTest.java","uriBaseId":"%SRCROOT%","index":418}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":419}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Challenge5.java","uriBaseId":"%SRCROOT%","index":420}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/Email.java","uriBaseId":"%SRCROOT%","index":421}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":422}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignment.java","uriBaseId":"%SRCROOT%","index":423}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/cryptography/CryptoUtilTest.java","uriBaseId":"%SRCROOT%","index":424}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/ReportCardService.java","uriBaseId":"%SRCROOT%","index":425}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentEndpoint.java","uriBaseId":"%SRCROOT%","index":426}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfRootMacro.java","uriBaseId":"%SRCROOT%","index":427}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":428}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/Email.java","uriBaseId":"%SRCROOT%","index":429}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":430}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":431}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/SerializationHelper.java","uriBaseId":"%SRCROOT%","index":432}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/controller/StartLesson.java","uriBaseId":"%SRCROOT%","index":433}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java","uriBaseId":"%SRCROOT%","index":434}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6aTest.java","uriBaseId":"%SRCROOT%","index":435}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Flag.java","uriBaseId":"%SRCROOT%","index":436}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Assignment1.java","uriBaseId":"%SRCROOT%","index":437}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/PathTraversalIntegrationTest.java","uriBaseId":"%SRCROOT%","index":438}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/WebGoatApplication.java","uriBaseId":"%SRCROOT%","index":439}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevTools.java","uriBaseId":"%SRCROOT%","index":440}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFixTest.java","uriBaseId":"%SRCROOT%","index":441}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/XSSIntegrationTest.java","uriBaseId":"%SRCROOT%","index":442}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingMitigation.java","uriBaseId":"%SRCROOT%","index":443}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/Language.java","uriBaseId":"%SRCROOT%","index":444}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDec.java","uriBaseId":"%SRCROOT%","index":445}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentHints.java","uriBaseId":"%SRCROOT%","index":446}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":447}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/Contact.java","uriBaseId":"%SRCROOT%","index":448}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":449}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/Salaries.java","uriBaseId":"%SRCROOT%","index":450}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LabelDebugService.java","uriBaseId":"%SRCROOT%","index":451}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/deserialization/DeserializeTest.java","uriBaseId":"%SRCROOT%","index":452}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SessionManagementIntegrationTest.java","uriBaseId":"%SRCROOT%","index":453}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItemType.java","uriBaseId":"%SRCROOT%","index":454}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/XOREncodingAssignment.java","uriBaseId":"%SRCROOT%","index":455}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserRepository.java","uriBaseId":"%SRCROOT%","index":456}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":457}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/Messages.java","uriBaseId":"%SRCROOT%","index":458}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":459}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/ForgedReviews.java","uriBaseId":"%SRCROOT%","index":460}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrievalTest.java","uriBaseId":"%SRCROOT%","index":461}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":462}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonScanner.java","uriBaseId":"%SRCROOT%","index":463}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java","uriBaseId":"%SRCROOT%","index":464}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":465}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest2.java","uriBaseId":"%SRCROOT%","index":466}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORDiffAttributes.java","uriBaseId":"%SRCROOT%","index":467}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/CSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":468}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/XXEIntegrationTest.java","uriBaseId":"%SRCROOT%","index":469}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/CryptoUtil.java","uriBaseId":"%SRCROOT%","index":470}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8Test.java","uriBaseId":"%SRCROOT%","index":471}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java","uriBaseId":"%SRCROOT%","index":472}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cia/CIA.java","uriBaseId":"%SRCROOT%","index":473}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5aTest.java","uriBaseId":"%SRCROOT%","index":474}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":475}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentPath.java","uriBaseId":"%SRCROOT%","index":476}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/plugins/LessonTest.java","uriBaseId":"%SRCROOT%","index":477}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Email.java","uriBaseId":"%SRCROOT%","index":478}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/UserService.java","uriBaseId":"%SRCROOT%","index":479}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/UserSessionData.java","uriBaseId":"%SRCROOT%","index":480}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpoint.java","uriBaseId":"%SRCROOT%","index":481}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/ParentConfig.java","uriBaseId":"%SRCROOT%","index":482}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonConnectionInvocationHandler.java","uriBaseId":"%SRCROOT%","index":483}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":484}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignment.java","uriBaseId":"%SRCROOT%","index":485}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponents.java","uriBaseId":"%SRCROOT%","index":486}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/WebWolfIntegrationTest.java","uriBaseId":"%SRCROOT%","index":487}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/UserRepository.java","uriBaseId":"%SRCROOT%","index":488}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignmentTest.java","uriBaseId":"%SRCROOT%","index":489}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/csrf/CSRFFeedbackTest.java","uriBaseId":"%SRCROOT%","index":490}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6bTest.java","uriBaseId":"%SRCROOT%","index":491}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":492}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHash.java","uriBaseId":"%SRCROOT%","index":493}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/LabelDebugger.java","uriBaseId":"%SRCROOT%","index":494}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/user/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":495}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/LessonDataSource.java","uriBaseId":"%SRCROOT%","index":496}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionAdvancedIntegrationTest.java","uriBaseId":"%SRCROOT%","index":497}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpointTest.java","uriBaseId":"%SRCROOT%","index":498}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/ContactImpl.java","uriBaseId":"%SRCROOT%","index":499}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/IntegrationTest.java","uriBaseId":"%SRCROOT%","index":500}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10Test.java","uriBaseId":"%SRCROOT%","index":501}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevToolsTest.java","uriBaseId":"%SRCROOT%","index":502}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDOR.java","uriBaseId":"%SRCROOT%","index":503}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/session/LessonTrackerTest.java","uriBaseId":"%SRCROOT%","index":504}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/CryptoIntegrationTest.java","uriBaseId":"%SRCROOT%","index":505}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserTrackerRepository.java","uriBaseId":"%SRCROOT%","index":506}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/jwt/JWTToken.java","uriBaseId":"%SRCROOT%","index":507}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":508}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Lesson.java","uriBaseId":"%SRCROOT%","index":509}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepository.java","uriBaseId":"%SRCROOT%","index":510}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/votes/Vote.java","uriBaseId":"%SRCROOT%","index":511}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/Cryptography.java","uriBaseId":"%SRCROOT%","index":512}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/Course.java","uriBaseId":"%SRCROOT%","index":513}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LabelService.java","uriBaseId":"%SRCROOT%","index":514}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":515}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.java","uriBaseId":"%SRCROOT%","index":516}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepositoryTest.java","uriBaseId":"%SRCROOT%","index":517}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookie.java","uriBaseId":"%SRCROOT%","index":518}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/WebSession.java","uriBaseId":"%SRCROOT%","index":519}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordResetEmail.java","uriBaseId":"%SRCROOT%","index":520}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java","uriBaseId":"%SRCROOT%","index":521}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpointTest.java","uriBaseId":"%SRCROOT%","index":522}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFGetFlag.java","uriBaseId":"%SRCROOT%","index":523}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":524}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":525}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/session/LabelDebuggerTest.java","uriBaseId":"%SRCROOT%","index":526}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":527}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":528}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":529}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserTrackerRepositoryTest.java","uriBaseId":"%SRCROOT%","index":530}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserValidatorTest.java","uriBaseId":"%SRCROOT%","index":531}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":532}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionYourHashTest.java","uriBaseId":"%SRCROOT%","index":533}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidation.java","uriBaseId":"%SRCROOT%","index":534}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":535}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/cia/CIAQuizTest.java","uriBaseId":"%SRCROOT%","index":536}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserialization.java","uriBaseId":"%SRCROOT%","index":537}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSession.java","uriBaseId":"%SRCROOT%","index":538}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdmin.java","uriBaseId":"%SRCROOT%","index":539}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFConfirmFlag1.java","uriBaseId":"%SRCROOT%","index":540}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/UsernameMacro.java","uriBaseId":"%SRCROOT%","index":541}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItem.java","uriBaseId":"%SRCROOT%","index":542}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":543}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":544}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpointTest.java","uriBaseId":"%SRCROOT%","index":545}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":546}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":547}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5Test.java","uriBaseId":"%SRCROOT%","index":548}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java","uriBaseId":"%SRCROOT%","index":549}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1.java","uriBaseId":"%SRCROOT%","index":550}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":551}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingTest.java","uriBaseId":"%SRCROOT%","index":552}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/WebWolfTraceRepository.java","uriBaseId":"%SRCROOT%","index":553}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonInfoModel.java","uriBaseId":"%SRCROOT%","index":554}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest1.java","uriBaseId":"%SRCROOT%","index":555}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpointTest.java","uriBaseId":"%SRCROOT%","index":556}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationTest.java","uriBaseId":"%SRCROOT%","index":557}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswordsAssignment.java","uriBaseId":"%SRCROOT%","index":558}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":559}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkDummy.java","uriBaseId":"%SRCROOT%","index":560}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/SessionService.java","uriBaseId":"%SRCROOT%","index":561}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":562}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/ChallengeIntegrationTest.java","uriBaseId":"%SRCROOT%","index":563}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/DisplayUserTest.java","uriBaseId":"%SRCROOT%","index":564}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/WebWolfIntroduction.java","uriBaseId":"%SRCROOT%","index":565}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/votes/Views.java","uriBaseId":"%SRCROOT%","index":566}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/LessonProgressServiceTest.java","uriBaseId":"%SRCROOT%","index":567}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":568}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/LessonTemplateResolver.java","uriBaseId":"%SRCROOT%","index":569}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/controller/Welcome.java","uriBaseId":"%SRCROOT%","index":570}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/jwt/JWTTokenTest.java","uriBaseId":"%SRCROOT%","index":571}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":572}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1Test.java","uriBaseId":"%SRCROOT%","index":573}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOtherProfile.java","uriBaseId":"%SRCROOT%","index":574}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/lessontemplate/LessonTemplate.java","uriBaseId":"%SRCROOT%","index":575}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/User.java","uriBaseId":"%SRCROOT%","index":576}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/AccessControlIntegrationTest.java","uriBaseId":"%SRCROOT%","index":577}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":578}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonInfoService.java","uriBaseId":"%SRCROOT%","index":579}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/Comment.java","uriBaseId":"%SRCROOT%","index":580}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInputTest.java","uriBaseId":"%SRCROOT%","index":581}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserSession.java","uriBaseId":"%SRCROOT%","index":582}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTQuiz.java","uriBaseId":"%SRCROOT%","index":583}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfMacro.java","uriBaseId":"%SRCROOT%","index":584}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDecTest.java","uriBaseId":"%SRCROOT%","index":585}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/AuthBypass.java","uriBaseId":"%SRCROOT%","index":586}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionAdvanced.java","uriBaseId":"%SRCROOT%","index":587}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjection.java","uriBaseId":"%SRCROOT%","index":588}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignmentTest.java","uriBaseId":"%SRCROOT%","index":589}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpProxies.java","uriBaseId":"%SRCROOT%","index":590}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/PathTraversal.java","uriBaseId":"%SRCROOT%","index":591}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionAC.java","uriBaseId":"%SRCROOT%","index":592}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":593}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Challenge1.java","uriBaseId":"%SRCROOT%","index":594}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfile.java","uriBaseId":"%SRCROOT%","index":595}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadTest.java","uriBaseId":"%SRCROOT%","index":596}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallengeLogin.java","uriBaseId":"%SRCROOT%","index":597}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/OperatingSystemMacro.java","uriBaseId":"%SRCROOT%","index":598}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionMitigationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":599}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/AuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":600}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":601}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofingTask.java","uriBaseId":"%SRCROOT%","index":602}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/Requests.java","uriBaseId":"%SRCROOT%","index":603}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/Authentication.java","uriBaseId":"%SRCROOT%","index":604}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsQuiz.java","uriBaseId":"%SRCROOT%","index":605}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java","uriBaseId":"%SRCROOT%","index":606}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/SimpleXXETest.java","uriBaseId":"%SRCROOT%","index":607}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":608}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6b.java","uriBaseId":"%SRCROOT%","index":609}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10a.java","uriBaseId":"%SRCROOT%","index":610}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/IDORIntegrationTest.java","uriBaseId":"%SRCROOT%","index":611}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/HintServiceTest.java","uriBaseId":"%SRCROOT%","index":612}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/EncodingAssignment.java","uriBaseId":"%SRCROOT%","index":613}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatTmpDirMacro.java","uriBaseId":"%SRCROOT%","index":614}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":615}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpointTest.java","uriBaseId":"%SRCROOT%","index":616}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionQuiz.java","uriBaseId":"%SRCROOT%","index":617}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequest.java","uriBaseId":"%SRCROOT%","index":618}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywordsTest.java","uriBaseId":"%SRCROOT%","index":619}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Category.java","uriBaseId":"%SRCROOT%","index":620}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/XXE.java","uriBaseId":"%SRCROOT%","index":621}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpointTest.java","uriBaseId":"%SRCROOT%","index":622}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxController.java","uriBaseId":"%SRCROOT%","index":623}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/assignments/AssignmentEndpointTest.java","uriBaseId":"%SRCROOT%","index":624}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":625}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonTitleService.java","uriBaseId":"%SRCROOT%","index":626}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpoint.java","uriBaseId":"%SRCROOT%","index":627}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/WebWolfApplication.java","uriBaseId":"%SRCROOT%","index":628}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonMenuService.java","uriBaseId":"%SRCROOT%","index":629}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFiltering.java","uriBaseId":"%SRCROOT%","index":630}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/Comment.java","uriBaseId":"%SRCROOT%","index":631}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequestTest.java","uriBaseId":"%SRCROOT%","index":632}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Assignment8.java","uriBaseId":"%SRCROOT%","index":633}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRF.java","uriBaseId":"%SRCROOT%","index":634}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":635}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/EnvironmentService.java","uriBaseId":"%SRCROOT%","index":636}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":637}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/Ping.java","uriBaseId":"%SRCROOT%","index":638}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/DatabaseConfiguration.java","uriBaseId":"%SRCROOT%","index":639}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/LessonTrackerInterceptor.java","uriBaseId":"%SRCROOT%","index":640}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLoginTask.java","uriBaseId":"%SRCROOT%","index":641}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/LessonTracker.java","uriBaseId":"%SRCROOT%","index":642}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFFeedback.java","uriBaseId":"%SRCROOT%","index":643}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":644}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":645}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/User.java","uriBaseId":"%SRCROOT%","index":646}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebWolfRedirect.java","uriBaseId":"%SRCROOT%","index":647}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":648}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/RestartLessonService.java","uriBaseId":"%SRCROOT%","index":649}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordReset.java","uriBaseId":"%SRCROOT%","index":650}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkLesson.java","uriBaseId":"%SRCROOT%","index":651}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdminTest.java","uriBaseId":"%SRCROOT%","index":652}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/StoredXssCommentsTest.java","uriBaseId":"%SRCROOT%","index":653}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignment.java","uriBaseId":"%SRCROOT%","index":654}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/EnvironmentExposure.java","uriBaseId":"%SRCROOT%","index":655}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":656}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonProgressService.java","uriBaseId":"%SRCROOT%","index":657}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingQuiz.java","uriBaseId":"%SRCROOT%","index":658}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRF.java","uriBaseId":"%SRCROOT%","index":659}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignment.java","uriBaseId":"%SRCROOT%","index":660}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson4.java","uriBaseId":"%SRCROOT%","index":661}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/WebWolf.java","uriBaseId":"%SRCROOT%","index":662}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/ProgressRaceConditionIntegrationTest.java","uriBaseId":"%SRCROOT%","index":663}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/SqlLessonTest.java","uriBaseId":"%SRCROOT%","index":664}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/resetlink/PasswordChangeForm.java","uriBaseId":"%SRCROOT%","index":665}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":666}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatVersionMacro.java","uriBaseId":"%SRCROOT%","index":667}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webgoatintroduction/WebGoatIntroduction.java","uriBaseId":"%SRCROOT%","index":668}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":669}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java","uriBaseId":"%SRCROOT%","index":670}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebGoat.java","uriBaseId":"%SRCROOT%","index":671}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserRepositoryTest.java","uriBaseId":"%SRCROOT%","index":672}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":673}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":674}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9Test.java","uriBaseId":"%SRCROOT%","index":675}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidationTest.java","uriBaseId":"%SRCROOT%","index":676}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDOREditOtherProfiile.java","uriBaseId":"%SRCROOT%","index":677}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLogin.java","uriBaseId":"%SRCROOT%","index":678}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/Scoreboard.java","uriBaseId":"%SRCROOT%","index":679}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsersTest.java","uriBaseId":"%SRCROOT%","index":680}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORLogin.java","uriBaseId":"%SRCROOT%","index":681}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignmentTest.java","uriBaseId":"%SRCROOT%","index":682}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofing.java","uriBaseId":"%SRCROOT%","index":683}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLessonTest.java","uriBaseId":"%SRCROOT%","index":684}},{"location":{"uri":".mvn/wrapper/MavenWrapperDownloader.java","uriBaseId":"%SRCROOT%","index":685}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":686}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":687}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13Test.java","uriBaseId":"%SRCROOT%","index":688}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cia/CIAQuiz.java","uriBaseId":"%SRCROOT%","index":689}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/ImageServlet.java","uriBaseId":"%SRCROOT%","index":690}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":691}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":692}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/FlagController.java","uriBaseId":"%SRCROOT%","index":693}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentTest.java","uriBaseId":"%SRCROOT%","index":694}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":695}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFLogin.java","uriBaseId":"%SRCROOT%","index":696}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictions.java","uriBaseId":"%SRCROOT%","index":697}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTamperingTask.java","uriBaseId":"%SRCROOT%","index":698}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":699}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/scoreboardApp.js","uriBaseId":"%SRCROOT%","index":700}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/assignment3.js","uriBaseId":"%SRCROOT%","index":701}},{"location":{"uri":"src/main/resources/lessons/csrf/js/csrf-review.js","uriBaseId":"%SRCROOT%","index":702}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/xxe/js/xxe.js","uriBaseId":"%SRCROOT%","index":703}},{"location":{"uri":"src/main/resources/lessons/jwt/js/jwt-buy.js","uriBaseId":"%SRCROOT%","index":704}},{"location":{"uri":"src/main/resources/lessons/challenges/js/challenge8.js","uriBaseId":"%SRCROOT%","index":705}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/mode-java.js","uriBaseId":"%SRCROOT%","index":706}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/assignment10b.js","uriBaseId":"%SRCROOT%","index":707}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/TitleView.js","uriBaseId":"%SRCROOT%","index":708}},{"location":{"uri":"src/main/resources/lessons/idor/js/idor.js","uriBaseId":"%SRCROOT%","index":709}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery_form/jquery.form.js","uriBaseId":"%SRCROOT%","index":710}},{"location":{"uri":"src/main/resources/lessons/pathtraversal/js/path_traversal.js","uriBaseId":"%SRCROOT%","index":711}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/controller/MenuController.js","uriBaseId":"%SRCROOT%","index":712}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ErrorNotificationView.js","uriBaseId":"%SRCROOT%","index":713}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuButtonView.js","uriBaseId":"%SRCROOT%","index":714}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuData.js","uriBaseId":"%SRCROOT%","index":715}},{"location":{"uri":"src/main/resources/webgoat/static/js/jquery/jquery-1.10.2.min.js","uriBaseId":"%SRCROOT%","index":716}},{"location":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-slider/js/bootstrap-slider.js","uriBaseId":"%SRCROOT%","index":717}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/UserAndInfoView.js","uriBaseId":"%SRCROOT%","index":718}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/text.js","uriBaseId":"%SRCROOT%","index":719}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuModel.js","uriBaseId":"%SRCROOT%","index":720}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-base.js","uriBaseId":"%SRCROOT%","index":721}},{"location":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/wysihtml5-0.3.0.js","uriBaseId":"%SRCROOT%","index":722}},{"location":{"uri":"src/main/resources/lessons/jwt/js/jwt-refresh.js","uriBaseId":"%SRCROOT%","index":723}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-ui-1.10.4.js","uriBaseId":"%SRCROOT%","index":724}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/challenge.js","uriBaseId":"%SRCROOT%","index":725}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/theme-monokai.js","uriBaseId":"%SRCROOT%","index":726}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/AssignmentStatusModel.js","uriBaseId":"%SRCROOT%","index":727}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonOverviewCollection.js","uriBaseId":"%SRCROOT%","index":728}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HTMLContentModel.js","uriBaseId":"%SRCROOT%","index":729}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/ssrf/js/credentials.js","uriBaseId":"%SRCROOT%","index":730}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/clientsidefiltering/js/clientSideFilteringFree.js","uriBaseId":"%SRCROOT%","index":731}},{"location":{"uri":"src/main/resources/lessons/authbypass/js/bypass.js","uriBaseId":"%SRCROOT%","index":732}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuCollection.js","uriBaseId":"%SRCROOT%","index":733}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/GoatUtils.js","uriBaseId":"%SRCROOT%","index":734}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonInfoModel.js","uriBaseId":"%SRCROOT%","index":735}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/idor/js/idor.js","uriBaseId":"%SRCROOT%","index":736}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/TitleView.js","uriBaseId":"%SRCROOT%","index":737}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/PaginationControlView.js","uriBaseId":"%SRCROOT%","index":738}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonContentModel.js","uriBaseId":"%SRCROOT%","index":739}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HintModel.js","uriBaseId":"%SRCROOT%","index":740}},{"location":{"uri":"src/main/resources/lessons/jwt/js/jwt-voting.js","uriBaseId":"%SRCROOT%","index":741}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/goatApp.js","uriBaseId":"%SRCROOT%","index":742}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuModel.js","uriBaseId":"%SRCROOT%","index":743}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/FlagModel.js","uriBaseId":"%SRCROOT%","index":744}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/PaginationControlView.js","uriBaseId":"%SRCROOT%","index":745}},{"location":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/jwt.js","uriBaseId":"%SRCROOT%","index":746}},{"location":{"uri":"src/main/resources/webwolf/static/js/jwt.js","uriBaseId":"%SRCROOT%","index":747}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/csrf/js/csrf-review.js","uriBaseId":"%SRCROOT%","index":748}},{"location":{"uri":"src/main/resources/lessons/csrf/js/feedback.js","uriBaseId":"%SRCROOT%","index":749}},{"location":{"uri":"src/main/resources/webgoat/static/js/quiz.js","uriBaseId":"%SRCROOT%","index":750}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/search.js","uriBaseId":"%SRCROOT%","index":751}},{"location":{"uri":"src/main/resources/webgoat/static/js/jquery_form/jquery.form.js","uriBaseId":"%SRCROOT%","index":752}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-final.js","uriBaseId":"%SRCROOT%","index":753}},{"location":{"uri":"src/main/resources/lessons/challenges/js/challenge6.js","uriBaseId":"%SRCROOT%","index":754}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/underscore-min.js","uriBaseId":"%SRCROOT%","index":755}},{"location":{"uri":"src/main/resources/lessons/xss/js/assignment4.js","uriBaseId":"%SRCROOT%","index":756}},{"location":{"uri":"src/main/resources/lessons/sqlinjection/js/assignment10b.js","uriBaseId":"%SRCROOT%","index":757}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-refresh.js","uriBaseId":"%SRCROOT%","index":758}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/nanoScroller/jquery.nanoscroller.min.js","uriBaseId":"%SRCROOT%","index":759}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LabelDebugModel.js","uriBaseId":"%SRCROOT%","index":760}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuView.js","uriBaseId":"%SRCROOT%","index":761}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/pathtraversal/js/path_traversal.js","uriBaseId":"%SRCROOT%","index":762}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/GoatRouter.js","uriBaseId":"%SRCROOT%","index":763}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/insecurelogin/js/credentials.js","uriBaseId":"%SRCROOT%","index":764}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuData.js","uriBaseId":"%SRCROOT%","index":765}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ScoreboardView.js","uriBaseId":"%SRCROOT%","index":766}},{"location":{"uri":"src/main/resources/webwolf/static/js/mail.js","uriBaseId":"%SRCROOT%","index":767}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-weak-keys.js","uriBaseId":"%SRCROOT%","index":768}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-ui.min.js","uriBaseId":"%SRCROOT%","index":769}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/controller/LessonController.js","uriBaseId":"%SRCROOT%","index":770}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/passwordreset/js/password-reset-simple.js","uriBaseId":"%SRCROOT%","index":771}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/controller/MenuController.js","uriBaseId":"%SRCROOT%","index":772}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonInfoModel.js","uriBaseId":"%SRCROOT%","index":773}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HTMLContentModel.js","uriBaseId":"%SRCROOT%","index":774}},{"location":{"uri":"src/main/resources/lessons/clientsidefiltering/js/clientSideFilteringFree.js","uriBaseId":"%SRCROOT%","index":775}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/CustomGoat.js","uriBaseId":"%SRCROOT%","index":776}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/toggle.js","uriBaseId":"%SRCROOT%","index":777}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/theme-monokai.js","uriBaseId":"%SRCROOT%","index":778}},{"location":{"uri":"src/main/resources/lessons/ssrf/js/credentials.js","uriBaseId":"%SRCROOT%","index":779}},{"location":{"uri":"src/main/resources/webwolf/static/js/fileUpload.js","uriBaseId":"%SRCROOT%","index":780}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery.min.js","uriBaseId":"%SRCROOT%","index":781}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/GoatRouter.js","uriBaseId":"%SRCROOT%","index":782}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/goatConstants.js","uriBaseId":"%SRCROOT%","index":783}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-ui.min.js","uriBaseId":"%SRCROOT%","index":784}},{"location":{"uri":"src/main/resources/webgoat/static/plugins/nanoScroller/jquery.nanoscroller.min.js","uriBaseId":"%SRCROOT%","index":785}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/goatAsyncErrorHandler.js","uriBaseId":"%SRCROOT%","index":786}},{"location":{"uri":"src/main/resources/lessons/clientsidefiltering/js/clientSideFiltering.js","uriBaseId":"%SRCROOT%","index":787}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/polyglot.min.js","uriBaseId":"%SRCROOT%","index":788}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/clientsidefiltering/js/clientSideFiltering.js","uriBaseId":"%SRCROOT%","index":789}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/ReportCardModel.js","uriBaseId":"%SRCROOT%","index":790}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/FlagsCollection.js","uriBaseId":"%SRCROOT%","index":791}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/ace.js","uriBaseId":"%SRCROOT%","index":792}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":793}},{"location":{"uri":"src/main/resources/lessons/insecurelogin/js/credentials.js","uriBaseId":"%SRCROOT%","index":794}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-buy.js","uriBaseId":"%SRCROOT%","index":795}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/goatApp.js","uriBaseId":"%SRCROOT%","index":796}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/AssignmentStatusModel.js","uriBaseId":"%SRCROOT%","index":797}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery.form.js","uriBaseId":"%SRCROOT%","index":798}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/ace.js","uriBaseId":"%SRCROOT%","index":799}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/backbone-min.js","uriBaseId":"%SRCROOT%","index":800}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuView.js","uriBaseId":"%SRCROOT%","index":801}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/LessonContentView.js","uriBaseId":"%SRCROOT%","index":802}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/authbypass/js/bypass.js","uriBaseId":"%SRCROOT%","index":803}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HintCollection.js","uriBaseId":"%SRCROOT%","index":804}},{"location":{"uri":"src/main/resources/lessons/sqlinjection/js/assignment13.js","uriBaseId":"%SRCROOT%","index":805}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/csrf/js/feedback.js","uriBaseId":"%SRCROOT%","index":806}},{"location":{"uri":"src/main/resources/webgoat/static/js/application.js","uriBaseId":"%SRCROOT%","index":807}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/main.js","uriBaseId":"%SRCROOT%","index":808}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuCollection.js","uriBaseId":"%SRCROOT%","index":809}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/wysihtml5-0.3.0.js","uriBaseId":"%SRCROOT%","index":810}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/bootstrap3-wysihtml5.js","uriBaseId":"%SRCROOT%","index":811}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-2.1.4.min.js","uriBaseId":"%SRCROOT%","index":812}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/polyglot.min.js","uriBaseId":"%SRCROOT%","index":813}},{"location":{"uri":"src/main/resources/lessons/jwt/js/jwt-final.js","uriBaseId":"%SRCROOT%","index":814}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/HelpControlsView.js","uriBaseId":"%SRCROOT%","index":815}},{"location":{"uri":"src/main/resources/lessons/lessontemplate/js/idor.js","uriBaseId":"%SRCROOT%","index":816}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/require.min.js","uriBaseId":"%SRCROOT%","index":817}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HintModel.js","uriBaseId":"%SRCROOT%","index":818}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/ReportCardModel.js","uriBaseId":"%SRCROOT%","index":819}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/assignment4.js","uriBaseId":"%SRCROOT%","index":820}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/challenge8.js","uriBaseId":"%SRCROOT%","index":821}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/spoofcookie/js/handler.js","uriBaseId":"%SRCROOT%","index":822}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuItemView.js","uriBaseId":"%SRCROOT%","index":823}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/underscore-min.js","uriBaseId":"%SRCROOT%","index":824}},{"location":{"uri":"src/main/resources/webgoat/static/js/search.js","uriBaseId":"%SRCROOT%","index":825}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonContentModel.js","uriBaseId":"%SRCROOT%","index":826}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/HintView.js","uriBaseId":"%SRCROOT%","index":827}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuItemView.js","uriBaseId":"%SRCROOT%","index":828}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-vuln.js","uriBaseId":"%SRCROOT%","index":829}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ScoreboardView.js","uriBaseId":"%SRCROOT%","index":830}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/assignment13.js","uriBaseId":"%SRCROOT%","index":831}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/lessontemplate/js/idor.js","uriBaseId":"%SRCROOT%","index":832}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/HelpControlsView.js","uriBaseId":"%SRCROOT%","index":833}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-slider/js/bootstrap-slider.js","uriBaseId":"%SRCROOT%","index":834}},{"location":{"uri":"src/main/resources/lessons/xss/js/stored-xss.js","uriBaseId":"%SRCROOT%","index":835}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/UserAndInfoView.js","uriBaseId":"%SRCROOT%","index":836}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery.min.js","uriBaseId":"%SRCROOT%","index":837}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":838}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery/jquery-1.10.2.min.js","uriBaseId":"%SRCROOT%","index":839}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/text.js","uriBaseId":"%SRCROOT%","index":840}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/backbone-min.js","uriBaseId":"%SRCROOT%","index":841}},{"location":{"uri":"src/main/resources/webgoat/static/js/toggle.js","uriBaseId":"%SRCROOT%","index":842}},{"location":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/fileUpload.js","uriBaseId":"%SRCROOT%","index":843}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-base.js","uriBaseId":"%SRCROOT%","index":844}},{"location":{"uri":"src/main/resources/webgoat/static/js/jquery/jquery-ui-1.10.4.custom.min.js","uriBaseId":"%SRCROOT%","index":845}},{"location":{"uri":"src/main/resources/lessons/jwt/js/jwt-weak-keys.js","uriBaseId":"%SRCROOT%","index":846}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HintCollection.js","uriBaseId":"%SRCROOT%","index":847}},{"location":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/bootstrap3-wysihtml5.js","uriBaseId":"%SRCROOT%","index":848}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/goatConstants.js","uriBaseId":"%SRCROOT%","index":849}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-voting.js","uriBaseId":"%SRCROOT%","index":850}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-2.1.4.min.js","uriBaseId":"%SRCROOT%","index":851}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ReportCardView.js","uriBaseId":"%SRCROOT%","index":852}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LabelDebugModel.js","uriBaseId":"%SRCROOT%","index":853}},{"location":{"uri":"src/main/resources/lessons/challenges/js/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":854}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/scoreboardApp.js","uriBaseId":"%SRCROOT%","index":855}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/controller/LessonController.js","uriBaseId":"%SRCROOT%","index":856}},{"location":{"uri":"src/main/resources/lessons/sqlinjection/js/challenge.js","uriBaseId":"%SRCROOT%","index":857}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery/jquery-ui-1.10.4.custom.min.js","uriBaseId":"%SRCROOT%","index":858}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/FlagsCollection.js","uriBaseId":"%SRCROOT%","index":859}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonOverviewCollection.js","uriBaseId":"%SRCROOT%","index":860}},{"location":{"uri":"src/main/resources/lessons/xxe/js/xxe.js","uriBaseId":"%SRCROOT%","index":861}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/FlagModel.js","uriBaseId":"%SRCROOT%","index":862}},{"location":{"uri":"src/main/resources/lessons/passwordreset/js/password-reset-simple.js","uriBaseId":"%SRCROOT%","index":863}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ReportCardView.js","uriBaseId":"%SRCROOT%","index":864}},{"location":{"uri":"src/main/resources/webgoat/static/js/scoreboard.js","uriBaseId":"%SRCROOT%","index":865}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":866}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/GoatUtils.js","uriBaseId":"%SRCROOT%","index":867}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/CustomGoat.js","uriBaseId":"%SRCROOT%","index":868}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/scoreboard.js","uriBaseId":"%SRCROOT%","index":869}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/modernizr.min.js","uriBaseId":"%SRCROOT%","index":870}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/mode-java.js","uriBaseId":"%SRCROOT%","index":871}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ErrorNotificationView.js","uriBaseId":"%SRCROOT%","index":872}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/HintView.js","uriBaseId":"%SRCROOT%","index":873}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/stored-xss.js","uriBaseId":"%SRCROOT%","index":874}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/challenge6.js","uriBaseId":"%SRCROOT%","index":875}},{"location":{"uri":"src/main/resources/lessons/spoofcookie/js/handler.js","uriBaseId":"%SRCROOT%","index":876}},{"location":{"uri":"src/main/resources/webgoat/static/js/main.js","uriBaseId":"%SRCROOT%","index":877}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/application.js","uriBaseId":"%SRCROOT%","index":878}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuButtonView.js","uriBaseId":"%SRCROOT%","index":879}},{"location":{"uri":"src/main/resources/lessons/xss/js/assignment3.js","uriBaseId":"%SRCROOT%","index":880}},{"location":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/mail.js","uriBaseId":"%SRCROOT%","index":881}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/LessonContentView.js","uriBaseId":"%SRCROOT%","index":882}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/require.min.js","uriBaseId":"%SRCROOT%","index":883}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-vuln.js","uriBaseId":"%SRCROOT%","index":884}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/quiz.js","uriBaseId":"%SRCROOT%","index":885}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-ui-1.10.4.js","uriBaseId":"%SRCROOT%","index":886}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/goatAsyncErrorHandler.js","uriBaseId":"%SRCROOT%","index":887}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery.form.js","uriBaseId":"%SRCROOT%","index":888}},{"location":{"uri":"src/main/resources/webgoat/static/js/modernizr.min.js","uriBaseId":"%SRCROOT%","index":889}}],"results":[{"ruleId":"java/insecure-cookie","rule":{"id":"java/insecure-cookie","index":10,"toolComponent":{"index":18}},"message":{"text":"Cookie is added to response without the 'secure' flag being set."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":131,"startColumn":7,"endColumn":33}}}],"partialFingerprints":{"primaryLocationLineHash":"84a4c92c523d81a1:1","primaryLocationStartColumnFingerprint":"0"}},{"ruleId":"java/insecure-cookie","rule":{"id":"java/insecure-cookie","index":10,"toolComponent":{"index":18}},"message":{"text":"Cookie is added to response without the 'secure' flag being set."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":136,"startColumn":7,"endColumn":33}}}],"partialFingerprints":{"primaryLocationLineHash":"178a5d22f3f4ca47:1","primaryLocationStartColumnFingerprint":"0"}},{"ruleId":"java/insecure-cookie","rule":{"id":"java/insecure-cookie","index":10,"toolComponent":{"index":18}},"message":{"text":"Cookie is added to response without the 'secure' flag being set."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":1},"region":{"startLine":78,"startColumn":5,"endColumn":31}}}],"partialFingerprints":{"primaryLocationLineHash":"598c4a4ab35135b9:1","primaryLocationStartColumnFingerprint":"0"}},{"ruleId":"java/stack-trace-exposure","rule":{"id":"java/stack-trace-exposure","index":13,"toolComponent":{"index":18}},"message":{"text":"[Error information](1) can be exposed to an external user."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":2},"region":{"startLine":54,"startColumn":31,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"69b1bde9108b11cf:1","primaryLocationStartColumnFingerprint":"24"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":2},"region":{"startLine":54,"startColumn":31,"endColumn":57}},"message":{"text":"Error information"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":3},"region":{"startLine":68,"startColumn":19,"endColumn":76}}}],"partialFingerprints":{"primaryLocationLineHash":"31eaf1239ab18658:1","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":3},"region":{"startLine":68,"startColumn":19,"endColumn":76}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4},"region":{"startLine":107,"startColumn":17,"endColumn":58}}}],"partialFingerprints":{"primaryLocationLineHash":"25e8034b7fe5b633:1","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4},"region":{"startLine":107,"startColumn":17,"endColumn":58}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4},"region":{"startLine":137,"startColumn":11,"endColumn":52}}}],"partialFingerprints":{"primaryLocationLineHash":"c1626ca7a4cc054e:1","primaryLocationStartColumnFingerprint":"0"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4},"region":{"startLine":137,"startColumn":11,"endColumn":52}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":155,"startColumn":19,"endColumn":60}}}],"partialFingerprints":{"primaryLocationLineHash":"55fa3c43091de850:1","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":155,"startColumn":19,"endColumn":60}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":180,"startColumn":19,"endColumn":60}}}],"partialFingerprints":{"primaryLocationLineHash":"55fa3c43091de850:2","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":180,"startColumn":19,"endColumn":60}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":203,"startColumn":19,"endColumn":60}}}],"partialFingerprints":{"primaryLocationLineHash":"55fa3c43091de850:3","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":203,"startColumn":19,"endColumn":60}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5},"region":{"startLine":55,"startColumn":15,"endColumn":62}}}],"partialFingerprints":{"primaryLocationLineHash":"ea6a64ef5a45e8bd:1","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5},"region":{"startLine":55,"startColumn":15,"endColumn":62}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5},"region":{"startLine":59,"startColumn":12,"endLine":65,"endColumn":8}}}],"partialFingerprints":{"primaryLocationLineHash":"43c8407c9464bbdd:1","primaryLocationStartColumnFingerprint":"6"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5},"region":{"startLine":59,"startColumn":12,"endLine":65,"endColumn":8}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/path-injection","rule":{"id":"java/path-injection","index":24,"toolComponent":{"index":18}},"message":{"text":"This path depends on a [user-provided value](1).\nThis path depends on a [user-provided value](2).\nThis path depends on a [user-provided value](3).\nThis path depends on a [user-provided value](4)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":42,"startColumn":26,"endColumn":61}}}],"partialFingerprints":{"primaryLocationLineHash":"f9dec27c2aee101b:1","primaryLocationStartColumnFingerprint":"19"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7},"region":{"startLine":38,"startColumn":7,"endColumn":77}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7},"region":{"startLine":39,"startColumn":51,"endColumn":59}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7},"region":{"startLine":39,"startColumn":51,"endColumn":78}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7},"region":{"startLine":39,"startColumn":32,"endColumn":83}},"message":{"text":"...?...:... : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":31,"startColumn":54,"endColumn":69}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":42,"startColumn":52,"endColumn":60}},"message":{"text":"fullName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":35,"startColumn":7,"endColumn":70}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":36,"startColumn":32,"endColumn":36}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":36,"startColumn":32,"endColumn":58}},"message":{"text":"getOriginalFilename(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":31,"startColumn":54,"endColumn":69}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":42,"startColumn":52,"endColumn":60}},"message":{"text":"fullName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9},"region":{"startLine":38,"startColumn":7,"endColumn":74}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9},"region":{"startLine":39,"startColumn":32,"endColumn":40}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":31,"startColumn":54,"endColumn":69}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":42,"startColumn":52,"endColumn":60}},"message":{"text":"fullName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":36,"startColumn":32,"endColumn":58}},"message":{"text":"getOriginalFilename(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":31,"startColumn":54,"endColumn":69}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":42,"startColumn":52,"endColumn":60}},"message":{"text":"fullName"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7},"region":{"startLine":38,"startColumn":7,"endColumn":77}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":35,"startColumn":7,"endColumn":70}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9},"region":{"startLine":38,"startColumn":7,"endColumn":74}},"message":{"text":"user-provided value"}},{"id":4,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":36,"startColumn":32,"endColumn":58}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/path-injection","rule":{"id":"java/path-injection","index":24,"toolComponent":{"index":18}},"message":{"text":"This path depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":93,"startColumn":25,"endColumn":112}}}],"partialFingerprints":{"primaryLocationLineHash":"45dae355bcc6e27f:1","primaryLocationStartColumnFingerprint":"17"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":90,"startColumn":16,"endColumn":42}},"message":{"text":"getParameter(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":93,"startColumn":56,"endColumn":111}},"message":{"text":"... + ..."}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":90,"startColumn":16,"endColumn":42}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/path-injection","rule":{"id":"java/path-injection","index":24,"toolComponent":{"index":18}},"message":{"text":"This path depends on a [user-provided value](1).\nThis path depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":66,"startColumn":29,"endColumn":80}}}],"partialFingerprints":{"primaryLocationLineHash":"f91d2819131b20b6:1","primaryLocationStartColumnFingerprint":"22"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":51,"startColumn":41,"endColumn":96}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":55,"startColumn":31,"endColumn":35}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":60,"startColumn":41,"endColumn":59}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":66,"startColumn":53,"endColumn":57}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":66,"startColumn":53,"endColumn":79}},"message":{"text":"getOriginalFilename(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":51,"startColumn":41,"endColumn":96}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":66,"startColumn":53,"endColumn":79}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/path-injection","rule":{"id":"java/path-injection","index":24,"toolComponent":{"index":18}},"message":{"text":"This path depends on a [user-provided value](1).\nThis path depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":78,"startColumn":23,"endColumn":77}}}],"partialFingerprints":{"primaryLocationLineHash":"79bc479a53e1b374:1","primaryLocationStartColumnFingerprint":"18"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":78,"startColumn":48,"endColumn":54}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":78,"startColumn":48,"endColumn":76}},"message":{"text":"getOriginalFilename(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":78,"startColumn":48,"endColumn":76}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/path-injection","rule":{"id":"java/path-injection","index":24,"toolComponent":{"index":18}},"message":{"text":"This path depends on a [user-provided value](1).\nThis path depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":35,"endColumn":89}}}],"partialFingerprints":{"primaryLocationLineHash":"ef803e80edfe5b1e:1","primaryLocationStartColumnFingerprint":"30"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":66}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":88}},"message":{"text":"getOriginalFilename(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":88}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/zipslip","rule":{"id":"java/zipslip","index":25,"toolComponent":{"index":18}},"message":{"text":"Unsanitized archive entry, which may contain '..', is used in a [file system operation](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":73,"startColumn":53,"endColumn":64}}}],"partialFingerprints":{"primaryLocationLineHash":"a67d7aacb4287388:1","primaryLocationStartColumnFingerprint":"44"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":73,"startColumn":53,"endColumn":64}},"message":{"text":"getName(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":73,"startColumn":18,"endColumn":65}},"message":{"text":"new File(...) : File"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":75,"startColumn":24,"endColumn":25}},"message":{"text":"f : File"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":75,"startColumn":24,"endColumn":34}},"message":{"text":"toPath(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":75,"startColumn":24,"endColumn":34}},"message":{"text":"file system operation"}}]},{"ruleId":"java/xxe","rule":{"id":"java/xxe","index":37,"toolComponent":{"index":18}},"message":{"text":"XML parsing depends on a [user-provided value](1) without guarding against external entity expansion.\nXML parsing depends on a [user-provided value](2) without guarding against external entity expansion.\nXML parsing depends on a [user-provided value](3) without guarding against external entity expansion."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":41,"endColumn":62}}}],"partialFingerprints":{"primaryLocationLineHash":"1c93f3ad0a8f54:1","primaryLocationStartColumnFingerprint":"36"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14},"region":{"startLine":87,"startColumn":34,"endColumn":64}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14},"region":{"startLine":96,"startColumn":43,"endColumn":53}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":96,"startColumn":30,"endColumn":40}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":58,"endColumn":61}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":41,"endColumn":62}},"message":{"text":"new StringReader(...)"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15},"region":{"startLine":62,"startColumn":7,"endColumn":37}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15},"region":{"startLine":75,"startColumn":45,"endColumn":55}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":96,"startColumn":30,"endColumn":40}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":58,"endColumn":61}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":41,"endColumn":62}},"message":{"text":"new StringReader(...)"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16},"region":{"startLine":73,"startColumn":68,"endColumn":98}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16},"region":{"startLine":76,"startColumn":39,"endColumn":49}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":96,"startColumn":30,"endColumn":40}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":58,"endColumn":61}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":41,"endColumn":62}},"message":{"text":"new StringReader(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14},"region":{"startLine":87,"startColumn":34,"endColumn":64}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15},"region":{"startLine":62,"startColumn":7,"endColumn":37}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16},"region":{"startLine":73,"startColumn":68,"endColumn":98}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/unsafe-deserialization","rule":{"id":"java/unsafe-deserialization","index":41,"toolComponent":{"index":18}},"message":{"text":"Unsafe deserialization depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":60,"startColumn":18,"endColumn":34}}}],"partialFingerprints":{"primaryLocationLineHash":"6c850a3d150d9bb4:1","primaryLocationStartColumnFingerprint":"11"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":49,"startColumn":33,"endColumn":59}},"message":{"text":"token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":21}},"message":{"text":"token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":57}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":58,"startColumn":83,"endColumn":91}},"message":{"text":"b64token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":58,"startColumn":56,"endColumn":92}},"message":{"text":"decode(...) : byte[]"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":60,"startColumn":18,"endColumn":21}},"message":{"text":"ois"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":49,"startColumn":33,"endColumn":59}},"message":{"text":"token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":21}},"message":{"text":"token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":57}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":58,"startColumn":83,"endColumn":91}},"message":{"text":"b64token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":58,"startColumn":56,"endColumn":92}},"message":{"text":"decode(...) : byte[]"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":58,"startColumn":31,"endColumn":93}},"message":{"text":"new ByteArrayInputStream(...) : ByteArrayInputStream"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":60,"startColumn":18,"endColumn":21}},"message":{"text":"ois"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":49,"startColumn":33,"endColumn":59}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/unsafe-deserialization","rule":{"id":"java/unsafe-deserialization","index":41,"toolComponent":{"index":18}},"message":{"text":"Unsafe deserialization depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":57,"startColumn":27,"endColumn":51}}}],"partialFingerprints":{"primaryLocationLineHash":"350c8895428d29a7:1","primaryLocationStartColumnFingerprint":"20"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":40,"startColumn":47,"endColumn":75}},"message":{"text":"payload : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":57,"startColumn":43,"endColumn":50}},"message":{"text":"payload"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":40,"startColumn":47,"endColumn":75}},"message":{"text":"payload : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endColumn":20}},"message":{"text":"payload : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endLine":51,"endColumn":34}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endLine":52,"endColumn":35}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endLine":53,"endColumn":35}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endLine":54,"endColumn":36}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endLine":55,"endColumn":36}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":57,"startColumn":43,"endColumn":50}},"message":{"text":"payload"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":40,"startColumn":47,"endColumn":75}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/polynomial-redos","rule":{"id":"java/polynomial-redos","index":45,"toolComponent":{"index":18}},"message":{"text":"This [regular expression](1) that depends on a [user-provided value](2) may run slow on strings with many repetitions of ' '.\nThis [regular expression](3) that depends on a [user-provided value](2) may run slow on strings starting with 'union' and with many repetitions of 'union('.\nThis [regular expression](1) that depends on a [user-provided value](4) may run slow on strings with many repetitions of ' '.\nThis [regular expression](3) that depends on a [user-provided value](4) may run slow on strings starting with 'union' and with many repetitions of 'union('.\nThis [regular expression](1) that depends on a [user-provided value](5) may run slow on strings with many repetitions of ' '.\nThis [regular expression](3) that depends on a [user-provided value](5) may run slow on strings starting with 'union' and with many repetitions of 'union('."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}}}],"partialFingerprints":{"primaryLocationLineHash":"f222904dc5afe3ce:1","primaryLocationStartColumnFingerprint":"5"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":56,"startColumn":33,"endColumn":81}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":57,"startColumn":28,"endColumn":34}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":56,"startColumn":33,"endColumn":81}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":57,"startColumn":28,"endColumn":34}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":47,"startColumn":30,"endColumn":93}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":51,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":47,"startColumn":30,"endColumn":93}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":51,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":52,"startColumn":7,"endColumn":82}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":20}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":34}},"message":{"text":"toUpperCase(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":54}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":76}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":57,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":52,"startColumn":7,"endColumn":82}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":20}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":34}},"message":{"text":"toUpperCase(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":54}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":76}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":57,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":50,"endColumn":54}},"message":{"text":"regular expression"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":56,"startColumn":33,"endColumn":81}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":61,"endColumn":63}},"message":{"text":"regular expression"}},{"id":4,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":47,"startColumn":30,"endColumn":93}},"message":{"text":"user-provided value"}},{"id":5,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":52,"startColumn":7,"endColumn":82}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/polynomial-redos","rule":{"id":"java/polynomial-redos","index":45,"toolComponent":{"index":18}},"message":{"text":"This [regular expression](1) that depends on a [user-provided value](2) may run slow on strings starting with '<' and with many repetitions of '<'."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22},"region":{"startLine":63,"startColumn":16,"endColumn":22}}}],"partialFingerprints":{"primaryLocationLineHash":"c108af4381cebe6f:1","primaryLocationStartColumnFingerprint":"9"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22},"region":{"startLine":59,"startColumn":33,"endColumn":60}},"message":{"text":"editor : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22},"region":{"startLine":63,"startColumn":16,"endColumn":22}},"message":{"text":"editor"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22},"region":{"startLine":63,"startColumn":38,"endColumn":41}},"message":{"text":"regular expression"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22},"region":{"startLine":59,"startColumn":33,"endColumn":60}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/polynomial-redos","rule":{"id":"java/polynomial-redos","index":45,"toolComponent":{"index":18}},"message":{"text":"This [regular expression](1) that depends on a [user-provided value](2) may run slow on strings starting with '' and with many repetitions of ')'."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":63,"startColumn":26,"endColumn":32}}}],"partialFingerprints":{"primaryLocationLineHash":"113b34bd21123106:1","primaryLocationStartColumnFingerprint":"21"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":61,"startColumn":7,"endColumn":34}},"message":{"text":"field2 : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":63,"startColumn":26,"endColumn":32}},"message":{"text":"field2"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":61,"startColumn":7,"endColumn":34}},"message":{"text":"field2 : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":63,"startColumn":26,"endColumn":32}},"message":{"text":"field2"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":49,"startColumn":50,"endColumn":52}},"message":{"text":"regular expression"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":61,"startColumn":7,"endColumn":34}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":49,"startColumn":66,"endColumn":68}},"message":{"text":"regular expression"}}]},{"ruleId":"java/polynomial-redos","rule":{"id":"java/polynomial-redos","index":45,"toolComponent":{"index":18}},"message":{"text":"This [regular expression](1) that depends on a [user-provided value](2) may run slow on strings starting with '' and with many repetitions of ')'."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":85,"startColumn":26,"endColumn":32}}}],"partialFingerprints":{"primaryLocationLineHash":"de4f1e66fe5d59eb:1","primaryLocationStartColumnFingerprint":"21"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":60,"startColumn":7,"endColumn":34}},"message":{"text":"field1 : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":85,"startColumn":26,"endColumn":32}},"message":{"text":"field1"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":60,"startColumn":7,"endColumn":34}},"message":{"text":"field1 : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":85,"startColumn":26,"endColumn":32}},"message":{"text":"field1"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":49,"startColumn":50,"endColumn":52}},"message":{"text":"regular expression"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":60,"startColumn":7,"endColumn":34}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":49,"startColumn":66,"endColumn":68}},"message":{"text":"regular expression"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":26,"endColumn":97}}}],"partialFingerprints":{"primaryLocationLineHash":"c375853e645b5747:1","primaryLocationStartColumnFingerprint":"21"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":38,"startColumn":31,"endColumn":83}},"message":{"text":"userForm : UserForm"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":44,"startColumn":25,"endColumn":47}},"message":{"text":"getUsername(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":39,"startColumn":23,"endColumn":38}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":59,"endColumn":67}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":32,"startColumn":22,"endColumn":37}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":33,"startColumn":10,"endColumn":18}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":36,"startColumn":22,"endColumn":37}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":37,"startColumn":21,"endColumn":29}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":37,"startColumn":5,"endColumn":9}},"message":{"text":"this [post update] [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":33,"startColumn":5,"endColumn":41}},"message":{"text":"this [post update] [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":43,"endColumn":78}},"message":{"text":"new WebGoatUser(...) [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":23,"endColumn":79}},"message":{"text":"save(...) [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":47,"startColumn":28,"endColumn":39}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":51,"startColumn":37,"endColumn":60}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":47,"endColumn":58}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":55,"startColumn":17,"endColumn":28}},"message":{"text":"parameter this [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":56,"startColumn":12,"endColumn":16}},"message":{"text":"this [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":56,"startColumn":12,"endColumn":25}},"message":{"text":"this.username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":47,"endColumn":72}},"message":{"text":"getUsername(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":26,"endColumn":97}},"message":{"text":"... + ..."}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":38,"startColumn":31,"endColumn":83}},"message":{"text":"userForm : UserForm"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":44,"startColumn":25,"endColumn":33}},"message":{"text":"userForm : UserForm"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":27},"region":{"startLine":30,"startColumn":18,"endColumn":29}},"message":{"text":"parameter this : UserForm"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":27},"region":{"startLine":30,"startColumn":45,"endColumn":58}},"message":{"text":"this.username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":44,"startColumn":25,"endColumn":47}},"message":{"text":"getUsername(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":39,"startColumn":23,"endColumn":38}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":59,"endColumn":67}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":32,"startColumn":22,"endColumn":37}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":33,"startColumn":10,"endColumn":18}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":36,"startColumn":22,"endColumn":37}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":37,"startColumn":21,"endColumn":29}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":37,"startColumn":5,"endColumn":9}},"message":{"text":"this [post update] [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":33,"startColumn":5,"endColumn":41}},"message":{"text":"this [post update] [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":43,"endColumn":78}},"message":{"text":"new WebGoatUser(...) [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":23,"endColumn":79}},"message":{"text":"save(...) [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":47,"startColumn":28,"endColumn":39}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":51,"startColumn":37,"endColumn":60}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":47,"endColumn":58}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":55,"startColumn":17,"endColumn":28}},"message":{"text":"parameter this [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":56,"startColumn":12,"endColumn":16}},"message":{"text":"this [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":56,"startColumn":12,"endColumn":25}},"message":{"text":"this.username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":47,"endColumn":72}},"message":{"text":"getUsername(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":26,"endColumn":97}},"message":{"text":"... + ..."}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":38,"startColumn":31,"endColumn":83}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":64,"startColumn":66,"endColumn":188}}}],"partialFingerprints":{"primaryLocationLineHash":"1a0c1f7d5956e4f8:1","primaryLocationStartColumnFingerprint":"58"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":50,"startColumn":30,"endColumn":65}},"message":{"text":"username_login : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":64,"startColumn":66,"endColumn":188}},"message":{"text":"... + ..."}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":50,"startColumn":67,"endColumn":102}},"message":{"text":"password_login : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":64,"startColumn":66,"endColumn":188}},"message":{"text":"... + ..."}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":50,"startColumn":30,"endColumn":65}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":50,"startColumn":67,"endColumn":102}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29},"region":{"startLine":69,"startColumn":54,"endColumn":68}}}],"partialFingerprints":{"primaryLocationLineHash":"f774d9651c9c378c:1","primaryLocationStartColumnFingerprint":"45"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29},"region":{"startLine":60,"startColumn":40,"endColumn":73}},"message":{"text":"username_reg : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29},"region":{"startLine":69,"startColumn":54,"endColumn":68}},"message":{"text":"checkUserQuery"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29},"region":{"startLine":60,"startColumn":40,"endColumn":73}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2).\nThis query depends on a [user-provided value](3)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":74,"startColumn":52,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"5e5ec10e89273e98:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":56,"startColumn":33,"endColumn":81}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":57,"startColumn":28,"endColumn":34}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":74,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":47,"startColumn":30,"endColumn":93}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":51,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":74,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":52,"startColumn":7,"endColumn":82}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":20}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":34}},"message":{"text":"toUpperCase(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":54}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":76}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":57,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":74,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":56,"startColumn":33,"endColumn":81}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":47,"startColumn":30,"endColumn":93}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":52,"startColumn":7,"endColumn":82}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":71,"startColumn":52,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"983b99783dada75a:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":58,"startColumn":33,"endColumn":67}},"message":{"text":"action_string : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":59,"startColumn":40,"endColumn":53}},"message":{"text":"action_string : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":62,"startColumn":54,"endColumn":67}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":71,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":58,"startColumn":33,"endColumn":67}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":65,"startColumn":50,"endColumn":55}}}],"partialFingerprints":{"primaryLocationLineHash":"67dc1330c3a571f7:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":58,"startColumn":33,"endColumn":59}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":59,"startColumn":28,"endColumn":33}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":62,"startColumn":42,"endColumn":54}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":65,"startColumn":50,"endColumn":55}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":58,"startColumn":33,"endColumn":59}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":62,"startColumn":33,"endColumn":38}}}],"partialFingerprints":{"primaryLocationLineHash":"70e3ff06f7af756a:1","primaryLocationStartColumnFingerprint":"24"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":54,"startColumn":33,"endColumn":59}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":55,"startColumn":28,"endColumn":33}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":58,"startColumn":42,"endColumn":54}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":62,"startColumn":33,"endColumn":38}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":54,"startColumn":33,"endColumn":59}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":80,"startColumn":32,"endColumn":37}}}],"partialFingerprints":{"primaryLocationLineHash":"31dcbb8961cbab44:1","primaryLocationStartColumnFingerprint":"23"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":70,"startColumn":33,"endColumn":45}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":72,"startColumn":28,"endColumn":33}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":75,"startColumn":42,"endColumn":54}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":80,"startColumn":32,"endColumn":37}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":70,"startColumn":33,"endColumn":45}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":63,"startColumn":33,"endColumn":38}}}],"partialFingerprints":{"primaryLocationLineHash":"d339c823409c314d:1","primaryLocationStartColumnFingerprint":"24"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":53,"startColumn":33,"endColumn":59}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":54,"startColumn":28,"endColumn":33}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":57,"startColumn":42,"endColumn":54}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":63,"startColumn":33,"endColumn":38}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":53,"startColumn":33,"endColumn":59}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2).\nThis query depends on a [user-provided value](3)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":67,"startColumn":52,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"2b95e3c48ba92cd0:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":7,"endColumn":35}},"message":{"text":"account : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":56,"startColumn":28,"endColumn":70}},"message":{"text":"... + ... : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":59,"startColumn":42,"endColumn":60}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":67,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":37,"endColumn":66}},"message":{"text":"operator : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":56,"startColumn":28,"endColumn":70}},"message":{"text":"... + ... : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":59,"startColumn":42,"endColumn":60}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":67,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":68,"endColumn":98}},"message":{"text":"injection : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":56,"startColumn":28,"endColumn":70}},"message":{"text":"... + ... : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":59,"startColumn":42,"endColumn":60}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":67,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":7,"endColumn":35}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":37,"endColumn":66}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":68,"endColumn":98}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":66,"startColumn":15,"endColumn":26}}}],"partialFingerprints":{"primaryLocationLineHash":"ba7f4a519474e8ae:1","primaryLocationStartColumnFingerprint":"0"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":56,"startColumn":7,"endColumn":34}},"message":{"text":"userid : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":58,"startColumn":41,"endColumn":47}},"message":{"text":"userid : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":61,"startColumn":62,"endColumn":80}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":66,"startColumn":15,"endColumn":26}},"message":{"text":"queryString"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":56,"startColumn":7,"endColumn":34}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":78,"startColumn":52,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"615295edb2bddc7:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":33,"endColumn":58}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":60,"startColumn":43,"endColumn":47}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":63,"startColumn":57,"endColumn":68}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":78,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":60,"endColumn":89}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":60,"startColumn":49,"endColumn":57}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":63,"startColumn":70,"endColumn":85}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":78,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":33,"endColumn":58}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":60,"endColumn":89}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":76,"startColumn":52,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"c3579bd895056390:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":33,"endColumn":58}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":61,"startColumn":37,"endColumn":41}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":64,"startColumn":51,"endColumn":62}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":76,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":60,"endColumn":89}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":61,"startColumn":43,"endColumn":51}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":64,"startColumn":64,"endColumn":79}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":76,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":33,"endColumn":58}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":60,"endColumn":89}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2).\nThis query depends on a [user-provided value](3).\nThis query depends on a [user-provided value](4)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":158,"startColumn":31,"endColumn":39}}}],"partialFingerprints":{"primaryLocationLineHash":"86ab9021267dc726:1","primaryLocationStartColumnFingerprint":"24"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":33,"endColumn":58}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":60,"startColumn":43,"endColumn":47}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":63,"startColumn":57,"endColumn":68}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":77,"startColumn":25,"endColumn":30}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":147,"startColumn":49,"endColumn":62}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":20}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":158,"startColumn":31,"endColumn":39}},"message":{"text":"logQuery"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":60,"endColumn":89}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":60,"startColumn":49,"endColumn":57}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":63,"startColumn":70,"endColumn":85}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":77,"startColumn":25,"endColumn":30}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":147,"startColumn":49,"endColumn":62}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":20}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":158,"startColumn":31,"endColumn":39}},"message":{"text":"logQuery"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":33,"endColumn":58}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":61,"startColumn":37,"endColumn":41}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":64,"startColumn":51,"endColumn":62}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":75,"startColumn":45,"endColumn":50}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":147,"startColumn":49,"endColumn":62}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":20}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":158,"startColumn":31,"endColumn":39}},"message":{"text":"logQuery"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":60,"endColumn":89}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":61,"startColumn":43,"endColumn":51}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":64,"startColumn":64,"endColumn":79}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":75,"startColumn":45,"endColumn":50}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":147,"startColumn":49,"endColumn":62}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":20}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":158,"startColumn":31,"endColumn":39}},"message":{"text":"logQuery"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":33,"endColumn":58}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":60,"endColumn":89}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":33,"endColumn":58}},"message":{"text":"user-provided value"}},{"id":4,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":60,"endColumn":89}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39},"region":{"startLine":75,"startColumn":57,"endColumn":178}}}],"partialFingerprints":{"primaryLocationLineHash":"7cc0e97ef836b73a:1","primaryLocationStartColumnFingerprint":"49"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39},"region":{"startLine":67,"startColumn":28,"endColumn":55}},"message":{"text":"column : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39},"region":{"startLine":75,"startColumn":57,"endColumn":178}},"message":{"text":"... + ..."}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39},"region":{"startLine":67,"startColumn":28,"endColumn":55}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/ssrf","rule":{"id":"java/ssrf","index":49,"toolComponent":{"index":18}},"message":{"text":"Potential server-side request forgery due to a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":51,"startColumn":29,"endColumn":41}}}],"partialFingerprints":{"primaryLocationLineHash":"6be77af73d304fec:1","primaryLocationStartColumnFingerprint":"22"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":44,"startColumn":33,"endColumn":57}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":45,"startColumn":20,"endColumn":23}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":48,"startColumn":34,"endColumn":44}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":51,"startColumn":29,"endColumn":41}},"message":{"text":"new URL(...)"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":44,"startColumn":33,"endColumn":57}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":45,"startColumn":20,"endColumn":23}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":48,"startColumn":34,"endColumn":44}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":51,"startColumn":37,"endColumn":40}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":51,"startColumn":29,"endColumn":41}},"message":{"text":"new URL(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":44,"startColumn":33,"endColumn":57}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/spring-disabled-csrf-protection","rule":{"id":"java/spring-disabled-csrf-protection","index":56,"toolComponent":{"index":18}},"message":{"text":"CSRF vulnerability due to protection being disabled."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":41},"region":{"startLine":80,"startColumn":5,"endColumn":36}}}],"partialFingerprints":{"primaryLocationLineHash":"5a3b59dcf16b392d:1","primaryLocationStartColumnFingerprint":"0"}},{"ruleId":"java/spring-disabled-csrf-protection","rule":{"id":"java/spring-disabled-csrf-protection","index":56,"toolComponent":{"index":18}},"message":{"text":"CSRF vulnerability due to protection being disabled."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":42},"region":{"startLine":60,"startColumn":5,"endColumn":36}}}],"partialFingerprints":{"primaryLocationLineHash":"25bab9a440f2318b:1","primaryLocationStartColumnFingerprint":"0"}},{"ruleId":"java/weak-cryptographic-algorithm","rule":{"id":"java/weak-cryptographic-algorithm","index":57,"toolComponent":{"index":18}},"message":{"text":"Cryptographic algorithm [MD5](1) is weak and should not be used."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":55,"startColumn":26,"endColumn":58}}}],"partialFingerprints":{"primaryLocationLineHash":"99e2d6034d1626c0:1","primaryLocationStartColumnFingerprint":"19"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":55,"startColumn":52,"endColumn":57}},"message":{"text":"MD5"}}]},{"ruleId":"java/log-injection","rule":{"id":"java/log-injection","index":75,"toolComponent":{"index":18}},"message":{"text":"This log entry depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44},"region":{"startLine":164,"startColumn":40,"endColumn":50}}}],"partialFingerprints":{"primaryLocationLineHash":"6e872ef1bcf9d5da:1","primaryLocationStartColumnFingerprint":"31"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44},"region":{"startLine":162,"startColumn":27,"endColumn":76}},"message":{"text":"getHeader(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44},"region":{"startLine":164,"startColumn":40,"endColumn":50}},"message":{"text":"langHeader"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44},"region":{"startLine":162,"startColumn":27,"endColumn":76}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/log-injection","rule":{"id":"java/log-injection","index":75,"toolComponent":{"index":18}},"message":{"text":"This log entry depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45},"region":{"startLine":81,"startColumn":40,"endColumn":47}}}],"partialFingerprints":{"primaryLocationLineHash":"c60f6a54a39c911a:1","primaryLocationStartColumnFingerprint":"33"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45},"region":{"startLine":73,"startColumn":62,"endColumn":90}},"message":{"text":"modulus : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45},"region":{"startLine":81,"startColumn":40,"endColumn":47}},"message":{"text":"modulus"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45},"region":{"startLine":73,"startColumn":62,"endColumn":90}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/log-injection","rule":{"id":"java/log-injection","index":75,"toolComponent":{"index":18}},"message":{"text":"This log entry depends on a [user-provided value](1).\nThis log entry depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":35,"endColumn":89}}}],"partialFingerprints":{"primaryLocationLineHash":"ef803e80edfe5b1e:1","primaryLocationStartColumnFingerprint":"30"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":66}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":88}},"message":{"text":"getOriginalFilename(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":35,"endColumn":89}},"message":{"text":"new File(...)"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":88}},"message":{"text":"getOriginalFilename(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":35,"endColumn":89}},"message":{"text":"new File(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":88}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/log-injection","rule":{"id":"java/log-injection","index":75,"toolComponent":{"index":18}},"message":{"text":"This log entry depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":46},"region":{"startLine":48,"startColumn":45,"endColumn":68}}}],"partialFingerprints":{"primaryLocationLineHash":"27ba78a11a332dd5:1","primaryLocationStartColumnFingerprint":"38"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":46},"region":{"startLine":48,"startColumn":45,"endColumn":68}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sensitive-log","rule":{"id":"java/sensitive-log","index":76,"toolComponent":{"index":18}},"message":{"text":"This [potentially sensitive information](1) is written to a log file."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47},"region":{"startLine":50,"startColumn":9,"endColumn":86}}}],"partialFingerprints":{"primaryLocationLineHash":"fb9ac546c80284d7:1","primaryLocationStartColumnFingerprint":"0"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47},"region":{"startLine":50,"startColumn":44,"endColumn":52}},"message":{"text":"password : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47},"region":{"startLine":50,"startColumn":44,"endColumn":85}},"message":{"text":"getBytes(...) : byte[]"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47},"region":{"startLine":50,"startColumn":9,"endColumn":86}},"message":{"text":"encodeToString(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47},"region":{"startLine":50,"startColumn":44,"endColumn":52}},"message":{"text":"potentially sensitive information"}}]},{"ruleId":"java/sensitive-log","rule":{"id":"java/sensitive-log","index":76,"toolComponent":{"index":18}},"message":{"text":"This [potentially sensitive information](1) is written to a log file."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":68,"startColumn":50,"endColumn":65}}}],"partialFingerprints":{"primaryLocationLineHash":"7ccb022cc5fb1739:1","primaryLocationStartColumnFingerprint":"43"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":68,"startColumn":50,"endColumn":65}},"message":{"text":"potentially sensitive information"}}]},{"ruleId":"java/tainted-arithmetic","rule":{"id":"java/tainted-arithmetic","index":86,"toolComponent":{"index":18}},"message":{"text":"This arithmetic expression depends on a [user-provided value](1), potentially causing an overflow."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":283,"startColumn":10,"endColumn":25}}}],"partialFingerprints":{"primaryLocationLineHash":"ff289147dde00d14:1","primaryLocationStartColumnFingerprint":"5"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49},"region":{"startLine":75,"startColumn":46,"endColumn":72}},"message":{"text":"email : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49},"region":{"startLine":77,"startColumn":25,"endColumn":30}},"message":{"text":"email : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49},"region":{"startLine":77,"startColumn":25,"endColumn":63}},"message":{"text":"substring(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49},"region":{"startLine":91,"startColumn":207,"endColumn":215}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":50},"region":{"startLine":13,"startColumn":37,"endColumn":52}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":50},"region":{"startLine":19,"startColumn":81,"endColumn":89}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":207,"startColumn":38,"endColumn":46}},"message":{"text":"s : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":209,"startColumn":16,"endColumn":17}},"message":{"text":"s : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":371,"startColumn":22,"endColumn":30}},"message":{"text":"s : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":372,"startColumn":12,"endColumn":13}},"message":{"text":"s : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":372,"startColumn":12,"endColumn":24}},"message":{"text":"getBytes(...) : byte[]"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":348,"startColumn":22,"endColumn":35}},"message":{"text":"buffer : byte[]"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":349,"startColumn":23,"endColumn":36}},"message":{"text":"buffer.length : Number"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":325,"startColumn":49,"endColumn":59}},"message":{"text":"length : Number"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":326,"startColumn":42,"endColumn":48}},"message":{"text":"length : Number"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":278,"startColumn":66,"endColumn":76}},"message":{"text":"length : Number"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":283,"startColumn":10,"endColumn":16}},"message":{"text":"length"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49},"region":{"startLine":75,"startColumn":46,"endColumn":72}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/concatenated-sql-query","rule":{"id":"java/concatenated-sql-query","index":92,"toolComponent":{"index":18}},"message":{"text":"Query built by concatenation with [this expression](1), which may be untrusted."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":51},"region":{"startLine":90,"startColumn":39,"endColumn":90}}}],"partialFingerprints":{"primaryLocationLineHash":"b977808836279b6e:1","primaryLocationStartColumnFingerprint":"0"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":51},"region":{"startLine":90,"startColumn":81,"endColumn":84}},"message":{"text":"this expression"}}]},{"ruleId":"java/potentially-weak-cryptographic-algorithm","rule":{"id":"java/potentially-weak-cryptographic-algorithm","index":95,"toolComponent":{"index":18}},"message":{"text":"Cryptographic algorithm [SHA-256](1) may not be secure, consider using a different algorithm.\nCryptographic algorithm [SHA-256](2) may not be secure, consider using a different algorithm."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":100,"startColumn":24,"endColumn":60}}}],"partialFingerprints":{"primaryLocationLineHash":"2b5742fe12aaef84:1","primaryLocationStartColumnFingerprint":"19"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":72,"startColumn":32,"endColumn":41}},"message":{"text":"\"SHA-256\" : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":99,"startColumn":47,"endColumn":63}},"message":{"text":"algorithm : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":100,"startColumn":50,"endColumn":59}},"message":{"text":"algorithm"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":52},"region":{"startLine":49,"startColumn":52,"endColumn":61}},"message":{"text":"\"SHA-256\" : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":99,"startColumn":47,"endColumn":63}},"message":{"text":"algorithm : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":100,"startColumn":50,"endColumn":59}},"message":{"text":"algorithm"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":72,"startColumn":32,"endColumn":41}},"message":{"text":"SHA-256"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":52},"region":{"startLine":49,"startColumn":52,"endColumn":61}},"message":{"text":"SHA-256"}}]},{"ruleId":"java/potentially-weak-cryptographic-algorithm","rule":{"id":"java/potentially-weak-cryptographic-algorithm","index":95,"toolComponent":{"index":18}},"message":{"text":"Cryptographic algorithm [SHA-256](1) may not be secure, consider using a different algorithm."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":53},"region":{"startLine":55,"startColumn":24,"endColumn":60}}}],"partialFingerprints":{"primaryLocationLineHash":"555233fa65523009:1","primaryLocationStartColumnFingerprint":"19"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":53},"region":{"startLine":55,"startColumn":50,"endColumn":59}},"message":{"text":"SHA-256"}}]}],"columnKind":"utf16CodeUnits","properties":{"metricResults":[{"rule":{"id":"java/summary/lines-of-code","index":96,"toolComponent":{"index":18}},"ruleId":"java/summary/lines-of-code","value":16389,"baseline":34524},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":231,"message":{"text":"java.util.Map#put(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":125,"message":{"text":"java.lang.String#equals(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":63,"message":{"text":"java.lang.StringBuilder#append(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":60,"message":{"text":"java.util.Map#clear()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":60,"message":{"text":"java.util.Map#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":58,"message":{"text":"java.lang.String#contains(CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":49,"message":{"text":"java.lang.String#replace(CharSequence,CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":48,"message":{"text":"java.lang.Throwable#getMessage()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":39,"message":{"text":"java.lang.Object#equals(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":37,"message":{"text":"java.lang.StringBuilder#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":33,"message":{"text":"java.lang.Object#hashCode()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":33,"message":{"text":"java.util.Collection#stream()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":24,"message":{"text":"java.lang.String#getBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":24,"message":{"text":"java.lang.String#length()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":23,"message":{"text":"java.lang.String#indexOf(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":22,"message":{"text":"java.util.List#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":20,"message":{"text":"java.lang.String#substring(int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":20,"message":{"text":"java.lang.Object#getClass()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":19,"message":{"text":"java.lang.String#toLowerCase()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":17,"message":{"text":"java.util.Map#of(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":16,"message":{"text":"javax.servlet.http.Cookie#Cookie(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":16,"message":{"text":"org.springframework.http.HeadersBuilder#build()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":16,"message":{"text":"java.lang.String#concat(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"java.io.PrintStream#println(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"java.util.stream.Stream#filter(Predicate)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"javax.servlet.http.HttpServletRequest#getHeader(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"java.util.Map#of(Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"org.slf4j.Logger#debug(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"java.lang.String#format(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":14,"message":{"text":"java.sql.Statement#executeQuery(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":13,"message":{"text":"java.util.stream.Stream#map(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":13,"message":{"text":"java.lang.String#String(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":12,"message":{"text":"java.io.File#File(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":12,"message":{"text":"org.slf4j.Logger#debug(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":12,"message":{"text":"java.lang.String#matches(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"org.springframework.http.ResponseEntity#ok(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"java.util.Map#getOrDefault(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"java.util.List#size()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"java.lang.Object#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"java.lang.String#getBytes(Charset)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"java.sql.ResultSet#next()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"java.io.File#File(File,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"org.springframework.data.repository.CrudRepository#save(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"org.slf4j.Logger#error(String,Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"java.util.Map#isEmpty()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"java.lang.String#equalsIgnoreCase(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"java.util.stream.Stream#toList()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#readValue(String,Class)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"java.lang.String#substring(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":9,"message":{"text":"java.util.Encoder#encode(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":9,"message":{"text":"java.io.File#toPath()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":9,"message":{"text":"java.sql.PreparedStatement#setString(int,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.io.File#exists()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.lang.Class#getName()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.sql.Connection#prepareStatement(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"org.springframework.http.BodyBuilder#body(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.time.Instant#now()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.lang.String#split(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"org.apache.commons.lang3.StringUtils#reverse(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.util.stream.Stream#findFirst()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.net.URI#URI(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.nio.file.Path#toFile()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.util.Arrays#asList(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.lang.String#String(byte\\[\\],Charset)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.io.File#getName()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.util.Decoder#decode(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.util.Optional#orElse(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.util.List#contains(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"org.slf4j.Logger#info(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.Class#getSimpleName()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.nio.file.Paths#get(String,String\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.System#currentTimeMillis()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.String#startsWith(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.String#trim()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.util.stream.Collectors#toList()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.String#replaceAll(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.String#replaceFirst(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.util.ArrayList#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.Encoder#encodeToString(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.sql.ResultSet#getString(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.List#get(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.lang.String#formatted(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.lang.Class#getClassLoader()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"org.springframework.web.multipart.MultipartFile#getOriginalFilename()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.lang.Integer#intValue()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.Set#size()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.Map#values()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.Collection#toArray(IntFunction)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.math.BigInteger#valueOf(long)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.HashMap#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.lang.String#toUpperCase()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"javax.servlet.http.HttpServletResponse#addCookie(Cookie)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.lang.String#endsWith(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"org.springframework.util.MultiValueMap#getFirst(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.nio.file.Path#resolve(Path)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.math.BigInteger#toByteArray()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"org.springframework.web.client.RestTemplate#postForEntity(String,Object,Class,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Entry#getValue()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Entry#getKey()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.lang.StringBuffer#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.List#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"javax.servlet.ServletRequest#getParameter(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Decoder#decode(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"javax.servlet.http.HttpServletRequest#getRequestURL()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"org.apache.commons.lang3.ArrayUtils#addAll(Object\\[\\],Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Map#entrySet()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"org.slf4j.Logger#error(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Optional#ifPresent(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.lang.String#charAt(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.stream.Stream#of(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.UUID#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.UUID#randomUUID()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Set#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.lang.Iterable#forEach(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.io.File#File(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.io.InputStream#readAllBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.String#replace(char,char)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.nio.file.Path#resolve(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"org.springframework.validation.Errors#rejectValue(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.List#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.Optional#ofNullable(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.stream.Stream#sorted(Comparator)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.io.File#getCanonicalPath()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.HashMap#put(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.Date#Date(long)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.Properties#putAll(Map)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.sql.Statement#executeUpdate(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.Map#remove(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.List#of(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.Map#size()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"org.springframework.http.ResponseEntity#ResponseEntity(Object,HttpStatus)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.String#String(char\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.System#arraycopy(Object,int,Object,int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.IllegalStateException#IllegalStateException(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.String#getBytes(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.io.FileOutputStream#FileOutputStream(File)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.StringBuilder#StringBuilder(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"org.springframework.http.BodyBuilder#contentType(MediaType)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.stream.Stream#anyMatch(Predicate)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.slf4j.Logger#warn(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.InputStreamReader#InputStreamReader(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.ObjectInputStream#readObject()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.Enum#Enum(String,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.stream.Stream#flatMap(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.stream.Stream#mapToInt(ToIntFunction)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.String#toCharArray()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.ObjectInputStream#ObjectInputStream(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"com.google.common.collect.Lists#newArrayList(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.Integer#valueOf(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.ByteArrayInputStream#ByteArrayInputStream(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.ByteArrayOutputStream#toByteArray()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Objects#requireNonNull(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.File#toURI()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Arrays#stream(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.Float#parseFloat(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.net.URI#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Map#containsKey(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copyToByteArray(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copy(InputStream,OutputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copyToByteArray(File)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copy(byte\\[\\],File)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.web.multipart.MultipartFile#getBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.util.Base64Utils#decodeFromUrlSafeString(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Set#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.slf4j.Logger#warn(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.String#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.StringBuilder#reverse()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Collections#emptyList()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.String#isEmpty()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Map#of(Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractMessageSource#getMessage(String,Object\\[\\],Locale)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractMessageSource#getMessage(String,Object\\[\\],String,Locale)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.core.NestedRuntimeException#getMessage()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Optional#isPresent()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Collection#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.validation.Errors#getFieldError(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.ArrayList#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.http.HeadersBuilder#location(URI)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Collection#size()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.Throwable#getCause()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Optional#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.List#of(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Optional#map(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.function.Predicate#test(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.regex.Pattern#compile(String,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.InputStream#read(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.regex.Pattern#matcher(CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Queue#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Set#of(Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Set#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Set#contains(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Arrays#copyOfRange(byte\\[\\],int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Collections#list(Enumeration)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Collections#singleton(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Enumeration#nextElement()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Optional#stream()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Optional#get()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Optional#empty()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Properties#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Properties#getProperty(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.Enum#name()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.IllegalArgumentException#IllegalArgumentException(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.Integer#parseInt(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.Integer#toHexString(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.Long#intValue()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.Math#min(int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.List#isEmpty()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.RuntimeException#RuntimeException(Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.String#valueOf(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Collection#parallelStream()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.HashMap#entrySet()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.StringBuilder#append(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.StringBuilder#StringBuilder(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.HashMap#replace(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#writeValueAsBytes(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#readValue(byte\\[\\],Class)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectWriter#writeValueAsString(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.stream.Stream#reduce(Object,BiFunction,BinaryOperator)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.stream.Stream#forEach(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.stream.Stream#sorted()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.stream.Stream#distinct()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"com.google.common.collect.EvictingQueue#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.BufferedReader#readLine()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.BufferedReader#BufferedReader(Reader)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.File#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.File#getCanonicalFile()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.File#getAbsoluteFile()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.FilterOutputStream#write(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.ObjectOutputStream#writeObject(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.PrintWriter#println(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.PrintWriter#PrintWriter(File)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.StringReader#StringReader(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.StringWriter#getBuffer()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.net.URL#openStream()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.net.URL#URL(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#writeString(Path,CharSequence,Charset,OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#writeString(Path,CharSequence,OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#write(Path,byte\\[\\],OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#copy(InputStream,Path,CopyOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#createTempDirectory(String,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#createDirectories(Path,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#createFile(Path,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.sql.Connection#prepareStatement(String,int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.sql.PreparedStatement#setInt(int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.xml.sax.InputSource#InputSource(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.sql.Statement#execute(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Map#putAll(Map)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.text.DateFormat#format(Date)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.text.SimpleDateFormat#SimpleDateFormat(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.regex.Pattern#asMatchPredicate()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.regex.Pattern#compile(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.regex.Matcher#matches()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.regex.Matcher#group(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.servlet.ServletRequest#getParameterNames()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.servlet.http.Cookie#getValue()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.servlet.http.Cookie#getName()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Map#keySet()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.servlet.http.HttpServletRequest#getQueryString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.servlet.http.HttpServletResponse#sendError(int,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.xml.xpath.XPath#evaluate(String,InputSource,QName)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.apache.commons.io.FileUtils#byteCountToDisplaySize(long)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.apache.commons.io.FilenameUtils#isExtension(String,Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.apache.commons.logging.Log#error(Object,Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.http.HttpEntity#HttpEntity(MultiValueMap)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.http.HeadersBuilder#header(String,String\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.util.StringUtils#arrayToCommaDelimitedString(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.slf4j.Logger#error(String,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.slf4j.Logger#error(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.slf4j.Logger#info(String,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.slf4j.Logger#info(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Map#forEach(BiConsumer)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Map#of()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.slf4j.Logger#trace(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.jdbc.core.JdbcTemplate#execute(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.jdbc.datasource.AbstractDriverBasedDataSource#setUrl(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.ui.Model#addAttribute(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.ui.ModelMap#addAttribute(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.web.client.RestTemplate#exchange(String,HttpMethod,HttpEntity,Class,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.ArrayList#ArrayList(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Queue#remove()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":231,"message":{"text":"java.util.Map#put(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":125,"message":{"text":"java.lang.String#equals(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":63,"message":{"text":"java.lang.StringBuilder#append(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":60,"message":{"text":"java.util.Map#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":49,"message":{"text":"java.lang.String#replace(CharSequence,CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":48,"message":{"text":"java.lang.Throwable#getMessage()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":39,"message":{"text":"java.lang.Object#equals(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":37,"message":{"text":"java.lang.StringBuilder#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":33,"message":{"text":"java.util.Collection#stream()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":24,"message":{"text":"java.lang.String#getBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":22,"message":{"text":"java.util.List#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":20,"message":{"text":"java.lang.String#substring(int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":19,"message":{"text":"java.lang.String#toLowerCase()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":17,"message":{"text":"java.util.Map#of(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":16,"message":{"text":"org.springframework.http.HeadersBuilder#build()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":16,"message":{"text":"javax.servlet.http.Cookie#Cookie(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":16,"message":{"text":"java.lang.String#concat(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":15,"message":{"text":"java.util.Map#of(Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":15,"message":{"text":"java.util.stream.Stream#filter(Predicate)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":15,"message":{"text":"java.lang.String#format(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":13,"message":{"text":"java.util.stream.Stream#map(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":13,"message":{"text":"java.lang.String#String(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":12,"message":{"text":"java.io.File#File(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":11,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":11,"message":{"text":"java.util.Map#getOrDefault(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":11,"message":{"text":"java.lang.String#getBytes(Charset)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":11,"message":{"text":"org.springframework.http.ResponseEntity#ok(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":10,"message":{"text":"java.lang.String#substring(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":10,"message":{"text":"java.io.File#File(File,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":10,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#readValue(String,Class)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":10,"message":{"text":"java.util.stream.Stream#toList()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":10,"message":{"text":"org.springframework.data.repository.CrudRepository#save(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":9,"message":{"text":"java.sql.PreparedStatement#setString(int,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":9,"message":{"text":"java.util.Encoder#encode(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":9,"message":{"text":"java.io.File#toPath()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":8,"message":{"text":"org.apache.commons.lang3.StringUtils#reverse(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":8,"message":{"text":"java.util.stream.Stream#findFirst()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":8,"message":{"text":"org.springframework.http.BodyBuilder#body(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":8,"message":{"text":"java.lang.String#split(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.nio.file.Path#toFile()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.util.Arrays#asList(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.net.URI#URI(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.util.Optional#orElse(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.io.File#getName()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.lang.String#String(byte\\[\\],Charset)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.util.Decoder#decode(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":6,"message":{"text":"java.lang.String#replaceAll(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":6,"message":{"text":"java.lang.String#trim()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":6,"message":{"text":"java.util.ArrayList#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":6,"message":{"text":"java.lang.String#replaceFirst(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":6,"message":{"text":"java.nio.file.Paths#get(String,String\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.lang.String#formatted(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.util.Collection#toArray(IntFunction)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.lang.String#toUpperCase()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"org.springframework.web.multipart.MultipartFile#getOriginalFilename()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.util.List#get(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.math.BigInteger#valueOf(long)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.util.HashMap#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"org.springframework.util.MultiValueMap#getFirst(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.util.Map#values()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.util.Encoder#encodeToString(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.lang.Integer#intValue()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.sql.ResultSet#getString(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.lang.Iterable#forEach(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"org.apache.commons.lang3.ArrayUtils#addAll(Object\\[\\],Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Map#entrySet()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Optional#ifPresent(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.io.InputStream#readAllBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.lang.StringBuffer#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.nio.file.Path#resolve(Path)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Entry#getValue()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.lang.String#charAt(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Set#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Decoder#decode(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.List#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.math.BigInteger#toByteArray()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.io.File#File(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Entry#getKey()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.stream.Stream#of(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"org.springframework.validation.Errors#rejectValue(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.HashMap#put(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.nio.file.Path#resolve(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"org.springframework.http.BodyBuilder#contentType(MediaType)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"org.springframework.http.ResponseEntity#ResponseEntity(Object,HttpStatus)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.Optional#ofNullable(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.Properties#putAll(Map)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.IllegalStateException#IllegalStateException(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.List#of(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.String#replace(char,char)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.String#getBytes(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.List#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.StringBuilder#StringBuilder(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.String#String(char\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.System#arraycopy(Object,int,Object,int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.Map#remove(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.stream.Stream#sorted(Comparator)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.io.File#getCanonicalPath()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copy(InputStream,OutputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Optional#map(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.ByteArrayOutputStream#toByteArray()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.ObjectInputStream#ObjectInputStream(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.web.multipart.MultipartFile#getBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.ObjectInputStream#readObject()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.File#toURI()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.Throwable#getCause()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.validation.Errors#getFieldError(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.ArrayList#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Collection#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.core.NestedRuntimeException#getMessage()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.context.support.AbstractMessageSource#getMessage(String,Object\\[\\],String,Locale)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.InputStreamReader#InputStreamReader(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.context.support.AbstractMessageSource#getMessage(String,Object\\[\\],Locale)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Objects#requireNonNull(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.stream.Stream#anyMatch(Predicate)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copy(byte\\[\\],File)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copyToByteArray(File)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Optional#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.InputStream#read(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copyToByteArray(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Set#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.stream.Stream#flatMap(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.stream.Stream#mapToInt(ToIntFunction)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.util.Base64Utils#decodeFromUrlSafeString(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.http.HeadersBuilder#location(URI)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.regex.Pattern#matcher(CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"com.google.common.collect.Lists#newArrayList(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.net.URI#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Arrays#stream(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.String#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.String#toCharArray()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.Integer#valueOf(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.ByteArrayInputStream#ByteArrayInputStream(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Map#of(Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.StringBuilder#reverse()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.Float#parseFloat(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.List#of(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Map#of()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Map#forEach(BiConsumer)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Map#keySet()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Map#putAll(Map)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.HashMap#replace(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.HashMap#entrySet()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Collection#parallelStream()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.ArrayList#ArrayList(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Queue#remove()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Queue#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Set#of(Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Set#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Arrays#copyOfRange(byte\\[\\],int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Collections#list(Enumeration)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Collections#singleton(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Enumeration#nextElement()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Optional#stream()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Optional#get()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Properties#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Properties#getProperty(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.IllegalArgumentException#IllegalArgumentException(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.Integer#parseInt(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.Integer#toHexString(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.Long#intValue()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.RuntimeException#RuntimeException(Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.StringBuilder#append(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.StringBuilder#StringBuilder(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#writeValueAsBytes(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#readValue(byte\\[\\],Class)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectWriter#writeValueAsString(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.stream.Stream#reduce(Object,BiFunction,BinaryOperator)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.stream.Stream#forEach(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.stream.Stream#sorted()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.stream.Stream#distinct()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"com.google.common.collect.EvictingQueue#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.BufferedReader#readLine()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.BufferedReader#BufferedReader(Reader)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.File#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.File#getCanonicalFile()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.File#getAbsoluteFile()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.FilterOutputStream#write(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.ObjectOutputStream#writeObject(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.StringReader#StringReader(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.StringWriter#getBuffer()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.net.URL#URL(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.regex.Matcher#group(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.springframework.http.HttpEntity#HttpEntity(MultiValueMap)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.springframework.http.HeadersBuilder#header(String,String\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.springframework.util.StringUtils#arrayToCommaDelimitedString(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.springframework.ui.Model#addAttribute(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.springframework.ui.ModelMap#addAttribute(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.xml.sax.InputSource#InputSource(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":15,"message":{"text":"org.slf4j.Logger#debug(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":15,"message":{"text":"java.io.PrintStream#println(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":14,"message":{"text":"java.sql.Statement#executeQuery(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":12,"message":{"text":"org.slf4j.Logger#debug(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":12,"message":{"text":"java.lang.String#matches(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":10,"message":{"text":"org.slf4j.Logger#error(String,Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":8,"message":{"text":"java.lang.String#split(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":8,"message":{"text":"java.sql.Connection#prepareStatement(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":6,"message":{"text":"java.lang.String#replaceFirst(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":6,"message":{"text":"java.lang.String#replaceAll(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":6,"message":{"text":"org.slf4j.Logger#info(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":5,"message":{"text":"javax.servlet.http.HttpServletResponse#addCookie(Cookie)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":4,"message":{"text":"org.springframework.web.client.RestTemplate#postForEntity(String,Object,Class,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":4,"message":{"text":"org.slf4j.Logger#error(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":3,"message":{"text":"java.io.FileOutputStream#FileOutputStream(File)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":3,"message":{"text":"java.sql.Statement#executeUpdate(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":2,"message":{"text":"java.util.regex.Pattern#compile(String,int)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":2,"message":{"text":"java.util.regex.Pattern#matcher(CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":2,"message":{"text":"java.util.function.Predicate#test(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":2,"message":{"text":"org.slf4j.Logger#warn(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":2,"message":{"text":"org.slf4j.Logger#warn(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.util.regex.Pattern#asMatchPredicate()"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.util.regex.Pattern#compile(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.util.regex.Matcher#matches()"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"javax.servlet.http.HttpServletResponse#sendError(int,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#writeString(Path,CharSequence,Charset,OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"javax.xml.xpath.XPath#evaluate(String,InputSource,QName)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#createTempDirectory(String,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.net.URL#openStream()"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.slf4j.Logger#error(String,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.slf4j.Logger#error(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.slf4j.Logger#info(String,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.io.PrintWriter#PrintWriter(File)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.slf4j.Logger#info(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.io.PrintWriter#println(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.slf4j.Logger#trace(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.springframework.jdbc.core.JdbcTemplate#execute(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.springframework.jdbc.datasource.AbstractDriverBasedDataSource#setUrl(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.springframework.web.client.RestTemplate#exchange(String,HttpMethod,HttpEntity,Class,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#copy(InputStream,Path,CopyOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.apache.commons.logging.Log#error(Object,Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#createDirectories(Path,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#createFile(Path,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.sql.Connection#prepareStatement(String,int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#write(Path,byte\\[\\],OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.sql.Statement#execute(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#writeString(Path,CharSequence,OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":4104,"message":{"text":"rt.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":792,"message":{"text":"rest-assured-4.5.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":162,"message":{"text":"jjwt-0.9.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":110,"message":{"text":"spring-web-5.3.21.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":100,"message":{"text":"jakarta.servlet-api-4.0.4.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":97,"message":{"text":"slf4j-api-1.7.36.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":77,"message":{"text":"spring-webmvc-5.3.21.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":74,"message":{"text":"spring-core-5.3.21.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":51,"message":{"text":"spring-security-config-5.7.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":47,"message":{"text":"jackson-databind-2.13.3.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":42,"message":{"text":"spring-security-core-5.7.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":40,"message":{"text":"spring-context-5.3.21.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":31,"message":{"text":"commons-lang3-3.12.0.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":25,"message":{"text":"asciidoctorj-api-2.5.3.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":20,"message":{"text":"thymeleaf-3.0.15.RELEASE.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":17,"message":{"text":"json-path-4.5.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":17,"message":{"text":"zxcvbn-1.5.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":16,"message":{"text":"jose4j-0.9.3.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":16,"message":{"text":"xstream-1.4.5.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":16,"message":{"text":"flyway-core-8.5.13.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":13,"message":{"text":"spring-boot-2.7.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":13,"message":{"text":"spring-jdbc-5.3.21.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":12,"message":{"text":"spring-boot-actuator-2.7.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":11,"message":{"text":"spring-data-commons-2.7.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":9,"message":{"text":"guava-30.1-jre.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":9,"message":{"text":"jaxb-api-2.3.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":8,"message":{"text":"lombok-1.18.24.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":8,"message":{"text":"jsoup-1.15.4.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":6,"message":{"text":"spring-boot-autoconfigure-2.7.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":6,"message":{"text":"spring-data-jpa-2.7.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":6,"message":{"text":"jcommander-1.81.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":4,"message":{"text":"commons-exec-1.3.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":4,"message":{"text":"spring-security-crypto-5.7.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":4,"message":{"text":"thymeleaf-spring5-3.0.15.RELEASE.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":3,"message":{"text":"log4j-api-2.17.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":2,"message":{"text":"commons-text-1.9.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":2,"message":{"text":"commons-io-2.6.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":2,"message":{"text":"spring-security-web-5.7.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":1,"message":{"text":"spring-jcl-5.3.21.jar"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":83,"message":{"text":"io.restassured.RestAssured#given()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":82,"message":{"text":"io.restassured.specification.RequestSpecification#relaxedHTTPSValidation()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":82,"message":{"text":"io.restassured.specification.RequestSpecification#when()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":81,"message":{"text":"io.restassured.response.Validatable#then()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":79,"message":{"text":"io.restassured.specification.RequestSpecification#cookie(String,Object,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":66,"message":{"text":"io.restassured.response.ValidatableResponseOptions#extract()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":59,"message":{"text":"io.restassured.response.ValidatableResponseOptions#statusCode(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":48,"message":{"text":"io.restassured.specification.RequestSenderOptions#get(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":40,"message":{"text":"org.slf4j.LoggerFactory#getLogger(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":32,"message":{"text":"io.restassured.specification.RequestSenderOptions#post(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":25,"message":{"text":"java.time.LocalDateTime#now()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":23,"message":{"text":"io.restassured.response.ResponseBodyExtractionOptions#path(String,String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":22,"message":{"text":"io.restassured.response.ResponseBodyData#asString()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":19,"message":{"text":"io.jsonwebtoken.JwtBuilder#compact()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":19,"message":{"text":"io.jsonwebtoken.Jwts#builder()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":18,"message":{"text":"io.restassured.specification.RequestSpecification#contentType(ContentType)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":18,"message":{"text":"io.restassured.specification.RequestSpecification#header(String,Object,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":17,"message":{"text":"javax.servlet.http.HttpServletRequest#getSession()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":16,"message":{"text":"io.restassured.specification.RequestSpecification#formParam(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":15,"message":{"text":"io.jsonwebtoken.JwtBuilder#signWith(SignatureAlgorithm,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":14,"message":{"text":"java.sql.Connection#createStatement(int,int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":14,"message":{"text":"java.time.LocalDateTime#format(DateTimeFormatter)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":14,"message":{"text":"io.restassured.response.ResponseBodyExtractionOptions#jsonPath()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":14,"message":{"text":"org.springframework.web.servlet.ModelAndView#addObject(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":13,"message":{"text":"org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry#addResourceHandler(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":13,"message":{"text":"org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration#addResourceLocations(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":12,"message":{"text":"org.springframework.http.ResponseEntity#status(HttpStatus)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":12,"message":{"text":"org.springframework.util.StringUtils#hasText(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":12,"message":{"text":"io.jsonwebtoken.JwtBuilder#setClaims(Claims)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":12,"message":{"text":"java.lang.reflect.Method#getAnnotation(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":12,"message":{"text":"io.restassured.response.ExtractableResponse#response()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":11,"message":{"text":"java.sql.ResultSet#first()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":11,"message":{"text":"java.sql.ResultSet#getString(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":11,"message":{"text":"io.restassured.response.ResponseOptions#getBody()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":11,"message":{"text":"org.springframework.web.servlet.ModelAndView#setViewName(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":11,"message":{"text":"java.util.stream.Stream#collect(Collector)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":10,"message":{"text":"io.jsonwebtoken.Jwts#parser()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":10,"message":{"text":"java.util.Random#nextInt(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":10,"message":{"text":"java.util.Base64#getEncoder()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":10,"message":{"text":"javax.servlet.http.HttpSession#getAttribute(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":10,"message":{"text":"org.springframework.core.io.ResourceLoader#getResource(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":9,"message":{"text":"org.apache.commons.lang3.StringUtils#isEmpty(CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":9,"message":{"text":"io.jsonwebtoken.JwtBuilder#claim(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":9,"message":{"text":"io.restassured.path.json.JsonPath#getString(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"java.util.Date#from(Instant)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"io.jsonwebtoken.JwtParser#setSigningKey(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"javax.servlet.http.HttpSession#setAttribute(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"java.lang.System#getProperty(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"io.restassured.specification.RequestSpecification#formParams(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"org.springframework.boot.actuate.trace.http.Request#getUri()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"io.jsonwebtoken.JwtParser#parse(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"lombok.Lombok#sneakyThrow(Throwable)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"org.springframework.security.core.context.SecurityContext#getAuthentication()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"io.jsonwebtoken.Jwts#claims()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"org.springframework.core.env.PropertyResolver#getProperty(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"org.springframework.security.config.annotation.web.configurers.ExpressionInterceptUrlRegistry#and()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"org.springframework.security.core.Authentication#getPrincipal()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"java.lang.Throwable#printStackTrace()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"java.util.Base64#getDecoder()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"java.lang.String#lastIndexOf(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"io.jsonwebtoken.Jwt#getBody()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"org.springframework.security.core.context.SecurityContextHolder#getContext()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"java.sql.PreparedStatement#executeQuery()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"com.beust.jcommander.internal.Lists#newArrayList(Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"javax.xml.bind.DatatypeConverter#printHexBinary(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"io.restassured.specification.RequestSpecification#multiPart(String,String,byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"org.asciidoctor.extension.JavaExtensionRegistry#inlineMacro(String,Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"org.springframework.web.servlet.config.annotation.ViewControllerRegistration#setViewName(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"org.springframework.web.servlet.config.annotation.ViewControllerRegistry#addViewController(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"java.util.HashMap#containsKey(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#enable(DeserializationFeature)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"io.jsonwebtoken.JwtBuilder#setIssuedAt(Date)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"org.springframework.http.ResponseEntity#ok()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"java.util.List#of()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"org.springframework.data.jpa.repository.JpaRepository#saveAndFlush(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"org.asciidoctor.extension.InlineMacroProcessor#InlineMacroProcessor(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"java.io.File#getParentFile()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"org.springframework.web.servlet.ModelAndView#ModelAndView(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"com.nulabinc.zxcvbn.Strength#getScore()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"java.net.URI#getPath()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"io.restassured.response.ExtractableResponse#cookie(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"java.time.format.DateTimeFormatter#ofPattern(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"java.sql.ResultSet#getMetaData()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"org.springframework.validation.Errors#hasErrors()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"org.asciidoctor.extension.InlineMacroProcessor#InlineMacroProcessor(String,Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"io.jsonwebtoken.JwtBuilder#setHeaderParam(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"java.time.Duration#ofDays(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.security.interfaces.RSAKey#getModulus()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"io.jsonwebtoken.impl.TextCodec#encode(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.util.function.Supplier#get()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.util.Base64#getUrlDecoder()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"io.restassured.response.ValidatableResponseOptions#cookie(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"io.restassured.path.json.JsonPath#get(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.util.Base64#getUrlEncoder()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.asciidoctor.extension.BaseProcessor#createPhraseNode(ContentNode,String,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"io.restassured.specification.RequestSpecification#body(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.io.File#mkdirs()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.http.HttpStatus#value()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.io.FileInputStream#FileInputStream(File)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.util.StringUtils#isEmpty(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.util.Calendar#getTime()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.google.common.collect.Lists#newArrayList()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.nulabinc.zxcvbn.Strength#getFeedback()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.core.io.ClassPathResource#ClassPathResource(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.core.io.InputStreamSource#getInputStream()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.nio.charset.Charset#defaultCharset()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.http.converter.json.MappingJacksonValue#setSerializationView(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.nio.file.Files#readAllBytes(Path)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.jdbc.core.namedparam.MapSqlParameterSource#addValue(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.util.Calendar#getInstance()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.thoughtworks.xstream.XStream#ignoreUnknownElements()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.security.KeyPair#getPublic()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.thoughtworks.xstream.XStream#setClassLoader(ClassLoader)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.thoughtworks.xstream.XStream#alias(String,Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.thoughtworks.xstream.XStream#fromXML(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.sql.ResultSet#getRow()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.sql.ResultSet#last()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.sql.ResultSet#beforeFirst()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.web.servlet.ModelAndView#getViewName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.thymeleaf.templateresolver.AbstractTemplateResolver#setOrder(Integer)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.thymeleaf.templateresource.StringTemplateResource#StringTemplateResource(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.JwtBuilder#setSubject(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"com.fasterxml.jackson.databind.JsonNode#toString()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.apache.commons.lang3.RandomStringUtils#randomAlphabetic(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AuthorizedUrl#authenticated()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.validation.BeanPropertyBindingResult#BeanPropertyBindingResult(Object,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#readTree(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.sql.Connection#createStatement()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.sql.PreparedStatement#execute()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.restassured.path.json.JsonPath#getList(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.core.io.ClassPathResource#getInputStream()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.sql.ResultSetMetaData#getColumnCount()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.sql.ResultSet#getStatement()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.time.Instant#plus(TemporalAmount)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.security.MessageDigest#getInstance(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.web.context.request.RequestContextHolder#currentRequestAttributes()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.web.context.request.ServletRequestAttributes#getRequest()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.JwtBuilder#setExpiration(Date)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer#loginPage(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.JwtBuilder#setAudience(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.util.function.Function#apply(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.JwtBuilder#setClaims(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.Claims#setIssuedAt(Date)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.util.Locale#getLanguage()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.lang.Class#getPackageName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.core.env.EnvironmentCapable#getEnvironment()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver#setCharacterEncoding(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.boot.autoconfigure.jdbc.DataSourceProperties#getDriverClassName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.nio.charset.Charset#forName(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.boot.context.event.ApplicationReadyEvent#getApplicationContext()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.http.MediaType#parseMediaType(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#formLogin()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#web(WebApplicationType)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.context.support.PropertiesHolder#getProperties()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.time.Instant#plusSeconds(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#authorizeRequests()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.JwtBuilder#setIssuer(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.core.userdetails.UserDetails#getUsername()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.net.URI#getQuery()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.flywaydb.core.Flyway#migrate()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.apache.logging.log4j.util.Strings#isEmpty(CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.restassured.specification.RequestSpecification#formParams(String,Object,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.util.stream.Collectors#toMap(Function,Function)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.apache.commons.lang3.exception.ExceptionUtils#getStackTrace(Throwable)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"com.fasterxml.jackson.databind.node.ObjectNode#put(String,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.boot.actuate.trace.http.HttpTrace#getRequest()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.util.concurrent.TimeUnit#toDays(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.core.token.Sha512DigestUtils#shaHex(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.lang.Throwable#toString()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.restassured.specification.RequestSpecification#queryParams(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.UsernameNotFoundException#UsernameNotFoundException(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.apache.commons.text.StringEscapeUtils#escapeJson(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.apache.commons.lang3.StringUtils#contains(CharSequence,CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.restassured.specification.RequestSenderOptions#put(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.crypto.password.NoOpPasswordEncoder#getInstance()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.apache.commons.exec.OS#isFamilyMac()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.apache.commons.exec.OS#isFamilyUnix()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.sql.ResultSetMetaData#getColumnName(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.time.format.DateTimeFormatter#format(TemporalAccessor)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.xml.stream.XMLInputFactory#setProperty(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.jsonwebtoken.JwtParser#parseClaimsJws(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.util.Properties#stringPropertyNames()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.util.Comparator#reversed()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.http.HttpServletResponse#setStatus(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.http.HttpServletRequest#getMethod()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.util.stream.IntStream#range(int,int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.http.ResponseEntity#badRequest()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.http.ResponseEntity#accepted()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.jsoup.select.Elements#first()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.lang.String#isBlank()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.jsoup.nodes.Element#select(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.jsoup.nodes.Element#text()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.http.HttpServletRequest#getUserPrincipal()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.util.CollectionUtils#isEmpty(Collection)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.lang.String#lastIndexOf(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.io.File#listFiles()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.jsonwebtoken.impl.TextCodec#decode(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.jose4j.keys.HmacKey#HmacKey(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.http.Cookie#setPath(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.ConfigurableApplicationContext#getEnvironment()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.restassured.specification.RequestSpecification#param(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.http.Cookie#setSecure(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.api.configuration.FluentConfiguration#configuration(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#bannerMode(Mode)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"com.fasterxml.jackson.databind.JsonNode#size()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"com.nulabinc.zxcvbn.Feedback#getSuggestions()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"com.nulabinc.zxcvbn.Feedback#getWarning()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractResourceBasedMessageSource#setFallbackToSystemLocale(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractResourceBasedMessageSource#setDefaultEncoding(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractResourceBasedMessageSource#setBasenames(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractResourceBasedMessageSource#setBasename(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.DefaultMessageSourceResolvable#getCode()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.ServletResponse#setContentType(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.ReloadableResourceBundleMessageSource#getMergedProperties(Locale)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.api.configuration.FluentConfiguration#load()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.core.io.Resource#isReadable()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.api.configuration.FluentConfiguration#locations(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.core.io.support.ResourcePatternResolver#getResources(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.jsonwebtoken.JwtParser#setSigningKeyResolver(SigningKeyResolver)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.util.Comparator#comparing(Function)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.nio.file.Files#delete(Path)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#reader()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.thymeleaf.templateresolver.AbstractTemplateResolver#setResolvablePatterns(Set)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.lang.reflect.Method#getGenericReturnType()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver#setCacheable(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.time.Instant#minus(TemporalAmount)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder#userDetailsService(UserDetailsService)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.AbstractRequestMatcherRegistry#antMatchers(HttpMethod,String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.AbstractRequestMatcherRegistry#anyRequest()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#logout()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#csrf()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"com.fasterxml.jackson.databind.ObjectReader#readTree(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer#disable()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.security.MessageDigest#digest()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer#permitAll()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer#defaultSuccessUrl(String,boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.security.MessageDigest#update(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AuthorizedUrl#permitAll()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.api.configuration.FluentConfiguration#schemas(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.security.Principal#getName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.security.Signature#update(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.jsonwebtoken.Claims#setExpiration(Date)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.api.configuration.FluentConfiguration#dataSource(DataSource)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#authenticationManager()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.security.Signature#getInstance(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.Flyway#configure()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.User#isCredentialsNonExpired()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.User#isAccountNonLocked()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.User#isAccountNonExpired()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.User#isEnabled()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.User#User(String,String,Collection)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver#setTemplateMode(TemplateMode)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver#setSuffix(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver#setPrefix(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.w3c.dom.NodeList#getLength()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.w3c.dom.NodeList#item(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.w3c.dom.Node#getTextContent()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.w3c.dom.Node#getNodeName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.time.LocalDateTime#isBefore(ChronoLocalDateTime)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.HashMap#size()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Collection#contains(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.List#sort(Comparator)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.List#remove(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.ArrayList#sort(Comparator)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.ArrayList#clear()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Set#clear()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Set#containsAll(Collection)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Comparator#comparingLong(ToLongFunction)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Arrays#equals(byte\\[\\],byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Collections#reverse(List)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Enumeration#hasMoreElements()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Locale#getDefault()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Properties#containsKey(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Properties#load(InputStream)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Random#nextLong()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Random#nextInt()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Random#setSeed(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Boolean#valueOf(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Class#getAnnotationsByType(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Class#isAnnotationPresent(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Class#getResourceAsStream(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Class#getMethods()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.IllegalStateException#IllegalStateException(Throwable)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Integer#sum(int,int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Math#round(double)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Math#ceil(double)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Process#getInputStream()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Runtime#exec(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Runtime#getRuntime()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.String#valueOf(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.String#indexOf(String,int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.System#exit(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#writerWithDefaultPrettyPrinter()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#addMixIn(Class,Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.reflect.InvocationTargetException#getTargetException()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.reflect.Method#invoke(Object,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.reflect.Method#getReturnType()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.reflect.ParameterizedType#getActualTypeArguments()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.reflect.Proxy#newProxyInstance(ClassLoader,Class\\[\\],InvocationHandler)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.function.DoublePredicate#test(double)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.concurrent.Future#get()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.concurrent.ExecutorService#invokeAll(Collection)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.concurrent.Executors#newWorkStealingPool(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.concurrent.ThreadLocalRandom#nextDouble()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.concurrent.ThreadLocalRandom#current()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.Collectors#groupingBy(Function)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.Collectors#counting()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.IntStream#sum()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.IntStream#reduce(int,IntBinaryOperator)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.IntStream#forEach(IntConsumer)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.IntStream#mapToObj(IntFunction)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.Stream#count()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.google.common.collect.EvictingQueue#create(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.google.common.collect.Maps#newHashMap()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.nulabinc.zxcvbn.CrackTimeSeconds#getOnlineNoThrottling10perSecond()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.nulabinc.zxcvbn.Strength#getCrackTimeSeconds()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.nulabinc.zxcvbn.Strength#getGuesses()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.nulabinc.zxcvbn.Zxcvbn#measure(CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.ClaimJwtException#getClaims()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.Claims#setAudience(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.Claims#setSubject(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.Claims#setIssuer(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.Jwt#getHeader()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.JwtBuilder#addClaims(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.JwtBuilder#setHeader(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ExtractableResponse#header(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ResponseOptions#getStatusCode()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ResponseOptions#andReturn()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ResponseBodyData#asByteArray()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ValidatableResponseOptions#body(String,Matcher,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ValidatableResponseOptions#body(Matcher,Matcher\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.path.json.JsonPath#getObject(String,Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.specification.RequestSenderOptions#delete(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.specification.RequestSpecification#urlEncodingEnabled(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.specification.RequestSpecification#params(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.DataOutputStream#writeLong(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.DataOutputStream#DataOutputStream(OutputStream)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#mkdir()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#listFiles(FileFilter)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#delete()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#createNewFile()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#length()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#isFile()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.FileInputStream#FileInputStream(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.FilterOutputStream#close()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.ObjectInputStream#close()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.ObjectInputStream#defaultReadObject()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.ObjectOutputStream#close()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.ObjectOutputStream#ObjectOutputStream(OutputStream)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.PrintStream#println()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.net.InetAddress#getLocalHost()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.net.InetAddress#getHostAddress()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.net.URI#getHost()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.net.URI#getScheme()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.net.URL#toString()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.nio.charset.Charset#displayName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.Key#getEncoded()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyFactory#generatePrivate(KeySpec)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyFactory#getInstance(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyPair#getPrivate()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyPairGenerator#generateKeyPair()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyPairGenerator#initialize(AlgorithmParameterSpec)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyPairGenerator#getInstance(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.MessageDigest#digest(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.Signature#verify(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.Signature#sign()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.Signature#initSign(PrivateKey)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.Signature#initVerify(PublicKey)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.interfaces.RSAPublicKey#getPublicExponent()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.spec.PKCS8EncodedKeySpec#PKCS8EncodedKeySpec(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.spec.RSAKeyGenParameterSpec#RSAKeyGenParameterSpec(int,BigInteger)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.sql.Connection#commit()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.sql.ResultSet#getBoolean(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.sql.Wrapper#isWrapperFor(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.sql.Wrapper#unwrap(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.text.DecimalFormatSymbols#getInstance(Locale)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.text.DecimalFormat#setMaximumFractionDigits(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.text.DecimalFormat#DecimalFormat(String,DecimalFormatSymbols)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.text.NumberFormat#format(double)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.time.Instant#toEpochMilli()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.time.LocalDateTime#isAfter(ChronoLocalDateTime)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.time.LocalDateTime#minusMinutes(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.regex.Matcher#find()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipEntry#getName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipEntry#ZipEntry(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipFile#entries()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipFile#getInputStream(ZipEntry)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipFile#ZipFile(File)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipOutputStream#putNextEntry(ZipEntry)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipOutputStream#ZipOutputStream(OutputStream)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.servlet.ServletRequest#getContentType()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.servlet.http.Cookie#setMaxAge(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.servlet.http.HttpServletRequest#login(String,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.servlet.http.HttpServletRequest#getCookies()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.CommonDataSource#getParentLogger()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#getLoginTimeout()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#setLoginTimeout(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#setLogWriter(PrintWriter)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#getLogWriter()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#getConnection(String,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#getConnection()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.Diagnostic#getMessage(Locale)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.DiagnosticCollector#getDiagnostics()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.CompilationTask#call()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.SimpleJavaFileObject#SimpleJavaFileObject(URI,Kind)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.JavaCompiler#getStandardFileManager(DiagnosticListener,Locale,Charset)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.JavaCompiler#getTask(Writer,JavaFileManager,DiagnosticListener,Iterable,Iterable,Iterable)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.ToolProvider#getSystemJavaCompiler()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.bind.JAXBContext#createUnmarshaller()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.bind.JAXBContext#newInstance(Class\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.bind.Unmarshaller#unmarshal(XMLStreamReader)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.stream.XMLInputFactory#createXMLStreamReader(Reader)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.stream.XMLInputFactory#newInstance()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.xpath.XPathFactory#newXPath()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.xpath.XPathFactory#newInstance()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.apache.commons.lang3.RandomUtils#nextInt(int,int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.apache.commons.lang3.StringUtils#isNotEmpty(CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.asciidoctor.Factory#create()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.asciidoctor.Asciidoctor#javaExtensionRegistry()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.asciidoctor.Asciidoctor#convert(Reader,Writer,Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.asciidoctor.ast.PhraseNode#convert()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.asciidoctor.extension.BaseProcessor#createPhraseNode(ContentNode,String,String,Map,Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.flywaydb.core.Flyway#clean()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jws.JsonWebSignature#getEncodedPayload()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jws.JsonWebSignature#getCompactSerialization()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jws.JsonWebSignature#setPayload(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwt.consumer.JwtConsumer#processToClaims(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwt.consumer.JwtConsumerBuilder#build()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwt.consumer.JwtConsumerBuilder#setRelaxVerificationKeyValidation()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwt.consumer.JwtConsumerBuilder#setVerificationKey(Key)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwt.consumer.JwtConsumerBuilder#setSkipAllValidators()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.CompactSerializer#serialize(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.Headers#getEncodedHeader()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.JsonWebStructure#setDoKeyValidation(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.JsonWebStructure#setKey(Key)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.JsonWebStructure#setHeader(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.JsonWebStructure#getHeaders()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jsoup.Jsoup#parse(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jsoup.parser.Parser#unescapeEntities(String,boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.http.HttpMethod#matches(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.http.ResponseEntity#notFound()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.http.ResponseEntity#status(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.data.repository.CrudRepository#deleteAll()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.owasp.webgoat.lessons.challenges.Flag#number()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.util.FileSystemUtils#deleteRecursively(File)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.slf4j.LoggerFactory#getLogger(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.context.ApplicationContext#getApplicationName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.actuate.trace.http.HttpTrace#getTimestamp()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.autoconfigure.jdbc.DataSourceProperties#getPassword()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.autoconfigure.jdbc.DataSourceProperties#getUsername()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.autoconfigure.jdbc.DataSourceProperties#getUrl()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#sibling(Class\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#parent(Class\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#child(Class\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#run(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#SpringApplicationBuilder(Class\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.context.support.AbstractMessageSource#setParentMessageSource(MessageSource)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.context.support.PropertiesHolder#PropertiesHolder(Properties,long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.context.support.ReloadableResourceBundleMessageSource#refreshProperties(String,PropertiesHolder)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.core.io.Resource#getURI()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.core.io.Resource#getURL()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.http.converter.json.MappingJacksonValue#MappingJacksonValue(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate#update(String,SqlParameterSource)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate#query(String,RowMapper)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate#query(String,SqlParameterSource,RowMapper)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate#NamedParameterJdbcTemplate(DataSource)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.datasource.AbstractDriverBasedDataSource#setPassword(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.datasource.AbstractDriverBasedDataSource#setUsername(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.datasource.DriverManagerDataSource#setDriverClassName(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.AbstractRequestMatcherRegistry#antMatchers(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#exceptionHandling()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#headers()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer#failureUrl(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.ExceptionHandlingConfigurer#authenticationEntryPoint(AuthenticationEntryPoint)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer#passwordParameter(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer#usernameParameter(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.CacheControlConfig#disable()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.HeadersConfigurer#cacheControl()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.LogoutConfigurer#deleteCookies(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.LogoutConfigurer#permitAll()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.LogoutConfigurer#invalidateHttpSession(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.core.userdetails.User#hashCode()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.core.userdetails.User#equals(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.core.authority.SimpleGrantedAuthority#SimpleGrantedAuthority(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.crypto.codec.Hex#decode(CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.crypto.codec.Hex#encode(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint#commence(HttpServletRequest,HttpServletResponse,AuthenticationException)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint#LoginUrlAuthenticationEntryPoint(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.RequestMapping#path()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.RequestMapping#value()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.GetMapping#value()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.GetMapping#path()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.PostMapping#value()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.PostMapping#path()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.PutMapping#path()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.PutMapping#value()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.multipart.MultipartFile#transferTo(File)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.multipart.MultipartFile#isEmpty()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.servlet.LocaleResolver#resolveLocale(HttpServletRequest)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.servlet.ModelAndView#ModelAndView(View,Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.servlet.config.annotation.InterceptorRegistry#addInterceptor(HandlerInterceptor)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.servlet.i18n.LocaleChangeInterceptor#setParamName(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.servlet.view.RedirectView#RedirectView(String,boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.TemplateEngine#setTemplateResolvers(Set)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.TemplateEngine#addDialect(IDialect)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.spring5.SpringTemplateEngine#setEnableSpringELCompiler(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver#setApplicationContext(ApplicationContext)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.spring5.view.ThymeleafViewResolver#setCharacterEncoding(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.spring5.view.ThymeleafViewResolver#setTemplateEngine(ISpringTemplateEngine)"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":5571,"message":{"text":"Number of files"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":31145,"message":{"text":"Total number of lines"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":20314,"message":{"text":"Number of lines of code"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":15,"message":{"text":"Number of files with extension xml"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":75,"message":{"text":"Number of files with extension jar"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":349,"message":{"text":"Number of files with extension java"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":5131,"message":{"text":"Number of files with extension class"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":3925,"message":{"text":"Total number of lines with extension xml"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":27220,"message":{"text":"Total number of lines with extension java"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":3925,"message":{"text":"Number of lines of code with extension xml"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":16389,"message":{"text":"Number of lines of code with extension java"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":2,"message":{"text":"Number of diagnostics from CodeQL Java extractor with severity 2"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":75,"message":{"text":"Number of diagnostics from CodeQL Java extractor with severity 3"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":3,"message":{"text":"Number of diagnostics from CodeQL Java extractor with severity 4"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":80,"message":{"text":"Total number of diagnostics from CodeQL Java extractor"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":15,"message":{"text":"javax.servlet.http.HttpServletRequest#getHeader(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":5,"message":{"text":"org.springframework.web.multipart.MultipartFile#getOriginalFilename()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":4,"message":{"text":"org.springframework.web.client.RestTemplate#postForEntity(String,Object,Class,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":4,"message":{"text":"javax.servlet.http.HttpServletRequest#getRequestURL()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":4,"message":{"text":"javax.servlet.ServletRequest#getParameter(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":2,"message":{"text":"org.springframework.web.multipart.MultipartFile#getBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":1,"message":{"text":"javax.servlet.ServletRequest#getParameterNames()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":1,"message":{"text":"javax.servlet.http.Cookie#getValue()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":1,"message":{"text":"javax.servlet.http.Cookie#getName()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":1,"message":{"text":"javax.servlet.http.HttpServletRequest#getQueryString()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":1,"message":{"text":"org.springframework.web.client.RestTemplate#exchange(String,HttpMethod,HttpEntity,Class,Object\\[\\])"}}],"semmle.formatSpecifier":"sarif-latest"}}]} \ No newline at end of file +{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"CodeQL","organization":"GitHub","semanticVersion":"2.12.2","notifications":[{"id":"java/baseline/expected-extracted-files","name":"java/baseline/expected-extracted-files","shortDescription":{"text":"Expected extracted files"},"fullDescription":{"text":"Files appearing in the source archive that are expected to be extracted."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["expected-extracted-files","telemetry"]}},{"id":"js/baseline/expected-extracted-files","name":"js/baseline/expected-extracted-files","shortDescription":{"text":"Expected extracted files"},"fullDescription":{"text":"Files appearing in the source archive that are expected to be extracted."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["expected-extracted-files","telemetry"]}}],"rules":[]},"extensions":[{"name":"codeql/java-all","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-all/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-all/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/javascript-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/java-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/cpp-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/regex","semanticVersion":"0.0.6+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/regex/0.0.6/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/regex/0.0.6/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/csharp-queries","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-queries/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-queries/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/tutorial","semanticVersion":"0.0.3+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/tutorial/0.0.3/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/tutorial/0.0.3/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/ssa","semanticVersion":"0.0.10+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ssa/0.0.10/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ssa/0.0.10/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/util","semanticVersion":"0.0.3+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/util/0.0.3/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/util/0.0.3/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/ruby-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/typos","semanticVersion":"0.0.10+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/typos/0.0.10/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/typos/0.0.10/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/ruby-all","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-all/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-all/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/csharp-all","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-all/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-all/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/javascript-all","semanticVersion":"0.4.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-all/0.4.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-all/0.4.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/python-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/csharp-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/csharp-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"legacy-upgrades","semanticVersion":"0.0.0","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/legacy-upgrades/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/legacy-upgrades/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/go-all","semanticVersion":"0.4.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-all/0.4.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-all/0.4.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/java-queries","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","notifications":[{"id":"java/diagnostics/extraction-errors","name":"java/diagnostics/extraction-errors","shortDescription":{"text":"Extraction errors"},"fullDescription":{"text":"A list of extraction errors for files in the source code directory."},"defaultConfiguration":{"enabled":true},"properties":{"description":"A list of extraction errors for files in the source code directory.","id":"java/diagnostics/extraction-errors","kind":"diagnostic","name":"Extraction errors"}},{"id":"java/diagnostics/successfully-extracted-files","name":"java/diagnostics/successfully-extracted-files","shortDescription":{"text":"Successfully extracted files"},"fullDescription":{"text":"A list of all files in the source code directory that were extracted without encountering an error in the file."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["successfully-extracted-files"],"description":"A list of all files in the source code directory that\n were extracted without encountering an error in the file.","id":"java/diagnostics/successfully-extracted-files","kind":"diagnostic","name":"Successfully extracted files"}},{"id":"java/diagnostics/extraction-warnings","name":"java/diagnostics/extraction-warnings","shortDescription":{"text":"Extraction warnings"},"fullDescription":{"text":"A list of extraction warnings for files in the source code directory."},"defaultConfiguration":{"enabled":true},"properties":{"description":"A list of extraction warnings for files in the source code directory.","id":"java/diagnostics/extraction-warnings","kind":"diagnostic","name":"Extraction warnings"}}],"rules":[{"id":"java/implicit-cast-in-compound-assignment","name":"java/implicit-cast-in-compound-assignment","shortDescription":{"text":"Implicit narrowing conversion in compound assignment"},"fullDescription":{"text":"Compound assignment statements (for example 'intvar += longvar') that implicitly cast a value of a wider type to a narrower type may result in information loss and numeric errors such as overflows."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Implicit narrowing conversion in compound assignment\nCompound assignment statements of the form `x += y` or `x *= y` perform an implicit narrowing conversion if the type of `x` is narrower than the type of `y`. For example, `x += y` is equivalent to `x = (T)(x + y)`, where `T` is the type of `x`. This can result in information loss and numeric errors such as overflows.\n\n\n## Recommendation\nEnsure that the type of the left-hand side of the compound assignment statement is at least as wide as the type of the right-hand side.\n\n\n## Example\nIf `x` is of type `short` and `y` is of type `int`, the expression `x + y` is of type `int`. However, the expression `x += y` is equivalent to `x = (short) (x + y)`. The expression `x + y` is cast to the type of the left-hand side of the assignment: `short`, possibly leading to information loss.\n\nTo avoid implicitly narrowing the type of `x + y`, change the type of `x` to `int`. Then the types of `x` and `x + y` are both `int` and there is no need for an implicit cast.\n\n\n## References\n* J. Bloch and N. Gafter, *Java Puzzlers: Traps, Pitfalls, and Corner Cases*, Puzzle 9. Addison-Wesley, 2005.\n* Java Language Specification: [Compound Assignment Operators](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.26.2), [Narrowing Primitive Conversion](https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.1.3).\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-192](https://cwe.mitre.org/data/definitions/192.html).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n* Common Weakness Enumeration: [CWE-681](https://cwe.mitre.org/data/definitions/681.html).\n","markdown":"# Implicit narrowing conversion in compound assignment\nCompound assignment statements of the form `x += y` or `x *= y` perform an implicit narrowing conversion if the type of `x` is narrower than the type of `y`. For example, `x += y` is equivalent to `x = (T)(x + y)`, where `T` is the type of `x`. This can result in information loss and numeric errors such as overflows.\n\n\n## Recommendation\nEnsure that the type of the left-hand side of the compound assignment statement is at least as wide as the type of the right-hand side.\n\n\n## Example\nIf `x` is of type `short` and `y` is of type `int`, the expression `x + y` is of type `int`. However, the expression `x += y` is equivalent to `x = (short) (x + y)`. The expression `x + y` is cast to the type of the left-hand side of the assignment: `short`, possibly leading to information loss.\n\nTo avoid implicitly narrowing the type of `x + y`, change the type of `x` to `int`. Then the types of `x` and `x + y` are both `int` and there is no need for an implicit cast.\n\n\n## References\n* J. Bloch and N. Gafter, *Java Puzzlers: Traps, Pitfalls, and Corner Cases*, Puzzle 9. Addison-Wesley, 2005.\n* Java Language Specification: [Compound Assignment Operators](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.26.2), [Narrowing Primitive Conversion](https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.1.3).\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-192](https://cwe.mitre.org/data/definitions/192.html).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n* Common Weakness Enumeration: [CWE-681](https://cwe.mitre.org/data/definitions/681.html).\n"},"properties":{"tags":["reliability","security","external/cwe/cwe-190","external/cwe/cwe-192","external/cwe/cwe-197","external/cwe/cwe-681"],"description":"Compound assignment statements (for example 'intvar += longvar') that implicitly\n cast a value of a wider type to a narrower type may result in information loss and\n numeric errors such as overflows.","id":"java/implicit-cast-in-compound-assignment","kind":"problem","name":"Implicit narrowing conversion in compound assignment","precision":"very-high","problem.severity":"warning","security-severity":"8.1"}},{"id":"java/predictable-seed","name":"java/predictable-seed","shortDescription":{"text":"Use of a predictable seed in a secure random number generator"},"fullDescription":{"text":"Using a predictable seed in a pseudo-random number generator can lead to predictability of the numbers generated by it."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Use of a predictable seed in a secure random number generator\nUsing a predictable seed in a pseudo-random number generator can lead to predictability of the numbers generated by it.\n\n\n## Recommendation\nIf the predictability of the pseudo-random number generator does not matter then consider using the faster `Random` class from `java.util`. If it is important that the pseudo-random number generator produces completely unpredictable values then either let the generator securely seed itself by not specifying a seed or specify a randomly generated, unpredictable seed.\n\n\n## Example\nIn the first example shown here, a constant value is used as a seed. Depending on the implementation of ` SecureRandom`, this could lead to the same random number being generated each time the code is executed.\n\nIn the second example shown here, the system time is used as a seed. Depending on the implementation of ` SecureRandom`, if an attacker knows what time the code was run, they could predict the generated random number.\n\nIn the third example shown here, the random number generator is allowed to generate its own seed, which it will do in a secure way.\n\n\n```java\nSecureRandom prng = new SecureRandom();\nint randomData = 0;\n\n// BAD: Using a constant value as a seed for a random number generator means all numbers it generates are predictable.\nprng.setSeed(12345L);\nrandomData = prng.next(32);\n\n// BAD: System.currentTimeMillis() returns the system time which is predictable.\nprng.setSeed(System.currentTimeMillis());\nrandomData = prng.next(32);\n\n// GOOD: SecureRandom implementations seed themselves securely by default.\nprng = new SecureRandom();\nrandomData = prng.next(32);\n\n```\n\n## References\n* Common Weakness Enumeration: [CWE-335](https://cwe.mitre.org/data/definitions/335.html).\n* Common Weakness Enumeration: [CWE-337](https://cwe.mitre.org/data/definitions/337.html).\n","markdown":"# Use of a predictable seed in a secure random number generator\nUsing a predictable seed in a pseudo-random number generator can lead to predictability of the numbers generated by it.\n\n\n## Recommendation\nIf the predictability of the pseudo-random number generator does not matter then consider using the faster `Random` class from `java.util`. If it is important that the pseudo-random number generator produces completely unpredictable values then either let the generator securely seed itself by not specifying a seed or specify a randomly generated, unpredictable seed.\n\n\n## Example\nIn the first example shown here, a constant value is used as a seed. Depending on the implementation of ` SecureRandom`, this could lead to the same random number being generated each time the code is executed.\n\nIn the second example shown here, the system time is used as a seed. Depending on the implementation of ` SecureRandom`, if an attacker knows what time the code was run, they could predict the generated random number.\n\nIn the third example shown here, the random number generator is allowed to generate its own seed, which it will do in a secure way.\n\n\n```java\nSecureRandom prng = new SecureRandom();\nint randomData = 0;\n\n// BAD: Using a constant value as a seed for a random number generator means all numbers it generates are predictable.\nprng.setSeed(12345L);\nrandomData = prng.next(32);\n\n// BAD: System.currentTimeMillis() returns the system time which is predictable.\nprng.setSeed(System.currentTimeMillis());\nrandomData = prng.next(32);\n\n// GOOD: SecureRandom implementations seed themselves securely by default.\nprng = new SecureRandom();\nrandomData = prng.next(32);\n\n```\n\n## References\n* Common Weakness Enumeration: [CWE-335](https://cwe.mitre.org/data/definitions/335.html).\n* Common Weakness Enumeration: [CWE-337](https://cwe.mitre.org/data/definitions/337.html).\n"},"properties":{"tags":["security","external/cwe/cwe-335","external/cwe/cwe-337","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using a predictable seed in a pseudo-random number generator can lead to predictability of the numbers generated by it.","id":"java/predictable-seed","kind":"problem","name":"Use of a predictable seed in a secure random number generator","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/android/intent-uri-permission-manipulation","name":"java/android/intent-uri-permission-manipulation","shortDescription":{"text":"Intent URI permission manipulation"},"fullDescription":{"text":"Returning an externally provided Intent via 'setResult' may allow a malicious application to access arbitrary content providers of the vulnerable application."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Intent URI permission manipulation\nWhen an Android component expects a result from an Activity, `startActivityForResult` can be used. The started Activity can then use `setResult` to return the appropriate data to the calling component.\n\nIf an Activity obtains the incoming, user-provided Intent and directly returns it via `setResult` without any checks, the application may be unintentionally giving arbitrary access to its content providers, even if they are not exported, as long as they are configured with the attribute `android:grantUriPermissions=\"true\"`. This happens because the attacker adds the appropriate URI permission flags to the provided Intent, which take effect once the Intent is reflected back.\n\n\n## Recommendation\nAvoid returning user-provided or untrusted Intents via `setResult`. Use a new Intent instead.\n\nIf it is required to use the received Intent, make sure that it does not contain URI permission flags, either by checking them with `Intent.getFlags` or removing them with `Intent.removeFlags`.\n\n\n## Example\nThe following sample contains three examples. In the first example, a user-provided Intent is obtained and directly returned back with `setResult`, which is dangerous. In the second example, a new Intent is created to safely return the desired data. The third example shows how the obtained Intent can be sanitized by removing dangerous flags before using it to return data to the calling component.\n\n\n```java\npublic class IntentUriPermissionManipulation extends Activity {\n\n // BAD: the user-provided Intent is returned as-is\n public void dangerous() {\n Intent intent = getIntent();\n intent.putExtra(\"result\", \"resultData\");\n setResult(intent);\n }\n\n // GOOD: a new Intent is created and returned\n public void safe() {\n Intent intent = new Intent();\n intent.putExtra(\"result\", \"resultData\");\n setResult(intent);\n }\n\n // GOOD: the user-provided Intent is sanitized before being returned\n public void sanitized() {\n Intent intent = getIntent();\n intent.putExtra(\"result\", \"resultData\");\n intent.removeFlags(\n Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);\n setResult(intent);\n }\n}\n\n```\n\n## References\n* Google Help: [Remediation for Intent Redirection Vulnerability](https://support.google.com/faqs/answer/9267555?hl=en).\n* Common Weakness Enumeration: [CWE-266](https://cwe.mitre.org/data/definitions/266.html).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n","markdown":"# Intent URI permission manipulation\nWhen an Android component expects a result from an Activity, `startActivityForResult` can be used. The started Activity can then use `setResult` to return the appropriate data to the calling component.\n\nIf an Activity obtains the incoming, user-provided Intent and directly returns it via `setResult` without any checks, the application may be unintentionally giving arbitrary access to its content providers, even if they are not exported, as long as they are configured with the attribute `android:grantUriPermissions=\"true\"`. This happens because the attacker adds the appropriate URI permission flags to the provided Intent, which take effect once the Intent is reflected back.\n\n\n## Recommendation\nAvoid returning user-provided or untrusted Intents via `setResult`. Use a new Intent instead.\n\nIf it is required to use the received Intent, make sure that it does not contain URI permission flags, either by checking them with `Intent.getFlags` or removing them with `Intent.removeFlags`.\n\n\n## Example\nThe following sample contains three examples. In the first example, a user-provided Intent is obtained and directly returned back with `setResult`, which is dangerous. In the second example, a new Intent is created to safely return the desired data. The third example shows how the obtained Intent can be sanitized by removing dangerous flags before using it to return data to the calling component.\n\n\n```java\npublic class IntentUriPermissionManipulation extends Activity {\n\n // BAD: the user-provided Intent is returned as-is\n public void dangerous() {\n Intent intent = getIntent();\n intent.putExtra(\"result\", \"resultData\");\n setResult(intent);\n }\n\n // GOOD: a new Intent is created and returned\n public void safe() {\n Intent intent = new Intent();\n intent.putExtra(\"result\", \"resultData\");\n setResult(intent);\n }\n\n // GOOD: the user-provided Intent is sanitized before being returned\n public void sanitized() {\n Intent intent = getIntent();\n intent.putExtra(\"result\", \"resultData\");\n intent.removeFlags(\n Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);\n setResult(intent);\n }\n}\n\n```\n\n## References\n* Google Help: [Remediation for Intent Redirection Vulnerability](https://support.google.com/faqs/answer/9267555?hl=en).\n* Common Weakness Enumeration: [CWE-266](https://cwe.mitre.org/data/definitions/266.html).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n"},"properties":{"tags":["security","external/cwe/cwe-266","external/cwe/cwe-926","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Returning an externally provided Intent via 'setResult' may allow a malicious\n application to access arbitrary content providers of the vulnerable application.","id":"java/android/intent-uri-permission-manipulation","kind":"path-problem","name":"Intent URI permission manipulation","precision":"high","problem.severity":"error","security-severity":"7.8"}},{"id":"java/android/debuggable-attribute-enabled","name":"java/android/debuggable-attribute-enabled","shortDescription":{"text":"Android debuggable attribute enabled"},"fullDescription":{"text":"An enabled debugger can allow for entry points in the application or reveal sensitive information."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android debuggable attribute enabled\nThe Android manifest file defines configuration settings for Android applications. In this file, the `android:debuggable` attribute of the `application` element can be used to define whether or not the application can be debugged. When set to `true`, this attribute will allow the application to be debugged even when running on a device in user mode.\n\nWhen a debugger is enabled, it could allow for entry points in the application or reveal sensitive information. As a result, `android:debuggable` should only be enabled during development and should be disabled in production builds.\n\n\n## Recommendation\nIn Android applications, either set the `android:debuggable` attribute to `false`, or do not include it in the manifest. The default value, when not included, is `false`.\n\n\n## Example\nIn the example below, the `android:debuggable` attribute is set to `true`.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\nThe corrected version sets the `android:debuggable` attribute to `false`.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Developers: [App Manifest Overview](https://developer.android.com/guide/topics/manifest/manifest-intro).\n* Android Developers: [The android:debuggable attribute](https://developer.android.com/guide/topics/manifest/application-element#debug).\n* Android Developers: [Enable debugging](https://developer.android.com/studio/debug#enable-debug).\n* Common Weakness Enumeration: [CWE-489](https://cwe.mitre.org/data/definitions/489.html).\n","markdown":"# Android debuggable attribute enabled\nThe Android manifest file defines configuration settings for Android applications. In this file, the `android:debuggable` attribute of the `application` element can be used to define whether or not the application can be debugged. When set to `true`, this attribute will allow the application to be debugged even when running on a device in user mode.\n\nWhen a debugger is enabled, it could allow for entry points in the application or reveal sensitive information. As a result, `android:debuggable` should only be enabled during development and should be disabled in production builds.\n\n\n## Recommendation\nIn Android applications, either set the `android:debuggable` attribute to `false`, or do not include it in the manifest. The default value, when not included, is `false`.\n\n\n## Example\nIn the example below, the `android:debuggable` attribute is set to `true`.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\nThe corrected version sets the `android:debuggable` attribute to `false`.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Developers: [App Manifest Overview](https://developer.android.com/guide/topics/manifest/manifest-intro).\n* Android Developers: [The android:debuggable attribute](https://developer.android.com/guide/topics/manifest/application-element#debug).\n* Android Developers: [Enable debugging](https://developer.android.com/studio/debug#enable-debug).\n* Common Weakness Enumeration: [CWE-489](https://cwe.mitre.org/data/definitions/489.html).\n"},"properties":{"tags":["security","external/cwe/cwe-489"],"description":"An enabled debugger can allow for entry points in the application or reveal sensitive information.","id":"java/android/debuggable-attribute-enabled","kind":"problem","name":"Android debuggable attribute enabled","precision":"very-high","problem.severity":"warning","security-severity":"7.2"}},{"id":"java/android/webview-debugging-enabled","name":"java/android/webview-debugging-enabled","shortDescription":{"text":"Android Webview debugging enabled"},"fullDescription":{"text":"Enabling Webview debugging in production builds can expose entry points or leak sensitive information."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android Webview debugging enabled\nThe `WebView.setWebContentsDebuggingEnabled` method enables or disables the contents of any `WebView` in the application to be debugged.\n\nYou should only enable debugging features during development. When you create a production build, you should disable it. If you enable debugging features, this can make your code vulnerable by adding entry points, or leaking sensitive information.\n\n\n## Recommendation\nEnsure that debugging features are not enabled in production builds, such as by guarding calls to `WebView.setWebContentsDebuggingEnabled(true)` by a flag that is only enabled in debug builds.\n\n\n## Example\nIn the first (bad) example, WebView debugging is always enabled. whereas the GOOD case only enables it if the `android:debuggable` attribute is set to `true`.\n\n\n```java\n// BAD - debugging is always enabled \nWebView.setWebContentsDebuggingEnabled(true);\n\n// GOOD - debugging is only enabled when this is a debug build, as indicated by the debuggable flag being set.\nif (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) {\n WebView.setWebContentsDebuggingEnabled(true);\n}\n```\n\n## References\n* Android Developers: [setWebContentsDebuggingEnabled](https://developer.android.com/reference/android/webkit/WebView.html#setWebContentsDebuggingEnabled(boolean)).\n* Android Developers: [Remote debugging WebViews](https://developer.chrome.com/docs/devtools/remote-debugging/webviews/).\n* Common Weakness Enumeration: [CWE-489](https://cwe.mitre.org/data/definitions/489.html).\n","markdown":"# Android Webview debugging enabled\nThe `WebView.setWebContentsDebuggingEnabled` method enables or disables the contents of any `WebView` in the application to be debugged.\n\nYou should only enable debugging features during development. When you create a production build, you should disable it. If you enable debugging features, this can make your code vulnerable by adding entry points, or leaking sensitive information.\n\n\n## Recommendation\nEnsure that debugging features are not enabled in production builds, such as by guarding calls to `WebView.setWebContentsDebuggingEnabled(true)` by a flag that is only enabled in debug builds.\n\n\n## Example\nIn the first (bad) example, WebView debugging is always enabled. whereas the GOOD case only enables it if the `android:debuggable` attribute is set to `true`.\n\n\n```java\n// BAD - debugging is always enabled \nWebView.setWebContentsDebuggingEnabled(true);\n\n// GOOD - debugging is only enabled when this is a debug build, as indicated by the debuggable flag being set.\nif (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) {\n WebView.setWebContentsDebuggingEnabled(true);\n}\n```\n\n## References\n* Android Developers: [setWebContentsDebuggingEnabled](https://developer.android.com/reference/android/webkit/WebView.html#setWebContentsDebuggingEnabled(boolean)).\n* Android Developers: [Remote debugging WebViews](https://developer.chrome.com/docs/devtools/remote-debugging/webviews/).\n* Common Weakness Enumeration: [CWE-489](https://cwe.mitre.org/data/definitions/489.html).\n"},"properties":{"tags":["security","external/cwe/cwe-489"],"description":"Enabling Webview debugging in production builds can expose entry points or leak sensitive information.","id":"java/android/webview-debugging-enabled","kind":"path-problem","name":"Android Webview debugging enabled","precision":"high","problem.severity":"warning","security-severity":"7.2"}},{"id":"java/tainted-permissions-check","name":"java/tainted-permissions-check","shortDescription":{"text":"User-controlled data used in permissions check"},"fullDescription":{"text":"Using user-controlled data in a permissions check may result in inappropriate permissions being granted."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# User-controlled data used in permissions check\nUsing user-controlled data in a permissions check may allow a user to gain unauthorized access to protected functionality or data.\n\n\n## Recommendation\nWhen checking whether a user is authorized for a particular activity, do not use data that is controlled by that user in the permissions check. If necessary, always validate the input, ideally against a fixed list of expected values.\n\nSimilarly, do not decide which permission to check for based on user data. In particular, avoid using computation to decide which permissions to check for. Use fixed permissions for particular actions, rather than generating the permission to check for.\n\n\n## Example\nThis example, using the Apache Shiro security framework, shows two ways to specify the permissions to check. The first way uses a string, `whatDoTheyWantToDo`, to specify the permissions to check. However, this string is built from user input. This can allow an attacker to force a check against a permission that they know they have, rather than the permission that should be checked. For example, while trying to access the account details of another user, the attacker could force the system to check whether they had permissions to access their *own* account details, which is incorrect, and would allow them to perform the action. The second, more secure way uses a fixed check that does not depend on data that is controlled by the user.\n\n\n```java\npublic static void main(String[] args) {\n\tString whatDoTheyWantToDo = args[0];\n\tSubject subject = SecurityUtils.getSubject();\n\n\t// BAD: permissions decision made using tainted data\n\tif(subject.isPermitted(\"domain:sublevel:\" + whatDoTheyWantToDo))\n\t\tdoIt();\n\n\t// GOOD: use fixed checks\n\tif(subject.isPermitted(\"domain:sublevel:whatTheMethodDoes\"))\n\t\tdoIt();\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SEC02-J. Do not base security checks on untrusted sources](https://wiki.sei.cmu.edu/confluence/display/java/SEC02-J.+Do+not+base+security+checks+on+untrusted+sources).\n* Common Weakness Enumeration: [CWE-807](https://cwe.mitre.org/data/definitions/807.html).\n* Common Weakness Enumeration: [CWE-290](https://cwe.mitre.org/data/definitions/290.html).\n","markdown":"# User-controlled data used in permissions check\nUsing user-controlled data in a permissions check may allow a user to gain unauthorized access to protected functionality or data.\n\n\n## Recommendation\nWhen checking whether a user is authorized for a particular activity, do not use data that is controlled by that user in the permissions check. If necessary, always validate the input, ideally against a fixed list of expected values.\n\nSimilarly, do not decide which permission to check for based on user data. In particular, avoid using computation to decide which permissions to check for. Use fixed permissions for particular actions, rather than generating the permission to check for.\n\n\n## Example\nThis example, using the Apache Shiro security framework, shows two ways to specify the permissions to check. The first way uses a string, `whatDoTheyWantToDo`, to specify the permissions to check. However, this string is built from user input. This can allow an attacker to force a check against a permission that they know they have, rather than the permission that should be checked. For example, while trying to access the account details of another user, the attacker could force the system to check whether they had permissions to access their *own* account details, which is incorrect, and would allow them to perform the action. The second, more secure way uses a fixed check that does not depend on data that is controlled by the user.\n\n\n```java\npublic static void main(String[] args) {\n\tString whatDoTheyWantToDo = args[0];\n\tSubject subject = SecurityUtils.getSubject();\n\n\t// BAD: permissions decision made using tainted data\n\tif(subject.isPermitted(\"domain:sublevel:\" + whatDoTheyWantToDo))\n\t\tdoIt();\n\n\t// GOOD: use fixed checks\n\tif(subject.isPermitted(\"domain:sublevel:whatTheMethodDoes\"))\n\t\tdoIt();\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SEC02-J. Do not base security checks on untrusted sources](https://wiki.sei.cmu.edu/confluence/display/java/SEC02-J.+Do+not+base+security+checks+on+untrusted+sources).\n* Common Weakness Enumeration: [CWE-807](https://cwe.mitre.org/data/definitions/807.html).\n* Common Weakness Enumeration: [CWE-290](https://cwe.mitre.org/data/definitions/290.html).\n"},"properties":{"tags":["security","external/cwe/cwe-807","external/cwe/cwe-290","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Using user-controlled data in a permissions check may result in inappropriate\n permissions being granted.","id":"java/tainted-permissions-check","kind":"path-problem","name":"User-controlled data used in permissions check","precision":"high","problem.severity":"error","security-severity":"7.8"}},{"id":"java/static-initialization-vector","name":"java/static-initialization-vector","shortDescription":{"text":"Using a static initialization vector for encryption"},"fullDescription":{"text":"An initialization vector (IV) used for ciphers of certain modes (such as CBC or GCM) should be unique and unpredictable, to maximize encryption and prevent dictionary attacks."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Using a static initialization vector for encryption\nWhen a cipher is used in certain modes such as CBC or GCM, it requires an initialization vector (IV). Under the same secret key, IVs should be unique and ideally unpredictable. If the same IV is used with the same secret key, then the same plaintext results in the same ciphertext. This can let an attacker learn if the same data pieces are transferred or stored, or help the attacker run a dictionary attack.\n\n\n## Recommendation\nUse a random IV generated by `SecureRandom`.\n\n\n## Example\nThe following example initializes a cipher with a static IV, which is unsafe:\n\n\n```java\nbyte[] iv = new byte[16]; // all zeroes\nGCMParameterSpec params = new GCMParameterSpec(128, iv);\nCipher cipher = Cipher.getInstance(\"AES/GCM/PKCS5PADDING\");\ncipher.init(Cipher.ENCRYPT_MODE, key, params);\n```\nThe next example initializes a cipher with a random IV:\n\n\n```java\nbyte[] iv = new byte[16];\nSecureRandom random = SecureRandom.getInstanceStrong();\nrandom.nextBytes(iv);\nGCMParameterSpec params = new GCMParameterSpec(128, iv);\nCipher cipher = Cipher.getInstance(\"AES/GCM/PKCS5PADDING\");\ncipher.init(Cipher.ENCRYPT_MODE, key, params);\n```\n\n## References\n* Wikipedia: [Initialization vector](https://en.wikipedia.org/wiki/Initialization_vector).\n* National Institute of Standards and Technology: [Recommendation for Block Cipher Modes of Operation](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf).\n* National Institute of Standards and Technology: [FIPS 140-2: Security Requirements for Cryptographic Modules](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.140-2.pdf).\n* Common Weakness Enumeration: [CWE-329](https://cwe.mitre.org/data/definitions/329.html).\n* Common Weakness Enumeration: [CWE-1204](https://cwe.mitre.org/data/definitions/1204.html).\n","markdown":"# Using a static initialization vector for encryption\nWhen a cipher is used in certain modes such as CBC or GCM, it requires an initialization vector (IV). Under the same secret key, IVs should be unique and ideally unpredictable. If the same IV is used with the same secret key, then the same plaintext results in the same ciphertext. This can let an attacker learn if the same data pieces are transferred or stored, or help the attacker run a dictionary attack.\n\n\n## Recommendation\nUse a random IV generated by `SecureRandom`.\n\n\n## Example\nThe following example initializes a cipher with a static IV, which is unsafe:\n\n\n```java\nbyte[] iv = new byte[16]; // all zeroes\nGCMParameterSpec params = new GCMParameterSpec(128, iv);\nCipher cipher = Cipher.getInstance(\"AES/GCM/PKCS5PADDING\");\ncipher.init(Cipher.ENCRYPT_MODE, key, params);\n```\nThe next example initializes a cipher with a random IV:\n\n\n```java\nbyte[] iv = new byte[16];\nSecureRandom random = SecureRandom.getInstanceStrong();\nrandom.nextBytes(iv);\nGCMParameterSpec params = new GCMParameterSpec(128, iv);\nCipher cipher = Cipher.getInstance(\"AES/GCM/PKCS5PADDING\");\ncipher.init(Cipher.ENCRYPT_MODE, key, params);\n```\n\n## References\n* Wikipedia: [Initialization vector](https://en.wikipedia.org/wiki/Initialization_vector).\n* National Institute of Standards and Technology: [Recommendation for Block Cipher Modes of Operation](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf).\n* National Institute of Standards and Technology: [FIPS 140-2: Security Requirements for Cryptographic Modules](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.140-2.pdf).\n* Common Weakness Enumeration: [CWE-329](https://cwe.mitre.org/data/definitions/329.html).\n* Common Weakness Enumeration: [CWE-1204](https://cwe.mitre.org/data/definitions/1204.html).\n"},"properties":{"tags":["security","external/cwe/cwe-329","external/cwe/cwe-1204","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"An initialization vector (IV) used for ciphers of certain modes (such as CBC or GCM) should be unique and unpredictable, to maximize encryption and prevent dictionary attacks.","id":"java/static-initialization-vector","kind":"path-problem","name":"Using a static initialization vector for encryption","precision":"high","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/cleartext-storage-in-cookie","name":"java/cleartext-storage-in-cookie","shortDescription":{"text":"Cleartext storage of sensitive information in cookie"},"fullDescription":{"text":"Storing sensitive information in cleartext can expose it to an attacker."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Cleartext storage of sensitive information in cookie\nSensitive information that is stored unencrypted is accessible to an attacker who gains access to the storage.\n\n\n## Recommendation\nEnsure that sensitive information is always encrypted before being stored. It may be wise to encrypt information before it is put into a heap data structure (such as `Java.util.Properties`) that may be written to disk later. Objects that are serializable or marshallable should also always contain encrypted information unless you are certain that they are not ever going to be serialized.\n\nIn general, decrypt sensitive information only at the point where it is necessary for it to be used in cleartext.\n\n\n## Example\nThe following example shows two ways of storing user credentials in a cookie. In the 'BAD' case, the credentials are simply stored in cleartext. In the 'GOOD' case, the credentials are hashed before storing them.\n\n\n```java\npublic static void main(String[] args) {\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"BP@ssw0rd\".toCharArray());\n\t\tdata = credentials.getUserName() + \":\" + new String(credentials.getPassword());\n\t\n\t\t// BAD: store data in a cookie in cleartext form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n\t\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"GP@ssw0rd\".toCharArray());\n\t\tString salt = \"ThisIsMySalt\";\n\t\tMessageDigest messageDigest = MessageDigest.getInstance(\"SHA-512\");\n\t\tmessageDigest.reset();\n\t\tString credentialsToHash =\n\t\t\t\tcredentials.getUserName() + \":\" + credentials.getPassword();\n\t\tbyte[] hashedCredsAsBytes =\n\t\t\t\tmessageDigest.digest((salt+credentialsToHash).getBytes(\"UTF-8\"));\n\t\tdata = bytesToString(hashedCredsAsBytes);\n\t\t\n\t\t// GOOD: store data in a cookie in encrypted form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n}\n\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* M. Dowd, J. McDonald and J. Schuhm, *The Art of Software Security Assessment*, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.\n* M. Howard and D. LeBlanc, *Writing Secure Code*, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.\n* Common Weakness Enumeration: [CWE-315](https://cwe.mitre.org/data/definitions/315.html).\n","markdown":"# Cleartext storage of sensitive information in cookie\nSensitive information that is stored unencrypted is accessible to an attacker who gains access to the storage.\n\n\n## Recommendation\nEnsure that sensitive information is always encrypted before being stored. It may be wise to encrypt information before it is put into a heap data structure (such as `Java.util.Properties`) that may be written to disk later. Objects that are serializable or marshallable should also always contain encrypted information unless you are certain that they are not ever going to be serialized.\n\nIn general, decrypt sensitive information only at the point where it is necessary for it to be used in cleartext.\n\n\n## Example\nThe following example shows two ways of storing user credentials in a cookie. In the 'BAD' case, the credentials are simply stored in cleartext. In the 'GOOD' case, the credentials are hashed before storing them.\n\n\n```java\npublic static void main(String[] args) {\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"BP@ssw0rd\".toCharArray());\n\t\tdata = credentials.getUserName() + \":\" + new String(credentials.getPassword());\n\t\n\t\t// BAD: store data in a cookie in cleartext form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n\t\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"GP@ssw0rd\".toCharArray());\n\t\tString salt = \"ThisIsMySalt\";\n\t\tMessageDigest messageDigest = MessageDigest.getInstance(\"SHA-512\");\n\t\tmessageDigest.reset();\n\t\tString credentialsToHash =\n\t\t\t\tcredentials.getUserName() + \":\" + credentials.getPassword();\n\t\tbyte[] hashedCredsAsBytes =\n\t\t\t\tmessageDigest.digest((salt+credentialsToHash).getBytes(\"UTF-8\"));\n\t\tdata = bytesToString(hashedCredsAsBytes);\n\t\t\n\t\t// GOOD: store data in a cookie in encrypted form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n}\n\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* M. Dowd, J. McDonald and J. Schuhm, *The Art of Software Security Assessment*, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.\n* M. Howard and D. LeBlanc, *Writing Secure Code*, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.\n* Common Weakness Enumeration: [CWE-315](https://cwe.mitre.org/data/definitions/315.html).\n"},"properties":{"tags":["security","external/cwe/cwe-315","owasp-top10-2021","A05:2021 - Security Misconfiguration"],"description":"Storing sensitive information in cleartext can expose it to an attacker.","id":"java/cleartext-storage-in-cookie","kind":"problem","name":"Cleartext storage of sensitive information in cookie","precision":"high","problem.severity":"error","security-severity":"5.0"}},{"id":"java/android/backup-enabled","name":"java/android/backup-enabled","shortDescription":{"text":"Application backup allowed"},"fullDescription":{"text":"Allowing application backups may allow an attacker to extract sensitive data."},"defaultConfiguration":{"enabled":true,"level":"note"},"help":{"text":"# Application backup allowed\nIn the Android manifest file, you can use the `android:allowBackup` attribute of the `application` element to define whether the application will have automatic backups or not.\n\nIf your application uses any sensitive data, you should disable automatic backups to prevent attackers from extracting it.\n\n\n## Recommendation\nFor Android applications which process sensitive data, set `android:allowBackup` to `false` in the manifest file.\n\nNote: Since Android 6.0 (Marshmallow), automatic backups for applications are switched on by default.\n\n\n## Example\nIn the following two (bad) examples, the `android:allowBackup` setting is enabled:\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\nIn the following (good) example, `android:allowBackup` is set to `false`:\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Documentation: [Back up user data with Auto Backup](https://developer.android.com/guide/topics/data/autobackup#EnablingAutoBackup)\n* OWASP Mobile Security Testing Guide: [ Android Backups ](https://github.com/OWASP/owasp-mstg/blob/b7a93a2e5e0557cc9a12e55fc3f6675f6986bb86/Document/0x05d-Testing-Data-Storage.md#backups)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n","markdown":"# Application backup allowed\nIn the Android manifest file, you can use the `android:allowBackup` attribute of the `application` element to define whether the application will have automatic backups or not.\n\nIf your application uses any sensitive data, you should disable automatic backups to prevent attackers from extracting it.\n\n\n## Recommendation\nFor Android applications which process sensitive data, set `android:allowBackup` to `false` in the manifest file.\n\nNote: Since Android 6.0 (Marshmallow), automatic backups for applications are switched on by default.\n\n\n## Example\nIn the following two (bad) examples, the `android:allowBackup` setting is enabled:\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\nIn the following (good) example, `android:allowBackup` is set to `false`:\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Documentation: [Back up user data with Auto Backup](https://developer.android.com/guide/topics/data/autobackup#EnablingAutoBackup)\n* OWASP Mobile Security Testing Guide: [ Android Backups ](https://github.com/OWASP/owasp-mstg/blob/b7a93a2e5e0557cc9a12e55fc3f6675f6986bb86/Document/0x05d-Testing-Data-Storage.md#backups)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n"},"properties":{"tags":["security","external/cwe/cwe-312","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Allowing application backups may allow an attacker to extract sensitive data.","id":"java/android/backup-enabled","kind":"problem","name":"Application backup allowed","precision":"very-high","problem.severity":"recommendation","security-severity":"7.5"}},{"id":"java/android/intent-redirection","name":"java/android/intent-redirection","shortDescription":{"text":"Android Intent redirection"},"fullDescription":{"text":"Starting Android components with user-provided Intents can provide access to internal components of the application, increasing the attack surface and potentially causing unintended effects."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Android Intent redirection\nAn exported Android component that obtains a user-provided Intent and uses it to launch another component can be exploited to obtain access to private, unexported components of the same app or to launch other apps' components on behalf of the victim app.\n\n\n## Recommendation\nDo not export components that start other components from a user-provided Intent. They can be made private by setting the `android:exported` property to `false` in the app's Android Manifest.\n\nIf this is not possible, restrict either which apps can send Intents to the affected component, or which components can be started from it.\n\n\n## Example\nThe following snippet contains three examples. In the first example, an arbitrary component can be started from the externally provided `forward_intent` Intent. In the second example, the destination component of the Intent is first checked to make sure it is safe. In the third example, the component that created the Intent is first checked to make sure it comes from a trusted origin.\n\n\n```java\n// BAD: A user-provided Intent is used to launch an arbitrary component\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nstartActivity(forwardIntent);\n\n// GOOD: The destination component is checked before launching it\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nComponentName destinationComponent = forwardIntent.resolveActivity(getPackageManager());\nif (destinationComponent.getPackageName().equals(\"safe.package\") && \n destinationComponent.getClassName().equals(\"SafeClass\")) {\n startActivity(forwardIntent);\n}\n\n// GOOD: The component that sent the Intent is checked before launching the destination component\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nComponentName originComponent = getCallingActivity();\nif (originComponent.getPackageName().equals(\"trusted.package\") && originComponent.getClassName().equals(\"TrustedClass\")) {\n startActivity(forwardIntent);\n}\n\n```\n\n## References\n* Google: [Remediation for Intent Redirection Vulnerability](https://support.google.com/faqs/answer/9267555?hl=en).\n* OWASP Mobile Security Testing Guide: [Intents](https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05a-platform-overview#intents).\n* Android Developers: [The android:exported attribute](https://developer.android.com/guide/topics/manifest/activity-element#exported).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n* Common Weakness Enumeration: [CWE-940](https://cwe.mitre.org/data/definitions/940.html).\n","markdown":"# Android Intent redirection\nAn exported Android component that obtains a user-provided Intent and uses it to launch another component can be exploited to obtain access to private, unexported components of the same app or to launch other apps' components on behalf of the victim app.\n\n\n## Recommendation\nDo not export components that start other components from a user-provided Intent. They can be made private by setting the `android:exported` property to `false` in the app's Android Manifest.\n\nIf this is not possible, restrict either which apps can send Intents to the affected component, or which components can be started from it.\n\n\n## Example\nThe following snippet contains three examples. In the first example, an arbitrary component can be started from the externally provided `forward_intent` Intent. In the second example, the destination component of the Intent is first checked to make sure it is safe. In the third example, the component that created the Intent is first checked to make sure it comes from a trusted origin.\n\n\n```java\n// BAD: A user-provided Intent is used to launch an arbitrary component\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nstartActivity(forwardIntent);\n\n// GOOD: The destination component is checked before launching it\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nComponentName destinationComponent = forwardIntent.resolveActivity(getPackageManager());\nif (destinationComponent.getPackageName().equals(\"safe.package\") && \n destinationComponent.getClassName().equals(\"SafeClass\")) {\n startActivity(forwardIntent);\n}\n\n// GOOD: The component that sent the Intent is checked before launching the destination component\nIntent forwardIntent = (Intent) getIntent().getParcelableExtra(\"forward_intent\");\nComponentName originComponent = getCallingActivity();\nif (originComponent.getPackageName().equals(\"trusted.package\") && originComponent.getClassName().equals(\"TrustedClass\")) {\n startActivity(forwardIntent);\n}\n\n```\n\n## References\n* Google: [Remediation for Intent Redirection Vulnerability](https://support.google.com/faqs/answer/9267555?hl=en).\n* OWASP Mobile Security Testing Guide: [Intents](https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05a-platform-overview#intents).\n* Android Developers: [The android:exported attribute](https://developer.android.com/guide/topics/manifest/activity-element#exported).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n* Common Weakness Enumeration: [CWE-940](https://cwe.mitre.org/data/definitions/940.html).\n"},"properties":{"tags":["security","external/cwe/cwe-926","external/cwe/cwe-940","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Starting Android components with user-provided Intents\n can provide access to internal components of the application,\n increasing the attack surface and potentially causing unintended effects.","id":"java/android/intent-redirection","kind":"path-problem","name":"Android Intent redirection","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/insecure-cookie","name":"java/insecure-cookie","shortDescription":{"text":"Failure to use secure cookies"},"fullDescription":{"text":"Insecure cookies may be sent in cleartext, which makes them vulnerable to interception."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Failure to use secure cookies\nFailing to set the 'secure' flag on a cookie can cause it to be sent in cleartext. This makes it easier for an attacker to intercept.\n\n\n## Recommendation\nAlways use `setSecure` to set the 'secure' flag on a cookie before adding it to an `HttpServletResponse`.\n\n\n## Example\nThis example shows two ways of adding a cookie to an `HttpServletResponse`. The first way leaves out the setting of the 'secure' flag; the second way includes the setting of the flag.\n\n\n```java\npublic static void test(HttpServletRequest request, HttpServletResponse response) {\n\t{\n\t\tCookie cookie = new Cookie(\"secret\", \"fakesecret\");\n\t\t\n\t\t// BAD: 'secure' flag not set\n\t\tresponse.addCookie(cookie);\n\t}\n\n\t{\n\t\tCookie cookie = new Cookie(\"secret\", \"fakesecret\");\n\t\t\n\t\t// GOOD: set 'secure' flag\n\t\tcookie.setSecure(true);\n\t\tresponse.addCookie(cookie);\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* Java Platform, Enterprise Edition (Java EE) 7, API Specification: [Class Cookie](https://docs.oracle.com/javaee/7/api/javax/servlet/http/Cookie.html).\n* Common Weakness Enumeration: [CWE-614](https://cwe.mitre.org/data/definitions/614.html).\n","markdown":"# Failure to use secure cookies\nFailing to set the 'secure' flag on a cookie can cause it to be sent in cleartext. This makes it easier for an attacker to intercept.\n\n\n## Recommendation\nAlways use `setSecure` to set the 'secure' flag on a cookie before adding it to an `HttpServletResponse`.\n\n\n## Example\nThis example shows two ways of adding a cookie to an `HttpServletResponse`. The first way leaves out the setting of the 'secure' flag; the second way includes the setting of the flag.\n\n\n```java\npublic static void test(HttpServletRequest request, HttpServletResponse response) {\n\t{\n\t\tCookie cookie = new Cookie(\"secret\", \"fakesecret\");\n\t\t\n\t\t// BAD: 'secure' flag not set\n\t\tresponse.addCookie(cookie);\n\t}\n\n\t{\n\t\tCookie cookie = new Cookie(\"secret\", \"fakesecret\");\n\t\t\n\t\t// GOOD: set 'secure' flag\n\t\tcookie.setSecure(true);\n\t\tresponse.addCookie(cookie);\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* Java Platform, Enterprise Edition (Java EE) 7, API Specification: [Class Cookie](https://docs.oracle.com/javaee/7/api/javax/servlet/http/Cookie.html).\n* Common Weakness Enumeration: [CWE-614](https://cwe.mitre.org/data/definitions/614.html).\n"},"properties":{"tags":["security","external/cwe/cwe-614","owasp-top10-2021","A05:2021 - Security Misconfiguration"],"description":"Insecure cookies may be sent in cleartext, which makes them vulnerable to\n interception.","id":"java/insecure-cookie","kind":"problem","name":"Failure to use secure cookies","precision":"high","problem.severity":"error","security-severity":"5.0"}},{"id":"java/jhipster-prng","name":"java/jhipster-prng","shortDescription":{"text":"Detect JHipster Generator Vulnerability CVE-2019-16303"},"fullDescription":{"text":"Using a vulnerable version of JHipster to generate random numbers makes it easier for attackers to take over accounts."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Detect JHipster Generator Vulnerability CVE-2019-16303\nThis query detects instances of `RandomUtil.java` that were generated by a [JHipster](https://www.jhipster.tech/) version that is vulnerable to [CVE-2019-16303](https://github.com/jhipster/jhipster-kotlin/security/advisories/GHSA-j3rh-8vwq-wh84).\n\nIf an app uses `RandomUtil.java` generated by a vulnerable version of JHipster, attackers can request a password reset token and use this to predict the value of future reset tokens generated by this server. Using this information, they can create a reset link that allows them to take over any account.\n\nThis vulnerability has a [ CVSS v3.0 Base Score of 9.8/10 ](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?name=CVE-2019-16303&vector=AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H&version=3.1&source=NIST).\n\n\n## Example\nThe example below shows the vulnerable `RandomUtil` class generated by [JHipster prior to version 6.3.0](https://www.jhipster.tech/2019/09/13/jhipster-release-6.3.0.html).\n\n\n```java\nimport org.apache.commons.lang3.RandomStringUtils;\n\n/**\n * Utility class for generating random Strings.\n */\npublic final class RandomUtil {\n\n private static final int DEF_COUNT = 20;\n\n private RandomUtil() {\n }\n\n /**\n * Generate a password.\n *\n * @return the generated password.\n */\n public static String generatePassword() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate an activation key.\n *\n * @return the generated activation key.\n */\n public static String generateActivationKey() {\n return RandomStringUtils.randomNumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a reset key.\n *\n * @return the generated reset key.\n */\n public static String generateResetKey() {\n return RandomStringUtils.randomNumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a unique series to validate a persistent token, used in the\n * authentication remember-me mechanism.\n *\n * @return the generated series data.\n */\n public static String generateSeriesData() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a persistent token, used in the authentication remember-me mechanism.\n *\n * @return the generated token data.\n */\n public static String generateTokenData() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n}\n\n```\nBelow is a fixed version of the `RandomUtil` class.\n\n\n```java\nimport org.apache.commons.lang3.RandomStringUtils;\n\nimport java.security.SecureRandom;\n\n/**\n * Utility class for generating random Strings.\n */\npublic final class RandomUtil {\n private static final SecureRandom SECURE_RANDOM = new SecureRandom(); // GOOD: Using SecureRandom\n\n private static final int DEF_COUNT = 20;\n\n static {\n SECURE_RANDOM.nextBytes(new byte[64]);\n }\n\n private RandomUtil() {\n }\n\n private static String generateRandomAlphanumericString() {\n // GOOD: Passing Secure Random to RandomStringUtils::random\n return RandomStringUtils.random(DEF_COUNT, 0, 0, true, true, null, SECURE_RANDOM);\n }\n\n /**\n * Generate a password.\n *\n * @return the generated password.\n */\n public static String generatePassword() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate an activation key.\n *\n * @return the generated activation key.\n */\n public static String generateActivationKey() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a reset key.\n *\n * @return the generated reset key.\n */\n public static String generateResetKey() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a unique series to validate a persistent token, used in the\n * authentication remember-me mechanism.\n *\n * @return the generated series data.\n */\n public static String generateSeriesData() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a persistent token, used in the authentication remember-me mechanism.\n *\n * @return the generated token data.\n */\n public static String generateTokenData() {\n return generateRandomAlphanumericString();\n }\n}\n\n```\n\n## Recommendation\nYou should refactor the `RandomUtil` class and replace every call to `RandomStringUtils.randomAlphaNumeric`. You could regenerate the class using the latest version of JHipster, or use an automated refactoring. For example, using the [Patching JHipster CWE-338](https://github.com/moderneinc/jhipster-cwe-338) for the [Rewrite project](https://github.com/openrewrite/rewrite).\n\n\n## References\n* Cloudflare Blog: [ Why secure systems require random numbers ](https://blog.cloudflare.com/why-randomness-matters/)\n* Hacker News: [ How I Hacked Hacker News (with arc security advisory) ](https://news.ycombinator.com/item?id=639976)\n* Posts by Pucara Information Security Team: [ The Java Soothsayer: A practical application for insecure randomness. (Includes free 0day) ](https://blog.pucarasec.com/2020/05/09/the-java-soothsayer-a-practical-application-for-insecure-randomness-includes-free-0day/)\n* Common Weakness Enumeration: [CWE-338](https://cwe.mitre.org/data/definitions/338.html).\n","markdown":"# Detect JHipster Generator Vulnerability CVE-2019-16303\nThis query detects instances of `RandomUtil.java` that were generated by a [JHipster](https://www.jhipster.tech/) version that is vulnerable to [CVE-2019-16303](https://github.com/jhipster/jhipster-kotlin/security/advisories/GHSA-j3rh-8vwq-wh84).\n\nIf an app uses `RandomUtil.java` generated by a vulnerable version of JHipster, attackers can request a password reset token and use this to predict the value of future reset tokens generated by this server. Using this information, they can create a reset link that allows them to take over any account.\n\nThis vulnerability has a [ CVSS v3.0 Base Score of 9.8/10 ](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?name=CVE-2019-16303&vector=AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H&version=3.1&source=NIST).\n\n\n## Example\nThe example below shows the vulnerable `RandomUtil` class generated by [JHipster prior to version 6.3.0](https://www.jhipster.tech/2019/09/13/jhipster-release-6.3.0.html).\n\n\n```java\nimport org.apache.commons.lang3.RandomStringUtils;\n\n/**\n * Utility class for generating random Strings.\n */\npublic final class RandomUtil {\n\n private static final int DEF_COUNT = 20;\n\n private RandomUtil() {\n }\n\n /**\n * Generate a password.\n *\n * @return the generated password.\n */\n public static String generatePassword() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate an activation key.\n *\n * @return the generated activation key.\n */\n public static String generateActivationKey() {\n return RandomStringUtils.randomNumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a reset key.\n *\n * @return the generated reset key.\n */\n public static String generateResetKey() {\n return RandomStringUtils.randomNumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a unique series to validate a persistent token, used in the\n * authentication remember-me mechanism.\n *\n * @return the generated series data.\n */\n public static String generateSeriesData() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n\n /**\n * Generate a persistent token, used in the authentication remember-me mechanism.\n *\n * @return the generated token data.\n */\n public static String generateTokenData() {\n return RandomStringUtils.randomAlphanumeric(DEF_COUNT); // BAD: RandomStringUtils does not use SecureRandom\n }\n}\n\n```\nBelow is a fixed version of the `RandomUtil` class.\n\n\n```java\nimport org.apache.commons.lang3.RandomStringUtils;\n\nimport java.security.SecureRandom;\n\n/**\n * Utility class for generating random Strings.\n */\npublic final class RandomUtil {\n private static final SecureRandom SECURE_RANDOM = new SecureRandom(); // GOOD: Using SecureRandom\n\n private static final int DEF_COUNT = 20;\n\n static {\n SECURE_RANDOM.nextBytes(new byte[64]);\n }\n\n private RandomUtil() {\n }\n\n private static String generateRandomAlphanumericString() {\n // GOOD: Passing Secure Random to RandomStringUtils::random\n return RandomStringUtils.random(DEF_COUNT, 0, 0, true, true, null, SECURE_RANDOM);\n }\n\n /**\n * Generate a password.\n *\n * @return the generated password.\n */\n public static String generatePassword() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate an activation key.\n *\n * @return the generated activation key.\n */\n public static String generateActivationKey() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a reset key.\n *\n * @return the generated reset key.\n */\n public static String generateResetKey() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a unique series to validate a persistent token, used in the\n * authentication remember-me mechanism.\n *\n * @return the generated series data.\n */\n public static String generateSeriesData() {\n return generateRandomAlphanumericString();\n }\n\n /**\n * Generate a persistent token, used in the authentication remember-me mechanism.\n *\n * @return the generated token data.\n */\n public static String generateTokenData() {\n return generateRandomAlphanumericString();\n }\n}\n\n```\n\n## Recommendation\nYou should refactor the `RandomUtil` class and replace every call to `RandomStringUtils.randomAlphaNumeric`. You could regenerate the class using the latest version of JHipster, or use an automated refactoring. For example, using the [Patching JHipster CWE-338](https://github.com/moderneinc/jhipster-cwe-338) for the [Rewrite project](https://github.com/openrewrite/rewrite).\n\n\n## References\n* Cloudflare Blog: [ Why secure systems require random numbers ](https://blog.cloudflare.com/why-randomness-matters/)\n* Hacker News: [ How I Hacked Hacker News (with arc security advisory) ](https://news.ycombinator.com/item?id=639976)\n* Posts by Pucara Information Security Team: [ The Java Soothsayer: A practical application for insecure randomness. (Includes free 0day) ](https://blog.pucarasec.com/2020/05/09/the-java-soothsayer-a-practical-application-for-insecure-randomness-includes-free-0day/)\n* Common Weakness Enumeration: [CWE-338](https://cwe.mitre.org/data/definitions/338.html).\n"},"properties":{"tags":["security","external/cwe/cwe-338","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using a vulnerable version of JHipster to generate random numbers makes it easier for attackers to take over accounts.","id":"java/jhipster-prng","kind":"problem","name":"Detect JHipster Generator Vulnerability CVE-2019-16303","precision":"very-high","problem.severity":"error","security-severity":"7.8"}},{"id":"java/maven/dependency-upon-bintray","name":"java/maven/dependency-upon-bintray","shortDescription":{"text":"Depending upon JCenter/Bintray as an artifact repository"},"fullDescription":{"text":"Using a deprecated artifact repository may eventually give attackers access for a supply chain attack."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Depending upon JCenter/Bintray as an artifact repository\n[Bintray and JCenter are shutting down on February 1st, 2022](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/). Relying upon repositories that are deprecated or scheduled to be shutdown can have unintended consequences; for example, artifacts being resolved from a different artifact server or a total failure of the CI build.\n\nWhen artifact repositories are left unmaintained for a long period of time, vulnerabilities may emerge. Theoretically, this could allow attackers to inject malicious code into the artifacts that you are resolving and infect build artifacts that are being produced. This can be used by attackers to perform a [supply chain attack](https://en.wikipedia.org/wiki/Supply_chain_attack) against your project's users.\n\n\n## Recommendation\nAlways use the canonical repository for resolving your dependencies.\n\n\n## Example\nThe following example shows locations in a Maven POM file where artifact repository upload/download is configured. The use of Bintray in any of these locations is not advised.\n\n\n```xml\n\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Bintray Usage\n An example of using bintray to download and upload dependencies\n\n \n \n jcenter\n JCenter\n \n https://jcenter.bintray.com\n \n \n jcenter-snapshots\n JCenter\n \n https://jcenter.bintray.com\n \n \n \n \n jcenter\n JCenter\n \n https://jcenter.bintray.com\n \n \n \n \n jcenter\n JCenter\n \n https://dl.bintray.com/groovy/maven\n \n \n \n \n jcenter-plugins\n JCenter\n \n https://jcenter.bintray.com\n \n \n\n\n```\n\n## References\n* JFrog blog: [ Into the Sunset on May 1st: Bintray, JCenter, GoCenter, and ChartCenter ](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/)\n* Common Weakness Enumeration: [CWE-1104](https://cwe.mitre.org/data/definitions/1104.html).\n","markdown":"# Depending upon JCenter/Bintray as an artifact repository\n[Bintray and JCenter are shutting down on February 1st, 2022](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/). Relying upon repositories that are deprecated or scheduled to be shutdown can have unintended consequences; for example, artifacts being resolved from a different artifact server or a total failure of the CI build.\n\nWhen artifact repositories are left unmaintained for a long period of time, vulnerabilities may emerge. Theoretically, this could allow attackers to inject malicious code into the artifacts that you are resolving and infect build artifacts that are being produced. This can be used by attackers to perform a [supply chain attack](https://en.wikipedia.org/wiki/Supply_chain_attack) against your project's users.\n\n\n## Recommendation\nAlways use the canonical repository for resolving your dependencies.\n\n\n## Example\nThe following example shows locations in a Maven POM file where artifact repository upload/download is configured. The use of Bintray in any of these locations is not advised.\n\n\n```xml\n\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Bintray Usage\n An example of using bintray to download and upload dependencies\n\n \n \n jcenter\n JCenter\n \n https://jcenter.bintray.com\n \n \n jcenter-snapshots\n JCenter\n \n https://jcenter.bintray.com\n \n \n \n \n jcenter\n JCenter\n \n https://jcenter.bintray.com\n \n \n \n \n jcenter\n JCenter\n \n https://dl.bintray.com/groovy/maven\n \n \n \n \n jcenter-plugins\n JCenter\n \n https://jcenter.bintray.com\n \n \n\n\n```\n\n## References\n* JFrog blog: [ Into the Sunset on May 1st: Bintray, JCenter, GoCenter, and ChartCenter ](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/)\n* Common Weakness Enumeration: [CWE-1104](https://cwe.mitre.org/data/definitions/1104.html).\n"},"properties":{"tags":["security","external/cwe/cwe-1104","owasp-top10-2021","A06:2021 - Vulnerable and Outdated Components"],"description":"Using a deprecated artifact repository may eventually give attackers access for a supply chain attack.","id":"java/maven/dependency-upon-bintray","kind":"problem","name":"Depending upon JCenter/Bintray as an artifact repository","precision":"very-high","problem.severity":"error","security-severity":"6.5"}},{"id":"java/stack-trace-exposure","name":"java/stack-trace-exposure","shortDescription":{"text":"Information exposure through a stack trace"},"fullDescription":{"text":"Information from a stack trace propagates to an external user. Stack traces can unintentionally reveal implementation details that are useful to an attacker for developing a subsequent exploit."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Information exposure through a stack trace\nSoftware developers often add stack traces to error messages, as a debugging aid. Whenever that error message occurs for an end user, the developer can use the stack trace to help identify how to fix the problem. In particular, stack traces can tell the developer more about the sequence of events that led to a failure, as opposed to merely the final state of the software when the error occurred.\n\nUnfortunately, the same information can be useful to an attacker. The sequence of class names in a stack trace can reveal the structure of the application as well as any internal components it relies on. Furthermore, the error message at the top of a stack trace can include information such as server-side file names and SQL code that the application relies on, allowing an attacker to fine-tune a subsequent injection attack.\n\n\n## Recommendation\nSend the user a more generic error message that reveals less information. Either suppress the stack trace entirely, or log it only on the server.\n\n\n## Example\nIn the following example, an exception is handled in two different ways. In the first version, labeled BAD, the exception is sent back to the remote user using the `sendError()` method. As such, the user is able to see a detailed stack trace, which may contain sensitive information. In the second version, the error message is logged only on the server. That way, the developers can still access and use the error log, but remote users will not see the information.\n\n\n```java\nprotected void doGet(HttpServletRequest request, HttpServletResponse response) {\n\ttry {\n\t\tdoSomeWork();\n\t} catch (NullPointerException ex) {\n\t\t// BAD: printing a stack trace back to the response\n\t\tex.printStackTrace(response.getWriter());\n\t\treturn;\n\t}\n\n\ttry {\n\t\tdoSomeWork();\n\t} catch (NullPointerException ex) {\n\t\t// GOOD: log the stack trace, and send back a non-revealing response\n\t\tlog(\"Exception occurred\", ex);\n\t\tresponse.sendError(\n\t\t\tHttpServletResponse.SC_INTERNAL_SERVER_ERROR,\n\t\t\t\"Exception occurred\");\n\t\treturn;\n\t}\n}\n\n```\n\n## References\n* OWASP: [Improper Error Handling](https://owasp.org/www-community/Improper_Error_Handling).\n* CERT Java Coding Standard: [ERR01-J. Do not allow exceptions to expose sensitive information](https://www.securecoding.cert.org/confluence/display/java/ERR01-J.+Do+not+allow+exceptions+to+expose+sensitive+information).\n* Common Weakness Enumeration: [CWE-209](https://cwe.mitre.org/data/definitions/209.html).\n* Common Weakness Enumeration: [CWE-497](https://cwe.mitre.org/data/definitions/497.html).\n","markdown":"# Information exposure through a stack trace\nSoftware developers often add stack traces to error messages, as a debugging aid. Whenever that error message occurs for an end user, the developer can use the stack trace to help identify how to fix the problem. In particular, stack traces can tell the developer more about the sequence of events that led to a failure, as opposed to merely the final state of the software when the error occurred.\n\nUnfortunately, the same information can be useful to an attacker. The sequence of class names in a stack trace can reveal the structure of the application as well as any internal components it relies on. Furthermore, the error message at the top of a stack trace can include information such as server-side file names and SQL code that the application relies on, allowing an attacker to fine-tune a subsequent injection attack.\n\n\n## Recommendation\nSend the user a more generic error message that reveals less information. Either suppress the stack trace entirely, or log it only on the server.\n\n\n## Example\nIn the following example, an exception is handled in two different ways. In the first version, labeled BAD, the exception is sent back to the remote user using the `sendError()` method. As such, the user is able to see a detailed stack trace, which may contain sensitive information. In the second version, the error message is logged only on the server. That way, the developers can still access and use the error log, but remote users will not see the information.\n\n\n```java\nprotected void doGet(HttpServletRequest request, HttpServletResponse response) {\n\ttry {\n\t\tdoSomeWork();\n\t} catch (NullPointerException ex) {\n\t\t// BAD: printing a stack trace back to the response\n\t\tex.printStackTrace(response.getWriter());\n\t\treturn;\n\t}\n\n\ttry {\n\t\tdoSomeWork();\n\t} catch (NullPointerException ex) {\n\t\t// GOOD: log the stack trace, and send back a non-revealing response\n\t\tlog(\"Exception occurred\", ex);\n\t\tresponse.sendError(\n\t\t\tHttpServletResponse.SC_INTERNAL_SERVER_ERROR,\n\t\t\t\"Exception occurred\");\n\t\treturn;\n\t}\n}\n\n```\n\n## References\n* OWASP: [Improper Error Handling](https://owasp.org/www-community/Improper_Error_Handling).\n* CERT Java Coding Standard: [ERR01-J. Do not allow exceptions to expose sensitive information](https://www.securecoding.cert.org/confluence/display/java/ERR01-J.+Do+not+allow+exceptions+to+expose+sensitive+information).\n* Common Weakness Enumeration: [CWE-209](https://cwe.mitre.org/data/definitions/209.html).\n* Common Weakness Enumeration: [CWE-497](https://cwe.mitre.org/data/definitions/497.html).\n"},"properties":{"tags":["security","external/cwe/cwe-209","external/cwe/cwe-497","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Information from a stack trace propagates to an external user.\n Stack traces can unintentionally reveal implementation details\n that are useful to an attacker for developing a subsequent exploit.","id":"java/stack-trace-exposure","kind":"problem","name":"Information exposure through a stack trace","precision":"high","problem.severity":"error","security-severity":"5.4"}},{"id":"java/tainted-numeric-cast","name":"java/tainted-numeric-cast","shortDescription":{"text":"User-controlled data in numeric cast"},"fullDescription":{"text":"Casting user-controlled numeric data to a narrower type without validation can cause unexpected truncation."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# User-controlled data in numeric cast\nCasting a user-controlled numeric value to a narrower type can result in truncated values unless the input is validated.\n\nNarrowing conversions may cause potentially unintended results. For example, casting the positive integer value `128` to type `byte` yields the negative value `-128`.\n\n\n## Recommendation\nGuard against unexpected truncation of user-controlled arithmetic data by doing one of the following:\n\n* Validate the user input.\n* Define a guard on the cast expression, so that the cast is performed only if the input is known to be within the range of the resulting type.\n* Avoid casting to a narrower type, and instead continue to use a wider type.\n\n## Example\nIn this example, a value is read from standard input into a `long`. Because the value is a user-controlled value, it could be extremely large. Casting this value to a narrower type could therefore cause unexpected truncation. The `scaled2` example uses a guard to avoid this problem and checks the range of the input before performing the cast. If the value is too large to cast to type `int` it is rejected as invalid.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) throws IOException {\n\t\t{\n\t\t\tlong data;\n\n\t\t\tBufferedReader readerBuffered = new BufferedReader(\n\t\t\t\t\tnew InputStreamReader(System.in, \"UTF-8\"));\n\t\t\tString stringNumber = readerBuffered.readLine();\n\t\t\tif (stringNumber != null) {\n\t\t\t\tdata = Long.parseLong(stringNumber.trim());\n\t\t\t} else {\n\t\t\t\tdata = 0;\n\t\t\t}\n\n\t\t\t// AVOID: potential truncation if input data is very large,\n\t\t\t// for example 'Long.MAX_VALUE'\n\t\t\tint scaled = (int)data;\n\n\t\t\t//...\n\n\t\t\t// GOOD: use a guard to ensure no truncation occurs\n\t\t\tint scaled2;\n\t\t\tif (data > Integer.MIN_VALUE && data < Integer.MAX_VALUE)\n\t\t\t\tscaled2 = (int)data;\n\t\t\telse\n\t\t\t\tthrow new IllegalArgumentException(\"Invalid input\");\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM12-J. Ensure conversions of numeric types to narrower types do not result in lost or misinterpreted data](https://wiki.sei.cmu.edu/confluence/display/java/NUM12-J.+Ensure+conversions+of+numeric+types+to+narrower+types+do+not+result+in+lost+or+misinterpreted+data).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n* Common Weakness Enumeration: [CWE-681](https://cwe.mitre.org/data/definitions/681.html).\n","markdown":"# User-controlled data in numeric cast\nCasting a user-controlled numeric value to a narrower type can result in truncated values unless the input is validated.\n\nNarrowing conversions may cause potentially unintended results. For example, casting the positive integer value `128` to type `byte` yields the negative value `-128`.\n\n\n## Recommendation\nGuard against unexpected truncation of user-controlled arithmetic data by doing one of the following:\n\n* Validate the user input.\n* Define a guard on the cast expression, so that the cast is performed only if the input is known to be within the range of the resulting type.\n* Avoid casting to a narrower type, and instead continue to use a wider type.\n\n## Example\nIn this example, a value is read from standard input into a `long`. Because the value is a user-controlled value, it could be extremely large. Casting this value to a narrower type could therefore cause unexpected truncation. The `scaled2` example uses a guard to avoid this problem and checks the range of the input before performing the cast. If the value is too large to cast to type `int` it is rejected as invalid.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) throws IOException {\n\t\t{\n\t\t\tlong data;\n\n\t\t\tBufferedReader readerBuffered = new BufferedReader(\n\t\t\t\t\tnew InputStreamReader(System.in, \"UTF-8\"));\n\t\t\tString stringNumber = readerBuffered.readLine();\n\t\t\tif (stringNumber != null) {\n\t\t\t\tdata = Long.parseLong(stringNumber.trim());\n\t\t\t} else {\n\t\t\t\tdata = 0;\n\t\t\t}\n\n\t\t\t// AVOID: potential truncation if input data is very large,\n\t\t\t// for example 'Long.MAX_VALUE'\n\t\t\tint scaled = (int)data;\n\n\t\t\t//...\n\n\t\t\t// GOOD: use a guard to ensure no truncation occurs\n\t\t\tint scaled2;\n\t\t\tif (data > Integer.MIN_VALUE && data < Integer.MAX_VALUE)\n\t\t\t\tscaled2 = (int)data;\n\t\t\telse\n\t\t\t\tthrow new IllegalArgumentException(\"Invalid input\");\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM12-J. Ensure conversions of numeric types to narrower types do not result in lost or misinterpreted data](https://wiki.sei.cmu.edu/confluence/display/java/NUM12-J.+Ensure+conversions+of+numeric+types+to+narrower+types+do+not+result+in+lost+or+misinterpreted+data).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n* Common Weakness Enumeration: [CWE-681](https://cwe.mitre.org/data/definitions/681.html).\n"},"properties":{"tags":["security","external/cwe/cwe-197","external/cwe/cwe-681"],"description":"Casting user-controlled numeric data to a narrower type without validation\n can cause unexpected truncation.","id":"java/tainted-numeric-cast","kind":"path-problem","name":"User-controlled data in numeric cast","precision":"high","problem.severity":"error","security-severity":"9.0"}},{"id":"java/xss","name":"java/xss","shortDescription":{"text":"Cross-site scripting"},"fullDescription":{"text":"Writing user input directly to a web page allows for a cross-site scripting vulnerability."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Cross-site scripting\nDirectly writing user input (for example, an HTTP request parameter) to a web page, without properly sanitizing the input first, allows for a cross-site scripting vulnerability.\n\n\n## Recommendation\nTo guard against cross-site scripting, consider using contextual output encoding/escaping before writing user input to the page, or one of the other solutions that are mentioned in the reference.\n\n\n## Example\nThe following example shows the `page` parameter being written directly to the page, leaving the website vulnerable to cross-site scripting.\n\n\n```java\npublic class XSS extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: a request parameter is written directly to the Servlet response stream\n\t\tresponse.getWriter().print(\n\t\t\t\t\"The page \\\"\" + request.getParameter(\"page\") + \"\\\" was not found.\");\n\n\t}\n}\n\n```\n\n## References\n* OWASP: [XSS (Cross Site Scripting) Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html).\n* Wikipedia: [Cross-site scripting](http://en.wikipedia.org/wiki/Cross-site_scripting).\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n","markdown":"# Cross-site scripting\nDirectly writing user input (for example, an HTTP request parameter) to a web page, without properly sanitizing the input first, allows for a cross-site scripting vulnerability.\n\n\n## Recommendation\nTo guard against cross-site scripting, consider using contextual output encoding/escaping before writing user input to the page, or one of the other solutions that are mentioned in the reference.\n\n\n## Example\nThe following example shows the `page` parameter being written directly to the page, leaving the website vulnerable to cross-site scripting.\n\n\n```java\npublic class XSS extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: a request parameter is written directly to the Servlet response stream\n\t\tresponse.getWriter().print(\n\t\t\t\t\"The page \\\"\" + request.getParameter(\"page\") + \"\\\" was not found.\");\n\n\t}\n}\n\n```\n\n## References\n* OWASP: [XSS (Cross Site Scripting) Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html).\n* Wikipedia: [Cross-site scripting](http://en.wikipedia.org/wiki/Cross-site_scripting).\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n"},"properties":{"tags":["security","external/cwe/cwe-079","owasp-top10-2021","A03:2021 - Injection"],"description":"Writing user input directly to a web page\n allows for a cross-site scripting vulnerability.","id":"java/xss","kind":"path-problem","name":"Cross-site scripting","precision":"high","problem.severity":"error","security-severity":"6.1"}},{"id":"java/rsa-without-oaep","name":"java/rsa-without-oaep","shortDescription":{"text":"Use of RSA algorithm without OAEP"},"fullDescription":{"text":"Using RSA encryption without OAEP padding can result in a padding oracle attack, leading to a weaker encryption."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Use of RSA algorithm without OAEP\nCryptographic algorithms often use padding schemes to make the plaintext less predictable. The OAEP (Optimal Asymmetric Encryption Padding) scheme should be used with RSA encryption. Using an outdated padding scheme such as PKCS1, or no padding at all, can weaken the encryption by making it vulnerable to a padding oracle attack.\n\n\n## Recommendation\nUse the OAEP scheme when using RSA encryption.\n\n\n## Example\nIn the following example, the BAD case shows no padding being used, whereas the GOOD case shows an OAEP scheme being used.\n\n\n```java\n// BAD: No padding scheme is used\nCipher rsa = Cipher.getInstance(\"RSA/ECB/NoPadding\");\n...\n\n//GOOD: OAEP padding is used\nCipher rsa = Cipher.getInstance(\"RSA/ECB/OAEPWithSHA-1AndMGF1Padding\");\n...\n```\n\n## References\n* [Mobile Security Testing Guide](https://github.com/MobSF/owasp-mstg/blob/master/Document/0x04g-Testing-Cryptography.md#padding-oracle-attacks-due-to-weaker-padding-or-block-operation-implementations).\n* [The Padding Oracle Attack](https://robertheaton.com/2013/07/29/padding-oracle-attack/).\n* Common Weakness Enumeration: [CWE-780](https://cwe.mitre.org/data/definitions/780.html).\n","markdown":"# Use of RSA algorithm without OAEP\nCryptographic algorithms often use padding schemes to make the plaintext less predictable. The OAEP (Optimal Asymmetric Encryption Padding) scheme should be used with RSA encryption. Using an outdated padding scheme such as PKCS1, or no padding at all, can weaken the encryption by making it vulnerable to a padding oracle attack.\n\n\n## Recommendation\nUse the OAEP scheme when using RSA encryption.\n\n\n## Example\nIn the following example, the BAD case shows no padding being used, whereas the GOOD case shows an OAEP scheme being used.\n\n\n```java\n// BAD: No padding scheme is used\nCipher rsa = Cipher.getInstance(\"RSA/ECB/NoPadding\");\n...\n\n//GOOD: OAEP padding is used\nCipher rsa = Cipher.getInstance(\"RSA/ECB/OAEPWithSHA-1AndMGF1Padding\");\n...\n```\n\n## References\n* [Mobile Security Testing Guide](https://github.com/MobSF/owasp-mstg/blob/master/Document/0x04g-Testing-Cryptography.md#padding-oracle-attacks-due-to-weaker-padding-or-block-operation-implementations).\n* [The Padding Oracle Attack](https://robertheaton.com/2013/07/29/padding-oracle-attack/).\n* Common Weakness Enumeration: [CWE-780](https://cwe.mitre.org/data/definitions/780.html).\n"},"properties":{"tags":["security","external/cwe/cwe-780","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using RSA encryption without OAEP padding can result in a padding oracle attack, leading to a weaker encryption.","id":"java/rsa-without-oaep","kind":"path-problem","name":"Use of RSA algorithm without OAEP","precision":"high","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/missing-jwt-signature-check","name":"java/missing-jwt-signature-check","shortDescription":{"text":"Missing JWT signature check"},"fullDescription":{"text":"Failing to check the Json Web Token (JWT) signature may allow an attacker to forge their own tokens."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Missing JWT signature check\nA JSON Web Token (JWT) consists of three parts: header, payload, and signature. The `io.jsonwebtoken.jjwt` library is one of many libraries used for working with JWTs. It offers different methods for parsing tokens like `parse`, `parseClaimsJws`, and `parsePlaintextJws`. The last two correctly verify that the JWT is properly signed. This is done by computing the signature of the combination of header and payload and comparing the locally computed signature with the signature part of the JWT.\n\nTherefore it is necessary to provide the `JwtParser` with a key that is used for signature validation. Unfortunately the `parse` method **accepts** a JWT whose signature is empty although a signing key has been set for the parser. This means that an attacker can create arbitrary JWTs that will be accepted if this method is used.\n\n\n## Recommendation\nAlways verify the signature by using either the `parseClaimsJws` and `parsePlaintextJws` methods or by overriding the `onPlaintextJws` or `onClaimsJws` of `JwtHandlerAdapter`.\n\n\n## Example\nThe following example shows four cases where a signing key is set for a parser. In the first 'BAD' case the `parse` method is used, which will not validate the signature. The second 'BAD' case uses a `JwtHandlerAdapter` where the `onPlaintextJwt` method is overriden, so it will not validate the signature. The third and fourth 'GOOD' cases use `parseClaimsJws` method or override the `onPlaintextJws` method.\n\n\n```java\npublic void badJwt(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(token); // BAD: Does not verify the signature\n}\n\npublic void badJwtHandler(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(plaintextJwt, new JwtHandlerAdapter>() {\n @Override\n public Jwt onPlaintextJwt(Jwt jwt) {\n return jwt;\n }\n }); // BAD: The handler is called on an unverified JWT\n}\n\npublic void goodJwt(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parseClaimsJws(token) // GOOD: Verify the signature\n .getBody();\n}\n\npublic void goodJwtHandler(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(plaintextJwt, new JwtHandlerAdapter>() {\n @Override\n public Jws onPlaintextJws(Jws jws) {\n return jws;\n }\n }); // GOOD: The handler is called on a verified JWS\n}\n```\n\n## References\n* zofrex: [How I Found An alg=none JWT Vulnerability in the NHS Contact Tracing App](https://www.zofrex.com/blog/2020/10/20/alg-none-jwt-nhs-contact-tracing-app/).\n* Common Weakness Enumeration: [CWE-347](https://cwe.mitre.org/data/definitions/347.html).\n","markdown":"# Missing JWT signature check\nA JSON Web Token (JWT) consists of three parts: header, payload, and signature. The `io.jsonwebtoken.jjwt` library is one of many libraries used for working with JWTs. It offers different methods for parsing tokens like `parse`, `parseClaimsJws`, and `parsePlaintextJws`. The last two correctly verify that the JWT is properly signed. This is done by computing the signature of the combination of header and payload and comparing the locally computed signature with the signature part of the JWT.\n\nTherefore it is necessary to provide the `JwtParser` with a key that is used for signature validation. Unfortunately the `parse` method **accepts** a JWT whose signature is empty although a signing key has been set for the parser. This means that an attacker can create arbitrary JWTs that will be accepted if this method is used.\n\n\n## Recommendation\nAlways verify the signature by using either the `parseClaimsJws` and `parsePlaintextJws` methods or by overriding the `onPlaintextJws` or `onClaimsJws` of `JwtHandlerAdapter`.\n\n\n## Example\nThe following example shows four cases where a signing key is set for a parser. In the first 'BAD' case the `parse` method is used, which will not validate the signature. The second 'BAD' case uses a `JwtHandlerAdapter` where the `onPlaintextJwt` method is overriden, so it will not validate the signature. The third and fourth 'GOOD' cases use `parseClaimsJws` method or override the `onPlaintextJws` method.\n\n\n```java\npublic void badJwt(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(token); // BAD: Does not verify the signature\n}\n\npublic void badJwtHandler(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(plaintextJwt, new JwtHandlerAdapter>() {\n @Override\n public Jwt onPlaintextJwt(Jwt jwt) {\n return jwt;\n }\n }); // BAD: The handler is called on an unverified JWT\n}\n\npublic void goodJwt(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parseClaimsJws(token) // GOOD: Verify the signature\n .getBody();\n}\n\npublic void goodJwtHandler(String token) {\n Jwts.parserBuilder()\n .setSigningKey(\"someBase64EncodedKey\").build()\n .parse(plaintextJwt, new JwtHandlerAdapter>() {\n @Override\n public Jws onPlaintextJws(Jws jws) {\n return jws;\n }\n }); // GOOD: The handler is called on a verified JWS\n}\n```\n\n## References\n* zofrex: [How I Found An alg=none JWT Vulnerability in the NHS Contact Tracing App](https://www.zofrex.com/blog/2020/10/20/alg-none-jwt-nhs-contact-tracing-app/).\n* Common Weakness Enumeration: [CWE-347](https://cwe.mitre.org/data/definitions/347.html).\n"},"properties":{"tags":["security","external/cwe/cwe-347","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Failing to check the Json Web Token (JWT) signature may allow an attacker to forge their own tokens.","id":"java/missing-jwt-signature-check","kind":"path-problem","name":"Missing JWT signature check","precision":"high","problem.severity":"error","security-severity":"7.8"}},{"id":"java/insecure-trustmanager","name":"java/insecure-trustmanager","shortDescription":{"text":"`TrustManager` that accepts all certificates"},"fullDescription":{"text":"Trusting all certificates allows an attacker to perform a machine-in-the-middle attack."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# `TrustManager` that accepts all certificates\nIf the `checkServerTrusted` method of a `TrustManager` never throws a `CertificateException`, it trusts every certificate. This allows an attacker to perform a machine-in-the-middle attack against the application, therefore breaking any security Transport Layer Security (TLS) gives.\n\nAn attack might look like this:\n\n1. The vulnerable program connects to `https://example.com`.\n1. The attacker intercepts this connection and presents a valid, self-signed certificate for `https://example.com`.\n1. The vulnerable program calls the `checkServerTrusted` method to check whether it should trust the certificate.\n1. The `checkServerTrusted` method of your `TrustManager` does not throw a `CertificateException`.\n1. The vulnerable program accepts the certificate and proceeds with the connection since your `TrustManager` implicitly trusted it by not throwing an exception.\n1. The attacker can now read the data your program sends to `https://example.com` and/or alter its replies while the program thinks the connection is secure.\n\n## Recommendation\nDo not use a custom `TrustManager` that trusts any certificate. If you have to use a self-signed certificate, don't trust every certificate, but instead only trust this specific certificate. See below for an example of how to do this.\n\n\n## Example\nIn the first (bad) example, the `TrustManager` never throws a `CertificateException` and therefore implicitly trusts any certificate. This allows an attacker to perform a machine-in-the-middle attack. In the second (good) example, the self-signed certificate that should be trusted is loaded into a `KeyStore`. This explicitly defines the certificate as trusted and there is no need to create a custom `TrustManager`.\n\n\n```java\npublic static void main(String[] args) throws Exception {\n {\n class InsecureTrustManager implements X509TrustManager {\n @Override\n public X509Certificate[] getAcceptedIssuers() {\n return null;\n }\n\n @Override\n public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {\n // BAD: Does not verify the certificate chain, allowing any certificate.\n }\n\n @Override\n public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {\n\n }\n }\n SSLContext context = SSLContext.getInstance(\"TLS\");\n TrustManager[] trustManager = new TrustManager[] { new InsecureTrustManager() };\n context.init(null, trustManager, null);\n }\n {\n SSLContext context = SSLContext.getInstance(\"TLS\");\n File certificateFile = new File(\"path/to/self-signed-certificate\");\n // Create a `KeyStore` with default type\n KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());\n // `keyStore` is initially empty\n keyStore.load(null, null);\n X509Certificate generatedCertificate;\n try (InputStream cert = new FileInputStream(certificateFile)) {\n generatedCertificate = (X509Certificate) CertificateFactory.getInstance(\"X509\")\n .generateCertificate(cert);\n }\n // Add the self-signed certificate to the key store\n keyStore.setCertificateEntry(certificateFile.getName(), generatedCertificate);\n // Get default `TrustManagerFactory`\n TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\n // Use it with our key store that trusts our self-signed certificate\n tmf.init(keyStore);\n TrustManager[] trustManagers = tmf.getTrustManagers();\n context.init(null, trustManagers, null);\n // GOOD, we are not using a custom `TrustManager` but instead have\n // added the self-signed certificate we want to trust to the key\n // store. Note, the `trustManagers` will **only** trust this one\n // certificate.\n \n URL url = new URL(\"https://self-signed.badssl.com/\");\n HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();\n conn.setSSLSocketFactory(context.getSocketFactory());\n }\n}\n\n```\n\n## References\n* Android Developers: [Security with HTTPS and SSL](https://developer.android.com/training/articles/security-ssl).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n","markdown":"# `TrustManager` that accepts all certificates\nIf the `checkServerTrusted` method of a `TrustManager` never throws a `CertificateException`, it trusts every certificate. This allows an attacker to perform a machine-in-the-middle attack against the application, therefore breaking any security Transport Layer Security (TLS) gives.\n\nAn attack might look like this:\n\n1. The vulnerable program connects to `https://example.com`.\n1. The attacker intercepts this connection and presents a valid, self-signed certificate for `https://example.com`.\n1. The vulnerable program calls the `checkServerTrusted` method to check whether it should trust the certificate.\n1. The `checkServerTrusted` method of your `TrustManager` does not throw a `CertificateException`.\n1. The vulnerable program accepts the certificate and proceeds with the connection since your `TrustManager` implicitly trusted it by not throwing an exception.\n1. The attacker can now read the data your program sends to `https://example.com` and/or alter its replies while the program thinks the connection is secure.\n\n## Recommendation\nDo not use a custom `TrustManager` that trusts any certificate. If you have to use a self-signed certificate, don't trust every certificate, but instead only trust this specific certificate. See below for an example of how to do this.\n\n\n## Example\nIn the first (bad) example, the `TrustManager` never throws a `CertificateException` and therefore implicitly trusts any certificate. This allows an attacker to perform a machine-in-the-middle attack. In the second (good) example, the self-signed certificate that should be trusted is loaded into a `KeyStore`. This explicitly defines the certificate as trusted and there is no need to create a custom `TrustManager`.\n\n\n```java\npublic static void main(String[] args) throws Exception {\n {\n class InsecureTrustManager implements X509TrustManager {\n @Override\n public X509Certificate[] getAcceptedIssuers() {\n return null;\n }\n\n @Override\n public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {\n // BAD: Does not verify the certificate chain, allowing any certificate.\n }\n\n @Override\n public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {\n\n }\n }\n SSLContext context = SSLContext.getInstance(\"TLS\");\n TrustManager[] trustManager = new TrustManager[] { new InsecureTrustManager() };\n context.init(null, trustManager, null);\n }\n {\n SSLContext context = SSLContext.getInstance(\"TLS\");\n File certificateFile = new File(\"path/to/self-signed-certificate\");\n // Create a `KeyStore` with default type\n KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());\n // `keyStore` is initially empty\n keyStore.load(null, null);\n X509Certificate generatedCertificate;\n try (InputStream cert = new FileInputStream(certificateFile)) {\n generatedCertificate = (X509Certificate) CertificateFactory.getInstance(\"X509\")\n .generateCertificate(cert);\n }\n // Add the self-signed certificate to the key store\n keyStore.setCertificateEntry(certificateFile.getName(), generatedCertificate);\n // Get default `TrustManagerFactory`\n TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\n // Use it with our key store that trusts our self-signed certificate\n tmf.init(keyStore);\n TrustManager[] trustManagers = tmf.getTrustManagers();\n context.init(null, trustManagers, null);\n // GOOD, we are not using a custom `TrustManager` but instead have\n // added the self-signed certificate we want to trust to the key\n // store. Note, the `trustManagers` will **only** trust this one\n // certificate.\n \n URL url = new URL(\"https://self-signed.badssl.com/\");\n HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();\n conn.setSSLSocketFactory(context.getSocketFactory());\n }\n}\n\n```\n\n## References\n* Android Developers: [Security with HTTPS and SSL](https://developer.android.com/training/articles/security-ssl).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n"},"properties":{"tags":["security","external/cwe/cwe-295","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Trusting all certificates allows an attacker to perform a machine-in-the-middle attack.","id":"java/insecure-trustmanager","kind":"path-problem","name":"`TrustManager` that accepts all certificates","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/improper-webview-certificate-validation","name":"java/improper-webview-certificate-validation","shortDescription":{"text":"Android `WebView` that accepts all certificates"},"fullDescription":{"text":"Trusting all certificates allows an attacker to perform a machine-in-the-middle attack."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Android `WebView` that accepts all certificates\nIf the `onReceivedSslError` method of an Android `WebViewClient` always calls `proceed` on the given `SslErrorHandler`, it trusts any certificate. This allows an attacker to perform a machine-in-the-middle attack against the application, therefore breaking any security Transport Layer Security (TLS) gives.\n\nAn attack might look like this:\n\n1. The vulnerable application connects to `https://example.com`.\n1. The attacker intercepts this connection and presents a valid, self-signed certificate for `https://example.com`.\n1. The vulnerable application calls the `onReceivedSslError` method to check whether it should trust the certificate.\n1. The `onReceivedSslError` method of your `WebViewClient` calls `SslErrorHandler.proceed`.\n1. The vulnerable application accepts the certificate and proceeds with the connection since your `WevViewClient` trusted it by proceeding.\n1. The attacker can now read the data your application sends to `https://example.com` and/or alter its replies while the application thinks the connection is secure.\n\n## Recommendation\nDo not use a call `SslerrorHandler.proceed` unconditionally. If you have to use a self-signed certificate, only accept that certificate, not all certificates.\n\n\n## Example\nIn the first (bad) example, the `WebViewClient` trusts all certificates by always calling `SslErrorHandler.proceed`. In the second (good) example, only certificates signed by a certain public key are accepted.\n\n\n```java\nclass Bad extends WebViewClient {\n // BAD: All certificates are trusted.\n public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $hasResult\n handler.proceed(); \n }\n}\n\nclass Good extends WebViewClient {\n PublicKey myPubKey = ...;\n\n // GOOD: Only certificates signed by a certain public key are trusted.\n public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $hasResult\n try {\n X509Certificate cert = error.getCertificate().getX509Certificate();\n cert.verify(this.myPubKey);\n handler.proceed();\n }\n catch (CertificateException|NoSuchAlgorithmException|InvalidKeyException|NoSuchProviderException|SignatureException e) {\n handler.cancel();\n }\n } \n}\n```\n\n## References\n* [WebViewClient.onReceivedSslError documentation](https://developer.android.com/reference/android/webkit/WebViewClient?hl=en#onReceivedSslError(android.webkit.WebView,%20android.webkit.SslErrorHandler,%20android.net.http.SslError)).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n","markdown":"# Android `WebView` that accepts all certificates\nIf the `onReceivedSslError` method of an Android `WebViewClient` always calls `proceed` on the given `SslErrorHandler`, it trusts any certificate. This allows an attacker to perform a machine-in-the-middle attack against the application, therefore breaking any security Transport Layer Security (TLS) gives.\n\nAn attack might look like this:\n\n1. The vulnerable application connects to `https://example.com`.\n1. The attacker intercepts this connection and presents a valid, self-signed certificate for `https://example.com`.\n1. The vulnerable application calls the `onReceivedSslError` method to check whether it should trust the certificate.\n1. The `onReceivedSslError` method of your `WebViewClient` calls `SslErrorHandler.proceed`.\n1. The vulnerable application accepts the certificate and proceeds with the connection since your `WevViewClient` trusted it by proceeding.\n1. The attacker can now read the data your application sends to `https://example.com` and/or alter its replies while the application thinks the connection is secure.\n\n## Recommendation\nDo not use a call `SslerrorHandler.proceed` unconditionally. If you have to use a self-signed certificate, only accept that certificate, not all certificates.\n\n\n## Example\nIn the first (bad) example, the `WebViewClient` trusts all certificates by always calling `SslErrorHandler.proceed`. In the second (good) example, only certificates signed by a certain public key are accepted.\n\n\n```java\nclass Bad extends WebViewClient {\n // BAD: All certificates are trusted.\n public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $hasResult\n handler.proceed(); \n }\n}\n\nclass Good extends WebViewClient {\n PublicKey myPubKey = ...;\n\n // GOOD: Only certificates signed by a certain public key are trusted.\n public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { // $hasResult\n try {\n X509Certificate cert = error.getCertificate().getX509Certificate();\n cert.verify(this.myPubKey);\n handler.proceed();\n }\n catch (CertificateException|NoSuchAlgorithmException|InvalidKeyException|NoSuchProviderException|SignatureException e) {\n handler.cancel();\n }\n } \n}\n```\n\n## References\n* [WebViewClient.onReceivedSslError documentation](https://developer.android.com/reference/android/webkit/WebViewClient?hl=en#onReceivedSslError(android.webkit.WebView,%20android.webkit.SslErrorHandler,%20android.net.http.SslError)).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n"},"properties":{"tags":["security","external/cwe/cwe-295","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Trusting all certificates allows an attacker to perform a machine-in-the-middle attack.","id":"java/improper-webview-certificate-validation","kind":"problem","name":"Android `WebView` that accepts all certificates","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/ognl-injection","name":"java/ognl-injection","shortDescription":{"text":"OGNL Expression Language statement with user-controlled input"},"fullDescription":{"text":"Evaluation of OGNL Expression Language statement with user-controlled input can lead to execution of arbitrary code."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# OGNL Expression Language statement with user-controlled input\nObject-Graph Navigation Language (OGNL) is an open-source Expression Language (EL) for Java. OGNL can create or change executable code, consequently it can introduce critical security flaws to any application that uses it. Evaluation of unvalidated expressions is a common flaw in OGNL. This exposes the properties of Java objects to modification by an attacker and may allow them to execute arbitrary code.\n\n\n## Recommendation\nThe general recommendation is to avoid evaluating untrusted ONGL expressions. If user-provided OGNL expressions must be evaluated, do this in a sandbox and validate the expressions before evaluation.\n\n\n## Example\nIn the following examples, the code accepts an OGNL expression from the user and evaluates it.\n\nIn the first example, the user-provided OGNL expression is parsed and evaluated.\n\nThe second example validates the expression and evaluates it inside a sandbox. You can add a sandbox by setting a system property, as shown in the example, or by adding `-Dognl.security.manager` to JVM arguments.\n\n\n```java\nimport ognl.Ognl;\nimport ognl.OgnlException;\n\npublic void evaluate(HttpServletRequest request, Object root) throws OgnlException {\n String expression = request.getParameter(\"expression\");\n\n // BAD: User provided expression is evaluated\n Ognl.getValue(expression, root);\n \n // GOOD: The name is validated and expression is evaluated in sandbox\n System.setProperty(\"ognl.security.manager\", \"\"); // Or add -Dognl.security.manager to JVM args\n if (isValid(expression)) {\n Ognl.getValue(expression, root);\n } else {\n // Reject the request\n }\n}\n\npublic void isValid(Strig expression) {\n // Custom method to validate the expression.\n // For instance, make sure it doesn't include unexpected code.\n}\n\n```\n\n## References\n* Apache Commons: [Apache Commons OGNL](https://commons.apache.org/proper/commons-ognl/).\n* Struts security: [Proactively protect from OGNL Expression Injections attacks](https://struts.apache.org/security/#proactively-protect-from-ognl-expression-injections-attacks-if-easily-applicable).\n* Common Weakness Enumeration: [CWE-917](https://cwe.mitre.org/data/definitions/917.html).\n","markdown":"# OGNL Expression Language statement with user-controlled input\nObject-Graph Navigation Language (OGNL) is an open-source Expression Language (EL) for Java. OGNL can create or change executable code, consequently it can introduce critical security flaws to any application that uses it. Evaluation of unvalidated expressions is a common flaw in OGNL. This exposes the properties of Java objects to modification by an attacker and may allow them to execute arbitrary code.\n\n\n## Recommendation\nThe general recommendation is to avoid evaluating untrusted ONGL expressions. If user-provided OGNL expressions must be evaluated, do this in a sandbox and validate the expressions before evaluation.\n\n\n## Example\nIn the following examples, the code accepts an OGNL expression from the user and evaluates it.\n\nIn the first example, the user-provided OGNL expression is parsed and evaluated.\n\nThe second example validates the expression and evaluates it inside a sandbox. You can add a sandbox by setting a system property, as shown in the example, or by adding `-Dognl.security.manager` to JVM arguments.\n\n\n```java\nimport ognl.Ognl;\nimport ognl.OgnlException;\n\npublic void evaluate(HttpServletRequest request, Object root) throws OgnlException {\n String expression = request.getParameter(\"expression\");\n\n // BAD: User provided expression is evaluated\n Ognl.getValue(expression, root);\n \n // GOOD: The name is validated and expression is evaluated in sandbox\n System.setProperty(\"ognl.security.manager\", \"\"); // Or add -Dognl.security.manager to JVM args\n if (isValid(expression)) {\n Ognl.getValue(expression, root);\n } else {\n // Reject the request\n }\n}\n\npublic void isValid(Strig expression) {\n // Custom method to validate the expression.\n // For instance, make sure it doesn't include unexpected code.\n}\n\n```\n\n## References\n* Apache Commons: [Apache Commons OGNL](https://commons.apache.org/proper/commons-ognl/).\n* Struts security: [Proactively protect from OGNL Expression Injections attacks](https://struts.apache.org/security/#proactively-protect-from-ognl-expression-injections-attacks-if-easily-applicable).\n* Common Weakness Enumeration: [CWE-917](https://cwe.mitre.org/data/definitions/917.html).\n"},"properties":{"tags":["security","external/cwe/cwe-917","owasp-top10-2021","A03:2021 - Injection"],"description":"Evaluation of OGNL Expression Language statement with user-controlled input can\n lead to execution of arbitrary code.","id":"java/ognl-injection","kind":"path-problem","name":"OGNL Expression Language statement with user-controlled input","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/netty-http-request-or-response-splitting","name":"java/netty-http-request-or-response-splitting","shortDescription":{"text":"Disabled Netty HTTP header validation"},"fullDescription":{"text":"Disabling HTTP header validation makes code vulnerable to attack by header splitting if user input is written directly to an HTTP header."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Disabled Netty HTTP header validation\nDirectly writing user input (for example, an HTTP request parameter) to an HTTP header can lead to an HTTP request-splitting or response-splitting vulnerability.\n\nHTTP response splitting can lead to vulnerabilities such as XSS and cache poisoning.\n\nHTTP request splitting can allow an attacker to inject an additional HTTP request into a client's outgoing socket connection. This can allow an attacker to perform an SSRF-like attack.\n\nIn the context of a servlet container, if the user input includes blank lines and the servlet container does not escape the blank lines, then a remote user can cause the response to turn into two separate responses. The remote user can then control one or more responses, which is also HTTP response splitting.\n\n\n## Recommendation\nGuard against HTTP header splitting in the same way as guarding against cross-site scripting. Before passing any data into HTTP headers, either check the data for special characters, or escape any special characters that are present.\n\nIf the code calls Netty API's directly, ensure that the `validateHeaders` parameter is set to `true`.\n\n\n## Example\nThe following example shows the 'name' parameter being written to a cookie in two different ways. The first way writes it directly to the cookie, and thus is vulnerable to response-splitting attacks. The second way first removes all special characters, thus avoiding the potential problem.\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: setting a cookie with an unvalidated parameter\n\t\tCookie cookie = new Cookie(\"name\", request.getParameter(\"name\"));\n\t\tresponse.addCookie(cookie);\n\n\t\t// GOOD: remove special characters before putting them in the header\n\t\tString name = removeSpecial(request.getParameter(\"name\"));\n\t\tCookie cookie2 = new Cookie(\"name\", name);\n\t\tresponse.addCookie(cookie2);\n\t}\n\n\tprivate static String removeSpecial(String str) {\n\t\treturn str.replaceAll(\"[^a-zA-Z ]\", \"\");\n\t}\n}\n\n```\n\n## Example\nThe following example shows the use of the library 'netty' with HTTP response-splitting verification configurations. The second way will verify the parameters before using them to build the HTTP response.\n\n\n```java\nimport io.netty.handler.codec.http.DefaultHttpHeaders;\n\npublic class ResponseSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpResponse badResponse = new DefaultHttpResponse(version, httpResponseStatus, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpResponse goodResponse = new DefaultHttpResponse(version, httpResponseStatus);\n}\n\n```\n\n## Example\nThe following example shows the use of the netty library with configurations for verification of HTTP request splitting. The second recommended approach in the example verifies the parameters before using them to build the HTTP request.\n\n\n```java\npublic class NettyRequestSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpRequest badRequest = new DefaultHttpRequest(httpVersion, method, uri, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpRequest goodResponse = new DefaultHttpRequest(httpVersion, method, uri);\n}\n\n```\n\n## References\n* SecLists.org: [HTTP response splitting](https://seclists.org/bugtraq/2005/Apr/187).\n* OWASP: [HTTP Response Splitting](https://www.owasp.org/index.php/HTTP_Response_Splitting).\n* Wikipedia: [HTTP response splitting](http://en.wikipedia.org/wiki/HTTP_response_splitting).\n* CAPEC: [CAPEC-105: HTTP Request Splitting](https://capec.mitre.org/data/definitions/105.html)\n* Common Weakness Enumeration: [CWE-93](https://cwe.mitre.org/data/definitions/93.html).\n* Common Weakness Enumeration: [CWE-113](https://cwe.mitre.org/data/definitions/113.html).\n","markdown":"# Disabled Netty HTTP header validation\nDirectly writing user input (for example, an HTTP request parameter) to an HTTP header can lead to an HTTP request-splitting or response-splitting vulnerability.\n\nHTTP response splitting can lead to vulnerabilities such as XSS and cache poisoning.\n\nHTTP request splitting can allow an attacker to inject an additional HTTP request into a client's outgoing socket connection. This can allow an attacker to perform an SSRF-like attack.\n\nIn the context of a servlet container, if the user input includes blank lines and the servlet container does not escape the blank lines, then a remote user can cause the response to turn into two separate responses. The remote user can then control one or more responses, which is also HTTP response splitting.\n\n\n## Recommendation\nGuard against HTTP header splitting in the same way as guarding against cross-site scripting. Before passing any data into HTTP headers, either check the data for special characters, or escape any special characters that are present.\n\nIf the code calls Netty API's directly, ensure that the `validateHeaders` parameter is set to `true`.\n\n\n## Example\nThe following example shows the 'name' parameter being written to a cookie in two different ways. The first way writes it directly to the cookie, and thus is vulnerable to response-splitting attacks. The second way first removes all special characters, thus avoiding the potential problem.\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: setting a cookie with an unvalidated parameter\n\t\tCookie cookie = new Cookie(\"name\", request.getParameter(\"name\"));\n\t\tresponse.addCookie(cookie);\n\n\t\t// GOOD: remove special characters before putting them in the header\n\t\tString name = removeSpecial(request.getParameter(\"name\"));\n\t\tCookie cookie2 = new Cookie(\"name\", name);\n\t\tresponse.addCookie(cookie2);\n\t}\n\n\tprivate static String removeSpecial(String str) {\n\t\treturn str.replaceAll(\"[^a-zA-Z ]\", \"\");\n\t}\n}\n\n```\n\n## Example\nThe following example shows the use of the library 'netty' with HTTP response-splitting verification configurations. The second way will verify the parameters before using them to build the HTTP response.\n\n\n```java\nimport io.netty.handler.codec.http.DefaultHttpHeaders;\n\npublic class ResponseSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpResponse badResponse = new DefaultHttpResponse(version, httpResponseStatus, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpResponse goodResponse = new DefaultHttpResponse(version, httpResponseStatus);\n}\n\n```\n\n## Example\nThe following example shows the use of the netty library with configurations for verification of HTTP request splitting. The second recommended approach in the example verifies the parameters before using them to build the HTTP request.\n\n\n```java\npublic class NettyRequestSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpRequest badRequest = new DefaultHttpRequest(httpVersion, method, uri, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpRequest goodResponse = new DefaultHttpRequest(httpVersion, method, uri);\n}\n\n```\n\n## References\n* SecLists.org: [HTTP response splitting](https://seclists.org/bugtraq/2005/Apr/187).\n* OWASP: [HTTP Response Splitting](https://www.owasp.org/index.php/HTTP_Response_Splitting).\n* Wikipedia: [HTTP response splitting](http://en.wikipedia.org/wiki/HTTP_response_splitting).\n* CAPEC: [CAPEC-105: HTTP Request Splitting](https://capec.mitre.org/data/definitions/105.html)\n* Common Weakness Enumeration: [CWE-93](https://cwe.mitre.org/data/definitions/93.html).\n* Common Weakness Enumeration: [CWE-113](https://cwe.mitre.org/data/definitions/113.html).\n"},"properties":{"tags":["security","external/cwe/cwe-93","external/cwe/cwe-113","owasp-top10-2021","A03:2021 - Injection"],"description":"Disabling HTTP header validation makes code vulnerable to\n attack by header splitting if user input is written directly to\n an HTTP header.","id":"java/netty-http-request-or-response-splitting","kind":"problem","name":"Disabled Netty HTTP header validation","precision":"high","problem.severity":"error","security-severity":"6.1"}},{"id":"java/http-response-splitting","name":"java/http-response-splitting","shortDescription":{"text":"HTTP response splitting"},"fullDescription":{"text":"Writing user input directly to an HTTP header makes code vulnerable to attack by header splitting."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# HTTP response splitting\nDirectly writing user input (for example, an HTTP request parameter) to an HTTP header can lead to an HTTP request-splitting or response-splitting vulnerability.\n\nHTTP response splitting can lead to vulnerabilities such as XSS and cache poisoning.\n\nHTTP request splitting can allow an attacker to inject an additional HTTP request into a client's outgoing socket connection. This can allow an attacker to perform an SSRF-like attack.\n\nIn the context of a servlet container, if the user input includes blank lines and the servlet container does not escape the blank lines, then a remote user can cause the response to turn into two separate responses. The remote user can then control one or more responses, which is also HTTP response splitting.\n\n\n## Recommendation\nGuard against HTTP header splitting in the same way as guarding against cross-site scripting. Before passing any data into HTTP headers, either check the data for special characters, or escape any special characters that are present.\n\nIf the code calls Netty API's directly, ensure that the `validateHeaders` parameter is set to `true`.\n\n\n## Example\nThe following example shows the 'name' parameter being written to a cookie in two different ways. The first way writes it directly to the cookie, and thus is vulnerable to response-splitting attacks. The second way first removes all special characters, thus avoiding the potential problem.\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: setting a cookie with an unvalidated parameter\n\t\tCookie cookie = new Cookie(\"name\", request.getParameter(\"name\"));\n\t\tresponse.addCookie(cookie);\n\n\t\t// GOOD: remove special characters before putting them in the header\n\t\tString name = removeSpecial(request.getParameter(\"name\"));\n\t\tCookie cookie2 = new Cookie(\"name\", name);\n\t\tresponse.addCookie(cookie2);\n\t}\n\n\tprivate static String removeSpecial(String str) {\n\t\treturn str.replaceAll(\"[^a-zA-Z ]\", \"\");\n\t}\n}\n\n```\n\n## Example\nThe following example shows the use of the library 'netty' with HTTP response-splitting verification configurations. The second way will verify the parameters before using them to build the HTTP response.\n\n\n```java\nimport io.netty.handler.codec.http.DefaultHttpHeaders;\n\npublic class ResponseSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpResponse badResponse = new DefaultHttpResponse(version, httpResponseStatus, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpResponse goodResponse = new DefaultHttpResponse(version, httpResponseStatus);\n}\n\n```\n\n## Example\nThe following example shows the use of the netty library with configurations for verification of HTTP request splitting. The second recommended approach in the example verifies the parameters before using them to build the HTTP request.\n\n\n```java\npublic class NettyRequestSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpRequest badRequest = new DefaultHttpRequest(httpVersion, method, uri, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpRequest goodResponse = new DefaultHttpRequest(httpVersion, method, uri);\n}\n\n```\n\n## References\n* SecLists.org: [HTTP response splitting](https://seclists.org/bugtraq/2005/Apr/187).\n* OWASP: [HTTP Response Splitting](https://www.owasp.org/index.php/HTTP_Response_Splitting).\n* Wikipedia: [HTTP response splitting](http://en.wikipedia.org/wiki/HTTP_response_splitting).\n* CAPEC: [CAPEC-105: HTTP Request Splitting](https://capec.mitre.org/data/definitions/105.html)\n* Common Weakness Enumeration: [CWE-113](https://cwe.mitre.org/data/definitions/113.html).\n","markdown":"# HTTP response splitting\nDirectly writing user input (for example, an HTTP request parameter) to an HTTP header can lead to an HTTP request-splitting or response-splitting vulnerability.\n\nHTTP response splitting can lead to vulnerabilities such as XSS and cache poisoning.\n\nHTTP request splitting can allow an attacker to inject an additional HTTP request into a client's outgoing socket connection. This can allow an attacker to perform an SSRF-like attack.\n\nIn the context of a servlet container, if the user input includes blank lines and the servlet container does not escape the blank lines, then a remote user can cause the response to turn into two separate responses. The remote user can then control one or more responses, which is also HTTP response splitting.\n\n\n## Recommendation\nGuard against HTTP header splitting in the same way as guarding against cross-site scripting. Before passing any data into HTTP headers, either check the data for special characters, or escape any special characters that are present.\n\nIf the code calls Netty API's directly, ensure that the `validateHeaders` parameter is set to `true`.\n\n\n## Example\nThe following example shows the 'name' parameter being written to a cookie in two different ways. The first way writes it directly to the cookie, and thus is vulnerable to response-splitting attacks. The second way first removes all special characters, thus avoiding the potential problem.\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: setting a cookie with an unvalidated parameter\n\t\tCookie cookie = new Cookie(\"name\", request.getParameter(\"name\"));\n\t\tresponse.addCookie(cookie);\n\n\t\t// GOOD: remove special characters before putting them in the header\n\t\tString name = removeSpecial(request.getParameter(\"name\"));\n\t\tCookie cookie2 = new Cookie(\"name\", name);\n\t\tresponse.addCookie(cookie2);\n\t}\n\n\tprivate static String removeSpecial(String str) {\n\t\treturn str.replaceAll(\"[^a-zA-Z ]\", \"\");\n\t}\n}\n\n```\n\n## Example\nThe following example shows the use of the library 'netty' with HTTP response-splitting verification configurations. The second way will verify the parameters before using them to build the HTTP response.\n\n\n```java\nimport io.netty.handler.codec.http.DefaultHttpHeaders;\n\npublic class ResponseSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpResponse badResponse = new DefaultHttpResponse(version, httpResponseStatus, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpResponse goodResponse = new DefaultHttpResponse(version, httpResponseStatus);\n}\n\n```\n\n## Example\nThe following example shows the use of the netty library with configurations for verification of HTTP request splitting. The second recommended approach in the example verifies the parameters before using them to build the HTTP request.\n\n\n```java\npublic class NettyRequestSplitting {\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpHeaders badHeaders = new DefaultHttpHeaders(false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpHeaders goodHeaders = new DefaultHttpHeaders();\n\n // BAD: Disables the internal response splitting verification\n private final DefaultHttpRequest badRequest = new DefaultHttpRequest(httpVersion, method, uri, false);\n\n // GOOD: Verifies headers passed don't contain CRLF characters\n private final DefaultHttpRequest goodResponse = new DefaultHttpRequest(httpVersion, method, uri);\n}\n\n```\n\n## References\n* SecLists.org: [HTTP response splitting](https://seclists.org/bugtraq/2005/Apr/187).\n* OWASP: [HTTP Response Splitting](https://www.owasp.org/index.php/HTTP_Response_Splitting).\n* Wikipedia: [HTTP response splitting](http://en.wikipedia.org/wiki/HTTP_response_splitting).\n* CAPEC: [CAPEC-105: HTTP Request Splitting](https://capec.mitre.org/data/definitions/105.html)\n* Common Weakness Enumeration: [CWE-113](https://cwe.mitre.org/data/definitions/113.html).\n"},"properties":{"tags":["security","external/cwe/cwe-113","owasp-top10-2021","A03:2021 - Injection"],"description":"Writing user input directly to an HTTP header\n makes code vulnerable to attack by header splitting.","id":"java/http-response-splitting","kind":"path-problem","name":"HTTP response splitting","precision":"high","problem.severity":"error","security-severity":"6.1"}},{"id":"java/overly-large-range","name":"java/overly-large-range","shortDescription":{"text":"Overly permissive regular expression range"},"fullDescription":{"text":"Overly permissive regular expression ranges match a wider range of characters than intended. This may allow an attacker to bypass a filter or sanitizer."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Overly permissive regular expression range\nIt's easy to write a regular expression range that matches a wider range of characters than you intended. For example, `/[a-zA-z]/` matches all lowercase and all uppercase letters, as you would expect, but it also matches the characters: `` [ \\ ] ^ _ ` ``.\n\nAnother common problem is failing to escape the dash character in a regular expression. An unescaped dash is interpreted as part of a range. For example, in the character class `[a-zA-Z0-9%=.,-_]` the last character range matches the 55 characters between `,` and `_` (both included), which overlaps with the range `[0-9]` and is clearly not intended by the writer.\n\n\n## Recommendation\nAvoid any confusion about which characters are included in the range by writing unambiguous regular expressions. Always check that character ranges match only the expected characters.\n\n\n## Example\nThe following example code is intended to check whether a string is a valid 6 digit hex color.\n\n```java\n\nimport java.util.regex.Pattern\npublic class Tester {\n public static boolean is_valid_hex_color(String color) {\n return Pattern.matches(\"#[0-9a-fA-f]{6}\", color);\n }\n}\n\n```\nHowever, the `A-f` range is overly large and matches every uppercase character. It would parse a \"color\" like `#XXYYZZ` as valid.\n\nThe fix is to use an uppercase `A-F` range instead.\n\n```javascript\n\nimport java.util.regex.Pattern\npublic class Tester {\n public static boolean is_valid_hex_color(String color) {\n return Pattern.matches(\"#[0-9a-fA-F]{6}\", color);\n }\n}\n\n```\n\n## References\n* GitHub Advisory Database: [CVE-2021-42740: Improper Neutralization of Special Elements used in a Command in Shell-quote](https://github.com/advisories/GHSA-g4rg-993r-mgx7)\n* wh0.github.io: [Exploiting CVE-2021-42740](https://wh0.github.io/2021/10/28/shell-quote-rce-exploiting.html)\n* Yosuke Ota: [no-obscure-range](https://ota-meshi.github.io/eslint-plugin-regexp/rules/no-obscure-range.html)\n* Paul Boyd: [The regex \\[,-.\\]](https://pboyd.io/posts/comma-dash-dot/)\n* Common Weakness Enumeration: [CWE-20](https://cwe.mitre.org/data/definitions/20.html).\n","markdown":"# Overly permissive regular expression range\nIt's easy to write a regular expression range that matches a wider range of characters than you intended. For example, `/[a-zA-z]/` matches all lowercase and all uppercase letters, as you would expect, but it also matches the characters: `` [ \\ ] ^ _ ` ``.\n\nAnother common problem is failing to escape the dash character in a regular expression. An unescaped dash is interpreted as part of a range. For example, in the character class `[a-zA-Z0-9%=.,-_]` the last character range matches the 55 characters between `,` and `_` (both included), which overlaps with the range `[0-9]` and is clearly not intended by the writer.\n\n\n## Recommendation\nAvoid any confusion about which characters are included in the range by writing unambiguous regular expressions. Always check that character ranges match only the expected characters.\n\n\n## Example\nThe following example code is intended to check whether a string is a valid 6 digit hex color.\n\n```java\n\nimport java.util.regex.Pattern\npublic class Tester {\n public static boolean is_valid_hex_color(String color) {\n return Pattern.matches(\"#[0-9a-fA-f]{6}\", color);\n }\n}\n\n```\nHowever, the `A-f` range is overly large and matches every uppercase character. It would parse a \"color\" like `#XXYYZZ` as valid.\n\nThe fix is to use an uppercase `A-F` range instead.\n\n```javascript\n\nimport java.util.regex.Pattern\npublic class Tester {\n public static boolean is_valid_hex_color(String color) {\n return Pattern.matches(\"#[0-9a-fA-F]{6}\", color);\n }\n}\n\n```\n\n## References\n* GitHub Advisory Database: [CVE-2021-42740: Improper Neutralization of Special Elements used in a Command in Shell-quote](https://github.com/advisories/GHSA-g4rg-993r-mgx7)\n* wh0.github.io: [Exploiting CVE-2021-42740](https://wh0.github.io/2021/10/28/shell-quote-rce-exploiting.html)\n* Yosuke Ota: [no-obscure-range](https://ota-meshi.github.io/eslint-plugin-regexp/rules/no-obscure-range.html)\n* Paul Boyd: [The regex \\[,-.\\]](https://pboyd.io/posts/comma-dash-dot/)\n* Common Weakness Enumeration: [CWE-20](https://cwe.mitre.org/data/definitions/20.html).\n"},"properties":{"tags":["correctness","security","external/cwe/cwe-020","owasp-top10-2021","A03:2021 - Injection"],"description":"Overly permissive regular expression ranges match a wider range of characters than intended.\n This may allow an attacker to bypass a filter or sanitizer.","id":"java/overly-large-range","kind":"problem","name":"Overly permissive regular expression range","precision":"high","problem.severity":"warning","security-severity":"5.0"}},{"id":"java/path-injection","name":"java/path-injection","shortDescription":{"text":"Uncontrolled data used in path expression"},"fullDescription":{"text":"Accessing paths influenced by users can allow an attacker to access unexpected resources."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Uncontrolled data used in path expression\nAccessing paths controlled by users can allow an attacker to access unexpected resources. This can result in sensitive information being revealed or deleted, or an attacker being able to influence behavior by modifying unexpected files.\n\nPaths that are naively constructed from data controlled by a user may contain unexpected special characters, such as \"..\". Such a path may potentially point to any directory on the file system.\n\n\n## Recommendation\nValidate user input before using it to construct a file path. Ideally, follow these rules:\n\n* Do not allow more than a single \".\" character.\n* Do not allow directory separators such as \"/\" or \"\\\\\" (depending on the file system).\n* Do not rely on simply replacing problematic sequences such as \"../\". For example, after applying this filter to \".../...//\" the resulting string would still be \"../\".\n* Ideally use a whitelist of known good patterns.\n\n## Example\nIn this example, a file name is read from a `java.net.Socket` and then used to access a file in the user's home directory and send it back over the socket. However, a malicious user could enter a file name which contains special characters. For example, the string \"../../etc/passwd\" will result in the code reading the file located at \"/home/\\[user\\]/../../etc/passwd\", which is the system's password file. This file would then be sent back to the user, giving them access to all the system's passwords.\n\n\n```java\npublic void sendUserFile(Socket sock, String user) {\n\tBufferedReader filenameReader = new BufferedReader(\n\t\t\tnew InputStreamReader(sock.getInputStream(), \"UTF-8\"));\n\tString filename = filenameReader.readLine();\n\t// BAD: read from a file using a path controlled by the user\n\tBufferedReader fileReader = new BufferedReader(\n\t\t\tnew FileReader(\"/home/\" + user + \"/\" + filename));\n\tString fileLine = fileReader.readLine();\n\twhile(fileLine != null) {\n\t\tsock.getOutputStream().write(fileLine.getBytes());\n\t\tfileLine = fileReader.readLine();\n\t}\n}\n\npublic void sendUserFileFixed(Socket sock, String user) {\n\t// ...\n\t\n\t// GOOD: remove all dots and directory delimiters from the filename before using\n\tString filename = filenameReader.readLine().replaceAll(\"\\\\.\", \"\").replaceAll(\"/\", \"\");\n\tBufferedReader fileReader = new BufferedReader(\n\t\t\tnew FileReader(\"/home/\" + user + \"/\" + filename));\n\n\t// ...\n}\n\n```\n\n## References\n* OWASP: [Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* Common Weakness Enumeration: [CWE-22](https://cwe.mitre.org/data/definitions/22.html).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n* Common Weakness Enumeration: [CWE-36](https://cwe.mitre.org/data/definitions/36.html).\n* Common Weakness Enumeration: [CWE-73](https://cwe.mitre.org/data/definitions/73.html).\n","markdown":"# Uncontrolled data used in path expression\nAccessing paths controlled by users can allow an attacker to access unexpected resources. This can result in sensitive information being revealed or deleted, or an attacker being able to influence behavior by modifying unexpected files.\n\nPaths that are naively constructed from data controlled by a user may contain unexpected special characters, such as \"..\". Such a path may potentially point to any directory on the file system.\n\n\n## Recommendation\nValidate user input before using it to construct a file path. Ideally, follow these rules:\n\n* Do not allow more than a single \".\" character.\n* Do not allow directory separators such as \"/\" or \"\\\\\" (depending on the file system).\n* Do not rely on simply replacing problematic sequences such as \"../\". For example, after applying this filter to \".../...//\" the resulting string would still be \"../\".\n* Ideally use a whitelist of known good patterns.\n\n## Example\nIn this example, a file name is read from a `java.net.Socket` and then used to access a file in the user's home directory and send it back over the socket. However, a malicious user could enter a file name which contains special characters. For example, the string \"../../etc/passwd\" will result in the code reading the file located at \"/home/\\[user\\]/../../etc/passwd\", which is the system's password file. This file would then be sent back to the user, giving them access to all the system's passwords.\n\n\n```java\npublic void sendUserFile(Socket sock, String user) {\n\tBufferedReader filenameReader = new BufferedReader(\n\t\t\tnew InputStreamReader(sock.getInputStream(), \"UTF-8\"));\n\tString filename = filenameReader.readLine();\n\t// BAD: read from a file using a path controlled by the user\n\tBufferedReader fileReader = new BufferedReader(\n\t\t\tnew FileReader(\"/home/\" + user + \"/\" + filename));\n\tString fileLine = fileReader.readLine();\n\twhile(fileLine != null) {\n\t\tsock.getOutputStream().write(fileLine.getBytes());\n\t\tfileLine = fileReader.readLine();\n\t}\n}\n\npublic void sendUserFileFixed(Socket sock, String user) {\n\t// ...\n\t\n\t// GOOD: remove all dots and directory delimiters from the filename before using\n\tString filename = filenameReader.readLine().replaceAll(\"\\\\.\", \"\").replaceAll(\"/\", \"\");\n\tBufferedReader fileReader = new BufferedReader(\n\t\t\tnew FileReader(\"/home/\" + user + \"/\" + filename));\n\n\t// ...\n}\n\n```\n\n## References\n* OWASP: [Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* Common Weakness Enumeration: [CWE-22](https://cwe.mitre.org/data/definitions/22.html).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n* Common Weakness Enumeration: [CWE-36](https://cwe.mitre.org/data/definitions/36.html).\n* Common Weakness Enumeration: [CWE-73](https://cwe.mitre.org/data/definitions/73.html).\n"},"properties":{"tags":["security","external/cwe/cwe-022","external/cwe/cwe-023","external/cwe/cwe-036","external/cwe/cwe-073","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Accessing paths influenced by users can allow an attacker to access unexpected resources.","id":"java/path-injection","kind":"path-problem","name":"Uncontrolled data used in path expression","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/zipslip","name":"java/zipslip","shortDescription":{"text":"Arbitrary file write during archive extraction (\"Zip Slip\")"},"fullDescription":{"text":"Extracting files from a malicious archive without validating that the destination file path is within the destination directory can cause files outside the destination directory to be overwritten."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Arbitrary file write during archive extraction (\"Zip Slip\")\nExtracting files from a malicious zip archive (or another archive format) without validating that the destination file path is within the destination directory can cause files outside the destination directory to be overwritten, due to the possible presence of directory traversal elements (`..`) in archive paths.\n\nZip archives contain archive entries representing each file in the archive. These entries include a file path for the entry, but these file paths are not restricted and may contain unexpected special elements such as the directory traversal element (`..`). If these file paths are used to determine an output file to write the contents of the archive item to, then the file may be written to an unexpected location. This can result in sensitive information being revealed or deleted, or an attacker being able to influence behavior by modifying unexpected files.\n\nFor example, if a zip file contains a file entry `..\\sneaky-file`, and the zip file is extracted to the directory `c:\\output`, then naively combining the paths would result in an output file path of `c:\\output\\..\\sneaky-file`, which would cause the file to be written to `c:\\sneaky-file`.\n\n\n## Recommendation\nEnsure that output paths constructed from zip archive entries are validated to prevent writing files to unexpected locations.\n\nThe recommended way of writing an output file from a zip archive entry is to verify that the normalized full path of the output file starts with a prefix that matches the destination directory. Path normalization can be done with either `java.io.File.getCanonicalFile()` or `java.nio.file.Path.normalize()`. Prefix checking can be done with `String.startsWith(..)`, but it is better to use `java.nio.file.Path.startsWith(..)`, as the latter works on complete path segments.\n\nAnother alternative is to validate archive entries against a whitelist of expected files.\n\n\n## Example\nIn this example, a file path taken from a zip archive item entry is combined with a destination directory. The result is used as the destination file path without verifying that the result is within the destination directory. If provided with a zip file containing an archive path like `..\\sneaky-file`, then this file would be written outside the destination directory.\n\n\n```java\nvoid writeZipEntry(ZipEntry entry, File destinationDir) {\n File file = new File(destinationDir, entry.getName());\n FileOutputStream fos = new FileOutputStream(file); // BAD\n // ... write entry to fos ...\n}\n\n```\nTo fix this vulnerability, we need to verify that the normalized `file` still has `destinationDir` as its prefix, and throw an exception if this is not the case.\n\n\n```java\nvoid writeZipEntry(ZipEntry entry, File destinationDir) {\n File file = new File(destinationDir, entry.getName());\n if (!file.toPath().normalize().startsWith(destinationDir.toPath()))\n throw new Exception(\"Bad zip entry\");\n FileOutputStream fos = new FileOutputStream(file); // OK\n // ... write entry to fos ...\n}\n\n```\n\n## References\n* Snyk: [Zip Slip Vulnerability](https://snyk.io/research/zip-slip-vulnerability).\n* OWASP: [Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* Common Weakness Enumeration: [CWE-22](https://cwe.mitre.org/data/definitions/22.html).\n","markdown":"# Arbitrary file write during archive extraction (\"Zip Slip\")\nExtracting files from a malicious zip archive (or another archive format) without validating that the destination file path is within the destination directory can cause files outside the destination directory to be overwritten, due to the possible presence of directory traversal elements (`..`) in archive paths.\n\nZip archives contain archive entries representing each file in the archive. These entries include a file path for the entry, but these file paths are not restricted and may contain unexpected special elements such as the directory traversal element (`..`). If these file paths are used to determine an output file to write the contents of the archive item to, then the file may be written to an unexpected location. This can result in sensitive information being revealed or deleted, or an attacker being able to influence behavior by modifying unexpected files.\n\nFor example, if a zip file contains a file entry `..\\sneaky-file`, and the zip file is extracted to the directory `c:\\output`, then naively combining the paths would result in an output file path of `c:\\output\\..\\sneaky-file`, which would cause the file to be written to `c:\\sneaky-file`.\n\n\n## Recommendation\nEnsure that output paths constructed from zip archive entries are validated to prevent writing files to unexpected locations.\n\nThe recommended way of writing an output file from a zip archive entry is to verify that the normalized full path of the output file starts with a prefix that matches the destination directory. Path normalization can be done with either `java.io.File.getCanonicalFile()` or `java.nio.file.Path.normalize()`. Prefix checking can be done with `String.startsWith(..)`, but it is better to use `java.nio.file.Path.startsWith(..)`, as the latter works on complete path segments.\n\nAnother alternative is to validate archive entries against a whitelist of expected files.\n\n\n## Example\nIn this example, a file path taken from a zip archive item entry is combined with a destination directory. The result is used as the destination file path without verifying that the result is within the destination directory. If provided with a zip file containing an archive path like `..\\sneaky-file`, then this file would be written outside the destination directory.\n\n\n```java\nvoid writeZipEntry(ZipEntry entry, File destinationDir) {\n File file = new File(destinationDir, entry.getName());\n FileOutputStream fos = new FileOutputStream(file); // BAD\n // ... write entry to fos ...\n}\n\n```\nTo fix this vulnerability, we need to verify that the normalized `file` still has `destinationDir` as its prefix, and throw an exception if this is not the case.\n\n\n```java\nvoid writeZipEntry(ZipEntry entry, File destinationDir) {\n File file = new File(destinationDir, entry.getName());\n if (!file.toPath().normalize().startsWith(destinationDir.toPath()))\n throw new Exception(\"Bad zip entry\");\n FileOutputStream fos = new FileOutputStream(file); // OK\n // ... write entry to fos ...\n}\n\n```\n\n## References\n* Snyk: [Zip Slip Vulnerability](https://snyk.io/research/zip-slip-vulnerability).\n* OWASP: [Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* Common Weakness Enumeration: [CWE-22](https://cwe.mitre.org/data/definitions/22.html).\n"},"properties":{"tags":["security","external/cwe/cwe-022","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Extracting files from a malicious archive without validating that the\n destination file path is within the destination directory can cause files outside\n the destination directory to be overwritten.","id":"java/zipslip","kind":"path-problem","name":"Arbitrary file write during archive extraction (\"Zip Slip\")","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/android/unsafe-content-uri-resolution","name":"java/android/unsafe-content-uri-resolution","shortDescription":{"text":"Uncontrolled data used in content resolution"},"fullDescription":{"text":"Resolving externally-provided content URIs without validation can allow an attacker to access unexpected resources."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Uncontrolled data used in content resolution\nWhen an Android application wants to access data in a content provider, it uses the `ContentResolver` object. `ContentResolver`s communicate with an instance of a class that implements the `ContentProvider` interface via URIs with the `content://` scheme. The authority part (the first path segment) of the URI, passed as parameter to the `ContentResolver`, determines which content provider is contacted for the operation. Specific operations that act on files also support the `file://` scheme, in which case the local filesystem is queried instead. If an external component, like a malicious or compromised application, controls the URI for a `ContentResolver` operation, it can trick the vulnerable application into accessing its own private files or non-exported content providers. The attacking application might be able to get access to the file by forcing it to be copied to a public directory, like external storage, or tamper with the contents by making the application overwrite the file with unexpected data.\n\n\n## Recommendation\nIf possible, avoid using externally-provided data to determine the URI for a `ContentResolver` to use. If that is not an option, validate that the incoming URI can only reference trusted components, like an allow list of content providers and/or applications, or alternatively make sure that the URI does not reference private directories like `/data/`.\n\n\n## Example\nThis example shows three ways of opening a file using a `ContentResolver`. In the first case, externally-provided data from an intent is used directly in the file-reading operation. This allows an attacker to provide a URI of the form `/data/data/(vulnerable app package)/(private file)` to trick the application into reading it and copying it to the external storage. In the second case, an insufficient check is performed on the externally-provided URI, still leaving room for exploitation. In the third case, the URI is correctly validated before being used, making sure it does not reference any internal application files.\n\n\n```java\nimport android.content.ContentResolver;\nimport android.net.Uri;\n\npublic class Example extends Activity {\n public void onCreate() {\n // BAD: Externally-provided URI directly used in content resolution\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n // BAD: input URI is not normalized, and check can be bypassed with \"..\" characters\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n String path = uri.getPath();\n if (path.startsWith(\"/data\"))\n throw new SecurityException();\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n // GOOD: URI is properly validated to block access to internal files\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n String path = uri.getPath();\n java.nio.file.Path normalized =\n java.nio.file.FileSystems.getDefault().getPath(path).normalize();\n if (normalized.startsWith(\"/data\"))\n throw new SecurityException();\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n }\n\n private void copyToExternalCache(InputStream is) {\n // Reads the contents of is and writes a file in the app's external\n // cache directory, which can be read publicly by applications in the same device.\n }\n}\n\n```\n\n## References\n* Android developers: [Content provider basics](https://developer.android.com/guide/topics/providers/content-provider-basics)\n* [The ContentResolver class](https://developer.android.com/reference/android/content/ContentResolver)\n* Common Weakness Enumeration: [CWE-441](https://cwe.mitre.org/data/definitions/441.html).\n* Common Weakness Enumeration: [CWE-610](https://cwe.mitre.org/data/definitions/610.html).\n","markdown":"# Uncontrolled data used in content resolution\nWhen an Android application wants to access data in a content provider, it uses the `ContentResolver` object. `ContentResolver`s communicate with an instance of a class that implements the `ContentProvider` interface via URIs with the `content://` scheme. The authority part (the first path segment) of the URI, passed as parameter to the `ContentResolver`, determines which content provider is contacted for the operation. Specific operations that act on files also support the `file://` scheme, in which case the local filesystem is queried instead. If an external component, like a malicious or compromised application, controls the URI for a `ContentResolver` operation, it can trick the vulnerable application into accessing its own private files or non-exported content providers. The attacking application might be able to get access to the file by forcing it to be copied to a public directory, like external storage, or tamper with the contents by making the application overwrite the file with unexpected data.\n\n\n## Recommendation\nIf possible, avoid using externally-provided data to determine the URI for a `ContentResolver` to use. If that is not an option, validate that the incoming URI can only reference trusted components, like an allow list of content providers and/or applications, or alternatively make sure that the URI does not reference private directories like `/data/`.\n\n\n## Example\nThis example shows three ways of opening a file using a `ContentResolver`. In the first case, externally-provided data from an intent is used directly in the file-reading operation. This allows an attacker to provide a URI of the form `/data/data/(vulnerable app package)/(private file)` to trick the application into reading it and copying it to the external storage. In the second case, an insufficient check is performed on the externally-provided URI, still leaving room for exploitation. In the third case, the URI is correctly validated before being used, making sure it does not reference any internal application files.\n\n\n```java\nimport android.content.ContentResolver;\nimport android.net.Uri;\n\npublic class Example extends Activity {\n public void onCreate() {\n // BAD: Externally-provided URI directly used in content resolution\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n // BAD: input URI is not normalized, and check can be bypassed with \"..\" characters\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n String path = uri.getPath();\n if (path.startsWith(\"/data\"))\n throw new SecurityException();\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n // GOOD: URI is properly validated to block access to internal files\n {\n ContentResolver contentResolver = getContentResolver();\n Uri uri = (Uri) getIntent().getParcelableExtra(\"URI_EXTRA\");\n String path = uri.getPath();\n java.nio.file.Path normalized =\n java.nio.file.FileSystems.getDefault().getPath(path).normalize();\n if (normalized.startsWith(\"/data\"))\n throw new SecurityException();\n InputStream is = contentResolver.openInputStream(uri);\n copyToExternalCache(is);\n }\n }\n\n private void copyToExternalCache(InputStream is) {\n // Reads the contents of is and writes a file in the app's external\n // cache directory, which can be read publicly by applications in the same device.\n }\n}\n\n```\n\n## References\n* Android developers: [Content provider basics](https://developer.android.com/guide/topics/providers/content-provider-basics)\n* [The ContentResolver class](https://developer.android.com/reference/android/content/ContentResolver)\n* Common Weakness Enumeration: [CWE-441](https://cwe.mitre.org/data/definitions/441.html).\n* Common Weakness Enumeration: [CWE-610](https://cwe.mitre.org/data/definitions/610.html).\n"},"properties":{"tags":["security","external/cwe/cwe-441","external/cwe/cwe-610","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Resolving externally-provided content URIs without validation can allow an attacker\n to access unexpected resources.","id":"java/android/unsafe-content-uri-resolution","kind":"path-problem","name":"Uncontrolled data used in content resolution","precision":"high","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/insufficient-key-size","name":"java/insufficient-key-size","shortDescription":{"text":"Use of a cryptographic algorithm with insufficient key size"},"fullDescription":{"text":"Using cryptographic algorithms with too small a key size can allow an attacker to compromise security."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Use of a cryptographic algorithm with insufficient key size\nModern encryption relies on the computational infeasibility of breaking a cipher and decoding its message without the key. As computational power increases, the ability to break ciphers grows, and key sizes need to become larger as a result. Cryptographic algorithms that use too small of a key size are vulnerable to brute force attacks, which can reveal sensitive data.\n\n\n## Recommendation\nUse a key of the recommended size or larger. The key size should be at least 128 bits for AES encryption, 256 bits for elliptic-curve cryptography (ECC), and 2048 bits for RSA, DSA, or DH encryption.\n\n\n## Example\nThe following code uses cryptographic algorithms with insufficient key sizes.\n\n\n```java\n KeyPairGenerator keyPairGen1 = KeyPairGenerator.getInstance(\"RSA\");\n keyPairGen1.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen2 = KeyPairGenerator.getInstance(\"DSA\");\n keyPairGen2.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen3 = KeyPairGenerator.getInstance(\"DH\");\n keyPairGen3.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen4 = KeyPairGenerator.getInstance(\"EC\");\n ECGenParameterSpec ecSpec = new ECGenParameterSpec(\"secp112r1\"); // BAD: Key size is less than 256\n keyPairGen4.initialize(ecSpec);\n\n KeyGenerator keyGen = KeyGenerator.getInstance(\"AES\");\n keyGen.init(64); // BAD: Key size is less than 128\n\n```\nTo fix the code, change the key sizes to be the recommended size or larger for each algorithm.\n\n\n## References\n* Wikipedia: [Key size](http://en.wikipedia.org/wiki/Key_size).\n* Wikipedia: [Strong cryptography](https://en.wikipedia.org/wiki/Strong_cryptography).\n* OWASP: [ Cryptographic Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html#algorithms).\n* OWASP: [ Testing for Weak Encryption](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/04-Testing_for_Weak_Encryption).\n* NIST: [ Transitioning the Use of Cryptographic Algorithms and Key Lengths](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf).\n* Common Weakness Enumeration: [CWE-326](https://cwe.mitre.org/data/definitions/326.html).\n","markdown":"# Use of a cryptographic algorithm with insufficient key size\nModern encryption relies on the computational infeasibility of breaking a cipher and decoding its message without the key. As computational power increases, the ability to break ciphers grows, and key sizes need to become larger as a result. Cryptographic algorithms that use too small of a key size are vulnerable to brute force attacks, which can reveal sensitive data.\n\n\n## Recommendation\nUse a key of the recommended size or larger. The key size should be at least 128 bits for AES encryption, 256 bits for elliptic-curve cryptography (ECC), and 2048 bits for RSA, DSA, or DH encryption.\n\n\n## Example\nThe following code uses cryptographic algorithms with insufficient key sizes.\n\n\n```java\n KeyPairGenerator keyPairGen1 = KeyPairGenerator.getInstance(\"RSA\");\n keyPairGen1.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen2 = KeyPairGenerator.getInstance(\"DSA\");\n keyPairGen2.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen3 = KeyPairGenerator.getInstance(\"DH\");\n keyPairGen3.initialize(1024); // BAD: Key size is less than 2048\n\n KeyPairGenerator keyPairGen4 = KeyPairGenerator.getInstance(\"EC\");\n ECGenParameterSpec ecSpec = new ECGenParameterSpec(\"secp112r1\"); // BAD: Key size is less than 256\n keyPairGen4.initialize(ecSpec);\n\n KeyGenerator keyGen = KeyGenerator.getInstance(\"AES\");\n keyGen.init(64); // BAD: Key size is less than 128\n\n```\nTo fix the code, change the key sizes to be the recommended size or larger for each algorithm.\n\n\n## References\n* Wikipedia: [Key size](http://en.wikipedia.org/wiki/Key_size).\n* Wikipedia: [Strong cryptography](https://en.wikipedia.org/wiki/Strong_cryptography).\n* OWASP: [ Cryptographic Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html#algorithms).\n* OWASP: [ Testing for Weak Encryption](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/04-Testing_for_Weak_Encryption).\n* NIST: [ Transitioning the Use of Cryptographic Algorithms and Key Lengths](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf).\n* Common Weakness Enumeration: [CWE-326](https://cwe.mitre.org/data/definitions/326.html).\n"},"properties":{"tags":["security","external/cwe/cwe-326","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using cryptographic algorithms with too small a key size can\n allow an attacker to compromise security.","id":"java/insufficient-key-size","kind":"path-problem","name":"Use of a cryptographic algorithm with insufficient key size","precision":"high","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/android/implicit-pendingintents","name":"java/android/implicit-pendingintents","shortDescription":{"text":"Use of implicit PendingIntents"},"fullDescription":{"text":"Sending an implicit and mutable 'PendingIntent' to an unspecified third party component may provide an attacker with access to internal components of the application or cause other unintended effects."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Use of implicit PendingIntents\nA `PendingIntent` is used to wrap an `Intent` that will be supplied and executed by another application. When the `Intent` is executed, it behaves as if it were run directly by the supplying application, using the privileges of that application.\n\nIf a `PendingIntent` is configured to be mutable, the fields of its internal `Intent` can be changed by the receiving application if they were not previously set. This means that a mutable `PendingIntent` that has not defined a destination component (that is, an implicit `PendingIntent`) can be altered to execute an arbitrary action with the privileges of the application that created it.\n\nA malicious application can access an implicit `PendingIntent` as follows:\n\n* It is wrapped and sent as an extra of another implicit `Intent`.\n* It is sent as the action of a `Slide`.\n* It is sent as the action of a `Notification`.\n\n\nOn gaining access, the attacker can modify the underlying `Intent` and execute an arbitrary action with elevated privileges. This could give the malicious application access to private components of the victim application, or the ability to perform actions without having the necessary permissions.\n\n\n## Recommendation\nAvoid creating implicit `PendingIntent`s. This means that the underlying `Intent` should always have an explicit destination component.\n\nWhen you add the `PendingIntent` as an extra of another `Intent`, make sure that this second `Intent` also has an explicit destination component, so that it is not delivered to untrusted applications.\n\nCreate the `PendingIntent` using the flag `FLAG_IMMUTABLE` whenever possible, to prevent the destination component from modifying empty fields of the underlying `Intent`.\n\n\n## Example\nIn the following examples, a `PendingIntent` is created and wrapped as an extra of another `Intent`.\n\nIn the first example, both the `PendingIntent` and the `Intent` it is wrapped in are implicit, making them vulnerable to attack.\n\nIn the second example, the issue is avoided by adding explicit destination components to the `PendingIntent` and the wrapping `Intent`.\n\nThe third example uses the `FLAG_IMMUTABLE` flag to prevent the underlying `Intent` from being modified by the destination component.\n\n\n```java\nimport android.app.Activity;\nimport android.app.PendingIntent;\nimport android.content.Intent;\nimport android.os.Bundle;\n\npublic class ImplicitPendingIntents extends Activity {\n\n\tpublic void onCreate(Bundle savedInstance) {\n\t\t{\n\t\t\t// BAD: an implicit Intent is used to create a PendingIntent.\n\t\t\t// The PendingIntent is then added to another implicit Intent\n\t\t\t// and started.\n\t\t\tIntent baseIntent = new Intent();\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, baseIntent, PendingIntent.FLAG_ONE_SHOT);\n\t\t\tIntent fwdIntent = new Intent(\"SOME_ACTION\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tsendBroadcast(fwdIntent);\n\t\t}\n\n\t\t{\n\t\t\t// GOOD: both the PendingIntent and the wrapping Intent are explicit.\n\t\t\tIntent safeIntent = new Intent(this, AnotherActivity.class);\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, safeIntent, PendingIntent.FLAG_ONE_SHOT);\n\t\t\tIntent fwdIntent = new Intent();\n\t\t\tfwdIntent.setClassName(\"destination.package\", \"DestinationClass\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tstartActivity(fwdIntent);\n\t\t}\n\n\t\t{\n\t\t\t// GOOD: The PendingIntent is created with FLAG_IMMUTABLE.\n\t\t\tIntent baseIntent = new Intent(\"SOME_ACTION\");\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, baseIntent, PendingIntent.FLAG_IMMUTABLE);\n\t\t\tIntent fwdIntent = new Intent();\n\t\t\tfwdIntent.setClassName(\"destination.package\", \"DestinationClass\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tstartActivity(fwdIntent);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* Google Help: [ Remediation for Implicit PendingIntent Vulnerability ](https://support.google.com/faqs/answer/10437428?hl=en)\n* University of Potsdam: [ PIAnalyzer: A precise approach for PendingIntent vulnerability analysis ](https://www.cs.uni-potsdam.de/se/papers/esorics18.pdf)\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n","markdown":"# Use of implicit PendingIntents\nA `PendingIntent` is used to wrap an `Intent` that will be supplied and executed by another application. When the `Intent` is executed, it behaves as if it were run directly by the supplying application, using the privileges of that application.\n\nIf a `PendingIntent` is configured to be mutable, the fields of its internal `Intent` can be changed by the receiving application if they were not previously set. This means that a mutable `PendingIntent` that has not defined a destination component (that is, an implicit `PendingIntent`) can be altered to execute an arbitrary action with the privileges of the application that created it.\n\nA malicious application can access an implicit `PendingIntent` as follows:\n\n* It is wrapped and sent as an extra of another implicit `Intent`.\n* It is sent as the action of a `Slide`.\n* It is sent as the action of a `Notification`.\n\n\nOn gaining access, the attacker can modify the underlying `Intent` and execute an arbitrary action with elevated privileges. This could give the malicious application access to private components of the victim application, or the ability to perform actions without having the necessary permissions.\n\n\n## Recommendation\nAvoid creating implicit `PendingIntent`s. This means that the underlying `Intent` should always have an explicit destination component.\n\nWhen you add the `PendingIntent` as an extra of another `Intent`, make sure that this second `Intent` also has an explicit destination component, so that it is not delivered to untrusted applications.\n\nCreate the `PendingIntent` using the flag `FLAG_IMMUTABLE` whenever possible, to prevent the destination component from modifying empty fields of the underlying `Intent`.\n\n\n## Example\nIn the following examples, a `PendingIntent` is created and wrapped as an extra of another `Intent`.\n\nIn the first example, both the `PendingIntent` and the `Intent` it is wrapped in are implicit, making them vulnerable to attack.\n\nIn the second example, the issue is avoided by adding explicit destination components to the `PendingIntent` and the wrapping `Intent`.\n\nThe third example uses the `FLAG_IMMUTABLE` flag to prevent the underlying `Intent` from being modified by the destination component.\n\n\n```java\nimport android.app.Activity;\nimport android.app.PendingIntent;\nimport android.content.Intent;\nimport android.os.Bundle;\n\npublic class ImplicitPendingIntents extends Activity {\n\n\tpublic void onCreate(Bundle savedInstance) {\n\t\t{\n\t\t\t// BAD: an implicit Intent is used to create a PendingIntent.\n\t\t\t// The PendingIntent is then added to another implicit Intent\n\t\t\t// and started.\n\t\t\tIntent baseIntent = new Intent();\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, baseIntent, PendingIntent.FLAG_ONE_SHOT);\n\t\t\tIntent fwdIntent = new Intent(\"SOME_ACTION\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tsendBroadcast(fwdIntent);\n\t\t}\n\n\t\t{\n\t\t\t// GOOD: both the PendingIntent and the wrapping Intent are explicit.\n\t\t\tIntent safeIntent = new Intent(this, AnotherActivity.class);\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, safeIntent, PendingIntent.FLAG_ONE_SHOT);\n\t\t\tIntent fwdIntent = new Intent();\n\t\t\tfwdIntent.setClassName(\"destination.package\", \"DestinationClass\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tstartActivity(fwdIntent);\n\t\t}\n\n\t\t{\n\t\t\t// GOOD: The PendingIntent is created with FLAG_IMMUTABLE.\n\t\t\tIntent baseIntent = new Intent(\"SOME_ACTION\");\n\t\t\tPendingIntent pi =\n\t\t\t\t\tPendingIntent.getActivity(this, 0, baseIntent, PendingIntent.FLAG_IMMUTABLE);\n\t\t\tIntent fwdIntent = new Intent();\n\t\t\tfwdIntent.setClassName(\"destination.package\", \"DestinationClass\");\n\t\t\tfwdIntent.putExtra(\"fwdIntent\", pi);\n\t\t\tstartActivity(fwdIntent);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* Google Help: [ Remediation for Implicit PendingIntent Vulnerability ](https://support.google.com/faqs/answer/10437428?hl=en)\n* University of Potsdam: [ PIAnalyzer: A precise approach for PendingIntent vulnerability analysis ](https://www.cs.uni-potsdam.de/se/papers/esorics18.pdf)\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n"},"properties":{"tags":["security","external/cwe/cwe-927","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Sending an implicit and mutable 'PendingIntent' to an unspecified third party\n component may provide an attacker with access to internal components of the\n application or cause other unintended effects.","id":"java/android/implicit-pendingintents","kind":"path-problem","name":"Use of implicit PendingIntents","precision":"high","problem.severity":"error","security-severity":"8.2"}},{"id":"java/ldap-injection","name":"java/ldap-injection","shortDescription":{"text":"LDAP query built from user-controlled sources"},"fullDescription":{"text":"Building an LDAP query from user-controlled sources is vulnerable to insertion of malicious LDAP code by the user."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# LDAP query built from user-controlled sources\nIf an LDAP query is built using string concatenation, and the components of the concatenation include user input, a user is likely to be able to run malicious LDAP queries.\n\n\n## Recommendation\nIf user input must be included in an LDAP query, it should be escaped to avoid a malicious user providing special characters that change the meaning of the query. If possible build the LDAP query using framework helper methods, for example from Spring's `LdapQueryBuilder` and `LdapNameBuilder`, instead of string concatenation. Alternatively, escape user input using an appropriate LDAP encoding method, for example: `encodeForLDAP` or `encodeForDN` from OWASP ESAPI, `LdapEncoder.filterEncode` or `LdapEncoder.nameEncode` from Spring LDAP, or `Filter.encodeValue` from UnboundID library.\n\n\n## Example\nIn the following examples, the code accepts an \"organization name\" and a \"username\" from the user, which it uses to query LDAP.\n\nThe first example concatenates the unvalidated and unencoded user input directly into both the DN (Distinguished Name) and the search filter used for the LDAP query. A malicious user could provide special characters to change the meaning of these queries, and search for a completely different set of values. The LDAP query is executed using Java JNDI API.\n\nThe second example uses the OWASP ESAPI library to encode the user values before they are included in the DN and search filters. This ensures the meaning of the query cannot be changed by a malicious user.\n\n\n```java\nimport javax.naming.directory.DirContext;\nimport org.owasp.esapi.Encoder;\nimport org.owasp.esapi.reference.DefaultEncoder;\n\npublic void ldapQueryBad(HttpServletRequest request, DirContext ctx) throws NamingException {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // BAD: User input used in DN (Distinguished Name) without encoding\n String dn = \"OU=People,O=\" + organizationName;\n\n // BAD: User input used in search filter without encoding\n String filter = \"username=\" + userName;\n\n ctx.search(dn, filter, new SearchControls());\n}\n\npublic void ldapQueryGood(HttpServletRequest request, DirContext ctx) throws NamingException {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // ESAPI encoder\n Encoder encoder = DefaultEncoder.getInstance();\n\n // GOOD: Organization name is encoded before being used in DN\n String safeOrganizationName = encoder.encodeForDN(organizationName);\n String safeDn = \"OU=People,O=\" + safeOrganizationName;\n\n // GOOD: User input is encoded before being used in search filter\n String safeUsername = encoder.encodeForLDAP(username);\n String safeFilter = \"username=\" + safeUsername;\n \n ctx.search(safeDn, safeFilter, new SearchControls());\n}\n```\nThe third example uses Spring `LdapQueryBuilder` to build an LDAP query. In addition to simplifying the building of complex search parameters, it also provides proper escaping of any unsafe characters in search filters. The DN is built using `LdapNameBuilder`, which also provides proper escaping.\n\n\n```java\nimport static org.springframework.ldap.query.LdapQueryBuilder.query;\nimport org.springframework.ldap.support.LdapNameBuilder;\n\npublic void ldapQueryGood(@RequestParam String organizationName, @RequestParam String username) {\n // GOOD: Organization name is encoded before being used in DN\n String safeDn = LdapNameBuilder.newInstance()\n .add(\"O\", organizationName)\n .add(\"OU=People\")\n .build().toString();\n\n // GOOD: User input is encoded before being used in search filter\n LdapQuery query = query()\n .base(safeDn)\n .where(\"username\").is(username);\n\n ldapTemplate.search(query, new AttributeCheckAttributesMapper());\n}\n```\nThe fourth example uses `UnboundID` classes, `Filter` and `DN`, to construct a safe filter and base DN.\n\n\n```java\nimport com.unboundid.ldap.sdk.LDAPConnection;\nimport com.unboundid.ldap.sdk.DN;\nimport com.unboundid.ldap.sdk.RDN;\nimport com.unboundid.ldap.sdk.Filter;\n\npublic void ldapQueryGood(HttpServletRequest request, LDAPConnection c) {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // GOOD: Organization name is encoded before being used in DN\n DN safeDn = new DN(new RDN(\"OU\", \"People\"), new RDN(\"O\", organizationName));\n\n // GOOD: User input is encoded before being used in search filter\n Filter safeFilter = Filter.createEqualityFilter(\"username\", username);\n \n c.search(safeDn.toString(), SearchScope.ONE, safeFilter);\n}\n```\nThe fifth example shows how to build a safe filter and DN using the Apache LDAP API.\n\n\n```java\nimport org.apache.directory.ldap.client.api.LdapConnection;\nimport org.apache.directory.api.ldap.model.name.Dn;\nimport org.apache.directory.api.ldap.model.name.Rdn;\nimport org.apache.directory.api.ldap.model.message.SearchRequest;\nimport org.apache.directory.api.ldap.model.message.SearchRequestImpl;\nimport static org.apache.directory.ldap.client.api.search.FilterBuilder.equal;\n\npublic void ldapQueryGood(HttpServletRequest request, LdapConnection c) {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // GOOD: Organization name is encoded before being used in DN\n Dn safeDn = new Dn(new Rdn(\"OU\", \"People\"), new Rdn(\"O\", organizationName));\n\n // GOOD: User input is encoded before being used in search filter\n String safeFilter = equal(\"username\", username);\n \n SearchRequest searchRequest = new SearchRequestImpl();\n searchRequest.setBase(safeDn);\n searchRequest.setFilter(safeFilter);\n c.search(searchRequest);\n}\n```\n\n## References\n* OWASP: [LDAP Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html).\n* OWASP ESAPI: [OWASP ESAPI](https://owasp.org/www-project-enterprise-security-api/).\n* Spring LdapQueryBuilder doc: [LdapQueryBuilder](https://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/query/LdapQueryBuilder.html).\n* Spring LdapNameBuilder doc: [LdapNameBuilder](https://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/support/LdapNameBuilder.html).\n* UnboundID: [Understanding and Defending Against LDAP Injection Attacks](https://ldap.com/2018/05/04/understanding-and-defending-against-ldap-injection-attacks/).\n* Common Weakness Enumeration: [CWE-90](https://cwe.mitre.org/data/definitions/90.html).\n","markdown":"# LDAP query built from user-controlled sources\nIf an LDAP query is built using string concatenation, and the components of the concatenation include user input, a user is likely to be able to run malicious LDAP queries.\n\n\n## Recommendation\nIf user input must be included in an LDAP query, it should be escaped to avoid a malicious user providing special characters that change the meaning of the query. If possible build the LDAP query using framework helper methods, for example from Spring's `LdapQueryBuilder` and `LdapNameBuilder`, instead of string concatenation. Alternatively, escape user input using an appropriate LDAP encoding method, for example: `encodeForLDAP` or `encodeForDN` from OWASP ESAPI, `LdapEncoder.filterEncode` or `LdapEncoder.nameEncode` from Spring LDAP, or `Filter.encodeValue` from UnboundID library.\n\n\n## Example\nIn the following examples, the code accepts an \"organization name\" and a \"username\" from the user, which it uses to query LDAP.\n\nThe first example concatenates the unvalidated and unencoded user input directly into both the DN (Distinguished Name) and the search filter used for the LDAP query. A malicious user could provide special characters to change the meaning of these queries, and search for a completely different set of values. The LDAP query is executed using Java JNDI API.\n\nThe second example uses the OWASP ESAPI library to encode the user values before they are included in the DN and search filters. This ensures the meaning of the query cannot be changed by a malicious user.\n\n\n```java\nimport javax.naming.directory.DirContext;\nimport org.owasp.esapi.Encoder;\nimport org.owasp.esapi.reference.DefaultEncoder;\n\npublic void ldapQueryBad(HttpServletRequest request, DirContext ctx) throws NamingException {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // BAD: User input used in DN (Distinguished Name) without encoding\n String dn = \"OU=People,O=\" + organizationName;\n\n // BAD: User input used in search filter without encoding\n String filter = \"username=\" + userName;\n\n ctx.search(dn, filter, new SearchControls());\n}\n\npublic void ldapQueryGood(HttpServletRequest request, DirContext ctx) throws NamingException {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // ESAPI encoder\n Encoder encoder = DefaultEncoder.getInstance();\n\n // GOOD: Organization name is encoded before being used in DN\n String safeOrganizationName = encoder.encodeForDN(organizationName);\n String safeDn = \"OU=People,O=\" + safeOrganizationName;\n\n // GOOD: User input is encoded before being used in search filter\n String safeUsername = encoder.encodeForLDAP(username);\n String safeFilter = \"username=\" + safeUsername;\n \n ctx.search(safeDn, safeFilter, new SearchControls());\n}\n```\nThe third example uses Spring `LdapQueryBuilder` to build an LDAP query. In addition to simplifying the building of complex search parameters, it also provides proper escaping of any unsafe characters in search filters. The DN is built using `LdapNameBuilder`, which also provides proper escaping.\n\n\n```java\nimport static org.springframework.ldap.query.LdapQueryBuilder.query;\nimport org.springframework.ldap.support.LdapNameBuilder;\n\npublic void ldapQueryGood(@RequestParam String organizationName, @RequestParam String username) {\n // GOOD: Organization name is encoded before being used in DN\n String safeDn = LdapNameBuilder.newInstance()\n .add(\"O\", organizationName)\n .add(\"OU=People\")\n .build().toString();\n\n // GOOD: User input is encoded before being used in search filter\n LdapQuery query = query()\n .base(safeDn)\n .where(\"username\").is(username);\n\n ldapTemplate.search(query, new AttributeCheckAttributesMapper());\n}\n```\nThe fourth example uses `UnboundID` classes, `Filter` and `DN`, to construct a safe filter and base DN.\n\n\n```java\nimport com.unboundid.ldap.sdk.LDAPConnection;\nimport com.unboundid.ldap.sdk.DN;\nimport com.unboundid.ldap.sdk.RDN;\nimport com.unboundid.ldap.sdk.Filter;\n\npublic void ldapQueryGood(HttpServletRequest request, LDAPConnection c) {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // GOOD: Organization name is encoded before being used in DN\n DN safeDn = new DN(new RDN(\"OU\", \"People\"), new RDN(\"O\", organizationName));\n\n // GOOD: User input is encoded before being used in search filter\n Filter safeFilter = Filter.createEqualityFilter(\"username\", username);\n \n c.search(safeDn.toString(), SearchScope.ONE, safeFilter);\n}\n```\nThe fifth example shows how to build a safe filter and DN using the Apache LDAP API.\n\n\n```java\nimport org.apache.directory.ldap.client.api.LdapConnection;\nimport org.apache.directory.api.ldap.model.name.Dn;\nimport org.apache.directory.api.ldap.model.name.Rdn;\nimport org.apache.directory.api.ldap.model.message.SearchRequest;\nimport org.apache.directory.api.ldap.model.message.SearchRequestImpl;\nimport static org.apache.directory.ldap.client.api.search.FilterBuilder.equal;\n\npublic void ldapQueryGood(HttpServletRequest request, LdapConnection c) {\n String organizationName = request.getParameter(\"organization_name\");\n String username = request.getParameter(\"username\");\n\n // GOOD: Organization name is encoded before being used in DN\n Dn safeDn = new Dn(new Rdn(\"OU\", \"People\"), new Rdn(\"O\", organizationName));\n\n // GOOD: User input is encoded before being used in search filter\n String safeFilter = equal(\"username\", username);\n \n SearchRequest searchRequest = new SearchRequestImpl();\n searchRequest.setBase(safeDn);\n searchRequest.setFilter(safeFilter);\n c.search(searchRequest);\n}\n```\n\n## References\n* OWASP: [LDAP Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html).\n* OWASP ESAPI: [OWASP ESAPI](https://owasp.org/www-project-enterprise-security-api/).\n* Spring LdapQueryBuilder doc: [LdapQueryBuilder](https://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/query/LdapQueryBuilder.html).\n* Spring LdapNameBuilder doc: [LdapNameBuilder](https://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/support/LdapNameBuilder.html).\n* UnboundID: [Understanding and Defending Against LDAP Injection Attacks](https://ldap.com/2018/05/04/understanding-and-defending-against-ldap-injection-attacks/).\n* Common Weakness Enumeration: [CWE-90](https://cwe.mitre.org/data/definitions/90.html).\n"},"properties":{"tags":["security","external/cwe/cwe-090","owasp-top10-2021","A03:2021 - Injection"],"description":"Building an LDAP query from user-controlled sources is vulnerable to insertion of\n malicious LDAP code by the user.","id":"java/ldap-injection","kind":"path-problem","name":"LDAP query built from user-controlled sources","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/android/fragment-injection","name":"java/android/fragment-injection","shortDescription":{"text":"Android fragment injection"},"fullDescription":{"text":"Instantiating an Android fragment from a user-provided value may allow a malicious application to bypass access controls, exposing the application to unintended effects."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Android fragment injection\nWhen fragments are instantiated with externally provided names, this exposes any exported activity that dynamically creates and hosts the fragment to fragment injection. A malicious application could provide the name of an arbitrary fragment, even one not designed to be externally accessible, and inject it into the activity. This can bypass access controls and expose the application to unintended effects.\n\nFragments are reusable parts of an Android application's user interface. Even though a fragment controls its own lifecycle and layout, and handles its input events, it cannot exist on its own: it must be hosted either by an activity or another fragment. This means that, normally, a fragment will be accessible by third-party applications (that is, exported) only if its hosting activity is itself exported.\n\n\n## Recommendation\nIn general, do not instantiate classes (including fragments) with user-provided names unless the name has been properly validated. Also, if an exported activity is extending the `PreferenceActivity` class, make sure that the `isValidFragment` method is overriden and only returns `true` when the provided `fragmentName` points to an intended fragment.\n\n\n## Example\nThe following example shows two cases: in the first one, untrusted data is used to instantiate and add a fragment to an activity, while in the second one, a fragment is safely added with a static name.\n\n\n```java\npublic class MyActivity extends FragmentActivity {\n\n @Override\n protected void onCreate(Bundle savedInstance) {\n try {\n super.onCreate(savedInstance);\n // BAD: Fragment instantiated from user input without validation\n {\n String fName = getIntent().getStringExtra(\"fragmentName\");\n getFragmentManager().beginTransaction().replace(com.android.internal.R.id.prefs,\n Fragment.instantiate(this, fName, null)).commit();\n }\n // GOOD: Fragment instantiated statically\n {\n getFragmentManager().beginTransaction()\n .replace(com.android.internal.R.id.prefs, new MyFragment()).commit();\n }\n } catch (Exception e) {\n }\n }\n\n}\n\n```\nThe next example shows two activities that extend `PreferenceActivity`. The first activity overrides `isValidFragment`, but it wrongly returns `true` unconditionally. The second activity correctly overrides `isValidFragment` so that it only returns `true` when `fragmentName` is a trusted fragment name.\n\n\n```java\nclass UnsafeActivity extends PreferenceActivity {\n\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // BAD: any Fragment name can be provided.\n return true;\n }\n}\n\n\nclass SafeActivity extends PreferenceActivity {\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // Good: only trusted Fragment names are allowed.\n return SafeFragment1.class.getName().equals(fragmentName)\n || SafeFragment2.class.getName().equals(fragmentName)\n || SafeFragment3.class.getName().equals(fragmentName);\n }\n\n}\n\n\n```\n\n## References\n* Google Help: [How to fix Fragment Injection vulnerability](https://support.google.com/faqs/answer/7188427?hl=en).\n* IBM Security Systems: [Android collapses into Fragments](https://securityintelligence.com/wp-content/uploads/2013/12/android-collapses-into-fragments.pdf).\n* Android Developers: [Fragments](https://developer.android.com/guide/fragments)\n* Common Weakness Enumeration: [CWE-470](https://cwe.mitre.org/data/definitions/470.html).\n","markdown":"# Android fragment injection\nWhen fragments are instantiated with externally provided names, this exposes any exported activity that dynamically creates and hosts the fragment to fragment injection. A malicious application could provide the name of an arbitrary fragment, even one not designed to be externally accessible, and inject it into the activity. This can bypass access controls and expose the application to unintended effects.\n\nFragments are reusable parts of an Android application's user interface. Even though a fragment controls its own lifecycle and layout, and handles its input events, it cannot exist on its own: it must be hosted either by an activity or another fragment. This means that, normally, a fragment will be accessible by third-party applications (that is, exported) only if its hosting activity is itself exported.\n\n\n## Recommendation\nIn general, do not instantiate classes (including fragments) with user-provided names unless the name has been properly validated. Also, if an exported activity is extending the `PreferenceActivity` class, make sure that the `isValidFragment` method is overriden and only returns `true` when the provided `fragmentName` points to an intended fragment.\n\n\n## Example\nThe following example shows two cases: in the first one, untrusted data is used to instantiate and add a fragment to an activity, while in the second one, a fragment is safely added with a static name.\n\n\n```java\npublic class MyActivity extends FragmentActivity {\n\n @Override\n protected void onCreate(Bundle savedInstance) {\n try {\n super.onCreate(savedInstance);\n // BAD: Fragment instantiated from user input without validation\n {\n String fName = getIntent().getStringExtra(\"fragmentName\");\n getFragmentManager().beginTransaction().replace(com.android.internal.R.id.prefs,\n Fragment.instantiate(this, fName, null)).commit();\n }\n // GOOD: Fragment instantiated statically\n {\n getFragmentManager().beginTransaction()\n .replace(com.android.internal.R.id.prefs, new MyFragment()).commit();\n }\n } catch (Exception e) {\n }\n }\n\n}\n\n```\nThe next example shows two activities that extend `PreferenceActivity`. The first activity overrides `isValidFragment`, but it wrongly returns `true` unconditionally. The second activity correctly overrides `isValidFragment` so that it only returns `true` when `fragmentName` is a trusted fragment name.\n\n\n```java\nclass UnsafeActivity extends PreferenceActivity {\n\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // BAD: any Fragment name can be provided.\n return true;\n }\n}\n\n\nclass SafeActivity extends PreferenceActivity {\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // Good: only trusted Fragment names are allowed.\n return SafeFragment1.class.getName().equals(fragmentName)\n || SafeFragment2.class.getName().equals(fragmentName)\n || SafeFragment3.class.getName().equals(fragmentName);\n }\n\n}\n\n\n```\n\n## References\n* Google Help: [How to fix Fragment Injection vulnerability](https://support.google.com/faqs/answer/7188427?hl=en).\n* IBM Security Systems: [Android collapses into Fragments](https://securityintelligence.com/wp-content/uploads/2013/12/android-collapses-into-fragments.pdf).\n* Android Developers: [Fragments](https://developer.android.com/guide/fragments)\n* Common Weakness Enumeration: [CWE-470](https://cwe.mitre.org/data/definitions/470.html).\n"},"properties":{"tags":["security","external/cwe/cwe-470","owasp-top10-2021","A03:2021 - Injection"],"description":"Instantiating an Android fragment from a user-provided value\n may allow a malicious application to bypass access controls, exposing the application to unintended effects.","id":"java/android/fragment-injection","kind":"path-problem","name":"Android fragment injection","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/android/fragment-injection-preference-activity","name":"java/android/fragment-injection-preference-activity","shortDescription":{"text":"Android fragment injection in PreferenceActivity"},"fullDescription":{"text":"An insecure implementation of the 'isValidFragment' method of the 'PreferenceActivity' class may allow a malicious application to bypass access controls, exposing the application to unintended effects."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Android fragment injection in PreferenceActivity\nWhen fragments are instantiated with externally provided names, this exposes any exported activity that dynamically creates and hosts the fragment to fragment injection. A malicious application could provide the name of an arbitrary fragment, even one not designed to be externally accessible, and inject it into the activity. This can bypass access controls and expose the application to unintended effects.\n\nFragments are reusable parts of an Android application's user interface. Even though a fragment controls its own lifecycle and layout, and handles its input events, it cannot exist on its own: it must be hosted either by an activity or another fragment. This means that, normally, a fragment will be accessible by third-party applications (that is, exported) only if its hosting activity is itself exported.\n\n\n## Recommendation\nIn general, do not instantiate classes (including fragments) with user-provided names unless the name has been properly validated. Also, if an exported activity is extending the `PreferenceActivity` class, make sure that the `isValidFragment` method is overriden and only returns `true` when the provided `fragmentName` points to an intended fragment.\n\n\n## Example\nThe following example shows two cases: in the first one, untrusted data is used to instantiate and add a fragment to an activity, while in the second one, a fragment is safely added with a static name.\n\n\n```java\npublic class MyActivity extends FragmentActivity {\n\n @Override\n protected void onCreate(Bundle savedInstance) {\n try {\n super.onCreate(savedInstance);\n // BAD: Fragment instantiated from user input without validation\n {\n String fName = getIntent().getStringExtra(\"fragmentName\");\n getFragmentManager().beginTransaction().replace(com.android.internal.R.id.prefs,\n Fragment.instantiate(this, fName, null)).commit();\n }\n // GOOD: Fragment instantiated statically\n {\n getFragmentManager().beginTransaction()\n .replace(com.android.internal.R.id.prefs, new MyFragment()).commit();\n }\n } catch (Exception e) {\n }\n }\n\n}\n\n```\nThe next example shows two activities that extend `PreferenceActivity`. The first activity overrides `isValidFragment`, but it wrongly returns `true` unconditionally. The second activity correctly overrides `isValidFragment` so that it only returns `true` when `fragmentName` is a trusted fragment name.\n\n\n```java\nclass UnsafeActivity extends PreferenceActivity {\n\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // BAD: any Fragment name can be provided.\n return true;\n }\n}\n\n\nclass SafeActivity extends PreferenceActivity {\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // Good: only trusted Fragment names are allowed.\n return SafeFragment1.class.getName().equals(fragmentName)\n || SafeFragment2.class.getName().equals(fragmentName)\n || SafeFragment3.class.getName().equals(fragmentName);\n }\n\n}\n\n\n```\n\n## References\n* Google Help: [How to fix Fragment Injection vulnerability](https://support.google.com/faqs/answer/7188427?hl=en).\n* IBM Security Systems: [Android collapses into Fragments](https://securityintelligence.com/wp-content/uploads/2013/12/android-collapses-into-fragments.pdf).\n* Android Developers: [Fragments](https://developer.android.com/guide/fragments)\n* Common Weakness Enumeration: [CWE-470](https://cwe.mitre.org/data/definitions/470.html).\n","markdown":"# Android fragment injection in PreferenceActivity\nWhen fragments are instantiated with externally provided names, this exposes any exported activity that dynamically creates and hosts the fragment to fragment injection. A malicious application could provide the name of an arbitrary fragment, even one not designed to be externally accessible, and inject it into the activity. This can bypass access controls and expose the application to unintended effects.\n\nFragments are reusable parts of an Android application's user interface. Even though a fragment controls its own lifecycle and layout, and handles its input events, it cannot exist on its own: it must be hosted either by an activity or another fragment. This means that, normally, a fragment will be accessible by third-party applications (that is, exported) only if its hosting activity is itself exported.\n\n\n## Recommendation\nIn general, do not instantiate classes (including fragments) with user-provided names unless the name has been properly validated. Also, if an exported activity is extending the `PreferenceActivity` class, make sure that the `isValidFragment` method is overriden and only returns `true` when the provided `fragmentName` points to an intended fragment.\n\n\n## Example\nThe following example shows two cases: in the first one, untrusted data is used to instantiate and add a fragment to an activity, while in the second one, a fragment is safely added with a static name.\n\n\n```java\npublic class MyActivity extends FragmentActivity {\n\n @Override\n protected void onCreate(Bundle savedInstance) {\n try {\n super.onCreate(savedInstance);\n // BAD: Fragment instantiated from user input without validation\n {\n String fName = getIntent().getStringExtra(\"fragmentName\");\n getFragmentManager().beginTransaction().replace(com.android.internal.R.id.prefs,\n Fragment.instantiate(this, fName, null)).commit();\n }\n // GOOD: Fragment instantiated statically\n {\n getFragmentManager().beginTransaction()\n .replace(com.android.internal.R.id.prefs, new MyFragment()).commit();\n }\n } catch (Exception e) {\n }\n }\n\n}\n\n```\nThe next example shows two activities that extend `PreferenceActivity`. The first activity overrides `isValidFragment`, but it wrongly returns `true` unconditionally. The second activity correctly overrides `isValidFragment` so that it only returns `true` when `fragmentName` is a trusted fragment name.\n\n\n```java\nclass UnsafeActivity extends PreferenceActivity {\n\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // BAD: any Fragment name can be provided.\n return true;\n }\n}\n\n\nclass SafeActivity extends PreferenceActivity {\n @Override\n protected boolean isValidFragment(String fragmentName) {\n // Good: only trusted Fragment names are allowed.\n return SafeFragment1.class.getName().equals(fragmentName)\n || SafeFragment2.class.getName().equals(fragmentName)\n || SafeFragment3.class.getName().equals(fragmentName);\n }\n\n}\n\n\n```\n\n## References\n* Google Help: [How to fix Fragment Injection vulnerability](https://support.google.com/faqs/answer/7188427?hl=en).\n* IBM Security Systems: [Android collapses into Fragments](https://securityintelligence.com/wp-content/uploads/2013/12/android-collapses-into-fragments.pdf).\n* Android Developers: [Fragments](https://developer.android.com/guide/fragments)\n* Common Weakness Enumeration: [CWE-470](https://cwe.mitre.org/data/definitions/470.html).\n"},"properties":{"tags":["security","external/cwe/cwe-470","owasp-top10-2021","A03:2021 - Injection"],"description":"An insecure implementation of the 'isValidFragment' method\n of the 'PreferenceActivity' class may allow a malicious application to bypass access controls,\n exposing the application to unintended effects.","id":"java/android/fragment-injection-preference-activity","kind":"problem","name":"Android fragment injection in PreferenceActivity","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/partial-path-traversal-from-remote","name":"java/partial-path-traversal-from-remote","shortDescription":{"text":"Partial path traversal vulnerability from remote"},"fullDescription":{"text":"A prefix used to check that a canonicalised path falls within another must be slash-terminated."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Partial path traversal vulnerability from remote\nA common way to check that a user-supplied path `SUBDIR` falls inside a directory `DIR` is to use `getCanonicalPath()` to remove any path-traversal elements and then check that `DIR` is a prefix. However, if `DIR` is not slash-terminated, this can unexpectedly allow accessing siblings of `DIR`.\n\nSee also `java/partial-path-traversal`, which is similar to this query, but may also flag non-remotely-exploitable instances of partial path traversal vulnerabilities.\n\n\n## Recommendation\nIf the user should only access items within a certain directory `DIR`, ensure that `DIR` is slash-terminated before checking that `DIR` is a prefix of the user-provided path, `SUBDIR`. Note, Java's `getCanonicalPath()` returns a **non**-slash-terminated path string, so a slash must be added to `DIR` if that method is used.\n\n\n## Example\nIn this example, the `if` statement checks if `parent.getCanonicalPath()` is a prefix of `dir.getCanonicalPath()`. However, `parent.getCanonicalPath()` is not slash-terminated. This means that users that supply `dir` may be also allowed to access siblings of `parent` and not just children of `parent`, which is a security issue.\n\n\n```java\npublic class PartialPathTraversalBad {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath())) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\nIn this example, the `if` statement checks if `parent.getCanonicalPath() + File.separator ` is a prefix of `dir.getCanonicalPath()`. Because `parent.getCanonicalPath() + File.separator` is indeed slash-terminated, the user supplying `dir` can only access children of `parent`, as desired.\n\n\n```java\npublic class PartialPathTraversalGood {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath() + File.separator)) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Partial Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* CVE-2022-23457: [ ESAPI Vulnerability Report](https://github.com/ESAPI/esapi-java-legacy/blob/develop/documentation/GHSL-2022-008_The_OWASP_Enterprise_Security_API.md).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n","markdown":"# Partial path traversal vulnerability from remote\nA common way to check that a user-supplied path `SUBDIR` falls inside a directory `DIR` is to use `getCanonicalPath()` to remove any path-traversal elements and then check that `DIR` is a prefix. However, if `DIR` is not slash-terminated, this can unexpectedly allow accessing siblings of `DIR`.\n\nSee also `java/partial-path-traversal`, which is similar to this query, but may also flag non-remotely-exploitable instances of partial path traversal vulnerabilities.\n\n\n## Recommendation\nIf the user should only access items within a certain directory `DIR`, ensure that `DIR` is slash-terminated before checking that `DIR` is a prefix of the user-provided path, `SUBDIR`. Note, Java's `getCanonicalPath()` returns a **non**-slash-terminated path string, so a slash must be added to `DIR` if that method is used.\n\n\n## Example\nIn this example, the `if` statement checks if `parent.getCanonicalPath()` is a prefix of `dir.getCanonicalPath()`. However, `parent.getCanonicalPath()` is not slash-terminated. This means that users that supply `dir` may be also allowed to access siblings of `parent` and not just children of `parent`, which is a security issue.\n\n\n```java\npublic class PartialPathTraversalBad {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath())) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\nIn this example, the `if` statement checks if `parent.getCanonicalPath() + File.separator ` is a prefix of `dir.getCanonicalPath()`. Because `parent.getCanonicalPath() + File.separator` is indeed slash-terminated, the user supplying `dir` can only access children of `parent`, as desired.\n\n\n```java\npublic class PartialPathTraversalGood {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath() + File.separator)) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Partial Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* CVE-2022-23457: [ ESAPI Vulnerability Report](https://github.com/ESAPI/esapi-java-legacy/blob/develop/documentation/GHSL-2022-008_The_OWASP_Enterprise_Security_API.md).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n"},"properties":{"tags":["security","external/cwe/cwe-023","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"A prefix used to check that a canonicalised path falls within another must be slash-terminated.","id":"java/partial-path-traversal-from-remote","kind":"path-problem","name":"Partial path traversal vulnerability from remote","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/tainted-format-string","name":"java/tainted-format-string","shortDescription":{"text":"Use of externally-controlled format string"},"fullDescription":{"text":"Using external input in format strings can lead to exceptions or information leaks."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Use of externally-controlled format string\nThe `String.format` method and related methods, like `PrintStream.printf` and `Formatter.format`, all accept a format string that is used to format the trailing arguments to the format call by providing inline format specifiers. If the format string contains unsanitized input from an untrusted source, then that string may contain extra format specifiers that cause an exception to be thrown or information to be leaked.\n\nThe Java standard library implementation for the format methods throws an exception if either the format specifier does not match the type of the argument, or if there are too few or too many arguments. If unsanitized input is used in the format string, it may contain invalid extra format specifiers which cause an exception to be thrown.\n\nPositional format specifiers may be used to access an argument to the format call by position. Unsanitized input in the format string may use a positional format specifier to access information that was not intended to be visible. For example, when formatting a Calendar instance we may intend to print only the year, but a user-specified format string may include a specifier to access the month and day.\n\n\n## Recommendation\nIf the argument passed as a format string is meant to be a plain string rather than a format string, then pass `%s` as the format string, and pass the original argument as the sole trailing argument.\n\n\n## Example\nThe following program is meant to check a card security code for a stored credit card:\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n Calendar expirationDate = new GregorianCalendar(2017, GregorianCalendar.SEPTEMBER, 1);\n // User provided value\n String cardSecurityCode = request.getParameter(\"cardSecurityCode\");\n \n if (notValid(cardSecurityCode)) {\n \n /*\n * BAD: user provided value is included in the format string.\n * A malicious user could provide an extra format specifier, which causes an\n * exception to be thrown. Or they could provide a %1$tm or %1$te format specifier to\n * access the month or day of the expiration date.\n */\n System.out.format(cardSecurityCode +\n \" is not the right value. Hint: the card expires in %1$ty.\",\n expirationDate);\n \n // GOOD: %s is used to include the user-provided cardSecurityCode in the output\n System.out.format(\"%s is not the right value. Hint: the card expires in %2$ty.\",\n cardSecurityCode,\n expirationDate);\n }\n\n }\n}\n```\nHowever, in the first format call it uses the cardSecurityCode provided by the user in a format string. If the user includes a format specifier in the cardSecurityCode field, they may be able to cause an exception to be thrown, or to be able to access extra information about the stored card expiration date.\n\nThe second format call shows the correct approach. The user-provided value is passed as an argument to the format call. This prevents any format specifiers in the user provided value from being evaluated.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [IDS06-J. Exclude unsanitized user input from format strings](https://wiki.sei.cmu.edu/confluence/display/java/IDS06-J.+Exclude+unsanitized+user+input+from+format+strings).\n* The Java Tutorials: [Formatting Numeric Print Output](https://docs.oracle.com/javase/tutorial/java/data/numberformat.html).\n* Java API Specification: [Formatter](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html).\n* Common Weakness Enumeration: [CWE-134](https://cwe.mitre.org/data/definitions/134.html).\n","markdown":"# Use of externally-controlled format string\nThe `String.format` method and related methods, like `PrintStream.printf` and `Formatter.format`, all accept a format string that is used to format the trailing arguments to the format call by providing inline format specifiers. If the format string contains unsanitized input from an untrusted source, then that string may contain extra format specifiers that cause an exception to be thrown or information to be leaked.\n\nThe Java standard library implementation for the format methods throws an exception if either the format specifier does not match the type of the argument, or if there are too few or too many arguments. If unsanitized input is used in the format string, it may contain invalid extra format specifiers which cause an exception to be thrown.\n\nPositional format specifiers may be used to access an argument to the format call by position. Unsanitized input in the format string may use a positional format specifier to access information that was not intended to be visible. For example, when formatting a Calendar instance we may intend to print only the year, but a user-specified format string may include a specifier to access the month and day.\n\n\n## Recommendation\nIf the argument passed as a format string is meant to be a plain string rather than a format string, then pass `%s` as the format string, and pass the original argument as the sole trailing argument.\n\n\n## Example\nThe following program is meant to check a card security code for a stored credit card:\n\n\n```java\npublic class ResponseSplitting extends HttpServlet {\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n Calendar expirationDate = new GregorianCalendar(2017, GregorianCalendar.SEPTEMBER, 1);\n // User provided value\n String cardSecurityCode = request.getParameter(\"cardSecurityCode\");\n \n if (notValid(cardSecurityCode)) {\n \n /*\n * BAD: user provided value is included in the format string.\n * A malicious user could provide an extra format specifier, which causes an\n * exception to be thrown. Or they could provide a %1$tm or %1$te format specifier to\n * access the month or day of the expiration date.\n */\n System.out.format(cardSecurityCode +\n \" is not the right value. Hint: the card expires in %1$ty.\",\n expirationDate);\n \n // GOOD: %s is used to include the user-provided cardSecurityCode in the output\n System.out.format(\"%s is not the right value. Hint: the card expires in %2$ty.\",\n cardSecurityCode,\n expirationDate);\n }\n\n }\n}\n```\nHowever, in the first format call it uses the cardSecurityCode provided by the user in a format string. If the user includes a format specifier in the cardSecurityCode field, they may be able to cause an exception to be thrown, or to be able to access extra information about the stored card expiration date.\n\nThe second format call shows the correct approach. The user-provided value is passed as an argument to the format call. This prevents any format specifiers in the user provided value from being evaluated.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [IDS06-J. Exclude unsanitized user input from format strings](https://wiki.sei.cmu.edu/confluence/display/java/IDS06-J.+Exclude+unsanitized+user+input+from+format+strings).\n* The Java Tutorials: [Formatting Numeric Print Output](https://docs.oracle.com/javase/tutorial/java/data/numberformat.html).\n* Java API Specification: [Formatter](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html).\n* Common Weakness Enumeration: [CWE-134](https://cwe.mitre.org/data/definitions/134.html).\n"},"properties":{"tags":["security","external/cwe/cwe-134"],"description":"Using external input in format strings can lead to exceptions or information leaks.","id":"java/tainted-format-string","kind":"path-problem","name":"Use of externally-controlled format string","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/xml/xpath-injection","name":"java/xml/xpath-injection","shortDescription":{"text":"XPath injection"},"fullDescription":{"text":"Building an XPath expression from user-controlled sources is vulnerable to insertion of malicious code by the user."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# XPath injection\nIf an XPath expression is built using string concatenation, and the components of the concatenation include user input, it makes it very easy for a user to create a malicious XPath expression.\n\n\n## Recommendation\nIf user input must be included in an XPath expression, either sanitize the data or pre-compile the query and use variable references to include the user input.\n\nXPath injection can also be prevented by using XQuery.\n\n\n## Example\nIn the first three examples, the code accepts a name and password specified by the user, and uses this unvalidated and unsanitized value in an XPath expression. This is vulnerable to the user providing special characters or string sequences that change the meaning of the XPath expression to search for different values.\n\nIn the fourth example, the code uses `setXPathVariableResolver` which prevents XPath injection.\n\nThe final two examples are for dom4j. They show an example of XPath injection and one method of preventing it.\n\n\n```java\nfinal String xmlStr = \"\" + \n \" \" + \n \" \" + \n \"\";\ntry {\n DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();\n domFactory.setNamespaceAware(true);\n DocumentBuilder builder = domFactory.newDocumentBuilder();\n //Document doc = builder.parse(\"user.xml\");\n Document doc = builder.parse(new InputSource(new StringReader(xmlStr)));\n\n XPathFactory factory = XPathFactory.newInstance();\n XPath xpath = factory.newXPath();\n\n // Injectable data\n String user = request.getParameter(\"user\");\n String pass = request.getParameter(\"pass\");\n if (user != null && pass != null) {\n boolean isExist = false;\n\n // Bad expression\n String expression1 = \"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\";\n isExist = (boolean)xpath.evaluate(expression1, doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Bad expression\n XPathExpression expression2 = xpath.compile(\"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\");\n isExist = (boolean)expression2.evaluate(doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Bad expression\n StringBuffer sb = new StringBuffer(\"/users/user[@name=\");\n sb.append(user);\n sb.append(\"' and @pass='\");\n sb.append(pass);\n sb.append(\"']\");\n String query = sb.toString();\n XPathExpression expression3 = xpath.compile(query);\n isExist = (boolean)expression3.evaluate(doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Good expression\n String expression4 = \"/users/user[@name=$user and @pass=$pass]\";\n xpath.setXPathVariableResolver(v -> {\n switch (v.getLocalPart()) {\n case \"user\":\n return user;\n case \"pass\":\n return pass;\n default:\n throw new IllegalArgumentException();\n }\n });\n isExist = (boolean)xpath.evaluate(expression4, doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n\n // Bad Dom4j \n org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader();\n org.dom4j.Document document = reader.read(new InputSource(new StringReader(xmlStr)));\n isExist = document.selectSingleNode(\"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\") != null;\n // or document.selectNodes\n System.out.println(isExist);\n\n // Good Dom4j\n org.jaxen.SimpleVariableContext svc = new org.jaxen.SimpleVariableContext();\n svc.setVariableValue(\"user\", user);\n svc.setVariableValue(\"pass\", pass);\n String xpathString = \"/users/user[@name=$user and @pass=$pass]\";\n org.dom4j.XPath safeXPath = document.createXPath(xpathString);\n safeXPath.setVariableContext(svc);\n isExist = safeXPath.selectSingleNode(document) != null;\n System.out.println(isExist);\n }\n} catch (ParserConfigurationException e) {\n\n} catch (SAXException e) {\n\n} catch (XPathExpressionException e) {\n\n} catch (org.dom4j.DocumentException e) {\n\n}\n```\n\n## References\n* OWASP: [Testing for XPath Injection](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/09-Testing_for_XPath_Injection).\n* OWASP: [XPath Injection](https://owasp.org/www-community/attacks/XPATH_Injection).\n* Common Weakness Enumeration: [CWE-643](https://cwe.mitre.org/data/definitions/643.html).\n","markdown":"# XPath injection\nIf an XPath expression is built using string concatenation, and the components of the concatenation include user input, it makes it very easy for a user to create a malicious XPath expression.\n\n\n## Recommendation\nIf user input must be included in an XPath expression, either sanitize the data or pre-compile the query and use variable references to include the user input.\n\nXPath injection can also be prevented by using XQuery.\n\n\n## Example\nIn the first three examples, the code accepts a name and password specified by the user, and uses this unvalidated and unsanitized value in an XPath expression. This is vulnerable to the user providing special characters or string sequences that change the meaning of the XPath expression to search for different values.\n\nIn the fourth example, the code uses `setXPathVariableResolver` which prevents XPath injection.\n\nThe final two examples are for dom4j. They show an example of XPath injection and one method of preventing it.\n\n\n```java\nfinal String xmlStr = \"\" + \n \" \" + \n \" \" + \n \"\";\ntry {\n DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();\n domFactory.setNamespaceAware(true);\n DocumentBuilder builder = domFactory.newDocumentBuilder();\n //Document doc = builder.parse(\"user.xml\");\n Document doc = builder.parse(new InputSource(new StringReader(xmlStr)));\n\n XPathFactory factory = XPathFactory.newInstance();\n XPath xpath = factory.newXPath();\n\n // Injectable data\n String user = request.getParameter(\"user\");\n String pass = request.getParameter(\"pass\");\n if (user != null && pass != null) {\n boolean isExist = false;\n\n // Bad expression\n String expression1 = \"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\";\n isExist = (boolean)xpath.evaluate(expression1, doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Bad expression\n XPathExpression expression2 = xpath.compile(\"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\");\n isExist = (boolean)expression2.evaluate(doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Bad expression\n StringBuffer sb = new StringBuffer(\"/users/user[@name=\");\n sb.append(user);\n sb.append(\"' and @pass='\");\n sb.append(pass);\n sb.append(\"']\");\n String query = sb.toString();\n XPathExpression expression3 = xpath.compile(query);\n isExist = (boolean)expression3.evaluate(doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n // Good expression\n String expression4 = \"/users/user[@name=$user and @pass=$pass]\";\n xpath.setXPathVariableResolver(v -> {\n switch (v.getLocalPart()) {\n case \"user\":\n return user;\n case \"pass\":\n return pass;\n default:\n throw new IllegalArgumentException();\n }\n });\n isExist = (boolean)xpath.evaluate(expression4, doc, XPathConstants.BOOLEAN);\n System.out.println(isExist);\n\n\n // Bad Dom4j \n org.dom4j.io.SAXReader reader = new org.dom4j.io.SAXReader();\n org.dom4j.Document document = reader.read(new InputSource(new StringReader(xmlStr)));\n isExist = document.selectSingleNode(\"/users/user[@name='\" + user + \"' and @pass='\" + pass + \"']\") != null;\n // or document.selectNodes\n System.out.println(isExist);\n\n // Good Dom4j\n org.jaxen.SimpleVariableContext svc = new org.jaxen.SimpleVariableContext();\n svc.setVariableValue(\"user\", user);\n svc.setVariableValue(\"pass\", pass);\n String xpathString = \"/users/user[@name=$user and @pass=$pass]\";\n org.dom4j.XPath safeXPath = document.createXPath(xpathString);\n safeXPath.setVariableContext(svc);\n isExist = safeXPath.selectSingleNode(document) != null;\n System.out.println(isExist);\n }\n} catch (ParserConfigurationException e) {\n\n} catch (SAXException e) {\n\n} catch (XPathExpressionException e) {\n\n} catch (org.dom4j.DocumentException e) {\n\n}\n```\n\n## References\n* OWASP: [Testing for XPath Injection](https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/09-Testing_for_XPath_Injection).\n* OWASP: [XPath Injection](https://owasp.org/www-community/attacks/XPATH_Injection).\n* Common Weakness Enumeration: [CWE-643](https://cwe.mitre.org/data/definitions/643.html).\n"},"properties":{"tags":["security","external/cwe/cwe-643","owasp-top10-2021","A03:2021 - Injection"],"description":"Building an XPath expression from user-controlled sources is vulnerable to insertion of\n malicious code by the user.","id":"java/xml/xpath-injection","kind":"path-problem","name":"XPath injection","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/improper-intent-verification","name":"java/improper-intent-verification","shortDescription":{"text":"Improper verification of intent by broadcast receiver"},"fullDescription":{"text":"A broadcast receiver that does not verify intents it receives may be susceptible to unintended behavior by third party applications sending it explicit intents."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Improper verification of intent by broadcast receiver\nWhen an Android application uses a `BroadcastReceiver` to receive intents, it is also able to receive explicit intents that are sent directly to it, regardless of its filter. Certain intent actions are only able to be sent by the operating system, not third-party applications. However, a `BroadcastReceiver` that is registered to receive system intents is still able to receive intents from a third-party application, so it should check that the intent received has the expected action. Otherwise, a third-party application could impersonate the system this way to cause unintended behavior, such as a denial of service.\n\n\n## Example\nIn the following code, the `ShutdownReceiver` initiates a shutdown procedure upon receiving an intent, without checking that the received action is indeed `ACTION_SHUTDOWN`. This allows third-party applications to send explicit intents to this receiver to cause a denial of service.\n\n\n```java\npublic class ShutdownReceiver extends BroadcastReceiver {\n @Override\n public void onReceive(final Context context, final Intent intent) {\n mainActivity.saveLocalData();\n mainActivity.stopActivity();\n }\n}\n```\n\n```xml\n\n \n \n \n \n \n \n \n\n```\n\n## Recommendation\nIn the `onReceive` method of a `BroadcastReceiver`, the action of the received Intent should be checked. The following code demonstrates this.\n\n\n```java\npublic class ShutdownReceiver extends BroadcastReceiver {\n @Override\n public void onReceive(final Context context, final Intent intent) {\n if (!intent.getAction().equals(Intent.ACTION_SHUTDOWN)) {\n return;\n }\n mainActivity.saveLocalData();\n mainActivity.stopActivity();\n }\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-925](https://cwe.mitre.org/data/definitions/925.html).\n","markdown":"# Improper verification of intent by broadcast receiver\nWhen an Android application uses a `BroadcastReceiver` to receive intents, it is also able to receive explicit intents that are sent directly to it, regardless of its filter. Certain intent actions are only able to be sent by the operating system, not third-party applications. However, a `BroadcastReceiver` that is registered to receive system intents is still able to receive intents from a third-party application, so it should check that the intent received has the expected action. Otherwise, a third-party application could impersonate the system this way to cause unintended behavior, such as a denial of service.\n\n\n## Example\nIn the following code, the `ShutdownReceiver` initiates a shutdown procedure upon receiving an intent, without checking that the received action is indeed `ACTION_SHUTDOWN`. This allows third-party applications to send explicit intents to this receiver to cause a denial of service.\n\n\n```java\npublic class ShutdownReceiver extends BroadcastReceiver {\n @Override\n public void onReceive(final Context context, final Intent intent) {\n mainActivity.saveLocalData();\n mainActivity.stopActivity();\n }\n}\n```\n\n```xml\n\n \n \n \n \n \n \n \n\n```\n\n## Recommendation\nIn the `onReceive` method of a `BroadcastReceiver`, the action of the received Intent should be checked. The following code demonstrates this.\n\n\n```java\npublic class ShutdownReceiver extends BroadcastReceiver {\n @Override\n public void onReceive(final Context context, final Intent intent) {\n if (!intent.getAction().equals(Intent.ACTION_SHUTDOWN)) {\n return;\n }\n mainActivity.saveLocalData();\n mainActivity.stopActivity();\n }\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-925](https://cwe.mitre.org/data/definitions/925.html).\n"},"properties":{"tags":["security","external/cwe/cwe-925"],"description":"A broadcast receiver that does not verify intents it receives may be susceptible to unintended behavior by third party applications sending it explicit intents.","id":"java/improper-intent-verification","kind":"problem","name":"Improper verification of intent by broadcast receiver","precision":"high","problem.severity":"warning","security-severity":"8.2"}},{"id":"java/unsafe-hostname-verification","name":"java/unsafe-hostname-verification","shortDescription":{"text":"Unsafe hostname verification"},"fullDescription":{"text":"Marking a certificate as valid for a host without checking the certificate hostname allows an attacker to perform a machine-in-the-middle attack."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Unsafe hostname verification\nIf a `HostnameVerifier` always returns `true` it will not verify the hostname at all. This stops Transport Layer Security (TLS) providing any security and allows an attacker to perform a man-in-the-middle attack against the application.\n\nAn attack might look like this:\n\n1. The program connects to `https://example.com`.\n1. The attacker intercepts this connection and presents an apparently-valid certificate of their choosing.\n1. The `TrustManager` of the program verifies that the certificate has been issued by a trusted certificate authority.\n1. The Java HTTPS library checks whether the certificate has been issued for the host `example.com`. This check fails because the certificate has been issued for a domain controlled by the attacker, for example: `malicious.domain`.\n1. The HTTPS library wants to reject the certificate because the hostname does not match. Before doing this it checks whether a `HostnameVerifier` exists.\n1. Your `HostnameVerifier` is called which returns `true` for any certificate so also for this one.\n1. The program proceeds with the connection since your `HostnameVerifier` accepted it.\n1. The attacker can now read the data your program sends to `https://example.com` and/or alter its replies while the program thinks the connection is secure.\n\n## Recommendation\nDo not use an open `HostnameVerifier`. If you have a configuration problem with TLS/HTTPS, you should always solve the configuration problem instead of using an open verifier.\n\n\n## Example\nIn the first (bad) example, the `HostnameVerifier` always returns `true`. This allows an attacker to perform a man-in-the-middle attack, because any certificate is accepted despite an incorrect hostname. In the second (good) example, the `HostnameVerifier` only returns `true` when the certificate has been correctly checked.\n\n\n```java\npublic static void main(String[] args) {\n\n\t{\n\t\tHostnameVerifier verifier = new HostnameVerifier() {\n\t\t\t@Override\n\t\t\tpublic boolean verify(String hostname, SSLSession session) {\n\t\t\t\treturn true; // BAD: accept even if the hostname doesn't match\n\t\t\t}\n\t\t};\n\t\tHttpsURLConnection.setDefaultHostnameVerifier(verifier);\n\t}\n\n\t{\n\t\tHostnameVerifier verifier = new HostnameVerifier() {\n\t\t\t@Override\n\t\t\tpublic boolean verify(String hostname, SSLSession session) {\n\t\t\t\ttry { // GOOD: verify the certificate\n\t\t\t\t\tCertificate[] certs = session.getPeerCertificates();\n\t\t\t\t\tX509Certificate x509 = (X509Certificate) certs[0];\n\t\t\t\t\tcheck(new String[]{host}, x509);\n\t\t\t\t\treturn true;\n\t\t\t\t} catch (SSLException e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tHttpsURLConnection.setDefaultHostnameVerifier(verifier);\n\t}\n\n}\n```\n\n## References\n* Android developers: [Security with HTTPS and SSL](https://developer.android.com/training/articles/security-ssl).\n* Terse systems blog: [Fixing Hostname Verification](https://tersesystems.com/blog/2014/03/23/fixing-hostname-verification/).\n* Common Weakness Enumeration: [CWE-297](https://cwe.mitre.org/data/definitions/297.html).\n","markdown":"# Unsafe hostname verification\nIf a `HostnameVerifier` always returns `true` it will not verify the hostname at all. This stops Transport Layer Security (TLS) providing any security and allows an attacker to perform a man-in-the-middle attack against the application.\n\nAn attack might look like this:\n\n1. The program connects to `https://example.com`.\n1. The attacker intercepts this connection and presents an apparently-valid certificate of their choosing.\n1. The `TrustManager` of the program verifies that the certificate has been issued by a trusted certificate authority.\n1. The Java HTTPS library checks whether the certificate has been issued for the host `example.com`. This check fails because the certificate has been issued for a domain controlled by the attacker, for example: `malicious.domain`.\n1. The HTTPS library wants to reject the certificate because the hostname does not match. Before doing this it checks whether a `HostnameVerifier` exists.\n1. Your `HostnameVerifier` is called which returns `true` for any certificate so also for this one.\n1. The program proceeds with the connection since your `HostnameVerifier` accepted it.\n1. The attacker can now read the data your program sends to `https://example.com` and/or alter its replies while the program thinks the connection is secure.\n\n## Recommendation\nDo not use an open `HostnameVerifier`. If you have a configuration problem with TLS/HTTPS, you should always solve the configuration problem instead of using an open verifier.\n\n\n## Example\nIn the first (bad) example, the `HostnameVerifier` always returns `true`. This allows an attacker to perform a man-in-the-middle attack, because any certificate is accepted despite an incorrect hostname. In the second (good) example, the `HostnameVerifier` only returns `true` when the certificate has been correctly checked.\n\n\n```java\npublic static void main(String[] args) {\n\n\t{\n\t\tHostnameVerifier verifier = new HostnameVerifier() {\n\t\t\t@Override\n\t\t\tpublic boolean verify(String hostname, SSLSession session) {\n\t\t\t\treturn true; // BAD: accept even if the hostname doesn't match\n\t\t\t}\n\t\t};\n\t\tHttpsURLConnection.setDefaultHostnameVerifier(verifier);\n\t}\n\n\t{\n\t\tHostnameVerifier verifier = new HostnameVerifier() {\n\t\t\t@Override\n\t\t\tpublic boolean verify(String hostname, SSLSession session) {\n\t\t\t\ttry { // GOOD: verify the certificate\n\t\t\t\t\tCertificate[] certs = session.getPeerCertificates();\n\t\t\t\t\tX509Certificate x509 = (X509Certificate) certs[0];\n\t\t\t\t\tcheck(new String[]{host}, x509);\n\t\t\t\t\treturn true;\n\t\t\t\t} catch (SSLException e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tHttpsURLConnection.setDefaultHostnameVerifier(verifier);\n\t}\n\n}\n```\n\n## References\n* Android developers: [Security with HTTPS and SSL](https://developer.android.com/training/articles/security-ssl).\n* Terse systems blog: [Fixing Hostname Verification](https://tersesystems.com/blog/2014/03/23/fixing-hostname-verification/).\n* Common Weakness Enumeration: [CWE-297](https://cwe.mitre.org/data/definitions/297.html).\n"},"properties":{"tags":["security","external/cwe/cwe-297","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Marking a certificate as valid for a host without checking the certificate hostname allows an attacker to perform a machine-in-the-middle attack.","id":"java/unsafe-hostname-verification","kind":"path-problem","name":"Unsafe hostname verification","precision":"high","problem.severity":"error","security-severity":"5.9"}},{"id":"java/xxe","name":"java/xxe","shortDescription":{"text":"Resolving XML external entity in user-controlled data"},"fullDescription":{"text":"Parsing user-controlled XML documents and allowing expansion of external entity references may lead to disclosure of confidential data or denial of service."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Resolving XML external entity in user-controlled data\nParsing untrusted XML files with a weakly configured XML parser may lead to an XML External Entity (XXE) attack. This type of attack uses external entity references to access arbitrary files on a system, carry out denial of service, or server side request forgery. Even when the result of parsing is not returned to the user, out-of-band data retrieval techniques may allow attackers to steal sensitive data. Denial of services can also be carried out in this situation.\n\nThere are many XML parsers for Java, and most of them are vulnerable to XXE because their default settings enable parsing of external entities. This query currently identifies vulnerable XML parsing from the following parsers: `javax.xml.parsers.DocumentBuilder`, `javax.xml.stream.XMLStreamReader`, `org.jdom.input.SAXBuilder`/`org.jdom2.input.SAXBuilder`, `javax.xml.parsers.SAXParser`,`org.dom4j.io.SAXReader`, `org.xml.sax.XMLReader`, `javax.xml.transform.sax.SAXSource`, `javax.xml.transform.TransformerFactory`, `javax.xml.transform.sax.SAXTransformerFactory`, `javax.xml.validation.SchemaFactory`, `javax.xml.bind.Unmarshaller` and `javax.xml.xpath.XPathExpression`.\n\n\n## Recommendation\nThe best way to prevent XXE attacks is to disable the parsing of any Document Type Declarations (DTDs) in untrusted data. If this is not possible you should disable the parsing of external general entities and external parameter entities. This improves security but the code will still be at risk of denial of service and server side request forgery attacks. Protection against denial of service attacks may also be implemented by setting entity expansion limits, which is done by default in recent JDK and JRE implementations. Because there are many different ways to disable external entity retrieval with varying support between different providers, in this query we choose to specifically check for the [OWASP recommended way](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java) to disable external entity retrieval for a particular parser. There may be other ways of making a particular parser safe which deviate from these guidelines, in which case this query will continue to flag the parser as potentially dangerous.\n\n\n## Example\nThe following example calls `parse` on a `DocumentBuilder` that is not safely configured on untrusted data, and is therefore inherently unsafe.\n\n\n```java\npublic void parse(Socket sock) throws Exception {\n DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n DocumentBuilder builder = factory.newDocumentBuilder();\n builder.parse(sock.getInputStream()); //unsafe\n}\n\n```\nIn this example, the `DocumentBuilder` is created with DTD disabled, securing it against XXE attack.\n\n\n```java\npublic void disableDTDParse(Socket sock) throws Exception {\n DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n factory.setFeature(\"http://apache.org/xml/features/disallow-doctype-decl\", true);\n DocumentBuilder builder = factory.newDocumentBuilder();\n builder.parse(sock.getInputStream()); //safe\n}\n\n```\n\n## References\n* OWASP vulnerability description: [XML External Entity (XXE) Processing](https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing).\n* OWASP guidance on parsing xml files: [XXE Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java).\n* Paper by Timothy Morgen: [XML Schema, DTD, and Entity Attacks](https://research.nccgroup.com/2014/05/19/xml-schema-dtd-and-entity-attacks-a-compendium-of-known-techniques/)\n* Out-of-band data retrieval: Timur Yunusov & Alexey Osipov, Black hat EU 2013: [XML Out-Of-Band Data Retrieval](https://www.slideshare.net/qqlan/bh-ready-v4).\n* Denial of service attack (Billion laughs): [Billion Laughs.](https://en.wikipedia.org/wiki/Billion_laughs)\n* The Java Tutorials: [Processing Limit Definitions.](https://docs.oracle.com/javase/tutorial/jaxp/limits/limits.html)\n* Common Weakness Enumeration: [CWE-611](https://cwe.mitre.org/data/definitions/611.html).\n* Common Weakness Enumeration: [CWE-776](https://cwe.mitre.org/data/definitions/776.html).\n* Common Weakness Enumeration: [CWE-827](https://cwe.mitre.org/data/definitions/827.html).\n","markdown":"# Resolving XML external entity in user-controlled data\nParsing untrusted XML files with a weakly configured XML parser may lead to an XML External Entity (XXE) attack. This type of attack uses external entity references to access arbitrary files on a system, carry out denial of service, or server side request forgery. Even when the result of parsing is not returned to the user, out-of-band data retrieval techniques may allow attackers to steal sensitive data. Denial of services can also be carried out in this situation.\n\nThere are many XML parsers for Java, and most of them are vulnerable to XXE because their default settings enable parsing of external entities. This query currently identifies vulnerable XML parsing from the following parsers: `javax.xml.parsers.DocumentBuilder`, `javax.xml.stream.XMLStreamReader`, `org.jdom.input.SAXBuilder`/`org.jdom2.input.SAXBuilder`, `javax.xml.parsers.SAXParser`,`org.dom4j.io.SAXReader`, `org.xml.sax.XMLReader`, `javax.xml.transform.sax.SAXSource`, `javax.xml.transform.TransformerFactory`, `javax.xml.transform.sax.SAXTransformerFactory`, `javax.xml.validation.SchemaFactory`, `javax.xml.bind.Unmarshaller` and `javax.xml.xpath.XPathExpression`.\n\n\n## Recommendation\nThe best way to prevent XXE attacks is to disable the parsing of any Document Type Declarations (DTDs) in untrusted data. If this is not possible you should disable the parsing of external general entities and external parameter entities. This improves security but the code will still be at risk of denial of service and server side request forgery attacks. Protection against denial of service attacks may also be implemented by setting entity expansion limits, which is done by default in recent JDK and JRE implementations. Because there are many different ways to disable external entity retrieval with varying support between different providers, in this query we choose to specifically check for the [OWASP recommended way](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java) to disable external entity retrieval for a particular parser. There may be other ways of making a particular parser safe which deviate from these guidelines, in which case this query will continue to flag the parser as potentially dangerous.\n\n\n## Example\nThe following example calls `parse` on a `DocumentBuilder` that is not safely configured on untrusted data, and is therefore inherently unsafe.\n\n\n```java\npublic void parse(Socket sock) throws Exception {\n DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n DocumentBuilder builder = factory.newDocumentBuilder();\n builder.parse(sock.getInputStream()); //unsafe\n}\n\n```\nIn this example, the `DocumentBuilder` is created with DTD disabled, securing it against XXE attack.\n\n\n```java\npublic void disableDTDParse(Socket sock) throws Exception {\n DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n factory.setFeature(\"http://apache.org/xml/features/disallow-doctype-decl\", true);\n DocumentBuilder builder = factory.newDocumentBuilder();\n builder.parse(sock.getInputStream()); //safe\n}\n\n```\n\n## References\n* OWASP vulnerability description: [XML External Entity (XXE) Processing](https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing).\n* OWASP guidance on parsing xml files: [XXE Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java).\n* Paper by Timothy Morgen: [XML Schema, DTD, and Entity Attacks](https://research.nccgroup.com/2014/05/19/xml-schema-dtd-and-entity-attacks-a-compendium-of-known-techniques/)\n* Out-of-band data retrieval: Timur Yunusov & Alexey Osipov, Black hat EU 2013: [XML Out-Of-Band Data Retrieval](https://www.slideshare.net/qqlan/bh-ready-v4).\n* Denial of service attack (Billion laughs): [Billion Laughs.](https://en.wikipedia.org/wiki/Billion_laughs)\n* The Java Tutorials: [Processing Limit Definitions.](https://docs.oracle.com/javase/tutorial/jaxp/limits/limits.html)\n* Common Weakness Enumeration: [CWE-611](https://cwe.mitre.org/data/definitions/611.html).\n* Common Weakness Enumeration: [CWE-776](https://cwe.mitre.org/data/definitions/776.html).\n* Common Weakness Enumeration: [CWE-827](https://cwe.mitre.org/data/definitions/827.html).\n"},"properties":{"tags":["security","external/cwe/cwe-611","external/cwe/cwe-776","external/cwe/cwe-827","owasp-top10-2021","A05:2021 - Security Misconfiguration"],"description":"Parsing user-controlled XML documents and allowing expansion of external entity\n references may lead to disclosure of confidential data or denial of service.","id":"java/xxe","kind":"path-problem","name":"Resolving XML external entity in user-controlled data","precision":"high","problem.severity":"error","security-severity":"9.1"}},{"id":"java/unvalidated-url-redirection","name":"java/unvalidated-url-redirection","shortDescription":{"text":"URL redirection from remote source"},"fullDescription":{"text":"URL redirection based on unvalidated user-input may cause redirection to malicious web sites."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# URL redirection from remote source\nDirectly incorporating user input into a URL redirect request without validating the input can facilitate phishing attacks. In these attacks, unsuspecting users can be redirected to a malicious site that looks very similar to the real site they intend to visit, but which is controlled by the attacker.\n\n\n## Recommendation\nTo guard against untrusted URL redirection, it is advisable to avoid putting user input directly into a redirect URL. Instead, maintain a list of authorized redirects on the server; then choose from that list based on the user input provided.\n\n\n## Example\nThe following example shows an HTTP request parameter being used directly in a URL redirect without validating the input, which facilitates phishing attacks. It also shows how to remedy the problem by validating the user input against a known fixed string.\n\n\n```java\npublic class UrlRedirect extends HttpServlet {\n\tprivate static final String VALID_REDIRECT = \"http://cwe.mitre.org/data/definitions/601.html\";\n\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: a request parameter is incorporated without validation into a URL redirect\n\t\tresponse.sendRedirect(request.getParameter(\"target\"));\n\n\t\t// GOOD: the request parameter is validated against a known fixed string\n\t\tif (VALID_REDIRECT.equals(request.getParameter(\"target\"))) {\n\t\t\tresponse.sendRedirect(VALID_REDIRECT);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* Common Weakness Enumeration: [CWE-601](https://cwe.mitre.org/data/definitions/601.html).\n","markdown":"# URL redirection from remote source\nDirectly incorporating user input into a URL redirect request without validating the input can facilitate phishing attacks. In these attacks, unsuspecting users can be redirected to a malicious site that looks very similar to the real site they intend to visit, but which is controlled by the attacker.\n\n\n## Recommendation\nTo guard against untrusted URL redirection, it is advisable to avoid putting user input directly into a redirect URL. Instead, maintain a list of authorized redirects on the server; then choose from that list based on the user input provided.\n\n\n## Example\nThe following example shows an HTTP request parameter being used directly in a URL redirect without validating the input, which facilitates phishing attacks. It also shows how to remedy the problem by validating the user input against a known fixed string.\n\n\n```java\npublic class UrlRedirect extends HttpServlet {\n\tprivate static final String VALID_REDIRECT = \"http://cwe.mitre.org/data/definitions/601.html\";\n\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\tthrows ServletException, IOException {\n\t\t// BAD: a request parameter is incorporated without validation into a URL redirect\n\t\tresponse.sendRedirect(request.getParameter(\"target\"));\n\n\t\t// GOOD: the request parameter is validated against a known fixed string\n\t\tif (VALID_REDIRECT.equals(request.getParameter(\"target\"))) {\n\t\t\tresponse.sendRedirect(VALID_REDIRECT);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* Common Weakness Enumeration: [CWE-601](https://cwe.mitre.org/data/definitions/601.html).\n"},"properties":{"tags":["security","external/cwe/cwe-601","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"URL redirection based on unvalidated user-input\n may cause redirection to malicious web sites.","id":"java/unvalidated-url-redirection","kind":"path-problem","name":"URL redirection from remote source","precision":"high","problem.severity":"error","security-severity":"6.1"}},{"id":"java/command-line-injection","name":"java/command-line-injection","shortDescription":{"text":"Uncontrolled command line"},"fullDescription":{"text":"Using externally controlled strings in a command line is vulnerable to malicious changes in the strings."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Uncontrolled command line\nCode that passes user input directly to `Runtime.exec`, or some other library routine that executes a command, allows the user to execute malicious code.\n\n\n## Recommendation\nIf possible, use hard-coded string literals to specify the command to run or library to load. Instead of passing the user input directly to the process or library function, examine the user input and then choose among hard-coded string literals.\n\nIf the applicable libraries or commands cannot be determined at compile time, then add code to verify that the user input string is safe before using it.\n\n\n## Example\nThe following example shows code that takes a shell script that can be changed maliciously by a user, and passes it straight to `Runtime.exec` without examining it first.\n\n\n```java\nclass Test {\n public static void main(String[] args) {\n String script = System.getenv(\"SCRIPTNAME\");\n if (script != null) {\n // BAD: The script to be executed is controlled by the user.\n Runtime.getRuntime().exec(script);\n }\n }\n}\n```\n\n## References\n* OWASP: [Command Injection](https://www.owasp.org/index.php/Command_Injection).\n* SEI CERT Oracle Coding Standard for Java: [IDS07-J. Sanitize untrusted data passed to the Runtime.exec() method](https://wiki.sei.cmu.edu/confluence/display/java/IDS07-J.+Sanitize+untrusted+data+passed+to+the+Runtime.exec()+method).\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n","markdown":"# Uncontrolled command line\nCode that passes user input directly to `Runtime.exec`, or some other library routine that executes a command, allows the user to execute malicious code.\n\n\n## Recommendation\nIf possible, use hard-coded string literals to specify the command to run or library to load. Instead of passing the user input directly to the process or library function, examine the user input and then choose among hard-coded string literals.\n\nIf the applicable libraries or commands cannot be determined at compile time, then add code to verify that the user input string is safe before using it.\n\n\n## Example\nThe following example shows code that takes a shell script that can be changed maliciously by a user, and passes it straight to `Runtime.exec` without examining it first.\n\n\n```java\nclass Test {\n public static void main(String[] args) {\n String script = System.getenv(\"SCRIPTNAME\");\n if (script != null) {\n // BAD: The script to be executed is controlled by the user.\n Runtime.getRuntime().exec(script);\n }\n }\n}\n```\n\n## References\n* OWASP: [Command Injection](https://www.owasp.org/index.php/Command_Injection).\n* SEI CERT Oracle Coding Standard for Java: [IDS07-J. Sanitize untrusted data passed to the Runtime.exec() method](https://wiki.sei.cmu.edu/confluence/display/java/IDS07-J.+Sanitize+untrusted+data+passed+to+the+Runtime.exec()+method).\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n"},"properties":{"tags":["security","external/cwe/cwe-078","external/cwe/cwe-088","owasp-top10-2021","A03:2021 - Injection"],"description":"Using externally controlled strings in a command line is vulnerable to malicious\n changes in the strings.","id":"java/command-line-injection","kind":"path-problem","name":"Uncontrolled command line","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/concatenated-command-line","name":"java/concatenated-command-line","shortDescription":{"text":"Building a command line with string concatenation"},"fullDescription":{"text":"Using concatenated strings in a command line is vulnerable to malicious insertion of special characters in the strings."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Building a command line with string concatenation\nCode that builds a command line by concatenating strings that have been entered by a user allows the user to execute malicious code.\n\n\n## Recommendation\nExecute external commands using an array of strings rather than a single string. By using an array, many possible vulnerabilities in the formatting of the string are avoided.\n\n\n## Example\nIn the following example, `latlonCoords` contains a string that has been entered by a user but not validated by the program. This allows the user to, for example, append an ampersand (&) followed by the command for a malicious program to the end of the string. The ampersand instructs Windows to execute another program. In the block marked 'BAD', `latlonCoords` is passed to `exec` as part of a concatenated string, which allows more than one command to be executed. However, in the block marked 'GOOD', `latlonCoords` is passed as part of an array, which means that `exec` treats it only as an argument.\n\n\n```java\nclass Test {\n public static void main(String[] args) {\n // BAD: user input might include special characters such as ampersands\n {\n String latlonCoords = args[1];\n Runtime rt = Runtime.getRuntime();\n Process exec = rt.exec(\"cmd.exe /C latlon2utm.exe \" + latlonCoords);\n }\n\n // GOOD: use an array of arguments instead of executing a string\n {\n String latlonCoords = args[1];\n Runtime rt = Runtime.getRuntime();\n Process exec = rt.exec(new String[] {\n \"c:\\\\path\\to\\latlon2utm.exe\",\n latlonCoords });\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Command Injection](https://www.owasp.org/index.php/Command_Injection).\n* SEI CERT Oracle Coding Standard for Java: [IDS07-J. Sanitize untrusted data passed to the Runtime.exec() method](https://wiki.sei.cmu.edu/confluence/display/java/IDS07-J.+Sanitize+untrusted+data+passed+to+the+Runtime.exec()+method).\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n","markdown":"# Building a command line with string concatenation\nCode that builds a command line by concatenating strings that have been entered by a user allows the user to execute malicious code.\n\n\n## Recommendation\nExecute external commands using an array of strings rather than a single string. By using an array, many possible vulnerabilities in the formatting of the string are avoided.\n\n\n## Example\nIn the following example, `latlonCoords` contains a string that has been entered by a user but not validated by the program. This allows the user to, for example, append an ampersand (&) followed by the command for a malicious program to the end of the string. The ampersand instructs Windows to execute another program. In the block marked 'BAD', `latlonCoords` is passed to `exec` as part of a concatenated string, which allows more than one command to be executed. However, in the block marked 'GOOD', `latlonCoords` is passed as part of an array, which means that `exec` treats it only as an argument.\n\n\n```java\nclass Test {\n public static void main(String[] args) {\n // BAD: user input might include special characters such as ampersands\n {\n String latlonCoords = args[1];\n Runtime rt = Runtime.getRuntime();\n Process exec = rt.exec(\"cmd.exe /C latlon2utm.exe \" + latlonCoords);\n }\n\n // GOOD: use an array of arguments instead of executing a string\n {\n String latlonCoords = args[1];\n Runtime rt = Runtime.getRuntime();\n Process exec = rt.exec(new String[] {\n \"c:\\\\path\\to\\latlon2utm.exe\",\n latlonCoords });\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Command Injection](https://www.owasp.org/index.php/Command_Injection).\n* SEI CERT Oracle Coding Standard for Java: [IDS07-J. Sanitize untrusted data passed to the Runtime.exec() method](https://wiki.sei.cmu.edu/confluence/display/java/IDS07-J.+Sanitize+untrusted+data+passed+to+the+Runtime.exec()+method).\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n"},"properties":{"tags":["security","external/cwe/cwe-078","external/cwe/cwe-088","owasp-top10-2021","A03:2021 - Injection"],"description":"Using concatenated strings in a command line is vulnerable to malicious\n insertion of special characters in the strings.","id":"java/concatenated-command-line","kind":"problem","name":"Building a command line with string concatenation","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/unsafe-deserialization","name":"java/unsafe-deserialization","shortDescription":{"text":"Deserialization of user-controlled data"},"fullDescription":{"text":"Deserializing user-controlled data may allow attackers to execute arbitrary code."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Deserialization of user-controlled data\nDeserializing untrusted data using any deserialization framework that allows the construction of arbitrary serializable objects is easily exploitable and in many cases allows an attacker to execute arbitrary code. Even before a deserialized object is returned to the caller of a deserialization method a lot of code may have been executed, including static initializers, constructors, and finalizers. Automatic deserialization of fields means that an attacker may craft a nested combination of objects on which the executed initialization code may have unforeseen effects, such as the execution of arbitrary code.\n\nThere are many different serialization frameworks. This query currently supports Kryo, XmlDecoder, XStream, SnakeYaml, JYaml, JsonIO, YAMLBeans, HessianBurlap, Castor, Burlap, Jackson, Jabsorb, Jodd JSON, Flexjson, Gson and Java IO serialization through `ObjectInputStream`/`ObjectOutputStream`.\n\n\n## Recommendation\nAvoid deserialization of untrusted data if at all possible. If the architecture permits it then use other formats instead of serialized objects, for example JSON or XML. However, these formats should not be deserialized into complex objects because this provides further opportunities for attack. For example, XML-based deserialization attacks are possible through libraries such as XStream and XmlDecoder.\n\nAlternatively, a tightly controlled whitelist can limit the vulnerability of code, but be aware of the existence of so-called Bypass Gadgets, which can circumvent such protection measures.\n\nRecommendations specific to particular frameworks supported by this query:\n\n**FastJson** - `com.alibaba:fastjson`\n\n* **Secure by Default**: Partially\n* **Recommendation**: Call `com.alibaba.fastjson.parser.ParserConfig#setSafeMode` with the argument `true` before deserializing untrusted data.\n\n\n**FasterXML** - `com.fasterxml.jackson.core:jackson-databind`\n\n* **Secure by Default**: Yes\n* **Recommendation**: Don't call `com.fasterxml.jackson.databind.ObjectMapper#enableDefaultTyping` and don't annotate any object fields with `com.fasterxml.jackson.annotation.JsonTypeInfo` passing either the `CLASS` or `MINIMAL_CLASS` values to the annotation. Read [this guide](https://cowtowncoder.medium.com/jackson-2-10-safe-default-typing-2d018f0ce2ba).\n\n\n**Kryo** - `com.esotericsoftware:kryo` and `com.esotericsoftware:kryo5`\n\n* **Secure by Default**: Yes for `com.esotericsoftware:kryo5` and for `com.esotericsoftware:kryo` >= v5.0.0\n* **Recommendation**: Don't call `com.esotericsoftware.kryo(5).Kryo#setRegistrationRequired` with the argument `false` on any `Kryo` instance that may deserialize untrusted data.\n\n\n**ObjectInputStream** - `Java Standard Library`\n\n* **Secure by Default**: No\n* **Recommendation**: Use a validating input stream, such as `org.apache.commons.io.serialization.ValidatingObjectInputStream`.\n\n\n**SnakeYAML** - `org.yaml:snakeyaml`\n\n* **Secure by Default**: No\n* **Recommendation**: Pass an instance of `org.yaml.snakeyaml.constructor.SafeConstructor` to `org.yaml.snakeyaml.Yaml`'s constructor before using it to deserialize untrusted data.\n\n\n**XML Decoder** - `Standard Java Library`\n\n* **Secure by Default**: No\n* **Recommendation**: Do not use with untrusted user input.\n\n\n\n## Example\nThe following example calls `readObject` directly on an `ObjectInputStream` that is constructed from untrusted data, and is therefore inherently unsafe.\n\n\n```java\npublic MyObject {\n public int field;\n MyObject(int field) {\n this.field = field;\n }\n}\n\npublic MyObject deserialize(Socket sock) {\n try(ObjectInputStream in = new ObjectInputStream(sock.getInputStream())) {\n return (MyObject)in.readObject(); // unsafe\n }\n}\n\n```\nRewriting the communication protocol to only rely on reading primitive types from the input stream removes the vulnerability.\n\n\n```java\npublic MyObject deserialize(Socket sock) {\n try(DataInputStream in = new DataInputStream(sock.getInputStream())) {\n return new MyObject(in.readInt());\n }\n}\n\n```\n\n## References\n* OWASP vulnerability description: [Deserialization of untrusted data](https://www.owasp.org/index.php/Deserialization_of_untrusted_data).\n* OWASP guidance on deserializing objects: [Deserialization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html).\n* Talks by Chris Frohoff & Gabriel Lawrence: [ AppSecCali 2015: Marshalling Pickles - how deserializing objects will ruin your day](http://frohoff.github.io/appseccali-marshalling-pickles/), [OWASP SD: Deserialize My Shorts: Or How I Learned to Start Worrying and Hate Java Object Deserialization](http://frohoff.github.io/owaspsd-deserialize-my-shorts/).\n* Alvaro Muñoz & Christian Schneider, RSAConference 2016: [Serial Killer: Silently Pwning Your Java Endpoints](https://speakerdeck.com/pwntester/serial-killer-silently-pwning-your-java-endpoints).\n* SnakeYaml documentation on deserialization: [SnakeYaml deserialization](https://bitbucket.org/snakeyaml/snakeyaml/wiki/Documentation#markdown-header-loading-yaml).\n* Hessian deserialization and related gadget chains: [Hessian deserialization](https://paper.seebug.org/1137/).\n* Castor and Hessian java deserialization vulnerabilities: [Castor and Hessian deserialization](https://securitylab.github.com/research/hessian-java-deserialization-castor-vulnerabilities/).\n* Remote code execution in JYaml library: [JYaml deserialization](https://www.cybersecurity-help.cz/vdb/SB2020022512).\n* JsonIO deserialization vulnerabilities: [JsonIO deserialization](https://klezvirus.github.io/Advanced-Web-Hacking/Serialisation/).\n* Research by Moritz Bechler: [Java Unmarshaller Security - Turning your data into code execution](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)\n* Blog posts by the developer of Jackson libraries: [On Jackson CVEs: Don’t Panic — Here is what you need to know](https://cowtowncoder.medium.com/on-jackson-cves-dont-panic-here-is-what-you-need-to-know-54cd0d6e8062) [Jackson 2.10: Safe Default Typing](https://cowtowncoder.medium.com/jackson-2-10-safe-default-typing-2d018f0ce2ba)\n* Jabsorb documentation on deserialization: [Jabsorb JSON Serializer](https://github.com/Servoy/jabsorb/blob/master/src/org/jabsorb/).\n* Jodd JSON documentation on deserialization: [JoddJson Parser](https://json.jodd.org/parser).\n* RCE in Flexjson: [Flexjson deserialization](https://codewhitesec.blogspot.com/2020/03/liferay-portal-json-vulns.html).\n* Android Intent deserialization vulnerabilities with GSON parser: [Insecure use of JSON parsers](https://blog.oversecured.com/Exploiting-memory-corruption-vulnerabilities-on-Android/#insecure-use-of-json-parsers).\n* Common Weakness Enumeration: [CWE-502](https://cwe.mitre.org/data/definitions/502.html).\n","markdown":"# Deserialization of user-controlled data\nDeserializing untrusted data using any deserialization framework that allows the construction of arbitrary serializable objects is easily exploitable and in many cases allows an attacker to execute arbitrary code. Even before a deserialized object is returned to the caller of a deserialization method a lot of code may have been executed, including static initializers, constructors, and finalizers. Automatic deserialization of fields means that an attacker may craft a nested combination of objects on which the executed initialization code may have unforeseen effects, such as the execution of arbitrary code.\n\nThere are many different serialization frameworks. This query currently supports Kryo, XmlDecoder, XStream, SnakeYaml, JYaml, JsonIO, YAMLBeans, HessianBurlap, Castor, Burlap, Jackson, Jabsorb, Jodd JSON, Flexjson, Gson and Java IO serialization through `ObjectInputStream`/`ObjectOutputStream`.\n\n\n## Recommendation\nAvoid deserialization of untrusted data if at all possible. If the architecture permits it then use other formats instead of serialized objects, for example JSON or XML. However, these formats should not be deserialized into complex objects because this provides further opportunities for attack. For example, XML-based deserialization attacks are possible through libraries such as XStream and XmlDecoder.\n\nAlternatively, a tightly controlled whitelist can limit the vulnerability of code, but be aware of the existence of so-called Bypass Gadgets, which can circumvent such protection measures.\n\nRecommendations specific to particular frameworks supported by this query:\n\n**FastJson** - `com.alibaba:fastjson`\n\n* **Secure by Default**: Partially\n* **Recommendation**: Call `com.alibaba.fastjson.parser.ParserConfig#setSafeMode` with the argument `true` before deserializing untrusted data.\n\n\n**FasterXML** - `com.fasterxml.jackson.core:jackson-databind`\n\n* **Secure by Default**: Yes\n* **Recommendation**: Don't call `com.fasterxml.jackson.databind.ObjectMapper#enableDefaultTyping` and don't annotate any object fields with `com.fasterxml.jackson.annotation.JsonTypeInfo` passing either the `CLASS` or `MINIMAL_CLASS` values to the annotation. Read [this guide](https://cowtowncoder.medium.com/jackson-2-10-safe-default-typing-2d018f0ce2ba).\n\n\n**Kryo** - `com.esotericsoftware:kryo` and `com.esotericsoftware:kryo5`\n\n* **Secure by Default**: Yes for `com.esotericsoftware:kryo5` and for `com.esotericsoftware:kryo` >= v5.0.0\n* **Recommendation**: Don't call `com.esotericsoftware.kryo(5).Kryo#setRegistrationRequired` with the argument `false` on any `Kryo` instance that may deserialize untrusted data.\n\n\n**ObjectInputStream** - `Java Standard Library`\n\n* **Secure by Default**: No\n* **Recommendation**: Use a validating input stream, such as `org.apache.commons.io.serialization.ValidatingObjectInputStream`.\n\n\n**SnakeYAML** - `org.yaml:snakeyaml`\n\n* **Secure by Default**: No\n* **Recommendation**: Pass an instance of `org.yaml.snakeyaml.constructor.SafeConstructor` to `org.yaml.snakeyaml.Yaml`'s constructor before using it to deserialize untrusted data.\n\n\n**XML Decoder** - `Standard Java Library`\n\n* **Secure by Default**: No\n* **Recommendation**: Do not use with untrusted user input.\n\n\n\n## Example\nThe following example calls `readObject` directly on an `ObjectInputStream` that is constructed from untrusted data, and is therefore inherently unsafe.\n\n\n```java\npublic MyObject {\n public int field;\n MyObject(int field) {\n this.field = field;\n }\n}\n\npublic MyObject deserialize(Socket sock) {\n try(ObjectInputStream in = new ObjectInputStream(sock.getInputStream())) {\n return (MyObject)in.readObject(); // unsafe\n }\n}\n\n```\nRewriting the communication protocol to only rely on reading primitive types from the input stream removes the vulnerability.\n\n\n```java\npublic MyObject deserialize(Socket sock) {\n try(DataInputStream in = new DataInputStream(sock.getInputStream())) {\n return new MyObject(in.readInt());\n }\n}\n\n```\n\n## References\n* OWASP vulnerability description: [Deserialization of untrusted data](https://www.owasp.org/index.php/Deserialization_of_untrusted_data).\n* OWASP guidance on deserializing objects: [Deserialization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html).\n* Talks by Chris Frohoff & Gabriel Lawrence: [ AppSecCali 2015: Marshalling Pickles - how deserializing objects will ruin your day](http://frohoff.github.io/appseccali-marshalling-pickles/), [OWASP SD: Deserialize My Shorts: Or How I Learned to Start Worrying and Hate Java Object Deserialization](http://frohoff.github.io/owaspsd-deserialize-my-shorts/).\n* Alvaro Muñoz & Christian Schneider, RSAConference 2016: [Serial Killer: Silently Pwning Your Java Endpoints](https://speakerdeck.com/pwntester/serial-killer-silently-pwning-your-java-endpoints).\n* SnakeYaml documentation on deserialization: [SnakeYaml deserialization](https://bitbucket.org/snakeyaml/snakeyaml/wiki/Documentation#markdown-header-loading-yaml).\n* Hessian deserialization and related gadget chains: [Hessian deserialization](https://paper.seebug.org/1137/).\n* Castor and Hessian java deserialization vulnerabilities: [Castor and Hessian deserialization](https://securitylab.github.com/research/hessian-java-deserialization-castor-vulnerabilities/).\n* Remote code execution in JYaml library: [JYaml deserialization](https://www.cybersecurity-help.cz/vdb/SB2020022512).\n* JsonIO deserialization vulnerabilities: [JsonIO deserialization](https://klezvirus.github.io/Advanced-Web-Hacking/Serialisation/).\n* Research by Moritz Bechler: [Java Unmarshaller Security - Turning your data into code execution](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)\n* Blog posts by the developer of Jackson libraries: [On Jackson CVEs: Don’t Panic — Here is what you need to know](https://cowtowncoder.medium.com/on-jackson-cves-dont-panic-here-is-what-you-need-to-know-54cd0d6e8062) [Jackson 2.10: Safe Default Typing](https://cowtowncoder.medium.com/jackson-2-10-safe-default-typing-2d018f0ce2ba)\n* Jabsorb documentation on deserialization: [Jabsorb JSON Serializer](https://github.com/Servoy/jabsorb/blob/master/src/org/jabsorb/).\n* Jodd JSON documentation on deserialization: [JoddJson Parser](https://json.jodd.org/parser).\n* RCE in Flexjson: [Flexjson deserialization](https://codewhitesec.blogspot.com/2020/03/liferay-portal-json-vulns.html).\n* Android Intent deserialization vulnerabilities with GSON parser: [Insecure use of JSON parsers](https://blog.oversecured.com/Exploiting-memory-corruption-vulnerabilities-on-Android/#insecure-use-of-json-parsers).\n* Common Weakness Enumeration: [CWE-502](https://cwe.mitre.org/data/definitions/502.html).\n"},"properties":{"tags":["security","external/cwe/cwe-502","owasp-top10-2021","A08:2021 - Software and Data Integrity Failures"],"description":"Deserializing user-controlled data may allow attackers to\n execute arbitrary code.","id":"java/unsafe-deserialization","kind":"path-problem","name":"Deserialization of user-controlled data","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/world-writable-file-read","name":"java/world-writable-file-read","shortDescription":{"text":"Reading from a world writable file"},"fullDescription":{"text":"Reading from a file which is set as world writable is dangerous because the file may be modified or removed by external actors."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Reading from a world writable file\nReading from a world-writable file is dangerous on a multi-user system because other users may be able to affect program execution by modifying or deleting the file.\n\n\n## Recommendation\nDo not make files explicitly world writable unless the file is intended to be written by multiple users on a multi-user system. In many cases, the file may only need to be writable for the current user.\n\nFor some file systems, there may be alternatives to setting the file to be world writable. For example, POSIX file systems support \"groups\" which may be used to ensure that only subset of all the users can write to the file. Access Control Lists (ACLs) are available for many operating system and file system combinations, and can provide fine-grained read and write support without resorting to world writable permissions.\n\n\n## Example\nIn the following example, we are loading some configuration parameters from a file:\n\n```java\n\nprivate void readConfig(File configFile) {\n if (!configFile.exists()) {\n // Create an empty config file\n configFile.createNewFile();\n // Make the file writable for all\n configFile.setWritable(true, false);\n }\n // Now read the config\n loadConfig(configFile);\n}\n\n```\nIf the configuration file does not yet exist, an empty file is created. Creating an empty file can simplify the later code and is a convenience for the user. However, by setting the file to be world writable, we allow any user on the system to modify the configuration, not just the current user. If there may be untrusted users on the system, this is potentially dangerous.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [FIO01-J. Create files with appropriate access permissions](https://wiki.sei.cmu.edu/confluence/display/java/FIO01-J.+Create+files+with+appropriate+access+permissions).\n* Common Weakness Enumeration: [CWE-732](https://cwe.mitre.org/data/definitions/732.html).\n","markdown":"# Reading from a world writable file\nReading from a world-writable file is dangerous on a multi-user system because other users may be able to affect program execution by modifying or deleting the file.\n\n\n## Recommendation\nDo not make files explicitly world writable unless the file is intended to be written by multiple users on a multi-user system. In many cases, the file may only need to be writable for the current user.\n\nFor some file systems, there may be alternatives to setting the file to be world writable. For example, POSIX file systems support \"groups\" which may be used to ensure that only subset of all the users can write to the file. Access Control Lists (ACLs) are available for many operating system and file system combinations, and can provide fine-grained read and write support without resorting to world writable permissions.\n\n\n## Example\nIn the following example, we are loading some configuration parameters from a file:\n\n```java\n\nprivate void readConfig(File configFile) {\n if (!configFile.exists()) {\n // Create an empty config file\n configFile.createNewFile();\n // Make the file writable for all\n configFile.setWritable(true, false);\n }\n // Now read the config\n loadConfig(configFile);\n}\n\n```\nIf the configuration file does not yet exist, an empty file is created. Creating an empty file can simplify the later code and is a convenience for the user. However, by setting the file to be world writable, we allow any user on the system to modify the configuration, not just the current user. If there may be untrusted users on the system, this is potentially dangerous.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [FIO01-J. Create files with appropriate access permissions](https://wiki.sei.cmu.edu/confluence/display/java/FIO01-J.+Create+files+with+appropriate+access+permissions).\n* Common Weakness Enumeration: [CWE-732](https://cwe.mitre.org/data/definitions/732.html).\n"},"properties":{"tags":["security","external/cwe/cwe-732"],"description":"Reading from a file which is set as world writable is dangerous because\n the file may be modified or removed by external actors.","id":"java/world-writable-file-read","kind":"problem","name":"Reading from a world writable file","precision":"high","problem.severity":"error","security-severity":"7.8"}},{"id":"java/regex-injection","name":"java/regex-injection","shortDescription":{"text":"Regular expression injection"},"fullDescription":{"text":"User input should not be used in regular expressions without first being escaped, otherwise a malicious user may be able to provide a regex that could require exponential time on certain inputs."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Regular expression injection\nConstructing a regular expression with unsanitized user input is dangerous as a malicious user may be able to modify the meaning of the expression. In particular, such a user may be able to provide a regular expression fragment that takes exponential time in the worst case, and use that to perform a Denial of Service attack.\n\n\n## Recommendation\nBefore embedding user input into a regular expression, use a sanitization function such as `Pattern.quote` to escape meta-characters that have special meaning.\n\n\n## Example\nThe following example shows an HTTP request parameter that is used to construct a regular expression.\n\nIn the first case the user-provided regex is not escaped. If a malicious user provides a regex whose worst-case performance is exponential, then this could lead to a Denial of Service.\n\nIn the second case, the user input is escaped using `Pattern.quote` before being included in the regular expression. This ensures that the user cannot insert characters which have a special meaning in regular expressions.\n\n\n```java\nimport java.util.regex.Pattern;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\n\npublic class RegexInjectionDemo extends HttpServlet {\n\n public boolean badExample(javax.servlet.http.HttpServletRequest request) {\n String regex = request.getParameter(\"regex\");\n String input = request.getParameter(\"input\");\n\n // BAD: Unsanitized user input is used to construct a regular expression\n return input.matches(regex);\n }\n\n public boolean goodExample(javax.servlet.http.HttpServletRequest request) {\n String regex = request.getParameter(\"regex\");\n String input = request.getParameter(\"input\");\n\n // GOOD: User input is sanitized before constructing the regex\n return input.matches(Pattern.quote(regex));\n }\n}\n\n```\n\n## References\n* OWASP: [Regular expression Denial of Service - ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS).\n* Wikipedia: [ReDoS](https://en.wikipedia.org/wiki/ReDoS).\n* Java API Specification: [Pattern.quote](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html#quote(java.lang.String)).\n* Common Weakness Enumeration: [CWE-730](https://cwe.mitre.org/data/definitions/730.html).\n* Common Weakness Enumeration: [CWE-400](https://cwe.mitre.org/data/definitions/400.html).\n","markdown":"# Regular expression injection\nConstructing a regular expression with unsanitized user input is dangerous as a malicious user may be able to modify the meaning of the expression. In particular, such a user may be able to provide a regular expression fragment that takes exponential time in the worst case, and use that to perform a Denial of Service attack.\n\n\n## Recommendation\nBefore embedding user input into a regular expression, use a sanitization function such as `Pattern.quote` to escape meta-characters that have special meaning.\n\n\n## Example\nThe following example shows an HTTP request parameter that is used to construct a regular expression.\n\nIn the first case the user-provided regex is not escaped. If a malicious user provides a regex whose worst-case performance is exponential, then this could lead to a Denial of Service.\n\nIn the second case, the user input is escaped using `Pattern.quote` before being included in the regular expression. This ensures that the user cannot insert characters which have a special meaning in regular expressions.\n\n\n```java\nimport java.util.regex.Pattern;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\n\npublic class RegexInjectionDemo extends HttpServlet {\n\n public boolean badExample(javax.servlet.http.HttpServletRequest request) {\n String regex = request.getParameter(\"regex\");\n String input = request.getParameter(\"input\");\n\n // BAD: Unsanitized user input is used to construct a regular expression\n return input.matches(regex);\n }\n\n public boolean goodExample(javax.servlet.http.HttpServletRequest request) {\n String regex = request.getParameter(\"regex\");\n String input = request.getParameter(\"input\");\n\n // GOOD: User input is sanitized before constructing the regex\n return input.matches(Pattern.quote(regex));\n }\n}\n\n```\n\n## References\n* OWASP: [Regular expression Denial of Service - ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS).\n* Wikipedia: [ReDoS](https://en.wikipedia.org/wiki/ReDoS).\n* Java API Specification: [Pattern.quote](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html#quote(java.lang.String)).\n* Common Weakness Enumeration: [CWE-730](https://cwe.mitre.org/data/definitions/730.html).\n* Common Weakness Enumeration: [CWE-400](https://cwe.mitre.org/data/definitions/400.html).\n"},"properties":{"tags":["security","external/cwe/cwe-730","external/cwe/cwe-400"],"description":"User input should not be used in regular expressions without first being escaped,\n otherwise a malicious user may be able to provide a regex that could require\n exponential time on certain inputs.","id":"java/regex-injection","kind":"path-problem","name":"Regular expression injection","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/redos","name":"java/redos","shortDescription":{"text":"Inefficient regular expression"},"fullDescription":{"text":"A regular expression that requires exponential time to match certain inputs can be a performance bottleneck, and may be vulnerable to denial-of-service attacks."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Inefficient regular expression\nSome regular expressions take a long time to match certain input strings to the point where the time it takes to match a string of length *n* is proportional to *nk* or even *2n*. Such regular expressions can negatively affect performance, or even allow a malicious user to perform a Denial of Service (\"DoS\") attack by crafting an expensive input string for the regular expression to match.\n\nThe regular expression engine provided by Java uses a backtracking non-deterministic finite automata to implement regular expression matching. While this approach is space-efficient and allows supporting advanced features like capture groups, it is not time-efficient in general. The worst-case time complexity of such an automaton can be polynomial or even exponential, meaning that for strings of a certain shape, increasing the input length by ten characters may make the automaton about 1000 times slower.\n\nTypically, a regular expression is affected by this problem if it contains a repetition of the form `r*` or `r+` where the sub-expression `r` is ambiguous in the sense that it can match some string in multiple ways. More information about the precise circumstances can be found in the references.\n\nNote that Java versions 9 and above have some mitigations against ReDoS; however they aren't perfect and more complex regular expressions can still be affected by this problem.\n\n\n## Recommendation\nModify the regular expression to remove the ambiguity, or ensure that the strings matched with the regular expression are short enough that the time-complexity does not matter. Alternatively, an alternate regex library that guarantees linear time execution, such as Google's RE2J, may be used.\n\n\n## Example\nConsider this regular expression:\n\n```java\n\n\t\t\t^_(__|.)+_$\n\t\t\n```\nIts sub-expression `\"(__|.)+?\"` can match the string `\"__\"` either by the first alternative `\"__\"` to the left of the `\"|\"` operator, or by two repetitions of the second alternative `\".\"` to the right. Thus, a string consisting of an odd number of underscores followed by some other character will cause the regular expression engine to run for an exponential amount of time before rejecting the input.\n\nThis problem can be avoided by rewriting the regular expression to remove the ambiguity between the two branches of the alternative inside the repetition:\n\n```java\n\n\t\t\t^_(__|[^_])+_$\n\t\t\n```\n\n## References\n* OWASP: [Regular expression Denial of Service - ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS).\n* Wikipedia: [ReDoS](https://en.wikipedia.org/wiki/ReDoS).\n* Wikipedia: [Time complexity](https://en.wikipedia.org/wiki/Time_complexity).\n* James Kirrage, Asiri Rathnayake, Hayo Thielecke: [Static Analysis for Regular Expression Denial-of-Service Attack](http://www.cs.bham.ac.uk/~hxt/research/reg-exp-sec.pdf).\n* Common Weakness Enumeration: [CWE-1333](https://cwe.mitre.org/data/definitions/1333.html).\n* Common Weakness Enumeration: [CWE-730](https://cwe.mitre.org/data/definitions/730.html).\n* Common Weakness Enumeration: [CWE-400](https://cwe.mitre.org/data/definitions/400.html).\n","markdown":"# Inefficient regular expression\nSome regular expressions take a long time to match certain input strings to the point where the time it takes to match a string of length *n* is proportional to *nk* or even *2n*. Such regular expressions can negatively affect performance, or even allow a malicious user to perform a Denial of Service (\"DoS\") attack by crafting an expensive input string for the regular expression to match.\n\nThe regular expression engine provided by Java uses a backtracking non-deterministic finite automata to implement regular expression matching. While this approach is space-efficient and allows supporting advanced features like capture groups, it is not time-efficient in general. The worst-case time complexity of such an automaton can be polynomial or even exponential, meaning that for strings of a certain shape, increasing the input length by ten characters may make the automaton about 1000 times slower.\n\nTypically, a regular expression is affected by this problem if it contains a repetition of the form `r*` or `r+` where the sub-expression `r` is ambiguous in the sense that it can match some string in multiple ways. More information about the precise circumstances can be found in the references.\n\nNote that Java versions 9 and above have some mitigations against ReDoS; however they aren't perfect and more complex regular expressions can still be affected by this problem.\n\n\n## Recommendation\nModify the regular expression to remove the ambiguity, or ensure that the strings matched with the regular expression are short enough that the time-complexity does not matter. Alternatively, an alternate regex library that guarantees linear time execution, such as Google's RE2J, may be used.\n\n\n## Example\nConsider this regular expression:\n\n```java\n\n\t\t\t^_(__|.)+_$\n\t\t\n```\nIts sub-expression `\"(__|.)+?\"` can match the string `\"__\"` either by the first alternative `\"__\"` to the left of the `\"|\"` operator, or by two repetitions of the second alternative `\".\"` to the right. Thus, a string consisting of an odd number of underscores followed by some other character will cause the regular expression engine to run for an exponential amount of time before rejecting the input.\n\nThis problem can be avoided by rewriting the regular expression to remove the ambiguity between the two branches of the alternative inside the repetition:\n\n```java\n\n\t\t\t^_(__|[^_])+_$\n\t\t\n```\n\n## References\n* OWASP: [Regular expression Denial of Service - ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS).\n* Wikipedia: [ReDoS](https://en.wikipedia.org/wiki/ReDoS).\n* Wikipedia: [Time complexity](https://en.wikipedia.org/wiki/Time_complexity).\n* James Kirrage, Asiri Rathnayake, Hayo Thielecke: [Static Analysis for Regular Expression Denial-of-Service Attack](http://www.cs.bham.ac.uk/~hxt/research/reg-exp-sec.pdf).\n* Common Weakness Enumeration: [CWE-1333](https://cwe.mitre.org/data/definitions/1333.html).\n* Common Weakness Enumeration: [CWE-730](https://cwe.mitre.org/data/definitions/730.html).\n* Common Weakness Enumeration: [CWE-400](https://cwe.mitre.org/data/definitions/400.html).\n"},"properties":{"tags":["security","external/cwe/cwe-1333","external/cwe/cwe-730","external/cwe/cwe-400"],"description":"A regular expression that requires exponential time to match certain inputs\n can be a performance bottleneck, and may be vulnerable to denial-of-service\n attacks.","id":"java/redos","kind":"problem","name":"Inefficient regular expression","precision":"high","problem.severity":"error","security-severity":"7.5"}},{"id":"java/polynomial-redos","name":"java/polynomial-redos","shortDescription":{"text":"Polynomial regular expression used on uncontrolled data"},"fullDescription":{"text":"A regular expression that can require polynomial time to match may be vulnerable to denial-of-service attacks."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Polynomial regular expression used on uncontrolled data\nSome regular expressions take a long time to match certain input strings to the point where the time it takes to match a string of length *n* is proportional to *nk* or even *2n*. Such regular expressions can negatively affect performance, or even allow a malicious user to perform a Denial of Service (\"DoS\") attack by crafting an expensive input string for the regular expression to match.\n\nThe regular expression engine provided by Java uses a backtracking non-deterministic finite automata to implement regular expression matching. While this approach is space-efficient and allows supporting advanced features like capture groups, it is not time-efficient in general. The worst-case time complexity of such an automaton can be polynomial or even exponential, meaning that for strings of a certain shape, increasing the input length by ten characters may make the automaton about 1000 times slower.\n\nTypically, a regular expression is affected by this problem if it contains a repetition of the form `r*` or `r+` where the sub-expression `r` is ambiguous in the sense that it can match some string in multiple ways. More information about the precise circumstances can be found in the references.\n\nNote that Java versions 9 and above have some mitigations against ReDoS; however they aren't perfect and more complex regular expressions can still be affected by this problem.\n\n\n## Recommendation\nModify the regular expression to remove the ambiguity, or ensure that the strings matched with the regular expression are short enough that the time-complexity does not matter. Alternatively, an alternate regex library that guarantees linear time execution, such as Google's RE2J, may be used.\n\n\n## Example\nConsider this use of a regular expression, which removes all leading and trailing whitespace in a string:\n\n```java\n\n\t\t\tPattern.compile(\"^\\\\s+|\\\\s+$\").matcher(text).replaceAll(\"\") // BAD\n\t\t\n```\nThe sub-expression `\"\\\\s+$\"` will match the whitespace characters in `text` from left to right, but it can start matching anywhere within a whitespace sequence. This is problematic for strings that do **not** end with a whitespace character. Such a string will force the regular expression engine to process each whitespace sequence once per whitespace character in the sequence.\n\nThis ultimately means that the time cost of trimming a string is quadratic in the length of the string. So a string like `\"a b\"` will take milliseconds to process, but a similar string with a million spaces instead of just one will take several minutes.\n\nAvoid this problem by rewriting the regular expression to not contain the ambiguity about when to start matching whitespace sequences. For instance, by using a negative look-behind (`\"^\\\\s+|(?k* or even *2n*. Such regular expressions can negatively affect performance, or even allow a malicious user to perform a Denial of Service (\"DoS\") attack by crafting an expensive input string for the regular expression to match.\n\nThe regular expression engine provided by Java uses a backtracking non-deterministic finite automata to implement regular expression matching. While this approach is space-efficient and allows supporting advanced features like capture groups, it is not time-efficient in general. The worst-case time complexity of such an automaton can be polynomial or even exponential, meaning that for strings of a certain shape, increasing the input length by ten characters may make the automaton about 1000 times slower.\n\nTypically, a regular expression is affected by this problem if it contains a repetition of the form `r*` or `r+` where the sub-expression `r` is ambiguous in the sense that it can match some string in multiple ways. More information about the precise circumstances can be found in the references.\n\nNote that Java versions 9 and above have some mitigations against ReDoS; however they aren't perfect and more complex regular expressions can still be affected by this problem.\n\n\n## Recommendation\nModify the regular expression to remove the ambiguity, or ensure that the strings matched with the regular expression are short enough that the time-complexity does not matter. Alternatively, an alternate regex library that guarantees linear time execution, such as Google's RE2J, may be used.\n\n\n## Example\nConsider this use of a regular expression, which removes all leading and trailing whitespace in a string:\n\n```java\n\n\t\t\tPattern.compile(\"^\\\\s+|\\\\s+$\").matcher(text).replaceAll(\"\") // BAD\n\t\t\n```\nThe sub-expression `\"\\\\s+$\"` will match the whitespace characters in `text` from left to right, but it can start matching anywhere within a whitespace sequence. This is problematic for strings that do **not** end with a whitespace character. Such a string will force the regular expression engine to process each whitespace sequence once per whitespace character in the sequence.\n\nThis ultimately means that the time cost of trimming a string is quadratic in the length of the string. So a string like `\"a b\"` will take milliseconds to process, but a similar string with a million spaces instead of just one will take several minutes.\n\nAvoid this problem by rewriting the regular expression to not contain the ambiguity about when to start matching whitespace sequences. For instance, by using a negative look-behind (`\"^\\\\s+|(?\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Security Testing\n An example of insecure download and upload of dependencies\n\n \n \n insecure-releases\n Insecure Repository Releases\n \n http://insecure-repository.example\n \n \n insecure-snapshots\n Insecure Repository Snapshots\n \n http://insecure-repository.example\n \n \n \n \n insecure\n Insecure Repository\n \n http://insecure-repository.example\n \n \n \n \n insecure-plugins\n Insecure Repository Releases\n \n http://insecure-repository.example\n \n \n\n\n```\n\n```xml\n\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Security Testing\n An example of secure download and upload of dependencies\n\n \n \n insecure-releases\n Secure Repository Releases\n \n https://insecure-repository.example\n \n \n insecure-snapshots\n Secure Repository Snapshots\n \n https://insecure-repository.example\n \n \n \n \n insecure\n Secure Repository\n \n https://insecure-repository.example\n \n \n \n \n insecure-plugins\n Secure Repository Releases\n \n https://insecure-repository.example\n \n \n\n\n```\n\n## References\n* Research: [ Want to take over the Java ecosystem? All you need is a MITM! ](https://medium.com/bugbountywriteup/want-to-take-over-the-java-ecosystem-all-you-need-is-a-mitm-1fc329d898fb?source=friends_link&sk=3c99970c55a899ad9ef41f126efcde0e)\n* Research: [ How to take over the computer of any Java (or Closure or Scala) Developer. ](https://max.computer/blog/how-to-take-over-the-computer-of-any-java-or-clojure-or-scala-developer/)\n* Proof of Concept: [ mveytsman/dilettante ](https://github.com/mveytsman/dilettante)\n* Additional Gradle & Maven plugin: [ Announcing nohttp ](https://spring.io/blog/2019/06/10/announcing-nohttp)\n* Java Ecosystem Announcement: [ HTTP Decommission Artifact Server Announcements ](https://gist.github.com/JLLeitschuh/789e49e3d34092a005031a0a1880af99)\n* Common Weakness Enumeration: [CWE-300](https://cwe.mitre.org/data/definitions/300.html).\n* Common Weakness Enumeration: [CWE-319](https://cwe.mitre.org/data/definitions/319.html).\n* Common Weakness Enumeration: [CWE-494](https://cwe.mitre.org/data/definitions/494.html).\n* Common Weakness Enumeration: [CWE-829](https://cwe.mitre.org/data/definitions/829.html).\n","markdown":"# Failure to use HTTPS or SFTP URL in Maven artifact upload/download\nUsing an insecure protocol like HTTP or FTP to download your dependencies leaves your Maven build vulnerable to a [Man in the Middle (MITM)](https://en.wikipedia.org/wiki/Man-in-the-middle_attack). This can allow attackers to inject malicious code into the artifacts that you are resolving and infect build artifacts that are being produced. This can be used by attackers to perform a [Supply chain attack](https://en.wikipedia.org/wiki/Supply_chain_attack) against your project's users.\n\nThis vulnerability has a [ CVSS v3.1 base score of 8.1/10 ](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H&version=3.1).\n\n\n## Recommendation\nAlways use HTTPS or SFTP to download artifacts from artifact servers.\n\n\n## Example\nThese examples show examples of locations in Maven POM files where artifact repository upload/download is configured. The first shows the use of HTTP, the second shows the use of HTTPS.\n\n\n```xml\n\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Security Testing\n An example of insecure download and upload of dependencies\n\n \n \n insecure-releases\n Insecure Repository Releases\n \n http://insecure-repository.example\n \n \n insecure-snapshots\n Insecure Repository Snapshots\n \n http://insecure-repository.example\n \n \n \n \n insecure\n Insecure Repository\n \n http://insecure-repository.example\n \n \n \n \n insecure-plugins\n Insecure Repository Releases\n \n http://insecure-repository.example\n \n \n\n\n```\n\n```xml\n\n\n\n 4.0.0\n\n com.semmle\n parent\n 1.0\n pom\n\n Security Testing\n An example of secure download and upload of dependencies\n\n \n \n insecure-releases\n Secure Repository Releases\n \n https://insecure-repository.example\n \n \n insecure-snapshots\n Secure Repository Snapshots\n \n https://insecure-repository.example\n \n \n \n \n insecure\n Secure Repository\n \n https://insecure-repository.example\n \n \n \n \n insecure-plugins\n Secure Repository Releases\n \n https://insecure-repository.example\n \n \n\n\n```\n\n## References\n* Research: [ Want to take over the Java ecosystem? All you need is a MITM! ](https://medium.com/bugbountywriteup/want-to-take-over-the-java-ecosystem-all-you-need-is-a-mitm-1fc329d898fb?source=friends_link&sk=3c99970c55a899ad9ef41f126efcde0e)\n* Research: [ How to take over the computer of any Java (or Closure or Scala) Developer. ](https://max.computer/blog/how-to-take-over-the-computer-of-any-java-or-clojure-or-scala-developer/)\n* Proof of Concept: [ mveytsman/dilettante ](https://github.com/mveytsman/dilettante)\n* Additional Gradle & Maven plugin: [ Announcing nohttp ](https://spring.io/blog/2019/06/10/announcing-nohttp)\n* Java Ecosystem Announcement: [ HTTP Decommission Artifact Server Announcements ](https://gist.github.com/JLLeitschuh/789e49e3d34092a005031a0a1880af99)\n* Common Weakness Enumeration: [CWE-300](https://cwe.mitre.org/data/definitions/300.html).\n* Common Weakness Enumeration: [CWE-319](https://cwe.mitre.org/data/definitions/319.html).\n* Common Weakness Enumeration: [CWE-494](https://cwe.mitre.org/data/definitions/494.html).\n* Common Weakness Enumeration: [CWE-829](https://cwe.mitre.org/data/definitions/829.html).\n"},"properties":{"tags":["security","external/cwe/cwe-300","external/cwe/cwe-319","external/cwe/cwe-494","external/cwe/cwe-829","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Non-HTTPS connections can be intercepted by third parties.","id":"java/maven/non-https-url","kind":"problem","name":"Failure to use HTTPS or SFTP URL in Maven artifact upload/download","precision":"very-high","problem.severity":"error","security-severity":"8.1"}},{"id":"java/sql-injection","name":"java/sql-injection","shortDescription":{"text":"Query built from user-controlled sources"},"fullDescription":{"text":"Building a SQL or Java Persistence query from user-controlled sources is vulnerable to insertion of malicious code by the user."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Query built from user-controlled sources\nIf a database query is built using string concatenation, and the components of the concatenation include user input, a user is likely to be able to run malicious database queries. This applies to various database query languages, including SQL and the Java Persistence Query Language.\n\n\n## Recommendation\nUsually, it is better to use a SQL prepared statement than to build a complete SQL query with string concatenation. A prepared statement can include a wildcard, written as a question mark (?), for each part of the SQL query that is expected to be filled in by a different value each time it is run. When the query is later executed, a value must be supplied for each wildcard in the query.\n\nIn the Java Persistence Query Language, it is better to use queries with parameters than to build a complete query with string concatenation. A Java Persistence query can include a parameter placeholder for each part of the query that is expected to be filled in by a different value when run. A parameter placeholder may be indicated by a colon (:) followed by a parameter name, or by a question mark (?) followed by an integer position. When the query is later executed, a value must be supplied for each parameter in the query, using the `setParameter` method. Specifying the query using the `@NamedQuery` annotation introduces an additional level of safety: the query must be a constant string literal, preventing construction by string concatenation, and the only way to fill in values for parts of the query is by setting positional parameters.\n\nIt is good practice to use prepared statements (in SQL) or query parameters (in the Java Persistence Query Language) for supplying parameter values to a query, whether or not any of the parameters are directly traceable to user input. Doing so avoids any need to worry about quoting and escaping.\n\n\n## Example\nIn the following example, the code runs a simple SQL query in two different ways.\n\nThe first way involves building a query, `query1`, by concatenating an environment variable with some string literals. The environment variable can include special characters, so this code allows for SQL injection attacks.\n\nThe second way, which shows good practice, involves building a query, `query2`, with a single string literal that includes a wildcard (`?`). The wildcard is then given a value by calling `setString`. This version is immune to injection attacks, because any special characters in the environment variable are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have SQL special characters in it\n String category = System.getenv(\"ITEM_CATEGORY\");\n Statement statement = connection.createStatement();\n String query1 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='\"\n + category + \"' ORDER BY PRICE\";\n ResultSet results = statement.executeQuery(query1);\n}\n\n{\n // GOOD: use a prepared query\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query2 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=? ORDER BY PRICE\";\n PreparedStatement statement = connection.prepareStatement(query2);\n statement.setString(1, category);\n ResultSet results = statement.executeQuery();\n}\n```\n\n## Example\nThe following code shows several different ways to run a Java Persistence query.\n\nThe first example involves building a query, `query1`, by concatenating an environment variable with some string literals. Just like the SQL example, the environment variable can include special characters, so this code allows for Java Persistence query injection attacks.\n\nThe remaining examples demonstrate different methods for safely building a Java Persistence query with user-supplied values:\n\n1. `query2` uses a single string literal that includes a placeholder for a parameter, indicated by a colon (`:`) and parameter name (`category`).\n1. `query3` uses a single string literal that includes a placeholder for a parameter, indicated by a question mark (`?`) and position number (`1`).\n1. `namedQuery1` is defined using the `@NamedQuery` annotation, whose `query` attribute is a string literal that includes a placeholder for a parameter, indicated by a colon (`:`) and parameter name (`category`).\n1. `namedQuery2` is defined using the `@NamedQuery` annotation, whose `query` attribute includes a placeholder for a parameter, indicated by a question mark (`?`) and position number (`1`).\nThe parameter is then given a value by calling `setParameter`. These versions are immune to injection attacks, because any special characters in the environment variable or user-supplied value are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have Java Persistence Query Language special characters in it\n String category = System.getenv(\"ITEM_CATEGORY\");\n Statement statement = connection.createStatement();\n String query1 = \"SELECT p FROM Product p WHERE p.category LIKE '\"\n + category + \"' ORDER BY p.price\";\n Query q = entityManager.createQuery(query1);\n}\n\n{\n // GOOD: use a named parameter and set its value\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query2 = \"SELECT p FROM Product p WHERE p.category LIKE :category ORDER BY p.price\"\n Query q = entityManager.createQuery(query2);\n q.setParameter(\"category\", category);\n}\n\n{\n // GOOD: use a positional parameter and set its value\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query3 = \"SELECT p FROM Product p WHERE p.category LIKE ?1 ORDER BY p.price\"\n Query q = entityManager.createQuery(query3);\n q.setParameter(1, category);\n}\n\n{\n // GOOD: use a named query with a named parameter and set its value\n @NamedQuery(\n name=\"lookupByCategory\",\n query=\"SELECT p FROM Product p WHERE p.category LIKE :category ORDER BY p.price\")\n private static class NQ {}\n ...\n String category = System.getenv(\"ITEM_CATEGORY\");\n Query namedQuery1 = entityManager.createNamedQuery(\"lookupByCategory\");\n namedQuery1.setParameter(\"category\", category);\n}\n\n{\n // GOOD: use a named query with a positional parameter and set its value\n @NamedQuery(\n name=\"lookupByCategory\",\n query=\"SELECT p FROM Product p WHERE p.category LIKE ?1 ORDER BY p.price\")\n private static class NQ {}\n ...\n String category = System.getenv(\"ITEM_CATEGORY\");\n Query namedQuery2 = entityManager.createNamedQuery(\"lookupByCategory\");\n namedQuery2.setParameter(1, category);\n}\n```\n\n## References\n* OWASP: [SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html).\n* SEI CERT Oracle Coding Standard for Java: [IDS00-J. Prevent SQL injection](https://wiki.sei.cmu.edu/confluence/display/java/IDS00-J.+Prevent+SQL+injection).\n* The Java Tutorials: [Using Prepared Statements](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html).\n* The Java EE Tutorial: [The Java Persistence Query Language](https://docs.oracle.com/javaee/7/tutorial/persistence-querylanguage.htm).\n* Common Weakness Enumeration: [CWE-89](https://cwe.mitre.org/data/definitions/89.html).\n* Common Weakness Enumeration: [CWE-564](https://cwe.mitre.org/data/definitions/564.html).\n","markdown":"# Query built from user-controlled sources\nIf a database query is built using string concatenation, and the components of the concatenation include user input, a user is likely to be able to run malicious database queries. This applies to various database query languages, including SQL and the Java Persistence Query Language.\n\n\n## Recommendation\nUsually, it is better to use a SQL prepared statement than to build a complete SQL query with string concatenation. A prepared statement can include a wildcard, written as a question mark (?), for each part of the SQL query that is expected to be filled in by a different value each time it is run. When the query is later executed, a value must be supplied for each wildcard in the query.\n\nIn the Java Persistence Query Language, it is better to use queries with parameters than to build a complete query with string concatenation. A Java Persistence query can include a parameter placeholder for each part of the query that is expected to be filled in by a different value when run. A parameter placeholder may be indicated by a colon (:) followed by a parameter name, or by a question mark (?) followed by an integer position. When the query is later executed, a value must be supplied for each parameter in the query, using the `setParameter` method. Specifying the query using the `@NamedQuery` annotation introduces an additional level of safety: the query must be a constant string literal, preventing construction by string concatenation, and the only way to fill in values for parts of the query is by setting positional parameters.\n\nIt is good practice to use prepared statements (in SQL) or query parameters (in the Java Persistence Query Language) for supplying parameter values to a query, whether or not any of the parameters are directly traceable to user input. Doing so avoids any need to worry about quoting and escaping.\n\n\n## Example\nIn the following example, the code runs a simple SQL query in two different ways.\n\nThe first way involves building a query, `query1`, by concatenating an environment variable with some string literals. The environment variable can include special characters, so this code allows for SQL injection attacks.\n\nThe second way, which shows good practice, involves building a query, `query2`, with a single string literal that includes a wildcard (`?`). The wildcard is then given a value by calling `setString`. This version is immune to injection attacks, because any special characters in the environment variable are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have SQL special characters in it\n String category = System.getenv(\"ITEM_CATEGORY\");\n Statement statement = connection.createStatement();\n String query1 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='\"\n + category + \"' ORDER BY PRICE\";\n ResultSet results = statement.executeQuery(query1);\n}\n\n{\n // GOOD: use a prepared query\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query2 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=? ORDER BY PRICE\";\n PreparedStatement statement = connection.prepareStatement(query2);\n statement.setString(1, category);\n ResultSet results = statement.executeQuery();\n}\n```\n\n## Example\nThe following code shows several different ways to run a Java Persistence query.\n\nThe first example involves building a query, `query1`, by concatenating an environment variable with some string literals. Just like the SQL example, the environment variable can include special characters, so this code allows for Java Persistence query injection attacks.\n\nThe remaining examples demonstrate different methods for safely building a Java Persistence query with user-supplied values:\n\n1. `query2` uses a single string literal that includes a placeholder for a parameter, indicated by a colon (`:`) and parameter name (`category`).\n1. `query3` uses a single string literal that includes a placeholder for a parameter, indicated by a question mark (`?`) and position number (`1`).\n1. `namedQuery1` is defined using the `@NamedQuery` annotation, whose `query` attribute is a string literal that includes a placeholder for a parameter, indicated by a colon (`:`) and parameter name (`category`).\n1. `namedQuery2` is defined using the `@NamedQuery` annotation, whose `query` attribute includes a placeholder for a parameter, indicated by a question mark (`?`) and position number (`1`).\nThe parameter is then given a value by calling `setParameter`. These versions are immune to injection attacks, because any special characters in the environment variable or user-supplied value are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have Java Persistence Query Language special characters in it\n String category = System.getenv(\"ITEM_CATEGORY\");\n Statement statement = connection.createStatement();\n String query1 = \"SELECT p FROM Product p WHERE p.category LIKE '\"\n + category + \"' ORDER BY p.price\";\n Query q = entityManager.createQuery(query1);\n}\n\n{\n // GOOD: use a named parameter and set its value\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query2 = \"SELECT p FROM Product p WHERE p.category LIKE :category ORDER BY p.price\"\n Query q = entityManager.createQuery(query2);\n q.setParameter(\"category\", category);\n}\n\n{\n // GOOD: use a positional parameter and set its value\n String category = System.getenv(\"ITEM_CATEGORY\");\n String query3 = \"SELECT p FROM Product p WHERE p.category LIKE ?1 ORDER BY p.price\"\n Query q = entityManager.createQuery(query3);\n q.setParameter(1, category);\n}\n\n{\n // GOOD: use a named query with a named parameter and set its value\n @NamedQuery(\n name=\"lookupByCategory\",\n query=\"SELECT p FROM Product p WHERE p.category LIKE :category ORDER BY p.price\")\n private static class NQ {}\n ...\n String category = System.getenv(\"ITEM_CATEGORY\");\n Query namedQuery1 = entityManager.createNamedQuery(\"lookupByCategory\");\n namedQuery1.setParameter(\"category\", category);\n}\n\n{\n // GOOD: use a named query with a positional parameter and set its value\n @NamedQuery(\n name=\"lookupByCategory\",\n query=\"SELECT p FROM Product p WHERE p.category LIKE ?1 ORDER BY p.price\")\n private static class NQ {}\n ...\n String category = System.getenv(\"ITEM_CATEGORY\");\n Query namedQuery2 = entityManager.createNamedQuery(\"lookupByCategory\");\n namedQuery2.setParameter(1, category);\n}\n```\n\n## References\n* OWASP: [SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html).\n* SEI CERT Oracle Coding Standard for Java: [IDS00-J. Prevent SQL injection](https://wiki.sei.cmu.edu/confluence/display/java/IDS00-J.+Prevent+SQL+injection).\n* The Java Tutorials: [Using Prepared Statements](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html).\n* The Java EE Tutorial: [The Java Persistence Query Language](https://docs.oracle.com/javaee/7/tutorial/persistence-querylanguage.htm).\n* Common Weakness Enumeration: [CWE-89](https://cwe.mitre.org/data/definitions/89.html).\n* Common Weakness Enumeration: [CWE-564](https://cwe.mitre.org/data/definitions/564.html).\n"},"properties":{"tags":["security","external/cwe/cwe-089","external/cwe/cwe-564","owasp-top10-2021","A03:2021 - Injection"],"description":"Building a SQL or Java Persistence query from user-controlled sources is vulnerable to insertion of\n malicious code by the user.","id":"java/sql-injection","kind":"path-problem","name":"Query built from user-controlled sources","precision":"high","problem.severity":"error","security-severity":"8.8"}},{"id":"java/android/implicitly-exported-component","name":"java/android/implicitly-exported-component","shortDescription":{"text":"Implicitly exported Android component"},"fullDescription":{"text":"Android components with an '' and no 'android:exported' attribute are implicitly exported, which can allow for improper access to the components themselves and to their data."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Implicitly exported Android component\nThe Android manifest file defines configuration settings for Android applications. In this file, components can be declared with intent filters which specify what the components can do and what types of intents the components can respond to. If the `android:exported` attribute is omitted from the component when an intent filter is included, then the component will be implicitly exported.\n\nAn implicitly exported component could allow for improper access to the component and its data.\n\n\n## Recommendation\nExplicitly set the `android:exported` attribute for every component or use permissions to limit access to the component.\n\n\n## Example\nIn the example below, the `android:exported` attribute is omitted when an intent filter is used.\n\n\n```xml\n\n \n \n android:name=\".Activity\">\n \n \n \n \n \n\n\n```\nA corrected version sets the `android:exported` attribute to `false`.\n\n\n```xml\n\n \n \n android:name=\".Activity\">\n android:exported=\"false\"\n \n \n \n \n \n\n\n```\n\n## References\n* Android Developers: [App Manifest Overview](https://developer.android.com/guide/topics/manifest/manifest-intro).\n* Android Developers: [The <intent-filter> element](https://developer.android.com/guide/topics/manifest/intent-filter-element).\n* Android Developers: [The android:exported attribute](https://developer.android.com/guide/topics/manifest/activity-element#exported).\n* Android Developers: [The android:permission attribute](https://developer.android.com/guide/topics/manifest/activity-element#prmsn).\n* Android Developers: [Safer component exporting](https://developer.android.com/about/versions/12/behavior-changes-12#exported).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n","markdown":"# Implicitly exported Android component\nThe Android manifest file defines configuration settings for Android applications. In this file, components can be declared with intent filters which specify what the components can do and what types of intents the components can respond to. If the `android:exported` attribute is omitted from the component when an intent filter is included, then the component will be implicitly exported.\n\nAn implicitly exported component could allow for improper access to the component and its data.\n\n\n## Recommendation\nExplicitly set the `android:exported` attribute for every component or use permissions to limit access to the component.\n\n\n## Example\nIn the example below, the `android:exported` attribute is omitted when an intent filter is used.\n\n\n```xml\n\n \n \n android:name=\".Activity\">\n \n \n \n \n \n\n\n```\nA corrected version sets the `android:exported` attribute to `false`.\n\n\n```xml\n\n \n \n android:name=\".Activity\">\n android:exported=\"false\"\n \n \n \n \n \n\n\n```\n\n## References\n* Android Developers: [App Manifest Overview](https://developer.android.com/guide/topics/manifest/manifest-intro).\n* Android Developers: [The <intent-filter> element](https://developer.android.com/guide/topics/manifest/intent-filter-element).\n* Android Developers: [The android:exported attribute](https://developer.android.com/guide/topics/manifest/activity-element#exported).\n* Android Developers: [The android:permission attribute](https://developer.android.com/guide/topics/manifest/activity-element#prmsn).\n* Android Developers: [Safer component exporting](https://developer.android.com/about/versions/12/behavior-changes-12#exported).\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n"},"properties":{"tags":["security","external/cwe/cwe-926"],"description":"Android components with an '' and no 'android:exported' attribute are implicitly exported, which can allow for improper access to the components themselves and to their data.","id":"java/android/implicitly-exported-component","kind":"problem","name":"Implicitly exported Android component","precision":"high","problem.severity":"warning","security-severity":"8.2"}},{"id":"java/ssrf","name":"java/ssrf","shortDescription":{"text":"Server-side request forgery"},"fullDescription":{"text":"Making web requests based on unvalidated user-input may cause the server to communicate with malicious servers."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Server-side request forgery\nDirectly incorporating user input into an HTTP request without validating the input can facilitate server-side request forgery (SSRF) attacks. In these attacks, the server may be tricked into making a request and interacting with an attacker-controlled server.\n\n\n## Recommendation\nTo guard against SSRF attacks, you should avoid putting user-provided input directly into a request URL. Instead, maintain a list of authorized URLs on the server; then choose from that list based on the input provided. Alternatively, ensure requests constructed from user input are limited to a particular host or more restrictive URL prefix.\n\n\n## Example\nThe following example shows an HTTP request parameter being used directly to form a new request without validating the input, which facilitates SSRF attacks. It also shows how to remedy the problem by validating the user input against a known fixed string.\n\n\n```java\nimport java.net.http.HttpClient;\n\npublic class SSRF extends HttpServlet {\n\tprivate static final String VALID_URI = \"http://lgtm.com\";\n\tprivate HttpClient client = HttpClient.newHttpClient();\n\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\t\tthrows ServletException, IOException {\n\t\tURI uri = new URI(request.getParameter(\"uri\"));\n\t\t// BAD: a request parameter is incorporated without validation into a Http request\n\t\tHttpRequest r = HttpRequest.newBuilder(uri).build();\n\t\tclient.send(r, null);\n\n\t\t// GOOD: the request parameter is validated against a known fixed string\n\t\tif (VALID_URI.equals(request.getParameter(\"uri\"))) {\n\t\t\tHttpRequest r2 = HttpRequest.newBuilder(uri).build();\n\t\t\tclient.send(r2, null);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* [OWASP SSRF](https://owasp.org/www-community/attacks/Server_Side_Request_Forgery)\n* Common Weakness Enumeration: [CWE-918](https://cwe.mitre.org/data/definitions/918.html).\n","markdown":"# Server-side request forgery\nDirectly incorporating user input into an HTTP request without validating the input can facilitate server-side request forgery (SSRF) attacks. In these attacks, the server may be tricked into making a request and interacting with an attacker-controlled server.\n\n\n## Recommendation\nTo guard against SSRF attacks, you should avoid putting user-provided input directly into a request URL. Instead, maintain a list of authorized URLs on the server; then choose from that list based on the input provided. Alternatively, ensure requests constructed from user input are limited to a particular host or more restrictive URL prefix.\n\n\n## Example\nThe following example shows an HTTP request parameter being used directly to form a new request without validating the input, which facilitates SSRF attacks. It also shows how to remedy the problem by validating the user input against a known fixed string.\n\n\n```java\nimport java.net.http.HttpClient;\n\npublic class SSRF extends HttpServlet {\n\tprivate static final String VALID_URI = \"http://lgtm.com\";\n\tprivate HttpClient client = HttpClient.newHttpClient();\n\n\tprotected void doGet(HttpServletRequest request, HttpServletResponse response)\n\t\tthrows ServletException, IOException {\n\t\tURI uri = new URI(request.getParameter(\"uri\"));\n\t\t// BAD: a request parameter is incorporated without validation into a Http request\n\t\tHttpRequest r = HttpRequest.newBuilder(uri).build();\n\t\tclient.send(r, null);\n\n\t\t// GOOD: the request parameter is validated against a known fixed string\n\t\tif (VALID_URI.equals(request.getParameter(\"uri\"))) {\n\t\t\tHttpRequest r2 = HttpRequest.newBuilder(uri).build();\n\t\t\tclient.send(r2, null);\n\t\t}\n\t}\n}\n\n```\n\n## References\n* [OWASP SSRF](https://owasp.org/www-community/attacks/Server_Side_Request_Forgery)\n* Common Weakness Enumeration: [CWE-918](https://cwe.mitre.org/data/definitions/918.html).\n"},"properties":{"tags":["security","external/cwe/cwe-918","owasp-top10-2021","A10:2021 - Server-Side Request Forgery (SSRF)"],"description":"Making web requests based on unvalidated user-input\n may cause the server to communicate with malicious servers.","id":"java/ssrf","kind":"path-problem","name":"Server-side request forgery","precision":"high","problem.severity":"error","security-severity":"9.1"}},{"id":"java/insecure-bean-validation","name":"java/insecure-bean-validation","shortDescription":{"text":"Insecure Bean Validation"},"fullDescription":{"text":"User-controlled data may be evaluated as a Java EL expression, leading to arbitrary code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Insecure Bean Validation\nCustom error messages for constraint validators support different types of interpolation, including [Java EL expressions](https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/chapter-message-interpolation.html#section-interpolation-with-message-expressions). Controlling part of the message template being passed to `ConstraintValidatorContext.buildConstraintViolationWithTemplate()` argument can lead to arbitrary Java code execution. Unfortunately, it is common that validated (and therefore, normally untrusted) bean properties flow into the custom error message.\n\n\n## Recommendation\nThere are different approaches to remediate the issue:\n\n* Do not include validated bean properties in the custom error message.\n* Use parameterized messages instead of string concatenation. For example:\n```\nHibernateConstraintValidatorContext context =\n constraintValidatorContext.unwrap(HibernateConstraintValidatorContext.class);\ncontext.addMessageParameter(\"foo\", \"bar\");\ncontext.buildConstraintViolationWithTemplate(\"My violation message contains a parameter {foo}\")\n .addConstraintViolation();\n```\n* Sanitize the validated bean properties to make sure that there are no EL expressions. An example of valid sanitization logic can be found [here](https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/messageinterpolation/util/InterpolationHelper.java#L17).\n* Disable the EL interpolation and only use `ParameterMessageInterpolator`:\n```\nValidator validator = Validation.byDefaultProvider()\n .configure()\n .messageInterpolator(new ParameterMessageInterpolator())\n .buildValidatorFactory()\n .getValidator();\n```\n* Replace Hibernate Validator with Apache BVal, which in its latest version does not interpolate EL expressions by default. Note that this replacement may not be a simple drop-in replacement.\n\n## Example\nThe following validator could result in arbitrary Java code execution:\n\n\n```java\nimport javax.validation.ConstraintValidator;\nimport javax.validation.ConstraintValidatorContext;\nimport org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class TestValidator implements ConstraintValidator {\n\n public static class InterpolationHelper {\n\n public static final char BEGIN_TERM = '{';\n public static final char END_TERM = '}';\n public static final char EL_DESIGNATOR = '$';\n public static final char ESCAPE_CHARACTER = '\\\\';\n\n private static final Pattern ESCAPE_MESSAGE_PARAMETER_PATTERN = Pattern.compile( \"([\\\\\" + ESCAPE_CHARACTER + BEGIN_TERM + END_TERM + EL_DESIGNATOR + \"])\" );\n\n private InterpolationHelper() {\n }\n\n public static String escapeMessageParameter(String messageParameter) {\n if ( messageParameter == null ) {\n return null;\n }\n return ESCAPE_MESSAGE_PARAMETER_PATTERN.matcher( messageParameter ).replaceAll( Matcher.quoteReplacement( String.valueOf( ESCAPE_CHARACTER ) ) + \"$1\" );\n }\n\n }\n\n @Override\n public boolean isValid(String object, ConstraintValidatorContext constraintContext) {\n String value = object + \" is invalid\";\n\n // Bad: Bean properties (normally user-controlled) are passed directly to `buildConstraintViolationWithTemplate`\n constraintContext.buildConstraintViolationWithTemplate(value).addConstraintViolation().disableDefaultConstraintViolation();\n\n // Good: Bean properties (normally user-controlled) are escaped \n String escaped = InterpolationHelper.escapeMessageParameter(value);\n constraintContext.buildConstraintViolationWithTemplate(escaped).addConstraintViolation().disableDefaultConstraintViolation();\n\n // Good: Bean properties (normally user-controlled) are parameterized\n HibernateConstraintValidatorContext context = constraintContext.unwrap( HibernateConstraintValidatorContext.class );\n context.addMessageParameter( \"prop\", object );\n context.buildConstraintViolationWithTemplate( \"{prop} is invalid\").addConstraintViolation();\n return false;\n }\n\n}\n\n```\n\n## References\n* Hibernate Reference Guide: [ConstraintValidatorContext](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#_the_code_constraintvalidatorcontext_code).\n* GitHub Security Lab research: [Bean validation](https://securitylab.github.com/research/bean-validation-RCE).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Insecure Bean Validation\nCustom error messages for constraint validators support different types of interpolation, including [Java EL expressions](https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/chapter-message-interpolation.html#section-interpolation-with-message-expressions). Controlling part of the message template being passed to `ConstraintValidatorContext.buildConstraintViolationWithTemplate()` argument can lead to arbitrary Java code execution. Unfortunately, it is common that validated (and therefore, normally untrusted) bean properties flow into the custom error message.\n\n\n## Recommendation\nThere are different approaches to remediate the issue:\n\n* Do not include validated bean properties in the custom error message.\n* Use parameterized messages instead of string concatenation. For example:\n```\nHibernateConstraintValidatorContext context =\n constraintValidatorContext.unwrap(HibernateConstraintValidatorContext.class);\ncontext.addMessageParameter(\"foo\", \"bar\");\ncontext.buildConstraintViolationWithTemplate(\"My violation message contains a parameter {foo}\")\n .addConstraintViolation();\n```\n* Sanitize the validated bean properties to make sure that there are no EL expressions. An example of valid sanitization logic can be found [here](https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/messageinterpolation/util/InterpolationHelper.java#L17).\n* Disable the EL interpolation and only use `ParameterMessageInterpolator`:\n```\nValidator validator = Validation.byDefaultProvider()\n .configure()\n .messageInterpolator(new ParameterMessageInterpolator())\n .buildValidatorFactory()\n .getValidator();\n```\n* Replace Hibernate Validator with Apache BVal, which in its latest version does not interpolate EL expressions by default. Note that this replacement may not be a simple drop-in replacement.\n\n## Example\nThe following validator could result in arbitrary Java code execution:\n\n\n```java\nimport javax.validation.ConstraintValidator;\nimport javax.validation.ConstraintValidatorContext;\nimport org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class TestValidator implements ConstraintValidator {\n\n public static class InterpolationHelper {\n\n public static final char BEGIN_TERM = '{';\n public static final char END_TERM = '}';\n public static final char EL_DESIGNATOR = '$';\n public static final char ESCAPE_CHARACTER = '\\\\';\n\n private static final Pattern ESCAPE_MESSAGE_PARAMETER_PATTERN = Pattern.compile( \"([\\\\\" + ESCAPE_CHARACTER + BEGIN_TERM + END_TERM + EL_DESIGNATOR + \"])\" );\n\n private InterpolationHelper() {\n }\n\n public static String escapeMessageParameter(String messageParameter) {\n if ( messageParameter == null ) {\n return null;\n }\n return ESCAPE_MESSAGE_PARAMETER_PATTERN.matcher( messageParameter ).replaceAll( Matcher.quoteReplacement( String.valueOf( ESCAPE_CHARACTER ) ) + \"$1\" );\n }\n\n }\n\n @Override\n public boolean isValid(String object, ConstraintValidatorContext constraintContext) {\n String value = object + \" is invalid\";\n\n // Bad: Bean properties (normally user-controlled) are passed directly to `buildConstraintViolationWithTemplate`\n constraintContext.buildConstraintViolationWithTemplate(value).addConstraintViolation().disableDefaultConstraintViolation();\n\n // Good: Bean properties (normally user-controlled) are escaped \n String escaped = InterpolationHelper.escapeMessageParameter(value);\n constraintContext.buildConstraintViolationWithTemplate(escaped).addConstraintViolation().disableDefaultConstraintViolation();\n\n // Good: Bean properties (normally user-controlled) are parameterized\n HibernateConstraintValidatorContext context = constraintContext.unwrap( HibernateConstraintValidatorContext.class );\n context.addMessageParameter( \"prop\", object );\n context.buildConstraintViolationWithTemplate( \"{prop} is invalid\").addConstraintViolation();\n return false;\n }\n\n}\n\n```\n\n## References\n* Hibernate Reference Guide: [ConstraintValidatorContext](https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#_the_code_constraintvalidatorcontext_code).\n* GitHub Security Lab research: [Bean validation](https://securitylab.github.com/research/bean-validation-RCE).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-094","owasp-top10-2021","A03:2021 - Injection"],"description":"User-controlled data may be evaluated as a Java EL expression, leading to arbitrary code execution.","id":"java/insecure-bean-validation","kind":"path-problem","name":"Insecure Bean Validation","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/spel-expression-injection","name":"java/spel-expression-injection","shortDescription":{"text":"Expression language injection (Spring)"},"fullDescription":{"text":"Evaluation of a user-controlled Spring Expression Language (SpEL) expression may lead to remote code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Expression language injection (Spring)\nThe Spring Expression Language (SpEL) is a powerful expression language provided by the Spring Framework. The language offers many features including invocation of methods available in the JVM. If a SpEL expression is built using attacker-controlled data, and then evaluated in a powerful context, then it may allow the attacker to run arbitrary code.\n\nThe `SpelExpressionParser` class parses a SpEL expression string and returns an `Expression` instance that can be then evaluated by calling one of its methods. By default, an expression is evaluated in a powerful `StandardEvaluationContext` that allows the expression to access other methods available in the JVM.\n\n\n## Recommendation\nIn general, including user input in a SpEL expression should be avoided. If user input must be included in the expression, it should be then evaluated in a limited context that doesn't allow arbitrary method invocation.\n\n\n## Example\nThe following example uses untrusted data to build a SpEL expression and then runs it in the default powerful context.\n\n\n```java\npublic Object evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n\n String string = reader.readLine();\n ExpressionParser parser = new SpelExpressionParser();\n Expression expression = parser.parseExpression(string);\n return expression.getValue();\n }\n}\n```\nThe next example shows how an untrusted SpEL expression can be run in `SimpleEvaluationContext` that doesn't allow accessing arbitrary methods. However, it's recommended to avoid using untrusted input in SpEL expressions.\n\n\n```java\npublic Object evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n\n String string = reader.readLine();\n ExpressionParser parser = new SpelExpressionParser();\n Expression expression = parser.parseExpression(string);\n SimpleEvaluationContext context \n = SimpleEvaluationContext.forReadWriteDataBinding().build();\n return expression.getValue(context);\n }\n}\n```\n\n## References\n* Spring Framework Reference Documentation: [Spring Expression Language (SpEL)](https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/expressions.html).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Expression language injection (Spring)\nThe Spring Expression Language (SpEL) is a powerful expression language provided by the Spring Framework. The language offers many features including invocation of methods available in the JVM. If a SpEL expression is built using attacker-controlled data, and then evaluated in a powerful context, then it may allow the attacker to run arbitrary code.\n\nThe `SpelExpressionParser` class parses a SpEL expression string and returns an `Expression` instance that can be then evaluated by calling one of its methods. By default, an expression is evaluated in a powerful `StandardEvaluationContext` that allows the expression to access other methods available in the JVM.\n\n\n## Recommendation\nIn general, including user input in a SpEL expression should be avoided. If user input must be included in the expression, it should be then evaluated in a limited context that doesn't allow arbitrary method invocation.\n\n\n## Example\nThe following example uses untrusted data to build a SpEL expression and then runs it in the default powerful context.\n\n\n```java\npublic Object evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n\n String string = reader.readLine();\n ExpressionParser parser = new SpelExpressionParser();\n Expression expression = parser.parseExpression(string);\n return expression.getValue();\n }\n}\n```\nThe next example shows how an untrusted SpEL expression can be run in `SimpleEvaluationContext` that doesn't allow accessing arbitrary methods. However, it's recommended to avoid using untrusted input in SpEL expressions.\n\n\n```java\npublic Object evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n\n String string = reader.readLine();\n ExpressionParser parser = new SpelExpressionParser();\n Expression expression = parser.parseExpression(string);\n SimpleEvaluationContext context \n = SimpleEvaluationContext.forReadWriteDataBinding().build();\n return expression.getValue(context);\n }\n}\n```\n\n## References\n* Spring Framework Reference Documentation: [Spring Expression Language (SpEL)](https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/expressions.html).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-094","owasp-top10-2021","A03:2021 - Injection"],"description":"Evaluation of a user-controlled Spring Expression Language (SpEL) expression\n may lead to remote code execution.","id":"java/spel-expression-injection","kind":"path-problem","name":"Expression language injection (Spring)","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/groovy-injection","name":"java/groovy-injection","shortDescription":{"text":"Groovy Language injection"},"fullDescription":{"text":"Evaluation of a user-controlled Groovy script may lead to arbitrary code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Groovy Language injection\nApache Groovy is a powerful, optionally typed and dynamic language, with static-typing and static compilation capabilities. It integrates smoothly with any Java program, and immediately delivers to your application powerful features, including scripting capabilities, Domain-Specific Language authoring, runtime and compile-time meta-programming and functional programming. If a Groovy script is built using attacker-controlled data, and then evaluated, then it may allow the attacker to achieve RCE.\n\n\n## Recommendation\nIt is generally recommended to avoid using untrusted input in a Groovy evaluation. If this is not possible, use a sandbox solution. Developers must also take care that Groovy compile-time metaprogramming can also lead to RCE: it is possible to achieve RCE by compiling a Groovy script (see the article \"Abusing Meta Programming for Unauthenticated RCE!\" linked below). Groovy's `SecureASTCustomizer` allows securing source code by controlling what code constructs are permitted. This is typically done when using Groovy for its scripting or domain specific language (DSL) features. The fundamental problem is that Groovy is a dynamic language, yet `SecureASTCustomizer` works by looking at Groovy AST statically. This makes it very easy for an attacker to bypass many of the intended checks (see \\[Groovy SecureASTCustomizer is harmful\\](https://kohsuke.org/2012/04/27/groovy-secureastcustomizer-is-harmful/)). Therefore, besides `SecureASTCustomizer`, runtime checks are also necessary before calling Groovy methods (see \\[Improved sandboxing of Groovy scripts\\](https://melix.github.io/blog/2015/03/sandboxing.html)). It is also possible to use a block-list method, excluding unwanted classes from being loaded by the JVM. This method is not always recommended, because block-lists can be bypassed by unexpected values.\n\n\n## Example\nThe following example uses untrusted data to evaluate a Groovy script.\n\n\n```java\npublic class GroovyInjection {\n void injectionViaClassLoader(HttpServletRequest request) { \n String script = request.getParameter(\"script\");\n final GroovyClassLoader classLoader = new GroovyClassLoader();\n Class groovy = classLoader.parseClass(script);\n GroovyObject groovyObj = (GroovyObject) groovy.newInstance();\n }\n\n void injectionViaEval(HttpServletRequest request) {\n String script = request.getParameter(\"script\");\n Eval.me(script);\n }\n\n void injectionViaGroovyShell(HttpServletRequest request) {\n GroovyShell shell = new GroovyShell();\n String script = request.getParameter(\"script\");\n shell.evaluate(script);\n }\n\n void injectionViaGroovyShellGroovyCodeSource(HttpServletRequest request) {\n GroovyShell shell = new GroovyShell();\n String script = request.getParameter(\"script\");\n GroovyCodeSource gcs = new GroovyCodeSource(script, \"test\", \"Test\");\n shell.evaluate(gcs);\n }\n}\n\n\n```\nThe following example uses classloader block-list approach to exclude loading dangerous classes.\n\n\n```java\npublic class SandboxGroovyClassLoader extends ClassLoader {\n public SandboxGroovyClassLoader(ClassLoader parent) {\n super(parent);\n }\n\n /* override `loadClass` here to prevent loading sensitive classes, such as `java.lang.Runtime`, `java.lang.ProcessBuilder`, `java.lang.System`, etc. */\n /* Note we must also block `groovy.transform.ASTTest`, `groovy.lang.GrabConfig` and `org.buildobjects.process.ProcBuilder` to prevent compile-time RCE. */\n\n static void runWithSandboxGroovyClassLoader() throws Exception {\n // GOOD: route all class-loading via sand-boxing classloader.\n SandboxGroovyClassLoader classLoader = new GroovyClassLoader(new SandboxGroovyClassLoader());\n \n Class scriptClass = classLoader.parseClass(untrusted.getQueryString());\n Object scriptInstance = scriptClass.newInstance();\n Object result = scriptClass.getDeclaredMethod(\"bar\", new Class[]{}).invoke(scriptInstance, new Object[]{});\n }\n}\n```\n\n## References\n* Orange Tsai: [Abusing Meta Programming for Unauthenticated RCE!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html).\n* Cédric Champeau: [Improved sandboxing of Groovy scripts](https://melix.github.io/blog/2015/03/sandboxing.html).\n* Kohsuke Kawaguchi: [Groovy SecureASTCustomizer is harmful](https://kohsuke.org/2012/04/27/groovy-secureastcustomizer-is-harmful/).\n* Welk1n: [Groovy Injection payloads](https://github.com/welk1n/exploiting-groovy-in-Java/).\n* Charles Chan: [Secure Groovy Script Execution in a Sandbox](https://levelup.gitconnected.com/secure-groovy-script-execution-in-a-sandbox-ea39f80ee87/).\n* Eugene: [Scripting and sandboxing in a JVM environment](https://stringconcat.com/en/scripting-and-sandboxing/).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Groovy Language injection\nApache Groovy is a powerful, optionally typed and dynamic language, with static-typing and static compilation capabilities. It integrates smoothly with any Java program, and immediately delivers to your application powerful features, including scripting capabilities, Domain-Specific Language authoring, runtime and compile-time meta-programming and functional programming. If a Groovy script is built using attacker-controlled data, and then evaluated, then it may allow the attacker to achieve RCE.\n\n\n## Recommendation\nIt is generally recommended to avoid using untrusted input in a Groovy evaluation. If this is not possible, use a sandbox solution. Developers must also take care that Groovy compile-time metaprogramming can also lead to RCE: it is possible to achieve RCE by compiling a Groovy script (see the article \"Abusing Meta Programming for Unauthenticated RCE!\" linked below). Groovy's `SecureASTCustomizer` allows securing source code by controlling what code constructs are permitted. This is typically done when using Groovy for its scripting or domain specific language (DSL) features. The fundamental problem is that Groovy is a dynamic language, yet `SecureASTCustomizer` works by looking at Groovy AST statically. This makes it very easy for an attacker to bypass many of the intended checks (see \\[Groovy SecureASTCustomizer is harmful\\](https://kohsuke.org/2012/04/27/groovy-secureastcustomizer-is-harmful/)). Therefore, besides `SecureASTCustomizer`, runtime checks are also necessary before calling Groovy methods (see \\[Improved sandboxing of Groovy scripts\\](https://melix.github.io/blog/2015/03/sandboxing.html)). It is also possible to use a block-list method, excluding unwanted classes from being loaded by the JVM. This method is not always recommended, because block-lists can be bypassed by unexpected values.\n\n\n## Example\nThe following example uses untrusted data to evaluate a Groovy script.\n\n\n```java\npublic class GroovyInjection {\n void injectionViaClassLoader(HttpServletRequest request) { \n String script = request.getParameter(\"script\");\n final GroovyClassLoader classLoader = new GroovyClassLoader();\n Class groovy = classLoader.parseClass(script);\n GroovyObject groovyObj = (GroovyObject) groovy.newInstance();\n }\n\n void injectionViaEval(HttpServletRequest request) {\n String script = request.getParameter(\"script\");\n Eval.me(script);\n }\n\n void injectionViaGroovyShell(HttpServletRequest request) {\n GroovyShell shell = new GroovyShell();\n String script = request.getParameter(\"script\");\n shell.evaluate(script);\n }\n\n void injectionViaGroovyShellGroovyCodeSource(HttpServletRequest request) {\n GroovyShell shell = new GroovyShell();\n String script = request.getParameter(\"script\");\n GroovyCodeSource gcs = new GroovyCodeSource(script, \"test\", \"Test\");\n shell.evaluate(gcs);\n }\n}\n\n\n```\nThe following example uses classloader block-list approach to exclude loading dangerous classes.\n\n\n```java\npublic class SandboxGroovyClassLoader extends ClassLoader {\n public SandboxGroovyClassLoader(ClassLoader parent) {\n super(parent);\n }\n\n /* override `loadClass` here to prevent loading sensitive classes, such as `java.lang.Runtime`, `java.lang.ProcessBuilder`, `java.lang.System`, etc. */\n /* Note we must also block `groovy.transform.ASTTest`, `groovy.lang.GrabConfig` and `org.buildobjects.process.ProcBuilder` to prevent compile-time RCE. */\n\n static void runWithSandboxGroovyClassLoader() throws Exception {\n // GOOD: route all class-loading via sand-boxing classloader.\n SandboxGroovyClassLoader classLoader = new GroovyClassLoader(new SandboxGroovyClassLoader());\n \n Class scriptClass = classLoader.parseClass(untrusted.getQueryString());\n Object scriptInstance = scriptClass.newInstance();\n Object result = scriptClass.getDeclaredMethod(\"bar\", new Class[]{}).invoke(scriptInstance, new Object[]{});\n }\n}\n```\n\n## References\n* Orange Tsai: [Abusing Meta Programming for Unauthenticated RCE!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html).\n* Cédric Champeau: [Improved sandboxing of Groovy scripts](https://melix.github.io/blog/2015/03/sandboxing.html).\n* Kohsuke Kawaguchi: [Groovy SecureASTCustomizer is harmful](https://kohsuke.org/2012/04/27/groovy-secureastcustomizer-is-harmful/).\n* Welk1n: [Groovy Injection payloads](https://github.com/welk1n/exploiting-groovy-in-Java/).\n* Charles Chan: [Secure Groovy Script Execution in a Sandbox](https://levelup.gitconnected.com/secure-groovy-script-execution-in-a-sandbox-ea39f80ee87/).\n* Eugene: [Scripting and sandboxing in a JVM environment](https://stringconcat.com/en/scripting-and-sandboxing/).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-094","owasp-top10-2021","A03:2021 - Injection"],"description":"Evaluation of a user-controlled Groovy script\n may lead to arbitrary code execution.","id":"java/groovy-injection","kind":"path-problem","name":"Groovy Language injection","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/mvel-expression-injection","name":"java/mvel-expression-injection","shortDescription":{"text":"Expression language injection (MVEL)"},"fullDescription":{"text":"Evaluation of a user-controlled MVEL expression may lead to remote code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Expression language injection (MVEL)\nMVEL is an expression language based on Java-syntax, which offers many features including invocation of methods available in the JVM. If a MVEL expression is built using attacker-controlled data, and then evaluated, then it may allow attackers to run arbitrary code.\n\n\n## Recommendation\nIncluding user input in a MVEL expression should be avoided.\n\n\n## Example\nIn the following sample, the first example uses untrusted data to build a MVEL expression and then runs it in the default context. In the second example, the untrusted data is validated with a custom method that checks that the expression does not contain unexpected code before evaluating it.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String expression = reader.readLine();\n // BAD: the user-provided expression is directly evaluated\n MVEL.eval(expression);\n }\n}\n\npublic void safeEvaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String expression = reader.readLine();\n // GOOD: the user-provided expression is validated before evaluation\n validateExpression(expression);\n MVEL.eval(expression);\n }\n}\n\nprivate void validateExpression(String expression) {\n // Validate that the expression does not contain unexpected code.\n // For instance, this can be done with allow-lists or deny-lists of code patterns.\n}\n```\n\n## References\n* MVEL Documentation: [Language Guide for 2.0](http://mvel.documentnode.com/).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Expression language injection (MVEL)\nMVEL is an expression language based on Java-syntax, which offers many features including invocation of methods available in the JVM. If a MVEL expression is built using attacker-controlled data, and then evaluated, then it may allow attackers to run arbitrary code.\n\n\n## Recommendation\nIncluding user input in a MVEL expression should be avoided.\n\n\n## Example\nIn the following sample, the first example uses untrusted data to build a MVEL expression and then runs it in the default context. In the second example, the untrusted data is validated with a custom method that checks that the expression does not contain unexpected code before evaluating it.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String expression = reader.readLine();\n // BAD: the user-provided expression is directly evaluated\n MVEL.eval(expression);\n }\n}\n\npublic void safeEvaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String expression = reader.readLine();\n // GOOD: the user-provided expression is validated before evaluation\n validateExpression(expression);\n MVEL.eval(expression);\n }\n}\n\nprivate void validateExpression(String expression) {\n // Validate that the expression does not contain unexpected code.\n // For instance, this can be done with allow-lists or deny-lists of code patterns.\n}\n```\n\n## References\n* MVEL Documentation: [Language Guide for 2.0](http://mvel.documentnode.com/).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-094","owasp-top10-2021","A03:2021 - Injection"],"description":"Evaluation of a user-controlled MVEL expression\n may lead to remote code execution.","id":"java/mvel-expression-injection","kind":"path-problem","name":"Expression language injection (MVEL)","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/jexl-expression-injection","name":"java/jexl-expression-injection","shortDescription":{"text":"Expression language injection (JEXL)"},"fullDescription":{"text":"Evaluation of a user-controlled JEXL expression may lead to arbitrary code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Expression language injection (JEXL)\nJava EXpression Language (JEXL) is a simple expression language provided by the Apache Commons JEXL library. The syntax is close to a mix of ECMAScript and shell-script. The language allows invocation of methods available in the JVM. If a JEXL expression is built using attacker-controlled data, and then evaluated, then it may allow the attacker to run arbitrary code.\n\n\n## Recommendation\nIt is generally recommended to avoid using untrusted input in a JEXL expression. If it is not possible, JEXL expressions should be run in a sandbox that allows accessing only explicitly allowed classes.\n\n\n## Example\nThe following example uses untrusted data to build and run a JEXL expression.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String input = reader.readLine();\n JexlEngine jexl = new JexlBuilder().create();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n}\n```\nThe next example shows how an untrusted JEXL expression can be run in a sandbox that allows accessing only methods in the `java.lang.Math` class. The sandbox is implemented using `JexlSandbox` class that is provided by Apache Commons JEXL 3.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n JexlSandbox onlyMath = new JexlSandbox(false);\n onlyMath.white(\"java.lang.Math\");\n JexlEngine jexl = new JexlBuilder().sandbox(onlyMath).create();\n \n String input = reader.readLine();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n}\n```\nThe next example shows another way how a sandbox can be implemented. It uses a custom implementation of `JexlUberspect` that checks if callees are instances of allowed classes.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n JexlUberspect sandbox = new JexlUberspectSandbox();\n JexlEngine jexl = new JexlBuilder().uberspect(sandbox).create();\n \n String input = reader.readLine();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n\n private static class JexlUberspectSandbox implements JexlUberspect {\n\n private static final List ALLOWED_CLASSES =\n Arrays.asList(\"java.lang.Math\", \"java.util.Random\");\n\n private final JexlUberspect uberspect = new JexlBuilder().create().getUberspect();\n\n private void checkAccess(Object obj) {\n if (!ALLOWED_CLASSES.contains(obj.getClass().getCanonicalName())) {\n throw new AccessControlException(\"Not allowed\");\n }\n }\n\n @Override\n public JexlMethod getMethod(Object obj, String method, Object... args) {\n checkAccess(obj);\n return uberspect.getMethod(obj, method, args);\n }\n\n @Override\n public List getResolvers(JexlOperator op, Object obj) {\n checkAccess(obj);\n return uberspect.getResolvers(op, obj);\n }\n\n @Override\n public void setClassLoader(ClassLoader loader) {\n uberspect.setClassLoader(loader);\n }\n\n @Override\n public int getVersion() {\n return uberspect.getVersion();\n }\n\n @Override\n public JexlMethod getConstructor(Object obj, Object... args) {\n checkAccess(obj);\n return uberspect.getConstructor(obj, args);\n }\n\n @Override\n public JexlPropertyGet getPropertyGet(Object obj, Object identifier) {\n checkAccess(obj);\n return uberspect.getPropertyGet(obj, identifier);\n }\n\n @Override\n public JexlPropertyGet getPropertyGet(List resolvers, Object obj, Object identifier) {\n checkAccess(obj);\n return uberspect.getPropertyGet(resolvers, obj, identifier);\n }\n\n @Override\n public JexlPropertySet getPropertySet(Object obj, Object identifier, Object arg) {\n checkAccess(obj);\n return uberspect.getPropertySet(obj, identifier, arg);\n }\n\n @Override\n public JexlPropertySet getPropertySet(List resolvers, Object obj, Object identifier, Object arg) {\n checkAccess(obj);\n return uberspect.getPropertySet(resolvers, obj, identifier, arg);\n }\n\n @Override\n public Iterator getIterator(Object obj) {\n checkAccess(obj);\n return uberspect.getIterator(obj);\n }\n\n @Override\n public JexlArithmetic.Uberspect getArithmetic(JexlArithmetic arithmetic) {\n return uberspect.getArithmetic(arithmetic);\n } \n }\n}\n```\n\n## References\n* Apache Commons JEXL: [Project page](https://commons.apache.org/proper/commons-jexl/).\n* Apache Commons JEXL documentation: [JEXL 2.1.1 API](https://commons.apache.org/proper/commons-jexl/javadocs/apidocs-2.1.1/).\n* Apache Commons JEXL documentation: [JEXL 3.1 API](https://commons.apache.org/proper/commons-jexl/apidocs/index.html).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Expression language injection (JEXL)\nJava EXpression Language (JEXL) is a simple expression language provided by the Apache Commons JEXL library. The syntax is close to a mix of ECMAScript and shell-script. The language allows invocation of methods available in the JVM. If a JEXL expression is built using attacker-controlled data, and then evaluated, then it may allow the attacker to run arbitrary code.\n\n\n## Recommendation\nIt is generally recommended to avoid using untrusted input in a JEXL expression. If it is not possible, JEXL expressions should be run in a sandbox that allows accessing only explicitly allowed classes.\n\n\n## Example\nThe following example uses untrusted data to build and run a JEXL expression.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n String input = reader.readLine();\n JexlEngine jexl = new JexlBuilder().create();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n}\n```\nThe next example shows how an untrusted JEXL expression can be run in a sandbox that allows accessing only methods in the `java.lang.Math` class. The sandbox is implemented using `JexlSandbox` class that is provided by Apache Commons JEXL 3.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n JexlSandbox onlyMath = new JexlSandbox(false);\n onlyMath.white(\"java.lang.Math\");\n JexlEngine jexl = new JexlBuilder().sandbox(onlyMath).create();\n \n String input = reader.readLine();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n}\n```\nThe next example shows another way how a sandbox can be implemented. It uses a custom implementation of `JexlUberspect` that checks if callees are instances of allowed classes.\n\n\n```java\npublic void evaluate(Socket socket) throws IOException {\n try (BufferedReader reader = new BufferedReader(\n new InputStreamReader(socket.getInputStream()))) {\n \n JexlUberspect sandbox = new JexlUberspectSandbox();\n JexlEngine jexl = new JexlBuilder().uberspect(sandbox).create();\n \n String input = reader.readLine();\n JexlExpression expression = jexl.createExpression(input);\n JexlContext context = new MapContext();\n expression.evaluate(context);\n }\n\n private static class JexlUberspectSandbox implements JexlUberspect {\n\n private static final List ALLOWED_CLASSES =\n Arrays.asList(\"java.lang.Math\", \"java.util.Random\");\n\n private final JexlUberspect uberspect = new JexlBuilder().create().getUberspect();\n\n private void checkAccess(Object obj) {\n if (!ALLOWED_CLASSES.contains(obj.getClass().getCanonicalName())) {\n throw new AccessControlException(\"Not allowed\");\n }\n }\n\n @Override\n public JexlMethod getMethod(Object obj, String method, Object... args) {\n checkAccess(obj);\n return uberspect.getMethod(obj, method, args);\n }\n\n @Override\n public List getResolvers(JexlOperator op, Object obj) {\n checkAccess(obj);\n return uberspect.getResolvers(op, obj);\n }\n\n @Override\n public void setClassLoader(ClassLoader loader) {\n uberspect.setClassLoader(loader);\n }\n\n @Override\n public int getVersion() {\n return uberspect.getVersion();\n }\n\n @Override\n public JexlMethod getConstructor(Object obj, Object... args) {\n checkAccess(obj);\n return uberspect.getConstructor(obj, args);\n }\n\n @Override\n public JexlPropertyGet getPropertyGet(Object obj, Object identifier) {\n checkAccess(obj);\n return uberspect.getPropertyGet(obj, identifier);\n }\n\n @Override\n public JexlPropertyGet getPropertyGet(List resolvers, Object obj, Object identifier) {\n checkAccess(obj);\n return uberspect.getPropertyGet(resolvers, obj, identifier);\n }\n\n @Override\n public JexlPropertySet getPropertySet(Object obj, Object identifier, Object arg) {\n checkAccess(obj);\n return uberspect.getPropertySet(obj, identifier, arg);\n }\n\n @Override\n public JexlPropertySet getPropertySet(List resolvers, Object obj, Object identifier, Object arg) {\n checkAccess(obj);\n return uberspect.getPropertySet(resolvers, obj, identifier, arg);\n }\n\n @Override\n public Iterator getIterator(Object obj) {\n checkAccess(obj);\n return uberspect.getIterator(obj);\n }\n\n @Override\n public JexlArithmetic.Uberspect getArithmetic(JexlArithmetic arithmetic) {\n return uberspect.getArithmetic(arithmetic);\n } \n }\n}\n```\n\n## References\n* Apache Commons JEXL: [Project page](https://commons.apache.org/proper/commons-jexl/).\n* Apache Commons JEXL documentation: [JEXL 2.1.1 API](https://commons.apache.org/proper/commons-jexl/javadocs/apidocs-2.1.1/).\n* Apache Commons JEXL documentation: [JEXL 3.1 API](https://commons.apache.org/proper/commons-jexl/apidocs/index.html).\n* OWASP: [Expression Language Injection](https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-094","owasp-top10-2021","A03:2021 - Injection"],"description":"Evaluation of a user-controlled JEXL expression\n may lead to arbitrary code execution.","id":"java/jexl-expression-injection","kind":"path-problem","name":"Expression language injection (JEXL)","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/server-side-template-injection","name":"java/server-side-template-injection","shortDescription":{"text":"Server-side template injection"},"fullDescription":{"text":"Untrusted input interpreted as a template can lead to remote code execution."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Server-side template injection\nTemplate injection occurs when user input is embedded in a template's code in an unsafe manner. An attacker can use native template syntax to inject a malicious payload into a template, which is then executed server-side. This permits the attacker to run arbitrary code in the server's context.\n\n\n## Recommendation\nTo fix this, ensure that untrusted input is not used as part of a template's code. If the application requirements do not allow this, use a sandboxed environment where access to unsafe attributes and methods is prohibited.\n\n\n## Example\nIn the example given below, an untrusted HTTP parameter `code` is used as a Velocity template string. This can lead to remote code execution.\n\n\n```java\n@Controller\npublic class VelocitySSTI {\n\n\t@GetMapping(value = \"bad\")\n\tpublic void bad(HttpServletRequest request) {\n\t\tVelocity.init();\n\n\t\tString code = request.getParameter(\"code\");\n\n\t\tVelocityContext context = new VelocityContext();\n\n\t\tcontext.put(\"name\", \"Velocity\");\n\t\tcontext.put(\"project\", \"Jakarta\");\n\n\t\tStringWriter w = new StringWriter();\n\t\t// evaluate( Context context, Writer out, String logTag, String instring )\n\t\tVelocity.evaluate(context, w, \"mystring\", code);\n\t}\n}\n\n```\nIn the next example, the problem is avoided by using a fixed template string `s`. Since the template's code is not attacker-controlled in this case, this solution prevents the execution of untrusted code.\n\n\n```java\n@Controller\npublic class VelocitySSTI {\n\n\t@GetMapping(value = \"good\")\n\tpublic void good(HttpServletRequest request) {\n\t\tVelocity.init();\n\t\tVelocityContext context = new VelocityContext();\n\n\t\tcontext.put(\"name\", \"Velocity\");\n\t\tcontext.put(\"project\", \"Jakarta\");\n\n\t\tString s = \"We are using $project $name to render this.\";\n\t\tStringWriter w = new StringWriter();\n\t\tVelocity.evaluate(context, w, \"mystring\", s);\n\t\tSystem.out.println(\" string : \" + w);\n\t}\n}\n\n```\n\n## References\n* Portswigger: [Server Side Template Injection](https://portswigger.net/web-security/server-side-template-injection).\n* Common Weakness Enumeration: [CWE-1336](https://cwe.mitre.org/data/definitions/1336.html).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n","markdown":"# Server-side template injection\nTemplate injection occurs when user input is embedded in a template's code in an unsafe manner. An attacker can use native template syntax to inject a malicious payload into a template, which is then executed server-side. This permits the attacker to run arbitrary code in the server's context.\n\n\n## Recommendation\nTo fix this, ensure that untrusted input is not used as part of a template's code. If the application requirements do not allow this, use a sandboxed environment where access to unsafe attributes and methods is prohibited.\n\n\n## Example\nIn the example given below, an untrusted HTTP parameter `code` is used as a Velocity template string. This can lead to remote code execution.\n\n\n```java\n@Controller\npublic class VelocitySSTI {\n\n\t@GetMapping(value = \"bad\")\n\tpublic void bad(HttpServletRequest request) {\n\t\tVelocity.init();\n\n\t\tString code = request.getParameter(\"code\");\n\n\t\tVelocityContext context = new VelocityContext();\n\n\t\tcontext.put(\"name\", \"Velocity\");\n\t\tcontext.put(\"project\", \"Jakarta\");\n\n\t\tStringWriter w = new StringWriter();\n\t\t// evaluate( Context context, Writer out, String logTag, String instring )\n\t\tVelocity.evaluate(context, w, \"mystring\", code);\n\t}\n}\n\n```\nIn the next example, the problem is avoided by using a fixed template string `s`. Since the template's code is not attacker-controlled in this case, this solution prevents the execution of untrusted code.\n\n\n```java\n@Controller\npublic class VelocitySSTI {\n\n\t@GetMapping(value = \"good\")\n\tpublic void good(HttpServletRequest request) {\n\t\tVelocity.init();\n\t\tVelocityContext context = new VelocityContext();\n\n\t\tcontext.put(\"name\", \"Velocity\");\n\t\tcontext.put(\"project\", \"Jakarta\");\n\n\t\tString s = \"We are using $project $name to render this.\";\n\t\tStringWriter w = new StringWriter();\n\t\tVelocity.evaluate(context, w, \"mystring\", s);\n\t\tSystem.out.println(\" string : \" + w);\n\t}\n}\n\n```\n\n## References\n* Portswigger: [Server Side Template Injection](https://portswigger.net/web-security/server-side-template-injection).\n* Common Weakness Enumeration: [CWE-1336](https://cwe.mitre.org/data/definitions/1336.html).\n* Common Weakness Enumeration: [CWE-94](https://cwe.mitre.org/data/definitions/94.html).\n"},"properties":{"tags":["security","external/cwe/cwe-1336","external/cwe/cwe-094","owasp-top10-2021","A03:2021 - Injection"],"description":"Untrusted input interpreted as a template can lead to remote code execution.","id":"java/server-side-template-injection","kind":"path-problem","name":"Server-side template injection","precision":"high","problem.severity":"error","security-severity":"9.3"}},{"id":"java/spring-disabled-csrf-protection","name":"java/spring-disabled-csrf-protection","shortDescription":{"text":"Disabled Spring CSRF protection"},"fullDescription":{"text":"Disabling CSRF protection makes the application vulnerable to a Cross-Site Request Forgery (CSRF) attack."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Disabled Spring CSRF protection\nWhen you set up a web server to receive a request from a client without any mechanism for verifying that it was intentionally sent, then it is vulnerable to attack. An attacker can trick a client into making an unintended request to the web server that will be treated as an authentic request. This can be done via a URL, image load, XMLHttpRequest, etc. and can result in exposure of data or unintended code execution.\n\n\n## Recommendation\nWhen you use Spring, Cross-Site Request Forgery (CSRF) protection is enabled by default. Spring's recommendation is to use CSRF protection for any request that could be processed by a browser client by normal users.\n\n\n## Example\nThe following example shows the Spring Java configuration with CSRF protection disabled. This type of configuration should only be used if you are creating a service that is used only by non-browser clients.\n\n\n```java\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\n\n@EnableWebSecurity\n@Configuration\npublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {\n @Override\n protected void configure(HttpSecurity http) throws Exception {\n http\n .csrf(csrf ->\n // BAD - CSRF protection shouldn't be disabled\n csrf.disable() \n );\n }\n}\n\n```\n\n## References\n* OWASP: [Cross-Site Request Forgery (CSRF)](https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)).\n* Spring Security Reference: [ Cross Site Request Forgery (CSRF) for Servlet Environments ](https://docs.spring.io/spring-security/site/docs/current/reference/html5/#servlet-csrf).\n* Common Weakness Enumeration: [CWE-352](https://cwe.mitre.org/data/definitions/352.html).\n","markdown":"# Disabled Spring CSRF protection\nWhen you set up a web server to receive a request from a client without any mechanism for verifying that it was intentionally sent, then it is vulnerable to attack. An attacker can trick a client into making an unintended request to the web server that will be treated as an authentic request. This can be done via a URL, image load, XMLHttpRequest, etc. and can result in exposure of data or unintended code execution.\n\n\n## Recommendation\nWhen you use Spring, Cross-Site Request Forgery (CSRF) protection is enabled by default. Spring's recommendation is to use CSRF protection for any request that could be processed by a browser client by normal users.\n\n\n## Example\nThe following example shows the Spring Java configuration with CSRF protection disabled. This type of configuration should only be used if you are creating a service that is used only by non-browser clients.\n\n\n```java\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\nimport org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\n\n@EnableWebSecurity\n@Configuration\npublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {\n @Override\n protected void configure(HttpSecurity http) throws Exception {\n http\n .csrf(csrf ->\n // BAD - CSRF protection shouldn't be disabled\n csrf.disable() \n );\n }\n}\n\n```\n\n## References\n* OWASP: [Cross-Site Request Forgery (CSRF)](https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)).\n* Spring Security Reference: [ Cross Site Request Forgery (CSRF) for Servlet Environments ](https://docs.spring.io/spring-security/site/docs/current/reference/html5/#servlet-csrf).\n* Common Weakness Enumeration: [CWE-352](https://cwe.mitre.org/data/definitions/352.html).\n"},"properties":{"tags":["security","external/cwe/cwe-352","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Disabling CSRF protection makes the application vulnerable to\n a Cross-Site Request Forgery (CSRF) attack.","id":"java/spring-disabled-csrf-protection","kind":"problem","name":"Disabled Spring CSRF protection","precision":"high","problem.severity":"error","security-severity":"8.8"}},{"id":"java/weak-cryptographic-algorithm","name":"java/weak-cryptographic-algorithm","shortDescription":{"text":"Use of a broken or risky cryptographic algorithm"},"fullDescription":{"text":"Using broken or weak cryptographic algorithms can allow an attacker to compromise security."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Use of a broken or risky cryptographic algorithm\nUsing broken or weak cryptographic algorithms can leave data vulnerable to being decrypted.\n\nMany cryptographic algorithms provided by cryptography libraries are known to be weak, or flawed. Using such an algorithm means that an attacker may be able to easily decrypt the encrypted data.\n\n\n## Recommendation\nEnsure that you use a strong, modern cryptographic algorithm. Use at least AES-128 or RSA-2048. Do not use the ECB encryption mode since it is vulnerable to replay and other attacks.\n\n\n## Example\nThe following code shows an example of using a java `Cipher` to encrypt some data. When creating a `Cipher` instance, you must specify the encryption algorithm to use. The first example uses DES, which is an older algorithm that is now considered weak. The second example uses AES, which is a strong modern algorithm.\n\n\n```java\n// BAD: DES is a weak algorithm \nCipher des = Cipher.getInstance(\"DES\");\ncipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);\n\nbyte[] encrypted = cipher.doFinal(input.getBytes(\"UTF-8\"));\n\n// ...\n\n// GOOD: AES is a strong algorithm\nCipher aes = Cipher.getInstance(\"AES\");\n\n// ...\n\n```\n\n## References\n* NIST, FIPS 140 Annex a: [ Approved Security Functions](http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf).\n* NIST, SP 800-131A: [ Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf).\n* Common Weakness Enumeration: [CWE-327](https://cwe.mitre.org/data/definitions/327.html).\n* Common Weakness Enumeration: [CWE-328](https://cwe.mitre.org/data/definitions/328.html).\n","markdown":"# Use of a broken or risky cryptographic algorithm\nUsing broken or weak cryptographic algorithms can leave data vulnerable to being decrypted.\n\nMany cryptographic algorithms provided by cryptography libraries are known to be weak, or flawed. Using such an algorithm means that an attacker may be able to easily decrypt the encrypted data.\n\n\n## Recommendation\nEnsure that you use a strong, modern cryptographic algorithm. Use at least AES-128 or RSA-2048. Do not use the ECB encryption mode since it is vulnerable to replay and other attacks.\n\n\n## Example\nThe following code shows an example of using a java `Cipher` to encrypt some data. When creating a `Cipher` instance, you must specify the encryption algorithm to use. The first example uses DES, which is an older algorithm that is now considered weak. The second example uses AES, which is a strong modern algorithm.\n\n\n```java\n// BAD: DES is a weak algorithm \nCipher des = Cipher.getInstance(\"DES\");\ncipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);\n\nbyte[] encrypted = cipher.doFinal(input.getBytes(\"UTF-8\"));\n\n// ...\n\n// GOOD: AES is a strong algorithm\nCipher aes = Cipher.getInstance(\"AES\");\n\n// ...\n\n```\n\n## References\n* NIST, FIPS 140 Annex a: [ Approved Security Functions](http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf).\n* NIST, SP 800-131A: [ Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf).\n* Common Weakness Enumeration: [CWE-327](https://cwe.mitre.org/data/definitions/327.html).\n* Common Weakness Enumeration: [CWE-328](https://cwe.mitre.org/data/definitions/328.html).\n"},"properties":{"tags":["security","external/cwe/cwe-327","external/cwe/cwe-328","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using broken or weak cryptographic algorithms can allow an attacker to compromise security.","id":"java/weak-cryptographic-algorithm","kind":"path-problem","name":"Use of a broken or risky cryptographic algorithm","precision":"high","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/jndi-injection","name":"java/jndi-injection","shortDescription":{"text":"JNDI lookup with user-controlled name"},"fullDescription":{"text":"Performing a JNDI lookup with a user-controlled name can lead to the download of an untrusted object and to execution of arbitrary code."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# JNDI lookup with user-controlled name\nThe Java Naming and Directory Interface (JNDI) is a Java API for a directory service that allows Java software clients to discover and look up data and resources (in the form of Java objects) via a name. If the name being used to look up the data is controlled by the user, it can point to a malicious server, which can return an arbitrary object. In the worst case, this can allow remote code execution.\n\n\n## Recommendation\nThe general recommendation is to avoid passing untrusted data to the `InitialContext.lookup ` method. If the name being used to look up the object must be provided by the user, make sure that it's not in the form of an absolute URL or that it's the URL pointing to a trused server.\n\n\n## Example\nIn the following examples, the code accepts a name from the user, which it uses to look up an object.\n\nIn the first example, the user provided name is used to look up an object.\n\nThe second example validates the name before using it to look up an object.\n\n\n```java\nimport javax.naming.Context;\nimport javax.naming.InitialContext;\n\npublic void jndiLookup(HttpServletRequest request) throws NamingException {\n String name = request.getParameter(\"name\");\n\n Hashtable env = new Hashtable();\n env.put(Context.INITIAL_CONTEXT_FACTORY, \"com.sun.jndi.rmi.registry.RegistryContextFactory\");\n env.put(Context.PROVIDER_URL, \"rmi://trusted-server:1099\");\n InitialContext ctx = new InitialContext(env);\n\n // BAD: User input used in lookup\n ctx.lookup(name);\n\n // GOOD: The name is validated before being used in lookup\n if (isValid(name)) {\n ctx.lookup(name);\n } else {\n // Reject the request\n }\n}\n```\n\n## References\n* Oracle: [Java Naming and Directory Interface (JNDI)](https://docs.oracle.com/javase/8/docs/technotes/guides/jndi/).\n* Black Hat materials: [A Journey from JNDI/LDAP Manipulation to Remote Code Execution Dream Land](https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE-wp.pdf).\n* Veracode: [Exploiting JNDI Injections in Java](https://www.veracode.com/blog/research/exploiting-jndi-injections-java).\n* Common Weakness Enumeration: [CWE-74](https://cwe.mitre.org/data/definitions/74.html).\n","markdown":"# JNDI lookup with user-controlled name\nThe Java Naming and Directory Interface (JNDI) is a Java API for a directory service that allows Java software clients to discover and look up data and resources (in the form of Java objects) via a name. If the name being used to look up the data is controlled by the user, it can point to a malicious server, which can return an arbitrary object. In the worst case, this can allow remote code execution.\n\n\n## Recommendation\nThe general recommendation is to avoid passing untrusted data to the `InitialContext.lookup ` method. If the name being used to look up the object must be provided by the user, make sure that it's not in the form of an absolute URL or that it's the URL pointing to a trused server.\n\n\n## Example\nIn the following examples, the code accepts a name from the user, which it uses to look up an object.\n\nIn the first example, the user provided name is used to look up an object.\n\nThe second example validates the name before using it to look up an object.\n\n\n```java\nimport javax.naming.Context;\nimport javax.naming.InitialContext;\n\npublic void jndiLookup(HttpServletRequest request) throws NamingException {\n String name = request.getParameter(\"name\");\n\n Hashtable env = new Hashtable();\n env.put(Context.INITIAL_CONTEXT_FACTORY, \"com.sun.jndi.rmi.registry.RegistryContextFactory\");\n env.put(Context.PROVIDER_URL, \"rmi://trusted-server:1099\");\n InitialContext ctx = new InitialContext(env);\n\n // BAD: User input used in lookup\n ctx.lookup(name);\n\n // GOOD: The name is validated before being used in lookup\n if (isValid(name)) {\n ctx.lookup(name);\n } else {\n // Reject the request\n }\n}\n```\n\n## References\n* Oracle: [Java Naming and Directory Interface (JNDI)](https://docs.oracle.com/javase/8/docs/technotes/guides/jndi/).\n* Black Hat materials: [A Journey from JNDI/LDAP Manipulation to Remote Code Execution Dream Land](https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE-wp.pdf).\n* Veracode: [Exploiting JNDI Injections in Java](https://www.veracode.com/blog/research/exploiting-jndi-injections-java).\n* Common Weakness Enumeration: [CWE-74](https://cwe.mitre.org/data/definitions/74.html).\n"},"properties":{"tags":["security","external/cwe/cwe-074","owasp-top10-2021","A03:2021 - Injection"],"description":"Performing a JNDI lookup with a user-controlled name can lead to the download of an untrusted\n object and to execution of arbitrary code.","id":"java/jndi-injection","kind":"path-problem","name":"JNDI lookup with user-controlled name","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/xslt-injection","name":"java/xslt-injection","shortDescription":{"text":"XSLT transformation with user-controlled stylesheet"},"fullDescription":{"text":"Performing an XSLT transformation with user-controlled stylesheets can lead to information disclosure or execution of arbitrary code."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# XSLT transformation with user-controlled stylesheet\nXSLT (Extensible Stylesheet Language Transformations) is a language for transforming XML documents into other XML documents or other formats. Processing unvalidated XSLT stylesheets can allow attackers to read arbitrary files from the filesystem or to execute arbitrary code.\n\n\n## Recommendation\nThe general recommendation is to not process untrusted XSLT stylesheets. If user-provided stylesheets must be processed, enable the secure processing mode.\n\n\n## Example\nIn the following examples, the code accepts an XSLT stylesheet from the user and processes it.\n\nIn the first example, the user-provided XSLT stylesheet is parsed and processed.\n\nIn the second example, secure processing mode is enabled.\n\n\n```java\nimport javax.xml.XMLConstants;\nimport javax.xml.transform.TransformerFactory;\nimport javax.xml.transform.stream.StreamResult;\nimport javax.xml.transform.stream.StreamSource;\n\npublic void transform(Socket socket, String inputXml) throws Exception {\n StreamSource xslt = new StreamSource(socket.getInputStream());\n StreamSource xml = new StreamSource(new StringReader(inputXml));\n StringWriter result = new StringWriter();\n TransformerFactory factory = TransformerFactory.newInstance();\n\n // BAD: User provided XSLT stylesheet is processed\n factory.newTransformer(xslt).transform(xml, new StreamResult(result));\n\n // GOOD: The secure processing mode is enabled\n factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);\n factory.newTransformer(xslt).transform(xml, new StreamResult(result));\n} \n```\n\n## References\n* Wikipedia: [XSLT](https://en.wikipedia.org/wiki/XSLT).\n* The Java Tutorials: [Transforming XML Data with XSLT](https://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html).\n* [XSLT Injection Basics](https://blog.hunniccyber.com/ektron-cms-remote-code-execution-xslt-transform-injection-java/).\n* Common Weakness Enumeration: [CWE-74](https://cwe.mitre.org/data/definitions/74.html).\n","markdown":"# XSLT transformation with user-controlled stylesheet\nXSLT (Extensible Stylesheet Language Transformations) is a language for transforming XML documents into other XML documents or other formats. Processing unvalidated XSLT stylesheets can allow attackers to read arbitrary files from the filesystem or to execute arbitrary code.\n\n\n## Recommendation\nThe general recommendation is to not process untrusted XSLT stylesheets. If user-provided stylesheets must be processed, enable the secure processing mode.\n\n\n## Example\nIn the following examples, the code accepts an XSLT stylesheet from the user and processes it.\n\nIn the first example, the user-provided XSLT stylesheet is parsed and processed.\n\nIn the second example, secure processing mode is enabled.\n\n\n```java\nimport javax.xml.XMLConstants;\nimport javax.xml.transform.TransformerFactory;\nimport javax.xml.transform.stream.StreamResult;\nimport javax.xml.transform.stream.StreamSource;\n\npublic void transform(Socket socket, String inputXml) throws Exception {\n StreamSource xslt = new StreamSource(socket.getInputStream());\n StreamSource xml = new StreamSource(new StringReader(inputXml));\n StringWriter result = new StringWriter();\n TransformerFactory factory = TransformerFactory.newInstance();\n\n // BAD: User provided XSLT stylesheet is processed\n factory.newTransformer(xslt).transform(xml, new StreamResult(result));\n\n // GOOD: The secure processing mode is enabled\n factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);\n factory.newTransformer(xslt).transform(xml, new StreamResult(result));\n} \n```\n\n## References\n* Wikipedia: [XSLT](https://en.wikipedia.org/wiki/XSLT).\n* The Java Tutorials: [Transforming XML Data with XSLT](https://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html).\n* [XSLT Injection Basics](https://blog.hunniccyber.com/ektron-cms-remote-code-execution-xslt-transform-injection-java/).\n* Common Weakness Enumeration: [CWE-74](https://cwe.mitre.org/data/definitions/74.html).\n"},"properties":{"tags":["security","external/cwe/cwe-074","owasp-top10-2021","A03:2021 - Injection"],"description":"Performing an XSLT transformation with user-controlled stylesheets can lead to\n information disclosure or execution of arbitrary code.","id":"java/xslt-injection","kind":"path-problem","name":"XSLT transformation with user-controlled stylesheet","precision":"high","problem.severity":"error","security-severity":"9.8"}},{"id":"java/unreleased-lock","name":"java/unreleased-lock","shortDescription":{"text":"Unreleased lock"},"fullDescription":{"text":"A lock that is acquired one or more times without a matching number of unlocks may cause a deadlock."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Unreleased lock\nWhen a thread acquires a lock it must make sure to unlock it again; failing to do so can lead to deadlocks. If a lock allows a thread to acquire it multiple times, for example `java.util.concurrent.locks.ReentrantLock`, then the number of locks must match the number of unlocks in order to fully release the lock.\n\n\n## Recommendation\nIt is recommended practice always to immediately follow a call to `lock` with a `try` block and place the call to `unlock` inside the `finally` block. Beware of calls inside the `finally` block that could cause exceptions, as this may result in skipping the call to `unlock`.\n\n\n## Example\nThe typical pattern for using locks safely looks like this:\n\n\n```java\npublic void m() {\n lock.lock();\n // A\n try {\n // ... method body\n } finally {\n // B\n lock.unlock();\n }\n}\n```\nIf any code that can cause a premature method exit (for example by throwing an exception) is inserted at either point `A` or `B` then the method might not unlock, so this should be avoided.\n\n\n## References\n* Java API Specification: [java.util.concurrent.locks.Lock](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/Lock.html), [java.util.concurrent.locks.ReentrantLock](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/ReentrantLock.html).\n* Common Weakness Enumeration: [CWE-764](https://cwe.mitre.org/data/definitions/764.html).\n* Common Weakness Enumeration: [CWE-833](https://cwe.mitre.org/data/definitions/833.html).\n","markdown":"# Unreleased lock\nWhen a thread acquires a lock it must make sure to unlock it again; failing to do so can lead to deadlocks. If a lock allows a thread to acquire it multiple times, for example `java.util.concurrent.locks.ReentrantLock`, then the number of locks must match the number of unlocks in order to fully release the lock.\n\n\n## Recommendation\nIt is recommended practice always to immediately follow a call to `lock` with a `try` block and place the call to `unlock` inside the `finally` block. Beware of calls inside the `finally` block that could cause exceptions, as this may result in skipping the call to `unlock`.\n\n\n## Example\nThe typical pattern for using locks safely looks like this:\n\n\n```java\npublic void m() {\n lock.lock();\n // A\n try {\n // ... method body\n } finally {\n // B\n lock.unlock();\n }\n}\n```\nIf any code that can cause a premature method exit (for example by throwing an exception) is inserted at either point `A` or `B` then the method might not unlock, so this should be avoided.\n\n\n## References\n* Java API Specification: [java.util.concurrent.locks.Lock](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/Lock.html), [java.util.concurrent.locks.ReentrantLock](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/locks/ReentrantLock.html).\n* Common Weakness Enumeration: [CWE-764](https://cwe.mitre.org/data/definitions/764.html).\n* Common Weakness Enumeration: [CWE-833](https://cwe.mitre.org/data/definitions/833.html).\n"},"properties":{"tags":["reliability","security","external/cwe/cwe-764","external/cwe/cwe-833"],"description":"A lock that is acquired one or more times without a matching number of unlocks\n may cause a deadlock.","id":"java/unreleased-lock","kind":"problem","name":"Unreleased lock","precision":"medium","problem.severity":"error","security-severity":"5.0"}},{"id":"java/unsafe-cert-trust","name":"java/unsafe-cert-trust","shortDescription":{"text":"Unsafe certificate trust"},"fullDescription":{"text":"SSLSocket/SSLEngine ignores all SSL certificate validation errors when establishing an HTTPS connection, thereby making the app vulnerable to man-in-the-middle attacks."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Unsafe certificate trust\nJava offers two mechanisms for SSL authentication - trust manager and hostname verifier (the later is checked by the `java/insecure-hostname-verifier` query). The trust manager validates the peer's certificate chain while hostname verification establishes that the hostname in the URL matches the hostname in the server's identification.\n\nWhen `SSLSocket` or `SSLEngine` are created without a secure `setEndpointIdentificationAlgorithm`, hostname verification is disabled by default.\n\nThis query checks whether `setEndpointIdentificationAlgorithm` is missing, thereby making the application vulnerable to man-in-the-middle attacks. The query also covers insecure configurations of `com.rabbitmq.client.ConnectionFactory`.\n\n\n## Recommendation\nValidate SSL certificates in SSL authentication.\n\n\n## Example\nThe following two examples show two ways of configuring SSLSocket/SSLEngine. In the 'BAD' case, `setEndpointIdentificationAlgorithm` is not called, thus no hostname verification takes place. In the 'GOOD' case, `setEndpointIdentificationAlgorithm` is called.\n\n\n```java\npublic static void main(String[] args) {\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tSSLEngine sslEngine = sslContext.createSSLEngine();\n\t\tSSLParameters sslParameters = sslEngine.getSSLParameters();\n\t\tsslParameters.setEndpointIdentificationAlgorithm(\"HTTPS\"); //GOOD: Set a valid endpointIdentificationAlgorithm for SSL engine to trigger hostname verification\n\t\tsslEngine.setSSLParameters(sslParameters);\n\t}\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tSSLEngine sslEngine = sslContext.createSSLEngine(); //BAD: No endpointIdentificationAlgorithm set\n\t}\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tfinal SSLSocketFactory socketFactory = sslContext.getSocketFactory();\n\t\tSSLSocket socket = (SSLSocket) socketFactory.createSocket(\"www.example.com\", 443); \n\t\tSSLParameters sslParameters = sslEngine.getSSLParameters();\n\t\tsslParameters.setEndpointIdentificationAlgorithm(\"HTTPS\"); //GOOD: Set a valid endpointIdentificationAlgorithm for SSL socket to trigger hostname verification\n\t\tsocket.setSSLParameters(sslParameters);\n\t}\n\n\t{\n\t\tcom.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();\n\t\tconnectionFactory.useSslProtocol();\n\t\tconnectionFactory.enableHostnameVerification(); //GOOD: Enable hostname verification for rabbitmq ConnectionFactory\n\t}\n\n\t{\n\t\tcom.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();\n\t\tconnectionFactory.useSslProtocol(); //BAD: Hostname verification for rabbitmq ConnectionFactory is not enabled\n\t}\n}\n```\n\n## References\n* [Testing Endpoint Identify Verification (MSTG-NETWORK-3)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05g-Testing-Network-Communication.md).\n* [SSLParameters.setEndpointIdentificationAlgorithm documentation](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/javax/net/ssl/SSLParameters.html#setEndpointIdentificationAlgorithm(java.lang.String)).\n* RabbitMQ: [ConnectionFactory.enableHostnameVerification documentation](https://rabbitmq.github.io/rabbitmq-java-client/api/current/com/rabbitmq/client/ConnectionFactory.html#enableHostnameVerification()).\n* RabbitMQ: [Using TLS in the Java Client](https://www.rabbitmq.com/ssl.html#java-client).\n* [CVE-2018-17187: Apache Qpid Proton-J transport issue with hostname verification](https://github.com/advisories/GHSA-xvch-r4wf-h8w9).\n* [CVE-2018-8034: Apache Tomcat - host name verification when using TLS with the WebSocket client](https://github.com/advisories/GHSA-46j3-r4pj-4835).\n* [CVE-2018-11087: Pivotal Spring AMQP vulnerability due to lack of hostname validation](https://github.com/advisories/GHSA-w4g2-9hj6-5472).\n* [CVE-2018-11775: TLS hostname verification issue when using the Apache ActiveMQ Client](https://github.com/advisories/GHSA-m9w8-v359-9ffr).\n* Common Weakness Enumeration: [CWE-273](https://cwe.mitre.org/data/definitions/273.html).\n","markdown":"# Unsafe certificate trust\nJava offers two mechanisms for SSL authentication - trust manager and hostname verifier (the later is checked by the `java/insecure-hostname-verifier` query). The trust manager validates the peer's certificate chain while hostname verification establishes that the hostname in the URL matches the hostname in the server's identification.\n\nWhen `SSLSocket` or `SSLEngine` are created without a secure `setEndpointIdentificationAlgorithm`, hostname verification is disabled by default.\n\nThis query checks whether `setEndpointIdentificationAlgorithm` is missing, thereby making the application vulnerable to man-in-the-middle attacks. The query also covers insecure configurations of `com.rabbitmq.client.ConnectionFactory`.\n\n\n## Recommendation\nValidate SSL certificates in SSL authentication.\n\n\n## Example\nThe following two examples show two ways of configuring SSLSocket/SSLEngine. In the 'BAD' case, `setEndpointIdentificationAlgorithm` is not called, thus no hostname verification takes place. In the 'GOOD' case, `setEndpointIdentificationAlgorithm` is called.\n\n\n```java\npublic static void main(String[] args) {\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tSSLEngine sslEngine = sslContext.createSSLEngine();\n\t\tSSLParameters sslParameters = sslEngine.getSSLParameters();\n\t\tsslParameters.setEndpointIdentificationAlgorithm(\"HTTPS\"); //GOOD: Set a valid endpointIdentificationAlgorithm for SSL engine to trigger hostname verification\n\t\tsslEngine.setSSLParameters(sslParameters);\n\t}\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tSSLEngine sslEngine = sslContext.createSSLEngine(); //BAD: No endpointIdentificationAlgorithm set\n\t}\n\n\t{\n\t\tSSLContext sslContext = SSLContext.getInstance(\"TLS\");\n\t\tfinal SSLSocketFactory socketFactory = sslContext.getSocketFactory();\n\t\tSSLSocket socket = (SSLSocket) socketFactory.createSocket(\"www.example.com\", 443); \n\t\tSSLParameters sslParameters = sslEngine.getSSLParameters();\n\t\tsslParameters.setEndpointIdentificationAlgorithm(\"HTTPS\"); //GOOD: Set a valid endpointIdentificationAlgorithm for SSL socket to trigger hostname verification\n\t\tsocket.setSSLParameters(sslParameters);\n\t}\n\n\t{\n\t\tcom.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();\n\t\tconnectionFactory.useSslProtocol();\n\t\tconnectionFactory.enableHostnameVerification(); //GOOD: Enable hostname verification for rabbitmq ConnectionFactory\n\t}\n\n\t{\n\t\tcom.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();\n\t\tconnectionFactory.useSslProtocol(); //BAD: Hostname verification for rabbitmq ConnectionFactory is not enabled\n\t}\n}\n```\n\n## References\n* [Testing Endpoint Identify Verification (MSTG-NETWORK-3)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05g-Testing-Network-Communication.md).\n* [SSLParameters.setEndpointIdentificationAlgorithm documentation](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/javax/net/ssl/SSLParameters.html#setEndpointIdentificationAlgorithm(java.lang.String)).\n* RabbitMQ: [ConnectionFactory.enableHostnameVerification documentation](https://rabbitmq.github.io/rabbitmq-java-client/api/current/com/rabbitmq/client/ConnectionFactory.html#enableHostnameVerification()).\n* RabbitMQ: [Using TLS in the Java Client](https://www.rabbitmq.com/ssl.html#java-client).\n* [CVE-2018-17187: Apache Qpid Proton-J transport issue with hostname verification](https://github.com/advisories/GHSA-xvch-r4wf-h8w9).\n* [CVE-2018-8034: Apache Tomcat - host name verification when using TLS with the WebSocket client](https://github.com/advisories/GHSA-46j3-r4pj-4835).\n* [CVE-2018-11087: Pivotal Spring AMQP vulnerability due to lack of hostname validation](https://github.com/advisories/GHSA-w4g2-9hj6-5472).\n* [CVE-2018-11775: TLS hostname verification issue when using the Apache ActiveMQ Client](https://github.com/advisories/GHSA-m9w8-v359-9ffr).\n* Common Weakness Enumeration: [CWE-273](https://cwe.mitre.org/data/definitions/273.html).\n"},"properties":{"tags":["security","external/cwe/cwe-273"],"description":"SSLSocket/SSLEngine ignores all SSL certificate validation\n errors when establishing an HTTPS connection, thereby making\n the app vulnerable to man-in-the-middle attacks.","id":"java/unsafe-cert-trust","kind":"problem","name":"Unsafe certificate trust","precision":"medium","problem.severity":"warning","security-severity":"9.8"}},{"id":"java/user-controlled-bypass","name":"java/user-controlled-bypass","shortDescription":{"text":"User-controlled bypass of sensitive method"},"fullDescription":{"text":"User-controlled bypassing of sensitive methods may allow attackers to avoid passing through authentication systems."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# User-controlled bypass of sensitive method\nMany Java constructs enable code statements to be executed conditionally, for example `if` statements and `for` statements. If these statements contain important authentication or login code, and the decision about whether to execute this code is based on user-controlled data, it may be possible for an attacker to bypass security systems by preventing this code from executing.\n\n\n## Recommendation\nNever decide whether to authenticate a user based on data that may be controlled by that user. If necessary, ensure that the data is validated extensively when it is input before any authentication checks are performed.\n\nIt is still possible to have a system that \"remembers\" users, thus not requiring the user to login on every interaction. For example, personalization settings can be applied without authentication because this is not sensitive information. However, users should be allowed to take sensitive actions only when they have been fully authenticated.\n\n\n## Example\nThis example shows two ways of deciding whether to authenticate a user. The first way shows a decision that is based on the value of a cookie. Cookies can be easily controlled by the user, and so this allows a user to become authenticated without providing valid credentials. The second, more secure way shows a decision that is based on looking up the user in a security database.\n\n\n```java\npublic boolean doLogin(String user, String password) {\n\tCookie adminCookie = getCookies()[0];\n\n\t// BAD: login is executed only if the value of 'adminCookie' is 'false', \n\t// but 'adminCookie' is controlled by the user\n\tif(adminCookie.getValue()==\"false\")\n\t\treturn login(user, password);\n\t\n\treturn true;\n}\n\npublic boolean doLogin(String user, String password) {\n\tCookie adminCookie = getCookies()[0];\n\t\n\t// GOOD: use server-side information based on the credentials to decide\n\t// whether user has privileges\n\tboolean isAdmin = queryDbForAdminStatus(user, password);\n\tif(!isAdmin)\n\t\treturn login(user, password);\n\t\n\treturn true;\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SEC02-J. Do not base security checks on untrusted sources](https://wiki.sei.cmu.edu/confluence/display/java/SEC02-J.+Do+not+base+security+checks+on+untrusted+sources).\n* Common Weakness Enumeration: [CWE-807](https://cwe.mitre.org/data/definitions/807.html).\n* Common Weakness Enumeration: [CWE-290](https://cwe.mitre.org/data/definitions/290.html).\n","markdown":"# User-controlled bypass of sensitive method\nMany Java constructs enable code statements to be executed conditionally, for example `if` statements and `for` statements. If these statements contain important authentication or login code, and the decision about whether to execute this code is based on user-controlled data, it may be possible for an attacker to bypass security systems by preventing this code from executing.\n\n\n## Recommendation\nNever decide whether to authenticate a user based on data that may be controlled by that user. If necessary, ensure that the data is validated extensively when it is input before any authentication checks are performed.\n\nIt is still possible to have a system that \"remembers\" users, thus not requiring the user to login on every interaction. For example, personalization settings can be applied without authentication because this is not sensitive information. However, users should be allowed to take sensitive actions only when they have been fully authenticated.\n\n\n## Example\nThis example shows two ways of deciding whether to authenticate a user. The first way shows a decision that is based on the value of a cookie. Cookies can be easily controlled by the user, and so this allows a user to become authenticated without providing valid credentials. The second, more secure way shows a decision that is based on looking up the user in a security database.\n\n\n```java\npublic boolean doLogin(String user, String password) {\n\tCookie adminCookie = getCookies()[0];\n\n\t// BAD: login is executed only if the value of 'adminCookie' is 'false', \n\t// but 'adminCookie' is controlled by the user\n\tif(adminCookie.getValue()==\"false\")\n\t\treturn login(user, password);\n\t\n\treturn true;\n}\n\npublic boolean doLogin(String user, String password) {\n\tCookie adminCookie = getCookies()[0];\n\t\n\t// GOOD: use server-side information based on the credentials to decide\n\t// whether user has privileges\n\tboolean isAdmin = queryDbForAdminStatus(user, password);\n\tif(!isAdmin)\n\t\treturn login(user, password);\n\t\n\treturn true;\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SEC02-J. Do not base security checks on untrusted sources](https://wiki.sei.cmu.edu/confluence/display/java/SEC02-J.+Do+not+base+security+checks+on+untrusted+sources).\n* Common Weakness Enumeration: [CWE-807](https://cwe.mitre.org/data/definitions/807.html).\n* Common Weakness Enumeration: [CWE-290](https://cwe.mitre.org/data/definitions/290.html).\n"},"properties":{"tags":["security","external/cwe/cwe-807","external/cwe/cwe-290","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"User-controlled bypassing of sensitive methods may allow attackers to avoid\n passing through authentication systems.","id":"java/user-controlled-bypass","kind":"path-problem","name":"User-controlled bypass of sensitive method","precision":"medium","problem.severity":"error","security-severity":"7.8"}},{"id":"java/cleartext-storage-in-properties","name":"java/cleartext-storage-in-properties","shortDescription":{"text":"Cleartext storage of sensitive information using 'Properties' class"},"fullDescription":{"text":"Storing sensitive information in cleartext can expose it to an attacker."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Cleartext storage of sensitive information using 'Properties' class\nSensitive information that is stored unencrypted is accessible to an attacker who gains access to the storage.\n\n\n## Recommendation\nEnsure that sensitive information is always encrypted before being stored. It may be wise to encrypt information before it is put into a heap data structure (such as `Java.util.Properties`) that may be written to disk later. Objects that are serializable or marshallable should also always contain encrypted information unless you are certain that they are not ever going to be serialized.\n\nIn general, decrypt sensitive information only at the point where it is necessary for it to be used in cleartext.\n\n\n## Example\nThe following example shows two ways of storing user credentials in a cookie. In the 'BAD' case, the credentials are simply stored in cleartext. In the 'GOOD' case, the credentials are hashed before storing them.\n\n\n```java\npublic static void main(String[] args) {\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"BP@ssw0rd\".toCharArray());\n\t\tdata = credentials.getUserName() + \":\" + new String(credentials.getPassword());\n\t\n\t\t// BAD: store data in a cookie in cleartext form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n\t\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"GP@ssw0rd\".toCharArray());\n\t\tString salt = \"ThisIsMySalt\";\n\t\tMessageDigest messageDigest = MessageDigest.getInstance(\"SHA-512\");\n\t\tmessageDigest.reset();\n\t\tString credentialsToHash =\n\t\t\t\tcredentials.getUserName() + \":\" + credentials.getPassword();\n\t\tbyte[] hashedCredsAsBytes =\n\t\t\t\tmessageDigest.digest((salt+credentialsToHash).getBytes(\"UTF-8\"));\n\t\tdata = bytesToString(hashedCredsAsBytes);\n\t\t\n\t\t// GOOD: store data in a cookie in encrypted form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n}\n\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* M. Dowd, J. McDonald and J. Schuhm, *The Art of Software Security Assessment*, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.\n* M. Howard and D. LeBlanc, *Writing Secure Code*, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.\n* Common Weakness Enumeration: [CWE-313](https://cwe.mitre.org/data/definitions/313.html).\n","markdown":"# Cleartext storage of sensitive information using 'Properties' class\nSensitive information that is stored unencrypted is accessible to an attacker who gains access to the storage.\n\n\n## Recommendation\nEnsure that sensitive information is always encrypted before being stored. It may be wise to encrypt information before it is put into a heap data structure (such as `Java.util.Properties`) that may be written to disk later. Objects that are serializable or marshallable should also always contain encrypted information unless you are certain that they are not ever going to be serialized.\n\nIn general, decrypt sensitive information only at the point where it is necessary for it to be used in cleartext.\n\n\n## Example\nThe following example shows two ways of storing user credentials in a cookie. In the 'BAD' case, the credentials are simply stored in cleartext. In the 'GOOD' case, the credentials are hashed before storing them.\n\n\n```java\npublic static void main(String[] args) {\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"BP@ssw0rd\".toCharArray());\n\t\tdata = credentials.getUserName() + \":\" + new String(credentials.getPassword());\n\t\n\t\t// BAD: store data in a cookie in cleartext form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n\t\n\t{\n\t\tString data;\n\t\tPasswordAuthentication credentials =\n\t\t\t\tnew PasswordAuthentication(\"user\", \"GP@ssw0rd\".toCharArray());\n\t\tString salt = \"ThisIsMySalt\";\n\t\tMessageDigest messageDigest = MessageDigest.getInstance(\"SHA-512\");\n\t\tmessageDigest.reset();\n\t\tString credentialsToHash =\n\t\t\t\tcredentials.getUserName() + \":\" + credentials.getPassword();\n\t\tbyte[] hashedCredsAsBytes =\n\t\t\t\tmessageDigest.digest((salt+credentialsToHash).getBytes(\"UTF-8\"));\n\t\tdata = bytesToString(hashedCredsAsBytes);\n\t\t\n\t\t// GOOD: store data in a cookie in encrypted form\n\t\tresponse.addCookie(new Cookie(\"auth\", data));\n\t}\n}\n\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [SER03-J. Do not serialize unencrypted, sensitive data](https://wiki.sei.cmu.edu/confluence/display/java/SER03-J.+Do+not+serialize+unencrypted+sensitive+data).\n* M. Dowd, J. McDonald and J. Schuhm, *The Art of Software Security Assessment*, 1st Edition, Chapter 2 - 'Common Vulnerabilities of Encryption', p. 43. Addison Wesley, 2006.\n* M. Howard and D. LeBlanc, *Writing Secure Code*, 2nd Edition, Chapter 9 - 'Protecting Secret Data', p. 299. Microsoft, 2002.\n* Common Weakness Enumeration: [CWE-313](https://cwe.mitre.org/data/definitions/313.html).\n"},"properties":{"tags":["security","external/cwe/cwe-313","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Storing sensitive information in cleartext can expose it to an attacker.","id":"java/cleartext-storage-in-properties","kind":"problem","name":"Cleartext storage of sensitive information using 'Properties' class","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/android/cleartext-storage-filesystem","name":"java/android/cleartext-storage-filesystem","shortDescription":{"text":"Cleartext storage of sensitive information in the Android filesystem"},"fullDescription":{"text":"Cleartext storage of sensitive information in the Android filesystem allows access for users with root privileges or unexpected exposure from chained vulnerabilities."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Cleartext storage of sensitive information in the Android filesystem\nAndroid applications with the appropriate permissions can write files either to the device external storage or the application internal storage, depending on the application's needs. However, sensitive information should not be saved in cleartext. Otherwise it can be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nConsider using the `EncryptedFile` class to work with files containing sensitive data. Alternatively, use encryption algorithms to encrypt the sensitive data being stored.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext using a local file.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the filesystem.\n\n\n```java\npublic void fileSystemStorageUnsafe(String name, String password) {\n\t// BAD - sensitive data stored in cleartext\n FileWriter fw = new FileWriter(\"some_file.txt\");\n fw.write(name + \":\" + password);\n fw.close();\n}\n\npublic void filesystemStorageEncryptedFileSafe(Context context, String name, String password) {\n\t// GOOD - the whole file is encrypted with androidx.security.crypto.EncryptedFile\n File file = new File(\"some_file.txt\");\n String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);\n EncryptedFile encryptedFile = new EncryptedFile.Builder(\n file,\n context,\n masterKeyAlias,\n EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB\n ).build();\n\tFileOutputStream encryptedOutputStream = encryptedFile.openFileOutput();\n\tencryptedOutputStream.write(name + \":\" + password);\n}\n\npublic void fileSystemStorageSafe(String name, String password) {\n\t// GOOD - sensitive data is encrypted using a custom method\n FileWriter fw = new FileWriter(\"some_file.txt\");\n fw.write(name + \":\" + encrypt(password));\n fw.close();\n}\n\nprivate static String encrypt(String cleartext) {\n // Use an encryption or strong hashing algorithm in the real world.\n // The example below just returns a SHA-256 hash.\n MessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n byte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n String encoded = Base64.getEncoder().encodeToString(hash);\n return encoded;\n}\n\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* Android Developers: [EncryptedFile](https://developer.android.com/reference/androidx/security/crypto/EncryptedFile)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n","markdown":"# Cleartext storage of sensitive information in the Android filesystem\nAndroid applications with the appropriate permissions can write files either to the device external storage or the application internal storage, depending on the application's needs. However, sensitive information should not be saved in cleartext. Otherwise it can be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nConsider using the `EncryptedFile` class to work with files containing sensitive data. Alternatively, use encryption algorithms to encrypt the sensitive data being stored.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext using a local file.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the filesystem.\n\n\n```java\npublic void fileSystemStorageUnsafe(String name, String password) {\n\t// BAD - sensitive data stored in cleartext\n FileWriter fw = new FileWriter(\"some_file.txt\");\n fw.write(name + \":\" + password);\n fw.close();\n}\n\npublic void filesystemStorageEncryptedFileSafe(Context context, String name, String password) {\n\t// GOOD - the whole file is encrypted with androidx.security.crypto.EncryptedFile\n File file = new File(\"some_file.txt\");\n String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);\n EncryptedFile encryptedFile = new EncryptedFile.Builder(\n file,\n context,\n masterKeyAlias,\n EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB\n ).build();\n\tFileOutputStream encryptedOutputStream = encryptedFile.openFileOutput();\n\tencryptedOutputStream.write(name + \":\" + password);\n}\n\npublic void fileSystemStorageSafe(String name, String password) {\n\t// GOOD - sensitive data is encrypted using a custom method\n FileWriter fw = new FileWriter(\"some_file.txt\");\n fw.write(name + \":\" + encrypt(password));\n fw.close();\n}\n\nprivate static String encrypt(String cleartext) {\n // Use an encryption or strong hashing algorithm in the real world.\n // The example below just returns a SHA-256 hash.\n MessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n byte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n String encoded = Base64.getEncoder().encodeToString(hash);\n return encoded;\n}\n\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* Android Developers: [EncryptedFile](https://developer.android.com/reference/androidx/security/crypto/EncryptedFile)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n"},"properties":{"tags":["security","external/cwe/cwe-312","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Cleartext storage of sensitive information in the Android filesystem\n allows access for users with root privileges or unexpected exposure\n from chained vulnerabilities.","id":"java/android/cleartext-storage-filesystem","kind":"problem","name":"Cleartext storage of sensitive information in the Android filesystem","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/android/cleartext-storage-shared-prefs","name":"java/android/cleartext-storage-shared-prefs","shortDescription":{"text":"Cleartext storage of sensitive information using `SharedPreferences` on Android"},"fullDescription":{"text":"Cleartext Storage of Sensitive Information using SharedPreferences on Android allows access for users with root privileges or unexpected exposure from chained vulnerabilities."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Cleartext storage of sensitive information using `SharedPreferences` on Android\n`SharedPreferences` is an Android API that stores application preferences using simple sets of data values. It allows you to easily save, alter, and retrieve the values stored in a user's profile. However, sensitive information should not be saved in cleartext. Otherwise it can be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nUse the `EncryptedSharedPreferences` API or other encryption algorithms for storing sensitive information.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the device.\n\n\n```java\npublic void testSetSharedPrefs(Context context, String name, String password)\n{\n\t{\n\t\t// BAD - sensitive information saved in cleartext.\n\t\tSharedPreferences sharedPrefs = context.getSharedPreferences(\"user_prefs\", Context.MODE_PRIVATE);\n\t\tEditor editor = sharedPrefs.edit();\n\t\teditor.putString(\"name\", name);\n\t\teditor.putString(\"password\", password);\n\t\teditor.commit();\n\t}\n\n\t{\n\t\t// GOOD - save sensitive information encrypted with a custom method.\n\t\tSharedPreferences sharedPrefs = context.getSharedPreferences(\"user_prefs\", Context.MODE_PRIVATE);\n\t\tEditor editor = sharedPrefs.edit();\n\t\teditor.putString(\"name\", encrypt(name));\n\t\teditor.putString(\"password\", encrypt(password));\n\t\teditor.commit();\n\t}\n\n\t{\n\t\t// GOOD - sensitive information saved using the built-in `EncryptedSharedPreferences` class in androidx.\n\t\tMasterKey masterKey = new MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)\n\t\t\t.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)\n\t\t\t.build();\n\n\t\tSharedPreferences sharedPreferences = EncryptedSharedPreferences.create(\n\t\t\tcontext,\n\t\t\t\"secret_shared_prefs\",\n\t\t\tmasterKey,\n\t\t\tEncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,\n\t\t\tEncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);\n\n\t\tSharedPreferences.Editor editor = sharedPreferences.edit();\n\t\teditor.putString(\"name\", name);\n\t\teditor.putString(\"password\", password);\n\t\teditor.commit();\n\t}\n}\n\nprivate static String encrypt(String cleartext) throws Exception {\n\t// Use an encryption or hashing algorithm in real world. The demo below just returns its\n\t// hash.\n\tMessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n\tbyte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n\tString encoded = Base64.getEncoder().encodeToString(hash);\n\treturn encoded;\n}\n\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* ProAndroidDev: [Encrypted Preferences in Android](https://proandroiddev.com/encrypted-preferences-in-android-af57a89af7c8)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n","markdown":"# Cleartext storage of sensitive information using `SharedPreferences` on Android\n`SharedPreferences` is an Android API that stores application preferences using simple sets of data values. It allows you to easily save, alter, and retrieve the values stored in a user's profile. However, sensitive information should not be saved in cleartext. Otherwise it can be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nUse the `EncryptedSharedPreferences` API or other encryption algorithms for storing sensitive information.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the device.\n\n\n```java\npublic void testSetSharedPrefs(Context context, String name, String password)\n{\n\t{\n\t\t// BAD - sensitive information saved in cleartext.\n\t\tSharedPreferences sharedPrefs = context.getSharedPreferences(\"user_prefs\", Context.MODE_PRIVATE);\n\t\tEditor editor = sharedPrefs.edit();\n\t\teditor.putString(\"name\", name);\n\t\teditor.putString(\"password\", password);\n\t\teditor.commit();\n\t}\n\n\t{\n\t\t// GOOD - save sensitive information encrypted with a custom method.\n\t\tSharedPreferences sharedPrefs = context.getSharedPreferences(\"user_prefs\", Context.MODE_PRIVATE);\n\t\tEditor editor = sharedPrefs.edit();\n\t\teditor.putString(\"name\", encrypt(name));\n\t\teditor.putString(\"password\", encrypt(password));\n\t\teditor.commit();\n\t}\n\n\t{\n\t\t// GOOD - sensitive information saved using the built-in `EncryptedSharedPreferences` class in androidx.\n\t\tMasterKey masterKey = new MasterKey.Builder(context, MasterKey.DEFAULT_MASTER_KEY_ALIAS)\n\t\t\t.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)\n\t\t\t.build();\n\n\t\tSharedPreferences sharedPreferences = EncryptedSharedPreferences.create(\n\t\t\tcontext,\n\t\t\t\"secret_shared_prefs\",\n\t\t\tmasterKey,\n\t\t\tEncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,\n\t\t\tEncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);\n\n\t\tSharedPreferences.Editor editor = sharedPreferences.edit();\n\t\teditor.putString(\"name\", name);\n\t\teditor.putString(\"password\", password);\n\t\teditor.commit();\n\t}\n}\n\nprivate static String encrypt(String cleartext) throws Exception {\n\t// Use an encryption or hashing algorithm in real world. The demo below just returns its\n\t// hash.\n\tMessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n\tbyte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n\tString encoded = Base64.getEncoder().encodeToString(hash);\n\treturn encoded;\n}\n\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* ProAndroidDev: [Encrypted Preferences in Android](https://proandroiddev.com/encrypted-preferences-in-android-af57a89af7c8)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n"},"properties":{"tags":["security","external/cwe/cwe-312","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Cleartext Storage of Sensitive Information using\n SharedPreferences on Android allows access for users with root\n privileges or unexpected exposure from chained vulnerabilities.","id":"java/android/cleartext-storage-shared-prefs","kind":"problem","name":"Cleartext storage of sensitive information using `SharedPreferences` on Android","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/android/cleartext-storage-database","name":"java/android/cleartext-storage-database","shortDescription":{"text":"Cleartext storage of sensitive information using a local database on Android"},"fullDescription":{"text":"Cleartext Storage of Sensitive Information using a local database on Android allows access for users with root privileges or unexpected exposure from chained vulnerabilities."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Cleartext storage of sensitive information using a local database on Android\nSQLite is a lightweight database engine commonly used in Android devices to store data. By itself, SQLite does not offer any encryption mechanism by default and stores all data in cleartext, which introduces a risk if sensitive data like credentials, authentication tokens or personal identifiable information (PII) are directly stored in a SQLite database. The information could be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nUse `SQLCipher` or similar libraries to add encryption capabilities to SQLite. Alternatively, encrypt sensitive data using cryptographically secure algorithms before storing it in the database.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the database.\n\n\n```java\npublic void sqliteStorageUnsafe(Context ctx, String name, String password) {\n\t// BAD - sensitive information saved in cleartext.\n\tSQLiteDatabase db = ctx.openOrCreateDatabase(\"test\", Context.MODE_PRIVATE, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, password});\n}\n\npublic void sqliteStorageSafe(Context ctx, String name, String password) {\n\t// GOOD - sensitive information encrypted with a custom method.\n\tSQLiteDatabase db = ctx.openOrCreateDatabase(\"test\", Context.MODE_PRIVATE, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, encrypt(password)});\n}\n\npublic void sqlCipherStorageSafe(String name, String password, String databasePassword) {\n\t// GOOD - sensitive information saved using SQLCipher.\n\tnet.sqlcipher.database.SQLiteDatabase db = \n\t\tnet.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(\"test\", databasePassword, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, password});\n}\n\nprivate static String encrypt(String cleartext) {\n // Use an encryption or strong hashing algorithm in the real world.\n // The example below just returns a SHA-256 hash.\n MessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n byte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n String encoded = Base64.getEncoder().encodeToString(hash);\n return encoded;\n}\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* SQLCipher: [Android Application Integration](https://www.zetetic.net/sqlcipher/sqlcipher-for-android/)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n","markdown":"# Cleartext storage of sensitive information using a local database on Android\nSQLite is a lightweight database engine commonly used in Android devices to store data. By itself, SQLite does not offer any encryption mechanism by default and stores all data in cleartext, which introduces a risk if sensitive data like credentials, authentication tokens or personal identifiable information (PII) are directly stored in a SQLite database. The information could be accessed by any process or user in rooted devices, or can be disclosed through chained vulnerabilities, like unexpected access to the private storage through exposed components.\n\n\n## Recommendation\nUse `SQLCipher` or similar libraries to add encryption capabilities to SQLite. Alternatively, encrypt sensitive data using cryptographically secure algorithms before storing it in the database.\n\n\n## Example\nIn the first example, sensitive user information is stored in cleartext.\n\nIn the second and third examples, the code encrypts sensitive information before saving it to the database.\n\n\n```java\npublic void sqliteStorageUnsafe(Context ctx, String name, String password) {\n\t// BAD - sensitive information saved in cleartext.\n\tSQLiteDatabase db = ctx.openOrCreateDatabase(\"test\", Context.MODE_PRIVATE, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, password});\n}\n\npublic void sqliteStorageSafe(Context ctx, String name, String password) {\n\t// GOOD - sensitive information encrypted with a custom method.\n\tSQLiteDatabase db = ctx.openOrCreateDatabase(\"test\", Context.MODE_PRIVATE, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, encrypt(password)});\n}\n\npublic void sqlCipherStorageSafe(String name, String password, String databasePassword) {\n\t// GOOD - sensitive information saved using SQLCipher.\n\tnet.sqlcipher.database.SQLiteDatabase db = \n\t\tnet.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(\"test\", databasePassword, null);\n\tdb.execSQL(\"INSERT INTO users VALUES (?, ?)\", new String[] {name, password});\n}\n\nprivate static String encrypt(String cleartext) {\n // Use an encryption or strong hashing algorithm in the real world.\n // The example below just returns a SHA-256 hash.\n MessageDigest digest = MessageDigest.getInstance(\"SHA-256\");\n byte[] hash = digest.digest(cleartext.getBytes(StandardCharsets.UTF_8));\n String encoded = Base64.getEncoder().encodeToString(hash);\n return encoded;\n}\n```\n\n## References\n* Android Developers: [Work with data more securely](https://developer.android.com/topic/security/data)\n* SQLCipher: [Android Application Integration](https://www.zetetic.net/sqlcipher/sqlcipher-for-android/)\n* Common Weakness Enumeration: [CWE-312](https://cwe.mitre.org/data/definitions/312.html).\n"},"properties":{"tags":["security","external/cwe/cwe-312","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Cleartext Storage of Sensitive Information using\n a local database on Android allows access for users with root\n privileges or unexpected exposure from chained vulnerabilities.","id":"java/android/cleartext-storage-database","kind":"problem","name":"Cleartext storage of sensitive information using a local database on Android","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/socket-auth-race-condition","name":"java/socket-auth-race-condition","shortDescription":{"text":"Race condition in socket authentication"},"fullDescription":{"text":"Opening a socket after authenticating via a different channel may allow an attacker to connect to the port first."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Race condition in socket authentication\nA common pattern is to have a channel of communication open with a user, and then to open another channel, for example to transfer data. However, if user authentication is done over the original channel rather than the alternate channel, then an attacker may be able to connect to the alternate channel before the legitimate user does. This allows the attacker to impersonate the user by \"piggybacking\" on any previous authentication.\n\n\n## Recommendation\nWhen opening an alternate channel for an authenticated user (for example, a Java `Socket`), always authenticate the user over the new channel.\n\n\n## Example\nThis example shows two ways of opening a connection for a user. In the first example, authentication is determined based on materials that the user has already provided (for example, their username and/or password), and then a new channel is opened. However, no authentication is done over the new channel, and so an attacker could connect to it before the user connects.\n\nIn the second example, authentication is done over the socket channel itself, which verifies that the newly connected user is in fact the user that was expected.\n\n\n```java\npublic void doConnect(int desiredPort, String username) {\n\tServerSocket listenSocket = new ServerSocket(desiredPort);\n\n\tif (isAuthenticated(username)) {\n\t\tSocket connection1 = listenSocket.accept();\n\t\t// BAD: no authentication over the socket connection\n\t\tconnection1.getOutputStream().write(secretData);\n\t}\n}\n\npublic void doConnect(int desiredPort, String username) {\n\tServerSocket listenSocket = new ServerSocket(desiredPort);\n\n\tSocket connection2 = listenSocket.accept();\n\t// GOOD: authentication happens over the socket\n\tif (doAuthenticate(connection2, username)) {\n\t\tconnection2.getOutputStream().write(secretData);\n\t}\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-421](https://cwe.mitre.org/data/definitions/421.html).\n","markdown":"# Race condition in socket authentication\nA common pattern is to have a channel of communication open with a user, and then to open another channel, for example to transfer data. However, if user authentication is done over the original channel rather than the alternate channel, then an attacker may be able to connect to the alternate channel before the legitimate user does. This allows the attacker to impersonate the user by \"piggybacking\" on any previous authentication.\n\n\n## Recommendation\nWhen opening an alternate channel for an authenticated user (for example, a Java `Socket`), always authenticate the user over the new channel.\n\n\n## Example\nThis example shows two ways of opening a connection for a user. In the first example, authentication is determined based on materials that the user has already provided (for example, their username and/or password), and then a new channel is opened. However, no authentication is done over the new channel, and so an attacker could connect to it before the user connects.\n\nIn the second example, authentication is done over the socket channel itself, which verifies that the newly connected user is in fact the user that was expected.\n\n\n```java\npublic void doConnect(int desiredPort, String username) {\n\tServerSocket listenSocket = new ServerSocket(desiredPort);\n\n\tif (isAuthenticated(username)) {\n\t\tSocket connection1 = listenSocket.accept();\n\t\t// BAD: no authentication over the socket connection\n\t\tconnection1.getOutputStream().write(secretData);\n\t}\n}\n\npublic void doConnect(int desiredPort, String username) {\n\tServerSocket listenSocket = new ServerSocket(desiredPort);\n\n\tSocket connection2 = listenSocket.accept();\n\t// GOOD: authentication happens over the socket\n\tif (doAuthenticate(connection2, username)) {\n\t\tconnection2.getOutputStream().write(secretData);\n\t}\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-421](https://cwe.mitre.org/data/definitions/421.html).\n"},"properties":{"tags":["security","external/cwe/cwe-421"],"description":"Opening a socket after authenticating via a different channel may allow an attacker to connect to the port first.","id":"java/socket-auth-race-condition","kind":"problem","name":"Race condition in socket authentication","precision":"medium","problem.severity":"warning","security-severity":"7.2"}},{"id":"java/android/websettings-allow-content-access","name":"java/android/websettings-allow-content-access","shortDescription":{"text":"Android WebView settings allows access to content links"},"fullDescription":{"text":"Access to content providers in a WebView can allow access to protected information by loading content:// links."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android WebView settings allows access to content links\nAndroid can provide access to content providers within a WebView using the `setAllowContentAccess` setting.\n\nAllowing access to content providers via `content://` URLs may allow JavaScript to access protected content.\n\n\n## Recommendation\nIf your app does not require access to the `content://` URL functionality, you should explicitly disable the setting by calling `setAllowContentAccess(false)` on the settings of the WebView.\n\n\n## Example\nIn the following (bad) example, access to `content://` URLs is explicitly allowed.\n\n\n```java\nWebSettings settings = webview.getSettings();\n\nsettings.setAllowContentAccess(true);\n\n```\nIn the following (good) example, access to `content://` URLs is explicitly denied.\n\n\n```java\nWebSettings settings = webview.getSettings();\n\nsettings.setAllowContentAccess(false);\n\n```\n\n## References\n* Android Documentation: [setAllowContentAccess](https://developer.android.com/reference/android/webkit/WebSettings#setAllowContentAccess(boolean)).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n","markdown":"# Android WebView settings allows access to content links\nAndroid can provide access to content providers within a WebView using the `setAllowContentAccess` setting.\n\nAllowing access to content providers via `content://` URLs may allow JavaScript to access protected content.\n\n\n## Recommendation\nIf your app does not require access to the `content://` URL functionality, you should explicitly disable the setting by calling `setAllowContentAccess(false)` on the settings of the WebView.\n\n\n## Example\nIn the following (bad) example, access to `content://` URLs is explicitly allowed.\n\n\n```java\nWebSettings settings = webview.getSettings();\n\nsettings.setAllowContentAccess(true);\n\n```\nIn the following (good) example, access to `content://` URLs is explicitly denied.\n\n\n```java\nWebSettings settings = webview.getSettings();\n\nsettings.setAllowContentAccess(false);\n\n```\n\n## References\n* Android Documentation: [setAllowContentAccess](https://developer.android.com/reference/android/webkit/WebSettings#setAllowContentAccess(boolean)).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n"},"properties":{"tags":["security","external/cwe/cwe-200","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Access to content providers in a WebView can allow access to protected information by loading content:// links.","id":"java/android/websettings-allow-content-access","kind":"problem","name":"Android WebView settings allows access to content links","precision":"medium","problem.severity":"warning","security-severity":"6.5"}},{"id":"java/local-temp-file-or-directory-information-disclosure","name":"java/local-temp-file-or-directory-information-disclosure","shortDescription":{"text":"Local information disclosure in a temporary directory"},"fullDescription":{"text":"Writing information without explicit permissions to a shared temporary directory may disclose it to other users."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Local information disclosure in a temporary directory\nLocal information disclosure can occur when files/directories are written into directories that are shared between all users on the system.\n\nOn most [unix-like](https://en.wikipedia.org/wiki/Unix-like) systems, the system temporary directory is shared between local users. If files/directories are created within the system temporary directory without using APIs that explicitly set the correct file permissions, local information disclosure can occur.\n\nDepending upon the particular file contents exposed, this vulnerability can have a [CVSSv3.1 base score of 6.2/10](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N&version=3.1).\n\n\n## Recommendation\nUse JDK methods that specifically protect against this vulnerability:\n\n* [java.nio.file.Files.createTempDirectory](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempDirectory-java.nio.file.Path-java.lang.String-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createTempFile](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempFile-java.nio.file.Path-java.lang.String-java.lang.String-java.nio.file.attribute.FileAttribute...-)\nOtherwise, create the file/directory by manually specifying the expected posix file permissions. For example: `PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))`\n\n* [java.nio.file.Files.createFile](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createFile-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createDirectory](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createDirectory-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createDirectories](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createDirectories-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n\n## Example\nIn the following example, files and directories are created with file permissions that allow other local users to read their contents.\n\n\n```java\nimport java.io.File;\n\npublic class TempDirUsageVulnerable {\n void exampleVulnerable() {\n File temp1 = File.createTempFile(\"random\", \".txt\"); // BAD: File has permissions `-rw-r--r--`\n\n File temp2 = File.createTempFile(\"random\", \"file\", null); // BAD: File has permissions `-rw-r--r--`\n\n File systemTempDir = new File(System.getProperty(\"java.io.tmpdir\"));\n File temp3 = File.createTempFile(\"random\", \"file\", systemTempDir); // BAD: File has permissions `-rw-r--r--`\n\n File tempDir = com.google.common.io.Files.createTempDir(); // BAD: CVE-2020-8908: Directory has permissions `drwxr-xr-x`\n\n new File(System.getProperty(\"java.io.tmpdir\"), \"/child\").mkdir(); // BAD: Directory has permissions `-rw-r--r--`\n\n File tempDirChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n Files.createFile(tempDirChildFile.toPath()); // BAD: File has permissions `-rw-r--r--`\n\n File tempDirChildDir = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-dir\");\n tempDirChildDir.mkdir(); // BAD: Directory has permissions `drwxr-xr-x`\n Files.createDirectory(tempDirChildDir.toPath()); // BAD: Directory has permissions `drwxr-xr-x`\n }\n}\n\n```\nIn the following example, files and directories are created with file permissions that protect their contents.\n\n\n```java\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.attribute.PosixFilePermission;\nimport java.nio.file.attribute.PosixFilePermissions;\n\nimport java.util.EnumSet;\n\n\npublic class TempDirUsageSafe {\n void exampleSafe() throws IOException {\n Path temp1 = Files.createTempFile(\"random\", \".txt\"); // GOOD: File has permissions `-rw-------`\n\n Path temp2 = Files.createTempDirectory(\"random-directory\"); // GOOD: File has permissions `drwx------`\n\n // Creating a temporary file with a non-randomly generated name\n File tempChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n // Warning: This will fail on windows as it doesn't support PosixFilePermissions.\n // See `exampleSafeWithWindowsSupportFile` if your code needs to support windows and unix-like systems.\n Files.createFile(\n tempChildFile.toPath(),\n PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))\n ); // GOOD: Good has permissions `-rw-------`\n }\n\n /*\n * An example of a safe use of createFile or createDirectory if your code must support windows and unix-like systems.\n */\n void exampleSafeWithWindowsSupportFile() {\n // Creating a temporary file with a non-randomly generated name\n File tempChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n createTempFile(tempChildFile.toPath()); // GOOD: Good has permissions `-rw-------`\n }\n\n static void createTempFile(Path tempDirChild) {\n try {\n if (tempDirChild.getFileSystem().supportedFileAttributeViews().contains(\"posix\")) {\n // Explicit permissions setting is only required on unix-like systems because\n // the temporary directory is shared between all users.\n // This is not necessary on Windows, each user has their own temp directory\n final EnumSet posixFilePermissions =\n EnumSet.of(\n PosixFilePermission.OWNER_READ,\n PosixFilePermission.OWNER_WRITE\n );\n if (!Files.exists(tempDirChild)) {\n Files.createFile(\n tempDirChild,\n PosixFilePermissions.asFileAttribute(posixFilePermissions)\n ); // GOOD: Directory has permissions `-rw-------`\n } else {\n Files.setPosixFilePermissions(\n tempDirChild,\n posixFilePermissions\n ); // GOOD: Good has permissions `-rw-------`, or will throw an exception if this fails\n }\n } else if (!Files.exists(tempDirChild)) {\n // On Windows, we still need to create the directory, when it doesn't already exist.\n Files.createDirectory(tempDirChild); // GOOD: Windows doesn't share the temp directory between users\n }\n } catch (IOException exception) {\n throw new UncheckedIOException(\"Failed to create temp file\", exception);\n }\n }\n\n void exampleSafeWithWindowsSupportDirectory() {\n File tempDirChildDir = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-dir\");\n createTempDirectories(tempDirChildDir.toPath()); // GOOD: Directory has permissions `drwx------`\n }\n\n static void createTempDirectories(Path tempDirChild) {\n try {\n if (tempDirChild.getFileSystem().supportedFileAttributeViews().contains(\"posix\")) {\n // Explicit permissions setting is only required on unix-like systems because\n // the temporary directory is shared between all users.\n // This is not necessary on Windows, each user has their own temp directory\n final EnumSet posixFilePermissions =\n EnumSet.of(\n PosixFilePermission.OWNER_READ,\n PosixFilePermission.OWNER_WRITE,\n PosixFilePermission.OWNER_EXECUTE\n );\n if (!Files.exists(tempDirChild)) {\n Files.createDirectories(\n tempDirChild,\n PosixFilePermissions.asFileAttribute(posixFilePermissions)\n ); // GOOD: Directory has permissions `drwx------`\n } else {\n Files.setPosixFilePermissions(\n tempDirChild,\n posixFilePermissions\n ); // GOOD: Good has permissions `drwx------`, or will throw an exception if this fails\n }\n } else if (!Files.exists(tempDirChild)) {\n // On Windows, we still need to create the directory, when it doesn't already exist.\n Files.createDirectories(tempDirChild); // GOOD: Windows doesn't share the temp directory between users\n }\n } catch (IOException exception) {\n throw new UncheckedIOException(\"Failed to create temp dir\", exception);\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Insecure Temporary File](https://owasp.org/www-community/vulnerabilities/Insecure_Temporary_File).\n* CERT: [FIO00-J. Do not operate on files in shared directories](https://wiki.sei.cmu.edu/confluence/display/java/FIO00-J.+Do+not+operate+on+files+in+shared+directories).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n* Common Weakness Enumeration: [CWE-732](https://cwe.mitre.org/data/definitions/732.html).\n","markdown":"# Local information disclosure in a temporary directory\nLocal information disclosure can occur when files/directories are written into directories that are shared between all users on the system.\n\nOn most [unix-like](https://en.wikipedia.org/wiki/Unix-like) systems, the system temporary directory is shared between local users. If files/directories are created within the system temporary directory without using APIs that explicitly set the correct file permissions, local information disclosure can occur.\n\nDepending upon the particular file contents exposed, this vulnerability can have a [CVSSv3.1 base score of 6.2/10](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N&version=3.1).\n\n\n## Recommendation\nUse JDK methods that specifically protect against this vulnerability:\n\n* [java.nio.file.Files.createTempDirectory](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempDirectory-java.nio.file.Path-java.lang.String-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createTempFile](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempFile-java.nio.file.Path-java.lang.String-java.lang.String-java.nio.file.attribute.FileAttribute...-)\nOtherwise, create the file/directory by manually specifying the expected posix file permissions. For example: `PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))`\n\n* [java.nio.file.Files.createFile](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createFile-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createDirectory](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createDirectory-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n* [java.nio.file.Files.createDirectories](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createDirectories-java.nio.file.Path-java.nio.file.attribute.FileAttribute...-)\n\n## Example\nIn the following example, files and directories are created with file permissions that allow other local users to read their contents.\n\n\n```java\nimport java.io.File;\n\npublic class TempDirUsageVulnerable {\n void exampleVulnerable() {\n File temp1 = File.createTempFile(\"random\", \".txt\"); // BAD: File has permissions `-rw-r--r--`\n\n File temp2 = File.createTempFile(\"random\", \"file\", null); // BAD: File has permissions `-rw-r--r--`\n\n File systemTempDir = new File(System.getProperty(\"java.io.tmpdir\"));\n File temp3 = File.createTempFile(\"random\", \"file\", systemTempDir); // BAD: File has permissions `-rw-r--r--`\n\n File tempDir = com.google.common.io.Files.createTempDir(); // BAD: CVE-2020-8908: Directory has permissions `drwxr-xr-x`\n\n new File(System.getProperty(\"java.io.tmpdir\"), \"/child\").mkdir(); // BAD: Directory has permissions `-rw-r--r--`\n\n File tempDirChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n Files.createFile(tempDirChildFile.toPath()); // BAD: File has permissions `-rw-r--r--`\n\n File tempDirChildDir = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-dir\");\n tempDirChildDir.mkdir(); // BAD: Directory has permissions `drwxr-xr-x`\n Files.createDirectory(tempDirChildDir.toPath()); // BAD: Directory has permissions `drwxr-xr-x`\n }\n}\n\n```\nIn the following example, files and directories are created with file permissions that protect their contents.\n\n\n```java\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.UncheckedIOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.attribute.PosixFilePermission;\nimport java.nio.file.attribute.PosixFilePermissions;\n\nimport java.util.EnumSet;\n\n\npublic class TempDirUsageSafe {\n void exampleSafe() throws IOException {\n Path temp1 = Files.createTempFile(\"random\", \".txt\"); // GOOD: File has permissions `-rw-------`\n\n Path temp2 = Files.createTempDirectory(\"random-directory\"); // GOOD: File has permissions `drwx------`\n\n // Creating a temporary file with a non-randomly generated name\n File tempChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n // Warning: This will fail on windows as it doesn't support PosixFilePermissions.\n // See `exampleSafeWithWindowsSupportFile` if your code needs to support windows and unix-like systems.\n Files.createFile(\n tempChildFile.toPath(),\n PosixFilePermissions.asFileAttribute(EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE))\n ); // GOOD: Good has permissions `-rw-------`\n }\n\n /*\n * An example of a safe use of createFile or createDirectory if your code must support windows and unix-like systems.\n */\n void exampleSafeWithWindowsSupportFile() {\n // Creating a temporary file with a non-randomly generated name\n File tempChildFile = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-create-file.txt\");\n createTempFile(tempChildFile.toPath()); // GOOD: Good has permissions `-rw-------`\n }\n\n static void createTempFile(Path tempDirChild) {\n try {\n if (tempDirChild.getFileSystem().supportedFileAttributeViews().contains(\"posix\")) {\n // Explicit permissions setting is only required on unix-like systems because\n // the temporary directory is shared between all users.\n // This is not necessary on Windows, each user has their own temp directory\n final EnumSet posixFilePermissions =\n EnumSet.of(\n PosixFilePermission.OWNER_READ,\n PosixFilePermission.OWNER_WRITE\n );\n if (!Files.exists(tempDirChild)) {\n Files.createFile(\n tempDirChild,\n PosixFilePermissions.asFileAttribute(posixFilePermissions)\n ); // GOOD: Directory has permissions `-rw-------`\n } else {\n Files.setPosixFilePermissions(\n tempDirChild,\n posixFilePermissions\n ); // GOOD: Good has permissions `-rw-------`, or will throw an exception if this fails\n }\n } else if (!Files.exists(tempDirChild)) {\n // On Windows, we still need to create the directory, when it doesn't already exist.\n Files.createDirectory(tempDirChild); // GOOD: Windows doesn't share the temp directory between users\n }\n } catch (IOException exception) {\n throw new UncheckedIOException(\"Failed to create temp file\", exception);\n }\n }\n\n void exampleSafeWithWindowsSupportDirectory() {\n File tempDirChildDir = new File(System.getProperty(\"java.io.tmpdir\"), \"/child-dir\");\n createTempDirectories(tempDirChildDir.toPath()); // GOOD: Directory has permissions `drwx------`\n }\n\n static void createTempDirectories(Path tempDirChild) {\n try {\n if (tempDirChild.getFileSystem().supportedFileAttributeViews().contains(\"posix\")) {\n // Explicit permissions setting is only required on unix-like systems because\n // the temporary directory is shared between all users.\n // This is not necessary on Windows, each user has their own temp directory\n final EnumSet posixFilePermissions =\n EnumSet.of(\n PosixFilePermission.OWNER_READ,\n PosixFilePermission.OWNER_WRITE,\n PosixFilePermission.OWNER_EXECUTE\n );\n if (!Files.exists(tempDirChild)) {\n Files.createDirectories(\n tempDirChild,\n PosixFilePermissions.asFileAttribute(posixFilePermissions)\n ); // GOOD: Directory has permissions `drwx------`\n } else {\n Files.setPosixFilePermissions(\n tempDirChild,\n posixFilePermissions\n ); // GOOD: Good has permissions `drwx------`, or will throw an exception if this fails\n }\n } else if (!Files.exists(tempDirChild)) {\n // On Windows, we still need to create the directory, when it doesn't already exist.\n Files.createDirectories(tempDirChild); // GOOD: Windows doesn't share the temp directory between users\n }\n } catch (IOException exception) {\n throw new UncheckedIOException(\"Failed to create temp dir\", exception);\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Insecure Temporary File](https://owasp.org/www-community/vulnerabilities/Insecure_Temporary_File).\n* CERT: [FIO00-J. Do not operate on files in shared directories](https://wiki.sei.cmu.edu/confluence/display/java/FIO00-J.+Do+not+operate+on+files+in+shared+directories).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n* Common Weakness Enumeration: [CWE-732](https://cwe.mitre.org/data/definitions/732.html).\n"},"properties":{"tags":["security","external/cwe/cwe-200","external/cwe/cwe-732","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Writing information without explicit permissions to a shared temporary directory may disclose it to other users.","id":"java/local-temp-file-or-directory-information-disclosure","kind":"path-problem","name":"Local information disclosure in a temporary directory","precision":"medium","problem.severity":"warning","security-severity":"6.5"}},{"id":"java/android/websettings-file-access","name":"java/android/websettings-file-access","shortDescription":{"text":"Android WebSettings file access"},"fullDescription":{"text":"Enabling access to the file system in a WebView allows attackers to view sensitive information."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android WebSettings file access\nAllowing file access in an Android WebView can expose a device's file system to the JavaScript running in that WebView. If the JavaScript contains vulnerabilities or the WebView loads untrusted content, file access allows an attacker to steal the user's data.\n\n\n## Recommendation\nWhen possible, do not allow file access. The file access settings are disabled by default. You can explicitly disable file access by setting the following settings to `false`:\n\n* `setAllowFileAccess`\n* `setAllowFileAccessFromFileURLs`\n* `setAllowUniversalAccessFromFileURLs`\nIf your application requires access to the file system, it is best to avoid using `file://` URLs. Instead, use an alternative that loads files via HTTPS, such as `androidx.webkit.WebViewAssetLoader`.\n\n\n## Example\nIn the following (bad) example, the WebView is configured with settings that allow local file access.\n\n\n```java\nWebSettings settings = view.getSettings();\n\nsettings.setAllowFileAccess(true);\nsettings.setAllowFileAccessFromURLs(true);\nsettings.setAllowUniversalAccessFromURLs(true);\n\n```\nIn the following (good) example, the WebView is configured to disallow file access.\n\n\n```java\nWebSettings settings = view.getSettings();\n\nsettings.setAllowFileAccess(false);\nsettings.setAllowFileAccessFromURLs(false);\nsettings.setAllowUniversalAccessFromURLs(false);\n\n```\nAs mentioned previously, asset loaders can load files without file system access. In the following (good) example, an asset loader is configured to load assets over HTTPS.\n\n\n```java\nWebViewAssetLoader loader = new WebViewAssetLoader.Builder()\n // Replace the domain with a domain you control, or use the default\n // appassets.androidplatform.com\n .setDomain(\"appassets.example.com\")\n .addPathHandler(\"/resources\", new AssetsPathHandler(this))\n .build();\n\nwebView.setWebViewClient(new WebViewClientCompat() {\n @Override\n public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {\n return assetLoader.shouldInterceptRequest(request.getUrl());\n }\n});\n\nwebView.loadUrl(\"https://appassets.example.com/resources/www/index.html\");\n\n```\n\n## References\n* Android documentation: [WebSettings.setAllowFileAccess](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccess(boolean)).\n* Android documentation: [WebSettings.setAllowFileAccessFromFileURLs](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccessFromFileURLs(boolean)).\n* Android documentation: [WebSettings.setAllowUniversalAccessFromFileURLs](https://developer.android.com/reference/android/webkit/WebSettings#setAllowUniversalAccessFromFileURLs(boolean)).\n* Android documentation: [WebViewAssetLoader](https://developer.android.com/reference/androidx/webkit/WebViewAssetLoader).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n","markdown":"# Android WebSettings file access\nAllowing file access in an Android WebView can expose a device's file system to the JavaScript running in that WebView. If the JavaScript contains vulnerabilities or the WebView loads untrusted content, file access allows an attacker to steal the user's data.\n\n\n## Recommendation\nWhen possible, do not allow file access. The file access settings are disabled by default. You can explicitly disable file access by setting the following settings to `false`:\n\n* `setAllowFileAccess`\n* `setAllowFileAccessFromFileURLs`\n* `setAllowUniversalAccessFromFileURLs`\nIf your application requires access to the file system, it is best to avoid using `file://` URLs. Instead, use an alternative that loads files via HTTPS, such as `androidx.webkit.WebViewAssetLoader`.\n\n\n## Example\nIn the following (bad) example, the WebView is configured with settings that allow local file access.\n\n\n```java\nWebSettings settings = view.getSettings();\n\nsettings.setAllowFileAccess(true);\nsettings.setAllowFileAccessFromURLs(true);\nsettings.setAllowUniversalAccessFromURLs(true);\n\n```\nIn the following (good) example, the WebView is configured to disallow file access.\n\n\n```java\nWebSettings settings = view.getSettings();\n\nsettings.setAllowFileAccess(false);\nsettings.setAllowFileAccessFromURLs(false);\nsettings.setAllowUniversalAccessFromURLs(false);\n\n```\nAs mentioned previously, asset loaders can load files without file system access. In the following (good) example, an asset loader is configured to load assets over HTTPS.\n\n\n```java\nWebViewAssetLoader loader = new WebViewAssetLoader.Builder()\n // Replace the domain with a domain you control, or use the default\n // appassets.androidplatform.com\n .setDomain(\"appassets.example.com\")\n .addPathHandler(\"/resources\", new AssetsPathHandler(this))\n .build();\n\nwebView.setWebViewClient(new WebViewClientCompat() {\n @Override\n public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {\n return assetLoader.shouldInterceptRequest(request.getUrl());\n }\n});\n\nwebView.loadUrl(\"https://appassets.example.com/resources/www/index.html\");\n\n```\n\n## References\n* Android documentation: [WebSettings.setAllowFileAccess](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccess(boolean)).\n* Android documentation: [WebSettings.setAllowFileAccessFromFileURLs](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccessFromFileURLs(boolean)).\n* Android documentation: [WebSettings.setAllowUniversalAccessFromFileURLs](https://developer.android.com/reference/android/webkit/WebSettings#setAllowUniversalAccessFromFileURLs(boolean)).\n* Android documentation: [WebViewAssetLoader](https://developer.android.com/reference/androidx/webkit/WebViewAssetLoader).\n* Common Weakness Enumeration: [CWE-200](https://cwe.mitre.org/data/definitions/200.html).\n"},"properties":{"tags":["security","external/cwe/cwe-200","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"Enabling access to the file system in a WebView allows attackers to view sensitive information.","id":"java/android/websettings-file-access","kind":"problem","name":"Android WebSettings file access","precision":"medium","problem.severity":"warning","security-severity":"6.5"}},{"id":"java/android/webview-addjavascriptinterface","name":"java/android/webview-addjavascriptinterface","shortDescription":{"text":"Access Java object methods through JavaScript exposure"},"fullDescription":{"text":"Exposing a Java object in a WebView with a JavaScript interface can lead to malicious JavaScript controlling the application."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Access Java object methods through JavaScript exposure\nCalling the `addJavascriptInterface` method of the `android.webkit.WebView` class allows the web pages of a WebView to access a Java object's methods via JavaScript.\n\nObjects exposed to JavaScript are available in all frames of the WebView.\n\n\n## Recommendation\nIf you need to expose Java objects to JavaScript, guarantee that no untrusted third-party content is loaded into the WebView.\n\n\n## Example\nIn the following (bad) example, a Java object is exposed to JavaScript.\n\n\n```java\nimport android.webkit.JavascriptInterface;\nimport android.database.sqlite.SQLiteOpenHelper;\n\nclass ExposedObject extends SQLiteOpenHelper {\n @JavascriptInterface\n public String studentEmail(String studentName) {\n // SQL injection\n String query = \"SELECT email FROM students WHERE studentname = '\" + studentName + \"'\";\n\n Cursor cursor = db.rawQuery(query, null);\n cursor.moveToFirst();\n String email = cursor.getString(0);\n\n return email;\n }\n}\n\nwebview.getSettings().setJavaScriptEnabled(true);\nwebview.addJavaScriptInterface(new ExposedObject(), \"exposedObject\");\nwebview.loadData(\"\", \"text/html\", null);\n\nString name = \"Robert'; DROP TABLE students; --\";\nwebview.loadUrl(\"javascript:alert(exposedObject.studentEmail(\\\"\"+ name +\"\\\"))\");\n\n```\n\n## References\n* Android Documentation: [addJavascriptInterface](https://developer.android.com/reference/android/webkit/WebView#addJavascriptInterface(java.lang.Object,%20java.lang.String))\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n","markdown":"# Access Java object methods through JavaScript exposure\nCalling the `addJavascriptInterface` method of the `android.webkit.WebView` class allows the web pages of a WebView to access a Java object's methods via JavaScript.\n\nObjects exposed to JavaScript are available in all frames of the WebView.\n\n\n## Recommendation\nIf you need to expose Java objects to JavaScript, guarantee that no untrusted third-party content is loaded into the WebView.\n\n\n## Example\nIn the following (bad) example, a Java object is exposed to JavaScript.\n\n\n```java\nimport android.webkit.JavascriptInterface;\nimport android.database.sqlite.SQLiteOpenHelper;\n\nclass ExposedObject extends SQLiteOpenHelper {\n @JavascriptInterface\n public String studentEmail(String studentName) {\n // SQL injection\n String query = \"SELECT email FROM students WHERE studentname = '\" + studentName + \"'\";\n\n Cursor cursor = db.rawQuery(query, null);\n cursor.moveToFirst();\n String email = cursor.getString(0);\n\n return email;\n }\n}\n\nwebview.getSettings().setJavaScriptEnabled(true);\nwebview.addJavaScriptInterface(new ExposedObject(), \"exposedObject\");\nwebview.loadData(\"\", \"text/html\", null);\n\nString name = \"Robert'; DROP TABLE students; --\";\nwebview.loadUrl(\"javascript:alert(exposedObject.studentEmail(\\\"\"+ name +\"\\\"))\");\n\n```\n\n## References\n* Android Documentation: [addJavascriptInterface](https://developer.android.com/reference/android/webkit/WebView#addJavascriptInterface(java.lang.Object,%20java.lang.String))\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n"},"properties":{"tags":["security","external/cwe/cwe-079","owasp-top10-2021","A03:2021 - Injection"],"description":"Exposing a Java object in a WebView with a JavaScript interface can lead to malicious JavaScript controlling the application.","id":"java/android/webview-addjavascriptinterface","kind":"problem","name":"Access Java object methods through JavaScript exposure","precision":"medium","problem.severity":"warning","security-severity":"6.1"}},{"id":"java/android/websettings-javascript-enabled","name":"java/android/websettings-javascript-enabled","shortDescription":{"text":"Android WebView JavaScript settings"},"fullDescription":{"text":"Enabling JavaScript execution in a WebView can result in cross-site scripting attacks."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android WebView JavaScript settings\nEnabling JavaScript in an Android WebView allows the execution of JavaScript code in the context of the running application. This creates a cross-site scripting vulnerability.\n\nFor example, if your application's WebView allows for visiting web pages that you do not trust, it is possible for an attacker to lead the user to a page which loads malicious JavaScript.\n\nYou can enable or disable Javascript execution using the `setJavaScriptEnabled` method of the settings of a WebView.\n\n\n## Recommendation\nJavaScript execution is disabled by default. You can explicitly disable it by calling `setJavaScriptEnabled(false)` on the settings of the WebView.\n\nIf JavaScript is necessary, only load content from trusted servers using encrypted channels, such as HTTPS with certificate verification.\n\n\n## Example\nIn the following (bad) example, a WebView has JavaScript enabled in its settings:\n\n\n```java\nWebSettings settings = webview.getSettings();\nsettings.setJavaScriptEnabled(true);\n\n```\nIn the following (good) example, a WebView explicitly disallows JavaScript execution:\n\n\n```java\nWebSettings settings = webview.getSettings();\nsettings.setJavaScriptEnabled(false);\n\n```\n\n## References\n* Android documentation: [setJavaScriptEnabled](https://developer.android.com/reference/android/webkit/WebSettings#setJavaScriptEnabled(boolean))\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n","markdown":"# Android WebView JavaScript settings\nEnabling JavaScript in an Android WebView allows the execution of JavaScript code in the context of the running application. This creates a cross-site scripting vulnerability.\n\nFor example, if your application's WebView allows for visiting web pages that you do not trust, it is possible for an attacker to lead the user to a page which loads malicious JavaScript.\n\nYou can enable or disable Javascript execution using the `setJavaScriptEnabled` method of the settings of a WebView.\n\n\n## Recommendation\nJavaScript execution is disabled by default. You can explicitly disable it by calling `setJavaScriptEnabled(false)` on the settings of the WebView.\n\nIf JavaScript is necessary, only load content from trusted servers using encrypted channels, such as HTTPS with certificate verification.\n\n\n## Example\nIn the following (bad) example, a WebView has JavaScript enabled in its settings:\n\n\n```java\nWebSettings settings = webview.getSettings();\nsettings.setJavaScriptEnabled(true);\n\n```\nIn the following (good) example, a WebView explicitly disallows JavaScript execution:\n\n\n```java\nWebSettings settings = webview.getSettings();\nsettings.setJavaScriptEnabled(false);\n\n```\n\n## References\n* Android documentation: [setJavaScriptEnabled](https://developer.android.com/reference/android/webkit/WebSettings#setJavaScriptEnabled(boolean))\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n"},"properties":{"tags":["security","external/cwe/cwe-079","owasp-top10-2021","A03:2021 - Injection"],"description":"Enabling JavaScript execution in a WebView can result in cross-site scripting attacks.","id":"java/android/websettings-javascript-enabled","kind":"problem","name":"Android WebView JavaScript settings","precision":"medium","problem.severity":"warning","security-severity":"6.1"}},{"id":"java/android/missing-certificate-pinning","name":"java/android/missing-certificate-pinning","shortDescription":{"text":"Android missing certificate pinning"},"fullDescription":{"text":"Network connections that do not use certificate pinning may allow attackers to eavesdrop on communications."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android missing certificate pinning\nCertificate pinning is the practice of only trusting a specific set of SSL certificates, rather than those that the device trusts by default. In Android applications, it is reccomended to use certificate pinning when communicating over the network, in order to minimize the risk of machine-in-the-middle attacks from a compromised CA.\n\n\n## Recommendation\nThe easiest way to implement certificate pinning is to declare your pins in a `network-security-config` XML file. This will automatically provide certificate pinning for any network connection made by the app.\n\nAnother way to implement certificate pinning is to use the \\`CertificatePinner\\` class from the \\`okhttp\\` library.\n\nA final way to implement certificate pinning is to use a `TrustManager`, initialized from a `KeyStore` loaded with only the necessary certificates.\n\n\n## Example\nIn the first (bad) case below, a network call is performed with no certificate pinning implemented. The other (good) cases demonstrate the different ways to implement certificate pinning.\n\n\n```java\n// BAD - By default, this network call does not use certificate pinning\nURLConnection conn = new URL(\"https://example.com\").openConnection();\n```\n\n```xml\n\n\n\n\n\n \n ...\n \n\n\n\n\n\n \n good.example.com\n \n ...\n \n \n\n```\n\n```java\n// GOOD: Certificate pinning implemented via okhttp3.CertificatePinner \nCertificatePinner certificatePinner = new CertificatePinner.Builder()\n .add(\"example.com\", \"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\")\n .build();\nOkHttpClient client = new OkHttpClient.Builder()\n .certificatePinner(certificatePinner)\n .build();\n\nclient.newCall(new Request.Builder().url(\"https://example.com\").build()).execute();\n\n\n\n// GOOD: Certificate pinning implemented via a TrustManager\nKeyStore keyStore = KeyStore.getInstance(\"BKS\");\nkeyStore.load(resources.openRawResource(R.raw.cert), null);\n\nTrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\ntmf.init(keyStore);\n\nSSLContext sslContext = SSLContext.getInstance(\"TLS\");\nsslContext.init(null, tmf.getTrustManagers(), null);\n\nURL url = new URL(\"http://www.example.com/\");\nHttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); \n\nurlConnection.setSSLSocketFactory(sslContext.getSocketFactory());\n```\n\n## References\n* OWASP Mobile Security: [Testing Custom Certificate Stores and Certificate Pinning (MSTG-NETWORK-4)](https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05g-testing-network-communication#testing-custom-certificate-stores-and-certificate-pinning-mstg-network-4).\n* Android Developers: [Network security configuration](https://developer.android.com/training/articles/security-config).\n* OkHttp: [CertificatePinner](https://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n","markdown":"# Android missing certificate pinning\nCertificate pinning is the practice of only trusting a specific set of SSL certificates, rather than those that the device trusts by default. In Android applications, it is reccomended to use certificate pinning when communicating over the network, in order to minimize the risk of machine-in-the-middle attacks from a compromised CA.\n\n\n## Recommendation\nThe easiest way to implement certificate pinning is to declare your pins in a `network-security-config` XML file. This will automatically provide certificate pinning for any network connection made by the app.\n\nAnother way to implement certificate pinning is to use the \\`CertificatePinner\\` class from the \\`okhttp\\` library.\n\nA final way to implement certificate pinning is to use a `TrustManager`, initialized from a `KeyStore` loaded with only the necessary certificates.\n\n\n## Example\nIn the first (bad) case below, a network call is performed with no certificate pinning implemented. The other (good) cases demonstrate the different ways to implement certificate pinning.\n\n\n```java\n// BAD - By default, this network call does not use certificate pinning\nURLConnection conn = new URL(\"https://example.com\").openConnection();\n```\n\n```xml\n\n\n\n\n\n \n ...\n \n\n\n\n\n\n \n good.example.com\n \n ...\n \n \n\n```\n\n```java\n// GOOD: Certificate pinning implemented via okhttp3.CertificatePinner \nCertificatePinner certificatePinner = new CertificatePinner.Builder()\n .add(\"example.com\", \"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\")\n .build();\nOkHttpClient client = new OkHttpClient.Builder()\n .certificatePinner(certificatePinner)\n .build();\n\nclient.newCall(new Request.Builder().url(\"https://example.com\").build()).execute();\n\n\n\n// GOOD: Certificate pinning implemented via a TrustManager\nKeyStore keyStore = KeyStore.getInstance(\"BKS\");\nkeyStore.load(resources.openRawResource(R.raw.cert), null);\n\nTrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\ntmf.init(keyStore);\n\nSSLContext sslContext = SSLContext.getInstance(\"TLS\");\nsslContext.init(null, tmf.getTrustManagers(), null);\n\nURL url = new URL(\"http://www.example.com/\");\nHttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); \n\nurlConnection.setSSLSocketFactory(sslContext.getSocketFactory());\n```\n\n## References\n* OWASP Mobile Security: [Testing Custom Certificate Stores and Certificate Pinning (MSTG-NETWORK-4)](https://mobile-security.gitbook.io/mobile-security-testing-guide/android-testing-guide/0x05g-testing-network-communication#testing-custom-certificate-stores-and-certificate-pinning-mstg-network-4).\n* Android Developers: [Network security configuration](https://developer.android.com/training/articles/security-config).\n* OkHttp: [CertificatePinner](https://square.github.io/okhttp/4.x/okhttp/okhttp3/-certificate-pinner/).\n* Common Weakness Enumeration: [CWE-295](https://cwe.mitre.org/data/definitions/295.html).\n"},"properties":{"tags":["security","external/cwe/cwe-295","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Network connections that do not use certificate pinning may allow attackers to eavesdrop on communications.","id":"java/android/missing-certificate-pinning","kind":"problem","name":"Android missing certificate pinning","precision":"medium","problem.severity":"warning","security-severity":"5.9"}},{"id":"java/insecure-basic-auth","name":"java/insecure-basic-auth","shortDescription":{"text":"Insecure basic authentication"},"fullDescription":{"text":"Basic authentication only obfuscates username/password in Base64 encoding, which can be easily recognized and reversed. Transmitting sensitive information without using HTTPS makes the data vulnerable to packet sniffing."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Insecure basic authentication\nBasic authentication only obfuscates usernames and passwords in Base64 encoding, which can be easily recognized and reversed, thus it must not be transmitted over the cleartext HTTP channel. Transmitting sensitive information without using HTTPS makes the data vulnerable to packet sniffing.\n\n\n## Recommendation\nEither use a more secure authentication mechanism like digest authentication or federated authentication, or use the HTTPS communication protocol.\n\n\n## Example\nThe following example shows two ways of using basic authentication. In the 'BAD' case, the credentials are transmitted over HTTP. In the 'GOOD' case, the credentials are transmitted over HTTPS.\n\n\n```java\npublic class InsecureBasicAuth {\n /**\n * Test basic authentication with Apache HTTP request.\n */\n public void testApacheHttpRequest(String username, String password) {\n\n // BAD: basic authentication over HTTP\n String url = \"http://www.example.com/rest/getuser.do?uid=abcdx\";\n\n // GOOD: basic authentication over HTTPS\n url = \"https://www.example.com/rest/getuser.do?uid=abcdx\";\n\n HttpPost post = new HttpPost(url);\n post.setHeader(\"Accept\", \"application/json\");\n post.setHeader(\"Content-type\", \"application/json\");\n\n String authString = username + \":\" + password;\n byte[] authEncBytes = Base64.getEncoder().encode(authString.getBytes());\n String authStringEnc = new String(authEncBytes);\n\n post.addHeader(\"Authorization\", \"Basic \" + authStringEnc);\n }\n\n /**\n * Test basic authentication with Java HTTP URL connection.\n */\n public void testHttpUrlConnection(String username, String password) {\n\n // BAD: basic authentication over HTTP\n String urlStr = \"http://www.example.com/rest/getuser.do?uid=abcdx\";\n\n // GOOD: basic authentication over HTTPS\n urlStr = \"https://www.example.com/rest/getuser.do?uid=abcdx\";\n\n String authString = username + \":\" + password;\n String encoding = Base64.getEncoder().encodeToString(authString.getBytes(\"UTF-8\"));\n URL url = new URL(urlStr);\n HttpURLConnection conn = (HttpURLConnection) url.openConnection();\n conn.setRequestMethod(\"POST\");\n conn.setDoOutput(true);\n conn.setRequestProperty(\"Authorization\", \"Basic \" + encoding);\n }\n}\n\n```\n\n## References\n* SonarSource rule: [Basic authentication should not be used](https://rules.sonarsource.com/java/tag/owasp/RSPEC-2647).\n* Acunetix: [WEB VULNERABILITIES INDEX - Basic authentication over HTTP](https://www.acunetix.com/vulnerabilities/web/basic-authentication-over-http/).\n* Common Weakness Enumeration: [CWE-522](https://cwe.mitre.org/data/definitions/522.html).\n* Common Weakness Enumeration: [CWE-319](https://cwe.mitre.org/data/definitions/319.html).\n","markdown":"# Insecure basic authentication\nBasic authentication only obfuscates usernames and passwords in Base64 encoding, which can be easily recognized and reversed, thus it must not be transmitted over the cleartext HTTP channel. Transmitting sensitive information without using HTTPS makes the data vulnerable to packet sniffing.\n\n\n## Recommendation\nEither use a more secure authentication mechanism like digest authentication or federated authentication, or use the HTTPS communication protocol.\n\n\n## Example\nThe following example shows two ways of using basic authentication. In the 'BAD' case, the credentials are transmitted over HTTP. In the 'GOOD' case, the credentials are transmitted over HTTPS.\n\n\n```java\npublic class InsecureBasicAuth {\n /**\n * Test basic authentication with Apache HTTP request.\n */\n public void testApacheHttpRequest(String username, String password) {\n\n // BAD: basic authentication over HTTP\n String url = \"http://www.example.com/rest/getuser.do?uid=abcdx\";\n\n // GOOD: basic authentication over HTTPS\n url = \"https://www.example.com/rest/getuser.do?uid=abcdx\";\n\n HttpPost post = new HttpPost(url);\n post.setHeader(\"Accept\", \"application/json\");\n post.setHeader(\"Content-type\", \"application/json\");\n\n String authString = username + \":\" + password;\n byte[] authEncBytes = Base64.getEncoder().encode(authString.getBytes());\n String authStringEnc = new String(authEncBytes);\n\n post.addHeader(\"Authorization\", \"Basic \" + authStringEnc);\n }\n\n /**\n * Test basic authentication with Java HTTP URL connection.\n */\n public void testHttpUrlConnection(String username, String password) {\n\n // BAD: basic authentication over HTTP\n String urlStr = \"http://www.example.com/rest/getuser.do?uid=abcdx\";\n\n // GOOD: basic authentication over HTTPS\n urlStr = \"https://www.example.com/rest/getuser.do?uid=abcdx\";\n\n String authString = username + \":\" + password;\n String encoding = Base64.getEncoder().encodeToString(authString.getBytes(\"UTF-8\"));\n URL url = new URL(urlStr);\n HttpURLConnection conn = (HttpURLConnection) url.openConnection();\n conn.setRequestMethod(\"POST\");\n conn.setDoOutput(true);\n conn.setRequestProperty(\"Authorization\", \"Basic \" + encoding);\n }\n}\n\n```\n\n## References\n* SonarSource rule: [Basic authentication should not be used](https://rules.sonarsource.com/java/tag/owasp/RSPEC-2647).\n* Acunetix: [WEB VULNERABILITIES INDEX - Basic authentication over HTTP](https://www.acunetix.com/vulnerabilities/web/basic-authentication-over-http/).\n* Common Weakness Enumeration: [CWE-522](https://cwe.mitre.org/data/definitions/522.html).\n* Common Weakness Enumeration: [CWE-319](https://cwe.mitre.org/data/definitions/319.html).\n"},"properties":{"tags":["security","external/cwe/cwe-522","external/cwe/cwe-319","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Basic authentication only obfuscates username/password in\n Base64 encoding, which can be easily recognized and reversed.\n Transmitting sensitive information without using HTTPS makes\n the data vulnerable to packet sniffing.","id":"java/insecure-basic-auth","kind":"path-problem","name":"Insecure basic authentication","precision":"medium","problem.severity":"warning","security-severity":"8.8"}},{"id":"java/log-injection","name":"java/log-injection","shortDescription":{"text":"Log Injection"},"fullDescription":{"text":"Building log entries from user-controlled data may allow insertion of forged log entries by malicious users."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Log Injection\nIf unsanitized user input is written to a log entry, a malicious user may be able to forge new log entries.\n\nForgery can occur if a user provides some input creating the appearance of multiple log entries. This can include unescaped new-line characters, or HTML or other markup.\n\n\n## Recommendation\nUser input should be suitably sanitized before it is logged.\n\nIf the log entries are plain text then line breaks should be removed from user input, using for example `String replace(char oldChar, char newChar)` or similar. Care should also be taken that user input is clearly marked in log entries, and that a malicious user cannot cause confusion in other ways.\n\nFor log entries that will be displayed in HTML, user input should be HTML encoded before being logged, to prevent forgery and other forms of HTML injection.\n\n\n## Example\nIn the first example, a username, provided by the user, is logged using `logger.warn` (from `org.slf4j.Logger`). In the first case (`/bad` endpoint), the username is logged without any sanitization. If a malicious user provides `Guest'%0AUser:'Admin` as a username parameter, the log entry will be split into two separate lines, where the first line will be `User:'Guest'` and the second one will be `User:'Admin'`.\n\n\n```java\npackage com.example.restservice;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class LogInjection {\n\n private final Logger log = LoggerFactory.getLogger(LogInjection.class);\n\n // /bad?username=Guest'%0AUser:'Admin\n @GetMapping(\"/bad\")\n public String bad(@RequestParam(value = \"username\", defaultValue = \"name\") String username) {\n log.warn(\"User:'{}'\", username);\n // The logging call above would result in multiple log entries as shown below:\n // User:'Guest'\n // User:'Admin'\n return username;\n }\n}\n\n\n```\nIn the second example (`/good` endpoint), `matches()` is used to ensure the user input only has alphanumeric characters. If a malicious user provides \\`Guest'%0AUser:'Admin\\` as a username parameter, the log entry will not be logged at all, preventing the injection.\n\n\n```java\npackage com.example.restservice;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class LogInjection {\n\n private final Logger log = LoggerFactory.getLogger(LogInjection.class);\n\n // /good?username=Guest'%0AUser:'Admin\n @GetMapping(\"/good\")\n public String good(@RequestParam(value = \"username\", defaultValue = \"name\") String username) {\n // The regex check here, allows only alphanumeric characters to pass.\n // Hence, does not result in log injection\n if (username.matches(\"\\\\w*\")) {\n log.warn(\"User:'{}'\", username);\n\n return username;\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Log Injection](https://owasp.org/www-community/attacks/Log_Injection).\n* Common Weakness Enumeration: [CWE-117](https://cwe.mitre.org/data/definitions/117.html).\n","markdown":"# Log Injection\nIf unsanitized user input is written to a log entry, a malicious user may be able to forge new log entries.\n\nForgery can occur if a user provides some input creating the appearance of multiple log entries. This can include unescaped new-line characters, or HTML or other markup.\n\n\n## Recommendation\nUser input should be suitably sanitized before it is logged.\n\nIf the log entries are plain text then line breaks should be removed from user input, using for example `String replace(char oldChar, char newChar)` or similar. Care should also be taken that user input is clearly marked in log entries, and that a malicious user cannot cause confusion in other ways.\n\nFor log entries that will be displayed in HTML, user input should be HTML encoded before being logged, to prevent forgery and other forms of HTML injection.\n\n\n## Example\nIn the first example, a username, provided by the user, is logged using `logger.warn` (from `org.slf4j.Logger`). In the first case (`/bad` endpoint), the username is logged without any sanitization. If a malicious user provides `Guest'%0AUser:'Admin` as a username parameter, the log entry will be split into two separate lines, where the first line will be `User:'Guest'` and the second one will be `User:'Admin'`.\n\n\n```java\npackage com.example.restservice;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class LogInjection {\n\n private final Logger log = LoggerFactory.getLogger(LogInjection.class);\n\n // /bad?username=Guest'%0AUser:'Admin\n @GetMapping(\"/bad\")\n public String bad(@RequestParam(value = \"username\", defaultValue = \"name\") String username) {\n log.warn(\"User:'{}'\", username);\n // The logging call above would result in multiple log entries as shown below:\n // User:'Guest'\n // User:'Admin'\n return username;\n }\n}\n\n\n```\nIn the second example (`/good` endpoint), `matches()` is used to ensure the user input only has alphanumeric characters. If a malicious user provides \\`Guest'%0AUser:'Admin\\` as a username parameter, the log entry will not be logged at all, preventing the injection.\n\n\n```java\npackage com.example.restservice;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class LogInjection {\n\n private final Logger log = LoggerFactory.getLogger(LogInjection.class);\n\n // /good?username=Guest'%0AUser:'Admin\n @GetMapping(\"/good\")\n public String good(@RequestParam(value = \"username\", defaultValue = \"name\") String username) {\n // The regex check here, allows only alphanumeric characters to pass.\n // Hence, does not result in log injection\n if (username.matches(\"\\\\w*\")) {\n log.warn(\"User:'{}'\", username);\n\n return username;\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Log Injection](https://owasp.org/www-community/attacks/Log_Injection).\n* Common Weakness Enumeration: [CWE-117](https://cwe.mitre.org/data/definitions/117.html).\n"},"properties":{"tags":["security","external/cwe/cwe-117","owasp-top10-2021","A09:2021 - Security Logging and Monitoring Failures"],"description":"Building log entries from user-controlled data may allow\n insertion of forged log entries by malicious users.","id":"java/log-injection","kind":"path-problem","name":"Log Injection","precision":"medium","problem.severity":"error","security-severity":"7.8"}},{"id":"java/sensitive-log","name":"java/sensitive-log","shortDescription":{"text":"Insertion of sensitive information into log files"},"fullDescription":{"text":"Writing sensitive information to log files can allow that information to be leaked to an attacker more easily."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Insertion of sensitive information into log files\nInformation written to log files can be of a sensitive nature and give valuable guidance to an attacker or expose sensitive user information. Third-party logging utilities like Log4J and SLF4J are widely used in Java projects. When sensitive information is written to logs without properly set logging levels, it is accessible to potential attackers who can use it to gain access to file storage.\n\n\n## Recommendation\nDo not write secrets into the log files and enforce proper logging level control.\n\n\n## Example\nThe following example shows two ways of logging sensitive information. In the 'BAD' case, the credentials are simply written to a debug log. In the 'GOOD' case, the credentials are never written to debug logs.\n\n\n```java\npublic static void main(String[] args) {\n {\n private static final Logger logger = LogManager.getLogger(SensitiveInfoLog.class);\n\n String password = \"Pass@0rd\";\n\n // BAD: user password is written to debug log\n logger.debug(\"User password is \"+password);\n }\n\t\n {\n private static final Logger logger = LogManager.getLogger(SensitiveInfoLog.class);\n \n String password = \"Pass@0rd\";\n\n // GOOD: user password is never written to debug log\n logger.debug(\"User password changed\")\n }\n}\n\n```\n\n## References\n* [OWASP Logging Guide](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html)\n* Common Weakness Enumeration: [CWE-532](https://cwe.mitre.org/data/definitions/532.html).\n","markdown":"# Insertion of sensitive information into log files\nInformation written to log files can be of a sensitive nature and give valuable guidance to an attacker or expose sensitive user information. Third-party logging utilities like Log4J and SLF4J are widely used in Java projects. When sensitive information is written to logs without properly set logging levels, it is accessible to potential attackers who can use it to gain access to file storage.\n\n\n## Recommendation\nDo not write secrets into the log files and enforce proper logging level control.\n\n\n## Example\nThe following example shows two ways of logging sensitive information. In the 'BAD' case, the credentials are simply written to a debug log. In the 'GOOD' case, the credentials are never written to debug logs.\n\n\n```java\npublic static void main(String[] args) {\n {\n private static final Logger logger = LogManager.getLogger(SensitiveInfoLog.class);\n\n String password = \"Pass@0rd\";\n\n // BAD: user password is written to debug log\n logger.debug(\"User password is \"+password);\n }\n\t\n {\n private static final Logger logger = LogManager.getLogger(SensitiveInfoLog.class);\n \n String password = \"Pass@0rd\";\n\n // GOOD: user password is never written to debug log\n logger.debug(\"User password changed\")\n }\n}\n\n```\n\n## References\n* [OWASP Logging Guide](https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html)\n* Common Weakness Enumeration: [CWE-532](https://cwe.mitre.org/data/definitions/532.html).\n"},"properties":{"tags":["security","external/cwe/cwe-532","owasp-top10-2021","A09:2021 - Security Logging and Monitoring Failures"],"description":"Writing sensitive information to log files can allow that\n information to be leaked to an attacker more easily.","id":"java/sensitive-log","kind":"path-problem","name":"Insertion of sensitive information into log files","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/hardcoded-credential-api-call","name":"java/hardcoded-credential-api-call","shortDescription":{"text":"Hard-coded credential in API call"},"fullDescription":{"text":"Using a hard-coded credential in a call to a sensitive Java API may compromise security."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Hard-coded credential in API call\nIncluding unencrypted hard-coded authentication credentials in source code is dangerous because the credentials may be easily discovered. For example, the code may be open source, or it may be leaked or accidentally revealed, making the credentials visible to an attacker. This, in turn, might enable them to gain unauthorized access, or to obtain privileged information.\n\n\n## Recommendation\nRemove hard-coded credentials, such as user names, passwords and certificates, from source code. Instead, place them in configuration files, environment variables or other data stores if necessary. If possible, store configuration files including credential data separately from the source code, in a secure location with restricted access.\n\n\n## Example\nThe following code example connects to a database using a hard-coded user name and password:\n\n\n```java\nprivate static final String p = \"123456\"; // hard-coded credential\n\npublic static void main(String[] args) throws SQLException {\n String url = \"jdbc:mysql://localhost/test\";\n String u = \"admin\"; // hard-coded credential\n\n getConn(url, u, p);\n}\n\npublic static void getConn(String url, String v, String q) throws SQLException {\n DriverManager.getConnection(url, v, q); // sensitive call\n}\n\n```\nInstead, the user name and password could be supplied through environment variables, which can be set externally without hard-coding credentials in the source code.\n\n\n## References\n* OWASP: [Use of hard-coded password](https://www.owasp.org/index.php/Use_of_hard-coded_password).\n* Common Weakness Enumeration: [CWE-798](https://cwe.mitre.org/data/definitions/798.html).\n","markdown":"# Hard-coded credential in API call\nIncluding unencrypted hard-coded authentication credentials in source code is dangerous because the credentials may be easily discovered. For example, the code may be open source, or it may be leaked or accidentally revealed, making the credentials visible to an attacker. This, in turn, might enable them to gain unauthorized access, or to obtain privileged information.\n\n\n## Recommendation\nRemove hard-coded credentials, such as user names, passwords and certificates, from source code. Instead, place them in configuration files, environment variables or other data stores if necessary. If possible, store configuration files including credential data separately from the source code, in a secure location with restricted access.\n\n\n## Example\nThe following code example connects to a database using a hard-coded user name and password:\n\n\n```java\nprivate static final String p = \"123456\"; // hard-coded credential\n\npublic static void main(String[] args) throws SQLException {\n String url = \"jdbc:mysql://localhost/test\";\n String u = \"admin\"; // hard-coded credential\n\n getConn(url, u, p);\n}\n\npublic static void getConn(String url, String v, String q) throws SQLException {\n DriverManager.getConnection(url, v, q); // sensitive call\n}\n\n```\nInstead, the user name and password could be supplied through environment variables, which can be set externally without hard-coding credentials in the source code.\n\n\n## References\n* OWASP: [Use of hard-coded password](https://www.owasp.org/index.php/Use_of_hard-coded_password).\n* Common Weakness Enumeration: [CWE-798](https://cwe.mitre.org/data/definitions/798.html).\n"},"properties":{"tags":["security","external/cwe/cwe-798","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Using a hard-coded credential in a call to a sensitive Java API may compromise security.","id":"java/hardcoded-credential-api-call","kind":"path-problem","name":"Hard-coded credential in API call","precision":"medium","problem.severity":"error","security-severity":"9.8"}},{"id":"java/toctou-race-condition","name":"java/toctou-race-condition","shortDescription":{"text":"Time-of-check time-of-use race condition"},"fullDescription":{"text":"Using a resource after an unsynchronized state check can lead to a race condition, if the state may be changed between the check and use."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Time-of-check time-of-use race condition\nOften it is necessary to check the state of a resource before using it. If the resource is accessed concurrently, then the check and the use need to be performed atomically, otherwise the state of the resource may change between the check and the use. This can lead to a \"time-of-check/time-of-use\" (TOCTOU) race condition.\n\nIn Java, classes may present state inspection methods and operation methods which are synchronized. This prevents multiple threads from executing those methods simultaneously, but it does not prevent a state change in between separate method invocations.\n\n\n## Recommendation\nWhen calling a series of methods which require a consistent view of an object, make sure to synchronize on a monitor that will prevent any other access to the object during your operations.\n\nIf the class that you are using has a well-designed interface, then synchronizing on the object itself will prevent its state being changed inappropriately.\n\n\n## Example\nThe following example shows a resource which has a readiness state, and an action that is only valid if the resource is ready.\n\nIn the bad case, the caller checks the readiness state and then acts, but does not synchronize around the two calls, so the readiness state may be changed by another thread.\n\nIn the good case, the caller jointly synchronizes the check and the use on the resource, so no other thread can modify the state before the use.\n\n\n```java\nclass Resource {\n\tpublic synchronized boolean isReady() { ... }\n\n\tpublic synchronized void setReady(boolean ready) { ... }\n\t\n\tpublic synchronized void act() { \n\t\tif (!isReady())\n\t\t\tthrow new IllegalStateException();\n\t\t...\n\t}\n}\n\t\npublic synchronized void bad(Resource r) {\n\tif (r.isReady()) {\n\t\t// r might no longer be ready, another thread might\n\t\t// have called setReady(false)\n\t\tr.act();\n\t}\n}\n\npublic synchronized void good(Resource r) {\n\tsynchronized(r) {\n\t\tif (r.isReady()) {\n\t\t\tr.act();\n\t\t}\n\t}\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-367](https://cwe.mitre.org/data/definitions/367.html).\n","markdown":"# Time-of-check time-of-use race condition\nOften it is necessary to check the state of a resource before using it. If the resource is accessed concurrently, then the check and the use need to be performed atomically, otherwise the state of the resource may change between the check and the use. This can lead to a \"time-of-check/time-of-use\" (TOCTOU) race condition.\n\nIn Java, classes may present state inspection methods and operation methods which are synchronized. This prevents multiple threads from executing those methods simultaneously, but it does not prevent a state change in between separate method invocations.\n\n\n## Recommendation\nWhen calling a series of methods which require a consistent view of an object, make sure to synchronize on a monitor that will prevent any other access to the object during your operations.\n\nIf the class that you are using has a well-designed interface, then synchronizing on the object itself will prevent its state being changed inappropriately.\n\n\n## Example\nThe following example shows a resource which has a readiness state, and an action that is only valid if the resource is ready.\n\nIn the bad case, the caller checks the readiness state and then acts, but does not synchronize around the two calls, so the readiness state may be changed by another thread.\n\nIn the good case, the caller jointly synchronizes the check and the use on the resource, so no other thread can modify the state before the use.\n\n\n```java\nclass Resource {\n\tpublic synchronized boolean isReady() { ... }\n\n\tpublic synchronized void setReady(boolean ready) { ... }\n\t\n\tpublic synchronized void act() { \n\t\tif (!isReady())\n\t\t\tthrow new IllegalStateException();\n\t\t...\n\t}\n}\n\t\npublic synchronized void bad(Resource r) {\n\tif (r.isReady()) {\n\t\t// r might no longer be ready, another thread might\n\t\t// have called setReady(false)\n\t\tr.act();\n\t}\n}\n\npublic synchronized void good(Resource r) {\n\tsynchronized(r) {\n\t\tif (r.isReady()) {\n\t\t\tr.act();\n\t\t}\n\t}\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-367](https://cwe.mitre.org/data/definitions/367.html).\n"},"properties":{"tags":["security","external/cwe/cwe-367"],"description":"Using a resource after an unsynchronized state check can lead to a race condition,\n if the state may be changed between the check and use.","id":"java/toctou-race-condition","kind":"problem","name":"Time-of-check time-of-use race condition","precision":"medium","problem.severity":"warning","security-severity":"7.7"}},{"id":"java/potentially-dangerous-function","name":"java/potentially-dangerous-function","shortDescription":{"text":"Use of a potentially dangerous function"},"fullDescription":{"text":"Certain standard library routines are dangerous to call."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Use of a potentially dangerous function\nThis rule finds calls to methods that are dangerous to use. Currently, it checks for calls to `Thread.stop`.\n\nStopping a thread with `Thread.stop` causes it to receive a `ThreadDeath` exception. That exception propagates up the stack, releasing all monitors that the thread was holding. In some cases the relevant code will be protected by catching the `ThreadDeath` exception and cleaning up, but because the exception can potentially be thrown from so very many locations, it is impractical to catch all such cases. As a result, calling `Thread.stop` is likely to result in corrupt data.\n\n\n## Recommendation\nThe best solution is usually to provide an alternate communication mechanism for the thread that might need to be interrupted early. For example, Oracle gives the following example of using a volatile variable to communicate whether the worker thread should exit:\n\n\n```java\nprivate volatile Thread blinker;\n\npublic void stop() {\n blinker = null;\n}\n\npublic void run() {\n Thread thisThread = Thread.currentThread();\n while (blinker == thisThread) {\n try {\n Thread.sleep(interval);\n } catch (InterruptedException e){\n }\n repaint();\n }\n}\n\n```\nIt is also possible to use `Thread.interrupt` and to catch and handle `InterruptedException` when it occurs. However, it can be difficult to handle an `InterruptedException` everywhere it might occur; for example, the sample code above simply discards the exception rather than actually exiting the thread.\n\nAnother strategy is to use message passing, for example via a `BlockingQueue`. In addition to passing the worker thread its ordinary work via such a message queue, the worker can be asked to exit by a particular kind of message being sent on the queue.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [THI05-J. Do not use Thread.stop() to terminate threads](https://wiki.sei.cmu.edu/confluence/display/java/THI05-J.+Do+not+use+Thread.stop()+to+terminate+threads).\n* Java API Specification: [Java Thread Primitive Deprecation](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/doc-files/threadPrimitiveDeprecation.html).\n* Java API Specification: [Thread.interrupt](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Thread.html#interrupt()), [BlockingQueue](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/BlockingQueue.html).\n* Common Weakness Enumeration: [CWE-676](https://cwe.mitre.org/data/definitions/676.html).\n","markdown":"# Use of a potentially dangerous function\nThis rule finds calls to methods that are dangerous to use. Currently, it checks for calls to `Thread.stop`.\n\nStopping a thread with `Thread.stop` causes it to receive a `ThreadDeath` exception. That exception propagates up the stack, releasing all monitors that the thread was holding. In some cases the relevant code will be protected by catching the `ThreadDeath` exception and cleaning up, but because the exception can potentially be thrown from so very many locations, it is impractical to catch all such cases. As a result, calling `Thread.stop` is likely to result in corrupt data.\n\n\n## Recommendation\nThe best solution is usually to provide an alternate communication mechanism for the thread that might need to be interrupted early. For example, Oracle gives the following example of using a volatile variable to communicate whether the worker thread should exit:\n\n\n```java\nprivate volatile Thread blinker;\n\npublic void stop() {\n blinker = null;\n}\n\npublic void run() {\n Thread thisThread = Thread.currentThread();\n while (blinker == thisThread) {\n try {\n Thread.sleep(interval);\n } catch (InterruptedException e){\n }\n repaint();\n }\n}\n\n```\nIt is also possible to use `Thread.interrupt` and to catch and handle `InterruptedException` when it occurs. However, it can be difficult to handle an `InterruptedException` everywhere it might occur; for example, the sample code above simply discards the exception rather than actually exiting the thread.\n\nAnother strategy is to use message passing, for example via a `BlockingQueue`. In addition to passing the worker thread its ordinary work via such a message queue, the worker can be asked to exit by a particular kind of message being sent on the queue.\n\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [THI05-J. Do not use Thread.stop() to terminate threads](https://wiki.sei.cmu.edu/confluence/display/java/THI05-J.+Do+not+use+Thread.stop()+to+terminate+threads).\n* Java API Specification: [Java Thread Primitive Deprecation](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/doc-files/threadPrimitiveDeprecation.html).\n* Java API Specification: [Thread.interrupt](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Thread.html#interrupt()), [BlockingQueue](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/BlockingQueue.html).\n* Common Weakness Enumeration: [CWE-676](https://cwe.mitre.org/data/definitions/676.html).\n"},"properties":{"tags":["reliability","security","external/cwe/cwe-676"],"description":"Certain standard library routines are dangerous to call.","id":"java/potentially-dangerous-function","kind":"problem","name":"Use of a potentially dangerous function","precision":"medium","problem.severity":"warning","security-severity":"10.0"}},{"id":"java/improper-validation-of-array-index","name":"java/improper-validation-of-array-index","shortDescription":{"text":"Improper validation of user-provided array index"},"fullDescription":{"text":"Using external input as an index to an array, without proper validation, can lead to index out of bound exceptions."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Improper validation of user-provided array index\nUsing unvalidated input as part of an index into the array can cause the array access to throw an `ArrayIndexOutOfBoundsException`. This is because there is no guarantee that the index provided is within the bounds of the array.\n\nThis problem occurs when user input is used as an array index, either directly or following one or more calculations. If the user input is unsanitized, it may be any value, which could result in either a negative index, or an index which is larger than the size of the array, either of which would result in an `ArrayIndexOutOfBoundsException`.\n\n\n## Recommendation\nThe index used in the array access should be checked against the bounds of the array before being used. The index should be smaller than the array size, and it should not be negative.\n\n\n## Example\nThe following program accesses an element from a fixed size constant array:\n\n\n```java\npublic class ImproperValidationOfArrayIndex extends HttpServlet {\n\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n String[] productDescriptions = new String[] { \"Chocolate bar\", \"Fizzy drink\" };\n\n // User provided value\n String productID = request.getParameter(\"productID\");\n try {\n int productID = Integer.parseInt(userProperty.trim());\n\n /*\n * BAD Array is accessed without checking if the user provided value is out of\n * bounds.\n */\n String productDescription = productDescriptions[productID];\n\n if (productID >= 0 && productID < productDescriptions.length) {\n // GOOD We have checked that the array index is valid first\n productDescription = productDescriptions[productID];\n } else {\n productDescription = \"No product for that ID\";\n }\n\n response.getWriter().write(productDescription);\n\n } catch (NumberFormatException e) { }\n }\n}\n```\nThe first access of the `productDescriptions` array uses the user-provided value as the index without performing any checks. If the user provides a negative value, or a value larger than the size of the array, then an `ArrayIndexOutOfBoundsException` may be thrown.\n\nThe second access of the `productDescriptions` array is contained within a conditional expression that verifies the user-provided value is a valid index into the array. This ensures that the access operation never throws an `ArrayIndexOutOfBoundsException`.\n\n\n## References\n* Java API Specification: [ArrayIndexOutOfBoundsException](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ArrayIndexOutOfBoundsException.html).\n* Common Weakness Enumeration: [CWE-129](https://cwe.mitre.org/data/definitions/129.html).\n","markdown":"# Improper validation of user-provided array index\nUsing unvalidated input as part of an index into the array can cause the array access to throw an `ArrayIndexOutOfBoundsException`. This is because there is no guarantee that the index provided is within the bounds of the array.\n\nThis problem occurs when user input is used as an array index, either directly or following one or more calculations. If the user input is unsanitized, it may be any value, which could result in either a negative index, or an index which is larger than the size of the array, either of which would result in an `ArrayIndexOutOfBoundsException`.\n\n\n## Recommendation\nThe index used in the array access should be checked against the bounds of the array before being used. The index should be smaller than the array size, and it should not be negative.\n\n\n## Example\nThe following program accesses an element from a fixed size constant array:\n\n\n```java\npublic class ImproperValidationOfArrayIndex extends HttpServlet {\n\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n String[] productDescriptions = new String[] { \"Chocolate bar\", \"Fizzy drink\" };\n\n // User provided value\n String productID = request.getParameter(\"productID\");\n try {\n int productID = Integer.parseInt(userProperty.trim());\n\n /*\n * BAD Array is accessed without checking if the user provided value is out of\n * bounds.\n */\n String productDescription = productDescriptions[productID];\n\n if (productID >= 0 && productID < productDescriptions.length) {\n // GOOD We have checked that the array index is valid first\n productDescription = productDescriptions[productID];\n } else {\n productDescription = \"No product for that ID\";\n }\n\n response.getWriter().write(productDescription);\n\n } catch (NumberFormatException e) { }\n }\n}\n```\nThe first access of the `productDescriptions` array uses the user-provided value as the index without performing any checks. If the user provides a negative value, or a value larger than the size of the array, then an `ArrayIndexOutOfBoundsException` may be thrown.\n\nThe second access of the `productDescriptions` array is contained within a conditional expression that verifies the user-provided value is a valid index into the array. This ensures that the access operation never throws an `ArrayIndexOutOfBoundsException`.\n\n\n## References\n* Java API Specification: [ArrayIndexOutOfBoundsException](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ArrayIndexOutOfBoundsException.html).\n* Common Weakness Enumeration: [CWE-129](https://cwe.mitre.org/data/definitions/129.html).\n"},"properties":{"tags":["security","external/cwe/cwe-129"],"description":"Using external input as an index to an array, without proper validation, can lead to index out of bound exceptions.","id":"java/improper-validation-of-array-index","kind":"path-problem","name":"Improper validation of user-provided array index","precision":"medium","problem.severity":"warning","security-severity":"8.8"}},{"id":"java/improper-validation-of-array-construction","name":"java/improper-validation-of-array-construction","shortDescription":{"text":"Improper validation of user-provided size used for array construction"},"fullDescription":{"text":"Using unvalidated external input as the argument to a construction of an array can lead to index out of bound exceptions."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Improper validation of user-provided size used for array construction\nUsing unvalidated input when specifying the size of a newly created array can result in the creation of an array with size zero. If this array is subsequently accessed without further checks, an `ArrayIndexOutOfBoundsException` may be thrown, because there is no guarantee that the array is not empty.\n\nThis problem occurs when user input is used as the size during array initialization, either directly or following one or more calculations. If the user input is unvalidated, it may cause the size of the array to be zero.\n\n\n## Recommendation\nThe size used in the array initialization should be verified to be greater than zero before being used. Alternatively, the array access may be protected by a conditional check that ensures it is only accessed if the index is less than the array size.\n\n\n## Example\nThe following program constructs an array with the size specified by some user input:\n\n\n```java\npublic class ImproperValidationOfArrayIndex extends HttpServlet {\n\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n try {\n // User provided value\n int numberOfItems = Integer.parseInt(request.getParameter(\"numberOfItems\").trim());\n\n if (numberOfItems >= 0) {\n /*\n * BAD numberOfItems may be zero, which would cause the array indexing operation to\n * throw an ArrayIndexOutOfBoundsException\n */\n String items = new String[numberOfItems];\n items[0] = \"Item 1\";\n }\n\n if (numberOfItems > 0) {\n /*\n * GOOD numberOfItems must be greater than zero, so the indexing succeeds.\n */\n String items = new String[numberOfItems];\n items[0] = \"Item 1\";\n }\n\n } catch (NumberFormatException e) { }\n }\n}\n```\nThe first array construction is protected by a condition that checks if the user input is zero or more. However, if the user provides `0` as the `numberOfItems` parameter, then an empty array is created, and any array access would fail with an `ArrayIndexOutOfBoundsException`.\n\nThe second array construction is protected by a condition that checks if the user input is greater than zero. The array will therefore never be empty, and the following array access will not throw an `ArrayIndexOutOfBoundsException`.\n\n\n## References\n* Java API Specification: [ArrayIndexOutOfBoundsException](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ArrayIndexOutOfBoundsException.html).\n* Common Weakness Enumeration: [CWE-129](https://cwe.mitre.org/data/definitions/129.html).\n","markdown":"# Improper validation of user-provided size used for array construction\nUsing unvalidated input when specifying the size of a newly created array can result in the creation of an array with size zero. If this array is subsequently accessed without further checks, an `ArrayIndexOutOfBoundsException` may be thrown, because there is no guarantee that the array is not empty.\n\nThis problem occurs when user input is used as the size during array initialization, either directly or following one or more calculations. If the user input is unvalidated, it may cause the size of the array to be zero.\n\n\n## Recommendation\nThe size used in the array initialization should be verified to be greater than zero before being used. Alternatively, the array access may be protected by a conditional check that ensures it is only accessed if the index is less than the array size.\n\n\n## Example\nThe following program constructs an array with the size specified by some user input:\n\n\n```java\npublic class ImproperValidationOfArrayIndex extends HttpServlet {\n\n protected void doGet(HttpServletRequest request, HttpServletResponse response)\n throws ServletException, IOException {\n try {\n // User provided value\n int numberOfItems = Integer.parseInt(request.getParameter(\"numberOfItems\").trim());\n\n if (numberOfItems >= 0) {\n /*\n * BAD numberOfItems may be zero, which would cause the array indexing operation to\n * throw an ArrayIndexOutOfBoundsException\n */\n String items = new String[numberOfItems];\n items[0] = \"Item 1\";\n }\n\n if (numberOfItems > 0) {\n /*\n * GOOD numberOfItems must be greater than zero, so the indexing succeeds.\n */\n String items = new String[numberOfItems];\n items[0] = \"Item 1\";\n }\n\n } catch (NumberFormatException e) { }\n }\n}\n```\nThe first array construction is protected by a condition that checks if the user input is zero or more. However, if the user provides `0` as the `numberOfItems` parameter, then an empty array is created, and any array access would fail with an `ArrayIndexOutOfBoundsException`.\n\nThe second array construction is protected by a condition that checks if the user input is greater than zero. The array will therefore never be empty, and the following array access will not throw an `ArrayIndexOutOfBoundsException`.\n\n\n## References\n* Java API Specification: [ArrayIndexOutOfBoundsException](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ArrayIndexOutOfBoundsException.html).\n* Common Weakness Enumeration: [CWE-129](https://cwe.mitre.org/data/definitions/129.html).\n"},"properties":{"tags":["security","external/cwe/cwe-129"],"description":"Using unvalidated external input as the argument to a construction of an array can lead to index out of bound exceptions.","id":"java/improper-validation-of-array-construction","kind":"path-problem","name":"Improper validation of user-provided size used for array construction","precision":"medium","problem.severity":"warning","security-severity":"8.8"}},{"id":"java/android/sensitive-result-receiver","name":"java/android/sensitive-result-receiver","shortDescription":{"text":"Leaking sensitive information through a ResultReceiver"},"fullDescription":{"text":"Sending sensitive data to a 'ResultReceiver' obtained from an untrusted source can allow malicious actors access to your information."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Leaking sensitive information through a ResultReceiver\nIf a `ResultReceiver` is obtained from an untrusted source, such as an `Intent` received by an exported component, do not send it sensitive data. Otherwise, the information may be leaked to a malicious application.\n\n\n## Recommendation\nDo not send sensitive data to an untrusted `ResultReceiver`.\n\n\n## Example\nIn the following (bad) example, sensitive data is sent to an untrusted `ResultReceiver`.\n\n\n```java\n// BAD: Sensitive data is sent to an untrusted result receiver \nvoid bad(String password) {\n Intent intent = getIntent();\n ResultReceiver rec = intent.getParcelableExtra(\"Receiver\");\n Bundle b = new Bundle();\n b.putCharSequence(\"pass\", password);\n rec.send(0, b); \n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n","markdown":"# Leaking sensitive information through a ResultReceiver\nIf a `ResultReceiver` is obtained from an untrusted source, such as an `Intent` received by an exported component, do not send it sensitive data. Otherwise, the information may be leaked to a malicious application.\n\n\n## Recommendation\nDo not send sensitive data to an untrusted `ResultReceiver`.\n\n\n## Example\nIn the following (bad) example, sensitive data is sent to an untrusted `ResultReceiver`.\n\n\n```java\n// BAD: Sensitive data is sent to an untrusted result receiver \nvoid bad(String password) {\n Intent intent = getIntent();\n ResultReceiver rec = intent.getParcelableExtra(\"Receiver\");\n Bundle b = new Bundle();\n b.putCharSequence(\"pass\", password);\n rec.send(0, b); \n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n"},"properties":{"tags":["security","external/cwe/cwe-927","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"Sending sensitive data to a 'ResultReceiver' obtained from an untrusted source\n can allow malicious actors access to your information.","id":"java/android/sensitive-result-receiver","kind":"path-problem","name":"Leaking sensitive information through a ResultReceiver","precision":"medium","problem.severity":"error","security-severity":"8.2"}},{"id":"java/android/sensitive-communication","name":"java/android/sensitive-communication","shortDescription":{"text":"Leaking sensitive information through an implicit Intent"},"fullDescription":{"text":"An Android application uses implicit Intents containing sensitive data in a way that exposes it to arbitrary applications on the device."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Leaking sensitive information through an implicit Intent\nWhen an implicit Intent is used with a method such as `startActivity`, `startService`, or `sendBroadcast`, it may be read by other applications on the device.\n\nThis means that sensitive data in these Intents may be leaked.\n\n\n## Recommendation\nFor `sendBroadcast` methods, a receiver permission may be specified so that only applications with a certain permission may receive the Intent; or a `LocalBroadcastManager` may be used. Otherwise, ensure that Intents containing sensitive data have an explicit receiver class set.\n\n\n## Example\nThe following example shows two ways of broadcasting Intents. In the 'BAD' case, no \"receiver permission\" is specified. In the 'GOOD' case, \"receiver permission\" or \"receiver application\" is specified.\n\n\n```java\npublic void sendBroadcast1(Context context, String token, String refreshToken) \n{\n {\n // BAD: broadcast sensitive information to all listeners\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent);\n }\n\n {\n // GOOD: broadcast sensitive information only to those with permission\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent, \"com.example.user_permission\");\n }\n\n {\n // GOOD: broadcast sensitive information to a specific application\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.setClassName(\"com.example2\", \"com.example2.UserInfoHandler\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent);\n }\n}\n```\n\n## References\n* Android Developers: [Security considerations and best practices for sending and receiving broadcasts](https://developer.android.com/guide/components/broadcasts)\n* SonarSource: [Broadcasting intents is security-sensitive](https://rules.sonarsource.com/java/type/Security%20Hotspot/RSPEC-5320)\n* Android Developer Fundamentals: [Restricting broadcasts](https://google-developer-training.github.io/android-developer-fundamentals-course-concepts-v2/unit-3-working-in-the-background/lesson-7-background-tasks/7-3-c-broadcasts/7-3-c-broadcasts.html)\n* Carnegie Mellon University: [DRD03-J. Do not broadcast sensitive information using an implicit intent](https://wiki.sei.cmu.edu/confluence/display/android/DRD03-J.+Do+not+broadcast+sensitive+information+using+an+implicit+intent)\n* Android Developers: [Android LiveData Overview](https://developer.android.com/topic/libraries/architecture/livedata)\n* Oversecured: [Interception of Android implicit intents](https://blog.oversecured.com/Interception-of-Android-implicit-intents/)\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n","markdown":"# Leaking sensitive information through an implicit Intent\nWhen an implicit Intent is used with a method such as `startActivity`, `startService`, or `sendBroadcast`, it may be read by other applications on the device.\n\nThis means that sensitive data in these Intents may be leaked.\n\n\n## Recommendation\nFor `sendBroadcast` methods, a receiver permission may be specified so that only applications with a certain permission may receive the Intent; or a `LocalBroadcastManager` may be used. Otherwise, ensure that Intents containing sensitive data have an explicit receiver class set.\n\n\n## Example\nThe following example shows two ways of broadcasting Intents. In the 'BAD' case, no \"receiver permission\" is specified. In the 'GOOD' case, \"receiver permission\" or \"receiver application\" is specified.\n\n\n```java\npublic void sendBroadcast1(Context context, String token, String refreshToken) \n{\n {\n // BAD: broadcast sensitive information to all listeners\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent);\n }\n\n {\n // GOOD: broadcast sensitive information only to those with permission\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent, \"com.example.user_permission\");\n }\n\n {\n // GOOD: broadcast sensitive information to a specific application\n Intent intent = new Intent();\n intent.setAction(\"com.example.custom_action\");\n intent.setClassName(\"com.example2\", \"com.example2.UserInfoHandler\");\n intent.putExtra(\"token\", token);\n intent.putExtra(\"refreshToken\", refreshToken);\n context.sendBroadcast(intent);\n }\n}\n```\n\n## References\n* Android Developers: [Security considerations and best practices for sending and receiving broadcasts](https://developer.android.com/guide/components/broadcasts)\n* SonarSource: [Broadcasting intents is security-sensitive](https://rules.sonarsource.com/java/type/Security%20Hotspot/RSPEC-5320)\n* Android Developer Fundamentals: [Restricting broadcasts](https://google-developer-training.github.io/android-developer-fundamentals-course-concepts-v2/unit-3-working-in-the-background/lesson-7-background-tasks/7-3-c-broadcasts/7-3-c-broadcasts.html)\n* Carnegie Mellon University: [DRD03-J. Do not broadcast sensitive information using an implicit intent](https://wiki.sei.cmu.edu/confluence/display/android/DRD03-J.+Do+not+broadcast+sensitive+information+using+an+implicit+intent)\n* Android Developers: [Android LiveData Overview](https://developer.android.com/topic/libraries/architecture/livedata)\n* Oversecured: [Interception of Android implicit intents](https://blog.oversecured.com/Interception-of-Android-implicit-intents/)\n* Common Weakness Enumeration: [CWE-927](https://cwe.mitre.org/data/definitions/927.html).\n"},"properties":{"tags":["security","external/cwe/cwe-927","owasp-top10-2021","A04:2021 - Insecure Design"],"description":"An Android application uses implicit Intents containing sensitive data\n in a way that exposes it to arbitrary applications on the device.","id":"java/android/sensitive-communication","kind":"path-problem","name":"Leaking sensitive information through an implicit Intent","precision":"medium","problem.severity":"warning","security-severity":"8.2"}},{"id":"java/partial-path-traversal","name":"java/partial-path-traversal","shortDescription":{"text":"Partial path traversal vulnerability"},"fullDescription":{"text":"A prefix used to check that a canonicalised path falls within another must be slash-terminated."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Partial path traversal vulnerability\nA common way to check that a user-supplied path `SUBDIR` falls inside a directory `DIR` is to use `getCanonicalPath()` to remove any path-traversal elements and then check that `DIR` is a prefix. However, if `DIR` is not slash-terminated, this can unexpectedly allow access to siblings of `DIR`.\n\nSee also `java/partial-path-traversal-from-remote`, which is similar to this query but only flags instances with evidence of remote exploitability.\n\n\n## Recommendation\nIf the user should only access items within a certain directory `DIR`, ensure that `DIR` is slash-terminated before checking that `DIR` is a prefix of the user-provided path, `SUBDIR`. Note, Java's `getCanonicalPath()` returns a **non**-slash-terminated path string, so a slash must be added to `DIR` if that method is used.\n\n\n## Example\nIn this example, the `if` statement checks if `parent.getCanonicalPath()` is a prefix of `dir.getCanonicalPath()`. However, `parent.getCanonicalPath()` is not slash-terminated. This means that users that supply `dir` may be also allowed to access siblings of `parent` and not just children of `parent`, which is a security issue.\n\n\n```java\npublic class PartialPathTraversalBad {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath())) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\nIn this example, the `if` statement checks if `parent.getCanonicalPath() + File.separator ` is a prefix of `dir.getCanonicalPath()`. Because `parent.getCanonicalPath() + File.separator` is indeed slash-terminated, the user supplying `dir` can only access children of `parent`, as desired.\n\n\n```java\npublic class PartialPathTraversalGood {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath() + File.separator)) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Partial Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* CVE-2022-23457: [ ESAPI Vulnerability Report](https://github.com/ESAPI/esapi-java-legacy/blob/develop/documentation/GHSL-2022-008_The_OWASP_Enterprise_Security_API.md).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n","markdown":"# Partial path traversal vulnerability\nA common way to check that a user-supplied path `SUBDIR` falls inside a directory `DIR` is to use `getCanonicalPath()` to remove any path-traversal elements and then check that `DIR` is a prefix. However, if `DIR` is not slash-terminated, this can unexpectedly allow access to siblings of `DIR`.\n\nSee also `java/partial-path-traversal-from-remote`, which is similar to this query but only flags instances with evidence of remote exploitability.\n\n\n## Recommendation\nIf the user should only access items within a certain directory `DIR`, ensure that `DIR` is slash-terminated before checking that `DIR` is a prefix of the user-provided path, `SUBDIR`. Note, Java's `getCanonicalPath()` returns a **non**-slash-terminated path string, so a slash must be added to `DIR` if that method is used.\n\n\n## Example\nIn this example, the `if` statement checks if `parent.getCanonicalPath()` is a prefix of `dir.getCanonicalPath()`. However, `parent.getCanonicalPath()` is not slash-terminated. This means that users that supply `dir` may be also allowed to access siblings of `parent` and not just children of `parent`, which is a security issue.\n\n\n```java\npublic class PartialPathTraversalBad {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath())) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\nIn this example, the `if` statement checks if `parent.getCanonicalPath() + File.separator ` is a prefix of `dir.getCanonicalPath()`. Because `parent.getCanonicalPath() + File.separator` is indeed slash-terminated, the user supplying `dir` can only access children of `parent`, as desired.\n\n\n```java\npublic class PartialPathTraversalGood {\n public void example(File dir, File parent) throws IOException {\n if (!dir.getCanonicalPath().startsWith(parent.getCanonicalPath() + File.separator)) {\n throw new IOException(\"Invalid directory: \" + dir.getCanonicalPath());\n }\n }\n}\n\n```\n\n## References\n* OWASP: [Partial Path Traversal](https://owasp.org/www-community/attacks/Path_Traversal).\n* CVE-2022-23457: [ ESAPI Vulnerability Report](https://github.com/ESAPI/esapi-java-legacy/blob/develop/documentation/GHSL-2022-008_The_OWASP_Enterprise_Security_API.md).\n* Common Weakness Enumeration: [CWE-23](https://cwe.mitre.org/data/definitions/23.html).\n"},"properties":{"tags":["security","external/cwe/cwe-023","owasp-top10-2021","A01:2021 - Broken Access Control"],"description":"A prefix used to check that a canonicalised path falls within another must be slash-terminated.","id":"java/partial-path-traversal","kind":"problem","name":"Partial path traversal vulnerability","precision":"medium","problem.severity":"error","security-severity":"9.3"}},{"id":"java/uncontrolled-arithmetic","name":"java/uncontrolled-arithmetic","shortDescription":{"text":"Uncontrolled data in arithmetic expression"},"fullDescription":{"text":"Arithmetic operations on uncontrolled data that is not validated can cause overflows."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Uncontrolled data in arithmetic expression\nPerforming calculations on uncontrolled data can result in integer overflows unless the input is validated.\n\nIf the data is not under your control, and can take extremely large values, even arithmetic operations that would usually result in a small change in magnitude may result in overflows.\n\n\n## Recommendation\nAlways guard against overflow in arithmetic operations on uncontrolled data by doing one of the following:\n\n* Validate the data.\n* Define a guard on the arithmetic expression, so that the operation is performed only if the result can be known to be less than, or equal to, the maximum value for the type, for example `MAX_VALUE`.\n* Use a wider type, so that larger input values do not cause overflow.\n\n## Example\nIn this example, a random integer is generated. Because the value is not controlled by the programmer, it could be extremely large. Performing arithmetic operations on this value could therefore cause an overflow. To avoid this happening, the example shows how to perform a check before performing a multiplication.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t{\n\t\t\tint data = (new java.security.SecureRandom()).nextInt();\n\n\t\t\t// BAD: may overflow if data is large\n\t\t\tint scaled = data * 10;\n\n\t\t\t// ...\n\n\t\t\t// GOOD: use a guard to ensure no overflows occur\n\t\t\tint scaled2;\n\t\t\tif (data < Integer.MAX_VALUE/10)\n\t\t\t\tscaled2 = data * 10;\n\t\t\telse \n\t\t\t\tscaled2 = Integer.MAX_VALUE;\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-191](https://cwe.mitre.org/data/definitions/191.html).\n","markdown":"# Uncontrolled data in arithmetic expression\nPerforming calculations on uncontrolled data can result in integer overflows unless the input is validated.\n\nIf the data is not under your control, and can take extremely large values, even arithmetic operations that would usually result in a small change in magnitude may result in overflows.\n\n\n## Recommendation\nAlways guard against overflow in arithmetic operations on uncontrolled data by doing one of the following:\n\n* Validate the data.\n* Define a guard on the arithmetic expression, so that the operation is performed only if the result can be known to be less than, or equal to, the maximum value for the type, for example `MAX_VALUE`.\n* Use a wider type, so that larger input values do not cause overflow.\n\n## Example\nIn this example, a random integer is generated. Because the value is not controlled by the programmer, it could be extremely large. Performing arithmetic operations on this value could therefore cause an overflow. To avoid this happening, the example shows how to perform a check before performing a multiplication.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t{\n\t\t\tint data = (new java.security.SecureRandom()).nextInt();\n\n\t\t\t// BAD: may overflow if data is large\n\t\t\tint scaled = data * 10;\n\n\t\t\t// ...\n\n\t\t\t// GOOD: use a guard to ensure no overflows occur\n\t\t\tint scaled2;\n\t\t\tif (data < Integer.MAX_VALUE/10)\n\t\t\t\tscaled2 = data * 10;\n\t\t\telse \n\t\t\t\tscaled2 = Integer.MAX_VALUE;\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-191](https://cwe.mitre.org/data/definitions/191.html).\n"},"properties":{"tags":["security","external/cwe/cwe-190","external/cwe/cwe-191"],"description":"Arithmetic operations on uncontrolled data that is not validated can cause\n overflows.","id":"java/uncontrolled-arithmetic","kind":"path-problem","name":"Uncontrolled data in arithmetic expression","precision":"medium","problem.severity":"warning","security-severity":"8.6"}},{"id":"java/tainted-arithmetic","name":"java/tainted-arithmetic","shortDescription":{"text":"User-controlled data in arithmetic expression"},"fullDescription":{"text":"Arithmetic operations on user-controlled data that is not validated can cause overflows."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# User-controlled data in arithmetic expression\nPerforming calculations on user-controlled data can result in integer overflows unless the input is validated.\n\nIf the user is free to enter very large numbers, even arithmetic operations that would usually result in a small change in magnitude may result in overflows.\n\n\n## Recommendation\nAlways guard against overflow in arithmetic operations on user-controlled data by doing one of the following:\n\n* Validate the user input.\n* Define a guard on the arithmetic expression, so that the operation is performed only if the result can be known to be less than, or equal to, the maximum value for the type, for example `MAX_VALUE`.\n* Use a wider type, so that larger input values do not cause overflow.\n\n## Example\nIn this example, a value is read from standard input into an `int`. Because the value is a user-controlled value, it could be extremely large. Performing arithmetic operations on this value could therefore cause an overflow. To avoid this happening, the example shows how to perform a check before performing a multiplication.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t{\n\t\t\tint data;\n\n\t\t\tBufferedReader readerBuffered = new BufferedReader(\n\t\t\t\t\tnew InputStreamReader(System.in, \"UTF-8\"));\n\t\t\tString stringNumber = readerBuffered.readLine();\n\t\t\tif (stringNumber != null) {\n\t\t\t\tdata = Integer.parseInt(stringNumber.trim());\n\t\t\t} else {\n\t\t\t\tdata = 0;\n\t\t\t}\n\n\t\t\t// BAD: may overflow if input data is very large, for example\n\t\t\t// 'Integer.MAX_VALUE'\n\t\t\tint scaled = data * 10;\n\n\t\t\t//...\n\t\t\t\n\t\t\t// GOOD: use a guard to ensure no overflows occur\n\t\t\tint scaled2;\n\t\t\tif (data < Integer.MAX_VALUE / 10)\n\t\t\t\tscaled2 = data * 10;\n\t\t\telse\n\t\t\t\tscaled2 = Integer.MAX_VALUE;\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-191](https://cwe.mitre.org/data/definitions/191.html).\n","markdown":"# User-controlled data in arithmetic expression\nPerforming calculations on user-controlled data can result in integer overflows unless the input is validated.\n\nIf the user is free to enter very large numbers, even arithmetic operations that would usually result in a small change in magnitude may result in overflows.\n\n\n## Recommendation\nAlways guard against overflow in arithmetic operations on user-controlled data by doing one of the following:\n\n* Validate the user input.\n* Define a guard on the arithmetic expression, so that the operation is performed only if the result can be known to be less than, or equal to, the maximum value for the type, for example `MAX_VALUE`.\n* Use a wider type, so that larger input values do not cause overflow.\n\n## Example\nIn this example, a value is read from standard input into an `int`. Because the value is a user-controlled value, it could be extremely large. Performing arithmetic operations on this value could therefore cause an overflow. To avoid this happening, the example shows how to perform a check before performing a multiplication.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t{\n\t\t\tint data;\n\n\t\t\tBufferedReader readerBuffered = new BufferedReader(\n\t\t\t\t\tnew InputStreamReader(System.in, \"UTF-8\"));\n\t\t\tString stringNumber = readerBuffered.readLine();\n\t\t\tif (stringNumber != null) {\n\t\t\t\tdata = Integer.parseInt(stringNumber.trim());\n\t\t\t} else {\n\t\t\t\tdata = 0;\n\t\t\t}\n\n\t\t\t// BAD: may overflow if input data is very large, for example\n\t\t\t// 'Integer.MAX_VALUE'\n\t\t\tint scaled = data * 10;\n\n\t\t\t//...\n\t\t\t\n\t\t\t// GOOD: use a guard to ensure no overflows occur\n\t\t\tint scaled2;\n\t\t\tif (data < Integer.MAX_VALUE / 10)\n\t\t\t\tscaled2 = data * 10;\n\t\t\telse\n\t\t\t\tscaled2 = Integer.MAX_VALUE;\n\t\t}\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-191](https://cwe.mitre.org/data/definitions/191.html).\n"},"properties":{"tags":["security","external/cwe/cwe-190","external/cwe/cwe-191"],"description":"Arithmetic operations on user-controlled data that is not validated can cause\n overflows.","id":"java/tainted-arithmetic","kind":"path-problem","name":"User-controlled data in arithmetic expression","precision":"medium","problem.severity":"warning","security-severity":"8.6"}},{"id":"java/comparison-with-wider-type","name":"java/comparison-with-wider-type","shortDescription":{"text":"Comparison of narrow type with wide type in loop condition"},"fullDescription":{"text":"Comparisons between types of different widths in a loop condition can cause the loop to behave unexpectedly."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Comparison of narrow type with wide type in loop condition\nIn a loop condition, comparison of a value of a narrow type with a value of a wide type may always evaluate to `true` if the wider value is sufficiently large (or small). This is because the narrower value may overflow. This can lead to an infinite loop.\n\n\n## Recommendation\nChange the types of the compared values so that the value on the narrower side of the comparison is at least as wide as the value it is being compared with.\n\n\n## Example\nIn this example, `bytesReceived` is compared against `MAXGET` in a `while` loop. However, `bytesReceived` is a `short`, and `MAXGET` is a `long`. Because `MAXGET` is larger than `Short.MAX_VALUE`, the loop condition is always `true`, so the loop never terminates.\n\nThis problem is avoided in the 'GOOD' case because `bytesReceived2` is a `long`, which is as wide as the type of `MAXGET`.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t\n\t\t{\t\t\n\t\t\tint BIGNUM = Integer.MAX_VALUE;\n\t\t\tlong MAXGET = Short.MAX_VALUE + 1;\n\t\t\t\n\t\t\tchar[] buf = new char[BIGNUM];\n\n\t\t\tshort bytesReceived = 0;\n\t\t\t\n\t\t\t// BAD: 'bytesReceived' is compared with a value of wider type.\n\t\t\t// 'bytesReceived' overflows before reaching MAXGET,\n\t\t\t// causing an infinite loop.\n\t\t\twhile (bytesReceived < MAXGET) {\n\t\t\t\tbytesReceived += getFromInput(buf, bytesReceived);\n\t\t\t}\n\t\t}\n\t\t\n\t\t{\n\t\t\tlong bytesReceived2 = 0;\n\t\t\t\n\t\t\t// GOOD: 'bytesReceived2' has a type at least as wide as MAXGET.\n\t\t\twhile (bytesReceived2 < MAXGET) {\n\t\t\t\tbytesReceived2 += getFromInput(buf, bytesReceived2);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tpublic static int getFromInput(char[] buf, short pos) {\n\t\t// write to buf\n\t\t// ...\n\t\treturn 1;\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n","markdown":"# Comparison of narrow type with wide type in loop condition\nIn a loop condition, comparison of a value of a narrow type with a value of a wide type may always evaluate to `true` if the wider value is sufficiently large (or small). This is because the narrower value may overflow. This can lead to an infinite loop.\n\n\n## Recommendation\nChange the types of the compared values so that the value on the narrower side of the comparison is at least as wide as the value it is being compared with.\n\n\n## Example\nIn this example, `bytesReceived` is compared against `MAXGET` in a `while` loop. However, `bytesReceived` is a `short`, and `MAXGET` is a `long`. Because `MAXGET` is larger than `Short.MAX_VALUE`, the loop condition is always `true`, so the loop never terminates.\n\nThis problem is avoided in the 'GOOD' case because `bytesReceived2` is a `long`, which is as wide as the type of `MAXGET`.\n\n\n```java\nclass Test {\n\tpublic static void main(String[] args) {\n\t\t\n\t\t{\t\t\n\t\t\tint BIGNUM = Integer.MAX_VALUE;\n\t\t\tlong MAXGET = Short.MAX_VALUE + 1;\n\t\t\t\n\t\t\tchar[] buf = new char[BIGNUM];\n\n\t\t\tshort bytesReceived = 0;\n\t\t\t\n\t\t\t// BAD: 'bytesReceived' is compared with a value of wider type.\n\t\t\t// 'bytesReceived' overflows before reaching MAXGET,\n\t\t\t// causing an infinite loop.\n\t\t\twhile (bytesReceived < MAXGET) {\n\t\t\t\tbytesReceived += getFromInput(buf, bytesReceived);\n\t\t\t}\n\t\t}\n\t\t\n\t\t{\n\t\t\tlong bytesReceived2 = 0;\n\t\t\t\n\t\t\t// GOOD: 'bytesReceived2' has a type at least as wide as MAXGET.\n\t\t\twhile (bytesReceived2 < MAXGET) {\n\t\t\t\tbytesReceived2 += getFromInput(buf, bytesReceived2);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tpublic static int getFromInput(char[] buf, short pos) {\n\t\t// write to buf\n\t\t// ...\n\t\treturn 1;\n\t}\n}\n```\n\n## References\n* SEI CERT Oracle Coding Standard for Java: [NUM00-J. Detect or prevent integer overflow](https://wiki.sei.cmu.edu/confluence/display/java/NUM00-J.+Detect+or+prevent+integer+overflow).\n* Common Weakness Enumeration: [CWE-190](https://cwe.mitre.org/data/definitions/190.html).\n* Common Weakness Enumeration: [CWE-197](https://cwe.mitre.org/data/definitions/197.html).\n"},"properties":{"tags":["reliability","security","external/cwe/cwe-190","external/cwe/cwe-197"],"description":"Comparisons between types of different widths in a loop condition can cause the loop\n to behave unexpectedly.","id":"java/comparison-with-wider-type","kind":"problem","name":"Comparison of narrow type with wide type in loop condition","precision":"medium","problem.severity":"warning","security-severity":"8.1"}},{"id":"java/android/sensitive-keyboard-cache","name":"java/android/sensitive-keyboard-cache","shortDescription":{"text":"Android sensitive keyboard cache"},"fullDescription":{"text":"Allowing the keyboard to cache sensitive information may result in information leaks to other applications."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Android sensitive keyboard cache\nWhen a user enters information in a text input field on an Android application, their input is saved to a keyboard cache which provides autocomplete suggestions and predictions. There is a risk that sensitive user data, such as passwords or banking information, may be leaked to other applications via the keyboard cache.\n\n\n## Recommendation\nFor input fields expected to accept sensitive information, use input types such as `\"textNoSuggestions\"` (or `\"textPassword\"` for a password) to ensure the input does not get stored in the keyboard cache.\n\nOptionally, instead of declaring an input type through XML, you can set the input type in your code using `TextView.setInputType()`.\n\n\n## Example\nIn the following example, the field labeled BAD allows the password to be saved to the keyboard cache, whereas the field labeled GOOD uses the `\"textPassword\"` input type to ensure the password is not cached.\n\n\n```xml\n\n\n\n \n \n\n \n \n\n```\n\n## References\n* OWASP Mobile Application Security Testing Guide: [Determining Whether the Keyboard Cache Is Disabled for Text Input Fields](https://github.com/OWASP/owasp-mastg/blob/b7a93a2e5e0557cc9a12e55fc3f6675f6986bb86/Document/0x05d-Testing-Data-Storage.md#determining-whether-the-keyboard-cache-is-disabled-for-text-input-fields-mstg-storage-5).\n* Android Developers: [android:inputType attribute documentation.](https://developer.android.com/reference/android/widget/TextView#attr_android:inputType)\n* Common Weakness Enumeration: [CWE-524](https://cwe.mitre.org/data/definitions/524.html).\n","markdown":"# Android sensitive keyboard cache\nWhen a user enters information in a text input field on an Android application, their input is saved to a keyboard cache which provides autocomplete suggestions and predictions. There is a risk that sensitive user data, such as passwords or banking information, may be leaked to other applications via the keyboard cache.\n\n\n## Recommendation\nFor input fields expected to accept sensitive information, use input types such as `\"textNoSuggestions\"` (or `\"textPassword\"` for a password) to ensure the input does not get stored in the keyboard cache.\n\nOptionally, instead of declaring an input type through XML, you can set the input type in your code using `TextView.setInputType()`.\n\n\n## Example\nIn the following example, the field labeled BAD allows the password to be saved to the keyboard cache, whereas the field labeled GOOD uses the `\"textPassword\"` input type to ensure the password is not cached.\n\n\n```xml\n\n\n\n \n \n\n \n \n\n```\n\n## References\n* OWASP Mobile Application Security Testing Guide: [Determining Whether the Keyboard Cache Is Disabled for Text Input Fields](https://github.com/OWASP/owasp-mastg/blob/b7a93a2e5e0557cc9a12e55fc3f6675f6986bb86/Document/0x05d-Testing-Data-Storage.md#determining-whether-the-keyboard-cache-is-disabled-for-text-input-fields-mstg-storage-5).\n* Android Developers: [android:inputType attribute documentation.](https://developer.android.com/reference/android/widget/TextView#attr_android:inputType)\n* Common Weakness Enumeration: [CWE-524](https://cwe.mitre.org/data/definitions/524.html).\n"},"properties":{"tags":["security","external/cwe/cwe-524"],"description":"Allowing the keyboard to cache sensitive information may result in information leaks to other applications.","id":"java/android/sensitive-keyboard-cache","kind":"problem","name":"Android sensitive keyboard cache","precision":"medium","problem.severity":"warning","security-severity":"8.1"}},{"id":"java/insecure-smtp-ssl","name":"java/insecure-smtp-ssl","shortDescription":{"text":"Insecure JavaMail SSL Configuration"},"fullDescription":{"text":"Configuring a Java application to use authenticated mail session over SSL without certificate validation makes the session susceptible to a man-in-the-middle attack."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Insecure JavaMail SSL Configuration\nJavaMail is commonly used in Java applications to send emails. There are popular third-party libraries like Apache Commons Email which are built on JavaMail and facilitate integration. Authenticated mail sessions require user credentials and mail sessions can require SSL/TLS authentication. It is a common security vulnerability that host-specific certificate data is not validated or is incorrectly validated. Failing to validate the certificate makes the SSL session susceptible to a man-in-the-middle attack.\n\nThis query checks whether the SSL certificate is validated when credentials are used and SSL is enabled in email communications.\n\nThe query has code for both plain JavaMail invocation and mailing through Apache SimpleMail to make it more comprehensive.\n\n\n## Recommendation\nValidate SSL certificate when sensitive information is sent in email communications.\n\n\n## Example\nThe following two examples show two ways of configuring secure emails through JavaMail or Apache SimpleMail. In the 'BAD' case, credentials are sent in an SSL session without certificate validation. In the 'GOOD' case, the certificate is validated.\n\n\n```java\nimport java.util.Properties;\n\nimport javax.activation.DataSource;\nimport javax.mail.Authenticator;\nimport javax.mail.Message;\nimport javax.mail.MessagingException;\nimport javax.mail.PasswordAuthentication;\nimport javax.mail.Session;\n\nimport org.apache.logging.log4j.util.PropertiesUtil;\n\nclass JavaMail {\n public static void main(String[] args) {\n // BAD: Don't have server certificate check\n {\n\t\tfinal Properties properties = PropertiesUtil.getSystemProperties();\n\t\tproperties.put(\"mail.transport.protocol\", \"protocol\");\n\t\tproperties.put(\"mail.smtp.host\", \"hostname\");\n\t\tproperties.put(\"mail.smtp.socketFactory.class\", \"classname\");\n\n\t\tfinal Authenticator authenticator = buildAuthenticator(\"username\", \"password\");\n\t\tif (null != authenticator) {\n\t\t\tproperties.put(\"mail.smtp.auth\", \"true\");\n\t\t}\n\t\tfinal Session session = Session.getInstance(properties, authenticator);\n }\n\n // GOOD: Have server certificate check\n {\n\t\tfinal Properties properties = PropertiesUtil.getSystemProperties();\n\t\tproperties.put(\"mail.transport.protocol\", \"protocol\");\n\t\tproperties.put(\"mail.smtp.host\", \"hostname\");\n\t\tproperties.put(\"mail.smtp.socketFactory.class\", \"classname\");\n\n\t\tfinal Authenticator authenticator = buildAuthenticator(\"username\", \"password\");\n\t\tif (null != authenticator) {\n\t\t\tproperties.put(\"mail.smtp.auth\", \"true\");\n\t\t\tproperties.put(\"mail.smtp.ssl.checkserveridentity\", \"true\");\n\t\t}\n\t\tfinal Session session = Session.getInstance(properties, authenticator);\n }\n }\n}\n```\n\n```java\nimport org.apache.commons.mail.DefaultAuthenticator;\nimport org.apache.commons.mail.Email;\nimport org.apache.commons.mail.EmailException;\nimport org.apache.commons.mail.SimpleEmail;\n\nclass SimpleMail {\n public static void main(String[] args) throws EmailException {\n // BAD: Don't have setSSLCheckServerIdentity set or set as false \n {\n Email email = new SimpleEmail();\n email.setHostName(\"hostName\");\n email.setSmtpPort(25);\n email.setAuthenticator(new DefaultAuthenticator(\"username\", \"password\"));\n email.setSSLOnConnect(true);\n \n //email.setSSLCheckServerIdentity(false);\n email.setFrom(\"fromAddress\");\n email.setSubject(\"subject\");\n email.setMsg(\"body\");\n email.addTo(\"toAddress\");\n email.send();\n }\n\n // GOOD: Have setSSLCheckServerIdentity set to true\n {\n Email email = new SimpleEmail();\n email.setHostName(\"hostName\");\n email.setSmtpPort(25);\n email.setAuthenticator(new DefaultAuthenticator(\"username\", \"password\"));\n email.setSSLOnConnect(true);\n\n email.setSSLCheckServerIdentity(true);\n email.setFrom(\"fromAddress\");\n email.setSubject(\"subject\");\n email.setMsg(\"body\");\n email.addTo(\"toAddress\");\n email.send();\n }\n }\n}\n```\n\n## References\n* Jakarta Mail: [SSL Notes](https://eclipse-ee4j.github.io/mail/docs/SSLNOTES.txt).\n* Apache Commons: [Email security](https://commons.apache.org/proper/commons-email/userguide.html#Security).\n* Log4j2: [Add support for specifying an SSL configuration for SmtpAppender (CVE-2020-9488)](https://issues.apache.org/jira/browse/LOG4J2-2819).\n* Common Weakness Enumeration: [CWE-297](https://cwe.mitre.org/data/definitions/297.html).\n","markdown":"# Insecure JavaMail SSL Configuration\nJavaMail is commonly used in Java applications to send emails. There are popular third-party libraries like Apache Commons Email which are built on JavaMail and facilitate integration. Authenticated mail sessions require user credentials and mail sessions can require SSL/TLS authentication. It is a common security vulnerability that host-specific certificate data is not validated or is incorrectly validated. Failing to validate the certificate makes the SSL session susceptible to a man-in-the-middle attack.\n\nThis query checks whether the SSL certificate is validated when credentials are used and SSL is enabled in email communications.\n\nThe query has code for both plain JavaMail invocation and mailing through Apache SimpleMail to make it more comprehensive.\n\n\n## Recommendation\nValidate SSL certificate when sensitive information is sent in email communications.\n\n\n## Example\nThe following two examples show two ways of configuring secure emails through JavaMail or Apache SimpleMail. In the 'BAD' case, credentials are sent in an SSL session without certificate validation. In the 'GOOD' case, the certificate is validated.\n\n\n```java\nimport java.util.Properties;\n\nimport javax.activation.DataSource;\nimport javax.mail.Authenticator;\nimport javax.mail.Message;\nimport javax.mail.MessagingException;\nimport javax.mail.PasswordAuthentication;\nimport javax.mail.Session;\n\nimport org.apache.logging.log4j.util.PropertiesUtil;\n\nclass JavaMail {\n public static void main(String[] args) {\n // BAD: Don't have server certificate check\n {\n\t\tfinal Properties properties = PropertiesUtil.getSystemProperties();\n\t\tproperties.put(\"mail.transport.protocol\", \"protocol\");\n\t\tproperties.put(\"mail.smtp.host\", \"hostname\");\n\t\tproperties.put(\"mail.smtp.socketFactory.class\", \"classname\");\n\n\t\tfinal Authenticator authenticator = buildAuthenticator(\"username\", \"password\");\n\t\tif (null != authenticator) {\n\t\t\tproperties.put(\"mail.smtp.auth\", \"true\");\n\t\t}\n\t\tfinal Session session = Session.getInstance(properties, authenticator);\n }\n\n // GOOD: Have server certificate check\n {\n\t\tfinal Properties properties = PropertiesUtil.getSystemProperties();\n\t\tproperties.put(\"mail.transport.protocol\", \"protocol\");\n\t\tproperties.put(\"mail.smtp.host\", \"hostname\");\n\t\tproperties.put(\"mail.smtp.socketFactory.class\", \"classname\");\n\n\t\tfinal Authenticator authenticator = buildAuthenticator(\"username\", \"password\");\n\t\tif (null != authenticator) {\n\t\t\tproperties.put(\"mail.smtp.auth\", \"true\");\n\t\t\tproperties.put(\"mail.smtp.ssl.checkserveridentity\", \"true\");\n\t\t}\n\t\tfinal Session session = Session.getInstance(properties, authenticator);\n }\n }\n}\n```\n\n```java\nimport org.apache.commons.mail.DefaultAuthenticator;\nimport org.apache.commons.mail.Email;\nimport org.apache.commons.mail.EmailException;\nimport org.apache.commons.mail.SimpleEmail;\n\nclass SimpleMail {\n public static void main(String[] args) throws EmailException {\n // BAD: Don't have setSSLCheckServerIdentity set or set as false \n {\n Email email = new SimpleEmail();\n email.setHostName(\"hostName\");\n email.setSmtpPort(25);\n email.setAuthenticator(new DefaultAuthenticator(\"username\", \"password\"));\n email.setSSLOnConnect(true);\n \n //email.setSSLCheckServerIdentity(false);\n email.setFrom(\"fromAddress\");\n email.setSubject(\"subject\");\n email.setMsg(\"body\");\n email.addTo(\"toAddress\");\n email.send();\n }\n\n // GOOD: Have setSSLCheckServerIdentity set to true\n {\n Email email = new SimpleEmail();\n email.setHostName(\"hostName\");\n email.setSmtpPort(25);\n email.setAuthenticator(new DefaultAuthenticator(\"username\", \"password\"));\n email.setSSLOnConnect(true);\n\n email.setSSLCheckServerIdentity(true);\n email.setFrom(\"fromAddress\");\n email.setSubject(\"subject\");\n email.setMsg(\"body\");\n email.addTo(\"toAddress\");\n email.send();\n }\n }\n}\n```\n\n## References\n* Jakarta Mail: [SSL Notes](https://eclipse-ee4j.github.io/mail/docs/SSLNOTES.txt).\n* Apache Commons: [Email security](https://commons.apache.org/proper/commons-email/userguide.html#Security).\n* Log4j2: [Add support for specifying an SSL configuration for SmtpAppender (CVE-2020-9488)](https://issues.apache.org/jira/browse/LOG4J2-2819).\n* Common Weakness Enumeration: [CWE-297](https://cwe.mitre.org/data/definitions/297.html).\n"},"properties":{"tags":["security","external/cwe/cwe-297","owasp-top10-2021","A07:2021 - Identification and Authentication Failures"],"description":"Configuring a Java application to use authenticated mail session\n over SSL without certificate validation\n makes the session susceptible to a man-in-the-middle attack.","id":"java/insecure-smtp-ssl","kind":"problem","name":"Insecure JavaMail SSL Configuration","precision":"medium","problem.severity":"warning","security-severity":"5.9"}},{"id":"java/relative-path-command","name":"java/relative-path-command","shortDescription":{"text":"Executing a command with a relative path"},"fullDescription":{"text":"Executing a command with a relative path is vulnerable to malicious changes in the PATH environment variable."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Executing a command with a relative path\nWhen a command is executed with a relative path, the runtime uses the PATH environment variable to find which executable to run. Therefore, any user who can change the PATH environment variable can cause the software to run a different, malicious executable.\n\n\n## Recommendation\nIn most cases, simply use a command that has an absolute path instead of a relative path.\n\nIn some cases, the location of the executable might be different on different installations. In such cases, consider specifying the location of key executables with some form of configuration. When using this approach, be careful that the configuration system is not itself vulnerable to malicious modifications.\n\n\n## Example\n\n```java\nclass Test {\n public static void main(String[] args) {\n // BAD: relative path\n Runtime.getRuntime().exec(\"make\");\n \n // GOOD: absolute path\n Runtime.getRuntime().exec(\"/usr/bin/make\");\n\n // GOOD: build an absolute path from known values\n Runtime.getRuntime().exec(Paths.MAKE_PREFIX + \"/bin/make\");\n }\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n","markdown":"# Executing a command with a relative path\nWhen a command is executed with a relative path, the runtime uses the PATH environment variable to find which executable to run. Therefore, any user who can change the PATH environment variable can cause the software to run a different, malicious executable.\n\n\n## Recommendation\nIn most cases, simply use a command that has an absolute path instead of a relative path.\n\nIn some cases, the location of the executable might be different on different installations. In such cases, consider specifying the location of key executables with some form of configuration. When using this approach, be careful that the configuration system is not itself vulnerable to malicious modifications.\n\n\n## Example\n\n```java\nclass Test {\n public static void main(String[] args) {\n // BAD: relative path\n Runtime.getRuntime().exec(\"make\");\n \n // GOOD: absolute path\n Runtime.getRuntime().exec(\"/usr/bin/make\");\n\n // GOOD: build an absolute path from known values\n Runtime.getRuntime().exec(Paths.MAKE_PREFIX + \"/bin/make\");\n }\n}\n```\n\n## References\n* Common Weakness Enumeration: [CWE-78](https://cwe.mitre.org/data/definitions/78.html).\n* Common Weakness Enumeration: [CWE-88](https://cwe.mitre.org/data/definitions/88.html).\n"},"properties":{"tags":["security","external/cwe/cwe-078","external/cwe/cwe-088","owasp-top10-2021","A03:2021 - Injection"],"description":"Executing a command with a relative path is vulnerable to\n malicious changes in the PATH environment variable.","id":"java/relative-path-command","kind":"problem","name":"Executing a command with a relative path","precision":"medium","problem.severity":"warning","security-severity":"9.8"}},{"id":"java/android/unsafe-android-webview-fetch","name":"java/android/unsafe-android-webview-fetch","shortDescription":{"text":"Unsafe resource fetching in Android WebView"},"fullDescription":{"text":"JavaScript rendered inside WebViews can access protected application files and web resources from any origin exposing them to attack."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Unsafe resource fetching in Android WebView\nAndroid WebViews that allow externally controlled URLs to be loaded, and whose JavaScript interface is enabled, are potentially vulnerable to cross-site scripting and sensitive resource disclosure attacks.\n\nA `WebView` whose `WebSettings` object has called `setAllowFileAccessFromFileURLs(true)` or `setAllowUniversalAccessFromFileURLs(true)` must not load any untrusted web content.\n\nEnabling these settings allows malicious scripts loaded in a `file://` context to launch cross-site scripting attacks, accessing arbitrary local files including WebView cookies, session tokens, private app data or even credentials used on arbitrary web sites.\n\nThis query detects the following two scenarios:\n\n1. A vulnerability introduced by WebViews when JavaScript is enabled and remote inputs are allowed.\n1. A more severe vulnerability when \"allow cross-origin resource access\" is also enabled. This setting was deprecated in API level 30 (Android 11), but most devices are still affected, especially since some Android phones are updated slowly or no longer updated at all.\n\n## Recommendation\nOnly allow trusted web content to be displayed in WebViews when JavaScript is enabled. Disallow cross-origin resource access in WebSettings to reduce the attack surface.\n\n\n## Example\nThe following example shows both 'BAD' and 'GOOD' configurations. In the 'BAD' configuration, JavaScript and the allow access setting are enabled and URLs are loaded from externally controlled inputs. In the 'GOOD' configuration, JavaScript is disabled or only trusted web content is allowed to be loaded.\n\n\n```java\npublic class UnsafeAndroidAccess extends Activity {\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\tsetContentView(R.layout.webview);\n\n\t\t// BAD: Have both JavaScript and cross-origin resource access enabled in webview while\n\t\t// taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(R.id.my_webview);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\t\t\twebSettings.setAllowUniversalAccessFromFileURLs(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getExtras().getString(\"url\"); // dangerous remote input from the intent's Bundle of extras\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// BAD: Have both JavaScript and cross-origin resource access enabled in webview while\n\t\t// taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(R.id.my_webview);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\t\t\twebSettings.setAllowUniversalAccessFromFileURLs(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getStringExtra(\"url\"); //dangerous remote input from intent extra\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// GOOD: Have JavaScript and cross-origin resource access disabled by default on modern Android (Jellybean+) while taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(-1);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getExtras().getString(\"url\"); // remote input\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// GOOD: Have JavaScript enabled in webview but remote user input is not allowed\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(-1);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\twv.loadUrl(\"https://www.mycorp.com\");\n\t\t}\n\t}\n}\n```\n\n## References\n* Google Help: [Fixing a File-based XSS Vulnerability](https://support.google.com/faqs/answer/7668153?hl=en)\n* OWASP: [Testing JavaScript Execution in WebViews (MSTG-PLATFORM-5)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#testing-javascript-execution-in-webviews-mstg-platform-5)\n* OWASP: [Testing WebView Protocol Handlers (MSTG-PLATFORM-6)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#testing-webview-protocol-handlers-mstg-platform-6)\n* Common Weakness Enumeration: [CWE-749](https://cwe.mitre.org/data/definitions/749.html).\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n","markdown":"# Unsafe resource fetching in Android WebView\nAndroid WebViews that allow externally controlled URLs to be loaded, and whose JavaScript interface is enabled, are potentially vulnerable to cross-site scripting and sensitive resource disclosure attacks.\n\nA `WebView` whose `WebSettings` object has called `setAllowFileAccessFromFileURLs(true)` or `setAllowUniversalAccessFromFileURLs(true)` must not load any untrusted web content.\n\nEnabling these settings allows malicious scripts loaded in a `file://` context to launch cross-site scripting attacks, accessing arbitrary local files including WebView cookies, session tokens, private app data or even credentials used on arbitrary web sites.\n\nThis query detects the following two scenarios:\n\n1. A vulnerability introduced by WebViews when JavaScript is enabled and remote inputs are allowed.\n1. A more severe vulnerability when \"allow cross-origin resource access\" is also enabled. This setting was deprecated in API level 30 (Android 11), but most devices are still affected, especially since some Android phones are updated slowly or no longer updated at all.\n\n## Recommendation\nOnly allow trusted web content to be displayed in WebViews when JavaScript is enabled. Disallow cross-origin resource access in WebSettings to reduce the attack surface.\n\n\n## Example\nThe following example shows both 'BAD' and 'GOOD' configurations. In the 'BAD' configuration, JavaScript and the allow access setting are enabled and URLs are loaded from externally controlled inputs. In the 'GOOD' configuration, JavaScript is disabled or only trusted web content is allowed to be loaded.\n\n\n```java\npublic class UnsafeAndroidAccess extends Activity {\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\tsetContentView(R.layout.webview);\n\n\t\t// BAD: Have both JavaScript and cross-origin resource access enabled in webview while\n\t\t// taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(R.id.my_webview);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\t\t\twebSettings.setAllowUniversalAccessFromFileURLs(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getExtras().getString(\"url\"); // dangerous remote input from the intent's Bundle of extras\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// BAD: Have both JavaScript and cross-origin resource access enabled in webview while\n\t\t// taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(R.id.my_webview);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\t\t\twebSettings.setAllowUniversalAccessFromFileURLs(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getStringExtra(\"url\"); //dangerous remote input from intent extra\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// GOOD: Have JavaScript and cross-origin resource access disabled by default on modern Android (Jellybean+) while taking remote user inputs\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(-1);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tString thisUrl = getIntent().getExtras().getString(\"url\"); // remote input\n\t\t\twv.loadUrl(thisUrl);\n\t\t}\n\n\t\t// GOOD: Have JavaScript enabled in webview but remote user input is not allowed\n\t\t{\n\t\t\tWebView wv = (WebView) findViewById(-1);\n\t\t\tWebSettings webSettings = wv.getSettings();\n\n\t\t\twebSettings.setJavaScriptEnabled(true);\n\n\t\t\twv.setWebViewClient(new WebViewClient() {\n\t\t\t\t@Override\n\t\t\t\tpublic boolean shouldOverrideUrlLoading(WebView view, String url) {\n\t\t\t\t\tview.loadUrl(url);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\twv.loadUrl(\"https://www.mycorp.com\");\n\t\t}\n\t}\n}\n```\n\n## References\n* Google Help: [Fixing a File-based XSS Vulnerability](https://support.google.com/faqs/answer/7668153?hl=en)\n* OWASP: [Testing JavaScript Execution in WebViews (MSTG-PLATFORM-5)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#testing-javascript-execution-in-webviews-mstg-platform-5)\n* OWASP: [Testing WebView Protocol Handlers (MSTG-PLATFORM-6)](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05h-Testing-Platform-Interaction.md#testing-webview-protocol-handlers-mstg-platform-6)\n* Common Weakness Enumeration: [CWE-749](https://cwe.mitre.org/data/definitions/749.html).\n* Common Weakness Enumeration: [CWE-79](https://cwe.mitre.org/data/definitions/79.html).\n"},"properties":{"tags":["security","external/cwe/cwe-749","external/cwe/cwe-079","owasp-top10-2021","A03:2021 - Injection"],"description":"JavaScript rendered inside WebViews can access protected\n application files and web resources from any origin exposing them to attack.","id":"java/android/unsafe-android-webview-fetch","kind":"path-problem","name":"Unsafe resource fetching in Android WebView","precision":"medium","problem.severity":"warning","security-severity":"6.1"}},{"id":"java/concatenated-sql-query","name":"java/concatenated-sql-query","shortDescription":{"text":"Query built by concatenation with a possibly-untrusted string"},"fullDescription":{"text":"Building a SQL or Java Persistence query by concatenating a possibly-untrusted string is vulnerable to insertion of malicious code."},"defaultConfiguration":{"enabled":true,"level":"error"},"help":{"text":"# Query built by concatenation with a possibly-untrusted string\nEven when the components of a SQL query are not fully controlled by a user, it is a vulnerability to build the query by directly concatenating those components. Perhaps a separate vulnerability will allow the user to gain control of the component. As well, a user who cannot gain full control of an input might influence it enough to cause the SQL query to fail to run.\n\n\n## Recommendation\nUsually, it is better to use a SQL prepared statement than to build a complete SQL query with string concatenation. A prepared statement can include a wildcard, written as a question mark (?), for each part of the SQL query that is expected to be filled in by a different value each time it is run. When the query is later executed, a value must be supplied for each wildcard in the query.\n\nIn the Java Persistence Query Language, it is better to use queries with parameters than to build a complete query with string concatenation. A Java Persistence query can include a parameter placeholder for each part of the query that is expected to be filled in by a different value when run. A parameter placeholder may be indicated by a colon (:) followed by a parameter name, or by a question mark (?) followed by an integer position. When the query is later executed, a value must be supplied for each parameter in the query, using the `setParameter` method. Specifying the query using the `@NamedQuery` annotation introduces an additional level of safety: the query must be a constant string literal, preventing construction by string concatenation, and the only way to fill in values for parts of the query is by setting positional parameters.\n\nIt is good practice to use prepared statements (in SQL) or query parameters (in the Java Persistence Query Language) for supplying parameter values to a query, whether or not any of the parameters are directly traceable to user input. Doing so avoids any need to worry about quoting and escaping.\n\n\n## Example\nIn the following example, the code runs a simple SQL query in two different ways.\n\nThe first way involves building a query, `query1`, by concatenating the result of `getCategory` with some string literals. The result of `getCategory` can include special characters, or it might be refactored later so that it may return something that contains special characters.\n\nThe second way, which shows good practice, involves building a query, `query2`, with a single string literal that includes a wildcard (`?`). The wildcard is then given a value by calling `setString`. This version is immune to injection attacks, because any special characters in the result of `getCategory` are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have SQL special characters in it\n String category = getCategory();\n Statement statement = connection.createStatement();\n String query1 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='\"\n + category + \"' ORDER BY PRICE\";\n ResultSet results = statement.executeQuery(query1);\n}\n\n{\n // GOOD: use a prepared query\n String category = getCategory();\n String query2 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=? ORDER BY PRICE\";\n PreparedStatement statement = connection.prepareStatement(query2);\n statement.setString(1, category);\n ResultSet results = statement.executeQuery();\n}\n```\n\n## References\n* OWASP: [SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html).\n* SEI CERT Oracle Coding Standard for Java: [IDS00-J. Prevent SQL injection](https://wiki.sei.cmu.edu/confluence/display/java/IDS00-J.+Prevent+SQL+injection).\n* The Java Tutorials: [Using Prepared Statements](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html).\n* Common Weakness Enumeration: [CWE-89](https://cwe.mitre.org/data/definitions/89.html).\n* Common Weakness Enumeration: [CWE-564](https://cwe.mitre.org/data/definitions/564.html).\n","markdown":"# Query built by concatenation with a possibly-untrusted string\nEven when the components of a SQL query are not fully controlled by a user, it is a vulnerability to build the query by directly concatenating those components. Perhaps a separate vulnerability will allow the user to gain control of the component. As well, a user who cannot gain full control of an input might influence it enough to cause the SQL query to fail to run.\n\n\n## Recommendation\nUsually, it is better to use a SQL prepared statement than to build a complete SQL query with string concatenation. A prepared statement can include a wildcard, written as a question mark (?), for each part of the SQL query that is expected to be filled in by a different value each time it is run. When the query is later executed, a value must be supplied for each wildcard in the query.\n\nIn the Java Persistence Query Language, it is better to use queries with parameters than to build a complete query with string concatenation. A Java Persistence query can include a parameter placeholder for each part of the query that is expected to be filled in by a different value when run. A parameter placeholder may be indicated by a colon (:) followed by a parameter name, or by a question mark (?) followed by an integer position. When the query is later executed, a value must be supplied for each parameter in the query, using the `setParameter` method. Specifying the query using the `@NamedQuery` annotation introduces an additional level of safety: the query must be a constant string literal, preventing construction by string concatenation, and the only way to fill in values for parts of the query is by setting positional parameters.\n\nIt is good practice to use prepared statements (in SQL) or query parameters (in the Java Persistence Query Language) for supplying parameter values to a query, whether or not any of the parameters are directly traceable to user input. Doing so avoids any need to worry about quoting and escaping.\n\n\n## Example\nIn the following example, the code runs a simple SQL query in two different ways.\n\nThe first way involves building a query, `query1`, by concatenating the result of `getCategory` with some string literals. The result of `getCategory` can include special characters, or it might be refactored later so that it may return something that contains special characters.\n\nThe second way, which shows good practice, involves building a query, `query2`, with a single string literal that includes a wildcard (`?`). The wildcard is then given a value by calling `setString`. This version is immune to injection attacks, because any special characters in the result of `getCategory` are not given any special treatment.\n\n\n```java\n{\n // BAD: the category might have SQL special characters in it\n String category = getCategory();\n Statement statement = connection.createStatement();\n String query1 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='\"\n + category + \"' ORDER BY PRICE\";\n ResultSet results = statement.executeQuery(query1);\n}\n\n{\n // GOOD: use a prepared query\n String category = getCategory();\n String query2 = \"SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY=? ORDER BY PRICE\";\n PreparedStatement statement = connection.prepareStatement(query2);\n statement.setString(1, category);\n ResultSet results = statement.executeQuery();\n}\n```\n\n## References\n* OWASP: [SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html).\n* SEI CERT Oracle Coding Standard for Java: [IDS00-J. Prevent SQL injection](https://wiki.sei.cmu.edu/confluence/display/java/IDS00-J.+Prevent+SQL+injection).\n* The Java Tutorials: [Using Prepared Statements](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html).\n* Common Weakness Enumeration: [CWE-89](https://cwe.mitre.org/data/definitions/89.html).\n* Common Weakness Enumeration: [CWE-564](https://cwe.mitre.org/data/definitions/564.html).\n"},"properties":{"tags":["security","external/cwe/cwe-089","external/cwe/cwe-564","owasp-top10-2021","A03:2021 - Injection"],"description":"Building a SQL or Java Persistence query by concatenating a possibly-untrusted string\n is vulnerable to insertion of malicious code.","id":"java/concatenated-sql-query","kind":"problem","name":"Query built by concatenation with a possibly-untrusted string","precision":"medium","problem.severity":"error","security-severity":"8.8"}},{"id":"java/unreachable-exit-in-loop","name":"java/unreachable-exit-in-loop","shortDescription":{"text":"Loop with unreachable exit condition"},"fullDescription":{"text":"An iteration or loop with an exit condition that cannot be reached is an indication of faulty logic and can likely lead to infinite looping."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Loop with unreachable exit condition\nLoops can contain multiple exit conditions, either directly in the loop condition or as guards around `break` or `return` statements. If an exit condition cannot be satisfied, then the code is misleading at best, and the loop might not terminate.\n\n\n## Recommendation\nWhen writing a loop that is intended to terminate, make sure that all the necessary exit conditions can be satisfied and that loop termination is clear.\n\n\n## Example\nThe following example shows a potentially infinite loop, since the inner loop condition is constantly true. Of course, the loop may or may not be infinite depending on the behavior of `shouldBreak`, but if this was intended as the only exit condition the loop should be rewritten to make this clear.\n\n\n```java\nfor (int i=0; i<10; i++) {\n for (int j=0; i<10; j++) {\n // do stuff\n if (shouldBreak()) break;\n }\n}\n\n```\nTo fix the loop the condition is corrected to check the right variable.\n\n\n```java\nfor (int i=0; i<10; i++) {\n for (int j=0; j<10; j++) {\n // do stuff\n if (shouldBreak()) break;\n }\n}\n\n```\n\n## References\n* Java Language Specification: [Blocks and Statements](https://docs.oracle.com/javase/specs/jls/se11/html/jls-14.html).\n* Common Weakness Enumeration: [CWE-835](https://cwe.mitre.org/data/definitions/835.html).\n","markdown":"# Loop with unreachable exit condition\nLoops can contain multiple exit conditions, either directly in the loop condition or as guards around `break` or `return` statements. If an exit condition cannot be satisfied, then the code is misleading at best, and the loop might not terminate.\n\n\n## Recommendation\nWhen writing a loop that is intended to terminate, make sure that all the necessary exit conditions can be satisfied and that loop termination is clear.\n\n\n## Example\nThe following example shows a potentially infinite loop, since the inner loop condition is constantly true. Of course, the loop may or may not be infinite depending on the behavior of `shouldBreak`, but if this was intended as the only exit condition the loop should be rewritten to make this clear.\n\n\n```java\nfor (int i=0; i<10; i++) {\n for (int j=0; i<10; j++) {\n // do stuff\n if (shouldBreak()) break;\n }\n}\n\n```\nTo fix the loop the condition is corrected to check the right variable.\n\n\n```java\nfor (int i=0; i<10; i++) {\n for (int j=0; j<10; j++) {\n // do stuff\n if (shouldBreak()) break;\n }\n}\n\n```\n\n## References\n* Java Language Specification: [Blocks and Statements](https://docs.oracle.com/javase/specs/jls/se11/html/jls-14.html).\n* Common Weakness Enumeration: [CWE-835](https://cwe.mitre.org/data/definitions/835.html).\n"},"properties":{"tags":["security","external/cwe/cwe-835"],"description":"An iteration or loop with an exit condition that cannot be\n reached is an indication of faulty logic and can likely lead to infinite\n looping.","id":"java/unreachable-exit-in-loop","kind":"problem","name":"Loop with unreachable exit condition","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/android/incomplete-provider-permissions","name":"java/android/incomplete-provider-permissions","shortDescription":{"text":"Missing read or write permission in a content provider"},"fullDescription":{"text":"Android content providers which do not configure both read and write permissions can allow permission bypass."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Missing read or write permission in a content provider\nThe Android manifest file specifies the content providers for the application using `provider` elements. The `provider` element specifies the explicit permissions an application requires in order to access a resource using that provider. You specify the permissions using the `android:readPermission`, `android:writePermission`, or `android:permission` attributes. If you do not specify the permission required to perform an operation, the application will implicitly have access to perform that operation. For example, if you specify only `android:readPermission`, the application must have explicit permission to read data, but requires no permission to write data.\n\n\n## Recommendation\nTo prevent permission bypass, you should create `provider` elements that either specify both the `android:readPermission` and `android:writePermission` attributes, or specify the `android:permission` attribute.\n\n\n## Example\nIn the following two (bad) examples, the provider is configured with only read or write permissions. This allows a malicious application to bypass the permission check by requesting access to the unrestricted operation.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\nIn the following (good) examples, the provider is configured with full permissions, protecting it from a permissions bypass.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Documentation: [Provider element](https://developer.android.com/guide/topics/manifest/provider-element)\n* CVE-2021-41166: [Insufficient permission control in Nextcloud Android app](https://nvd.nist.gov/vuln/detail/CVE-2021-41166)\n* GitHub Security Lab Research: [Insufficient permission control in Nextcloud Android app](https://securitylab.github.com/advisories/GHSL-2021-1007-Nextcloud_Android_app/#issue-2-permission-bypass-in-disklruimagecachefileprovider-ghsl-2021-1008)\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n","markdown":"# Missing read or write permission in a content provider\nThe Android manifest file specifies the content providers for the application using `provider` elements. The `provider` element specifies the explicit permissions an application requires in order to access a resource using that provider. You specify the permissions using the `android:readPermission`, `android:writePermission`, or `android:permission` attributes. If you do not specify the permission required to perform an operation, the application will implicitly have access to perform that operation. For example, if you specify only `android:readPermission`, the application must have explicit permission to read data, but requires no permission to write data.\n\n\n## Recommendation\nTo prevent permission bypass, you should create `provider` elements that either specify both the `android:readPermission` and `android:writePermission` attributes, or specify the `android:permission` attribute.\n\n\n## Example\nIn the following two (bad) examples, the provider is configured with only read or write permissions. This allows a malicious application to bypass the permission check by requesting access to the unrestricted operation.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\nIn the following (good) examples, the provider is configured with full permissions, protecting it from a permissions bypass.\n\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n```xml\n\n \n \n \n \n \n\n\n```\n\n## References\n* Android Documentation: [Provider element](https://developer.android.com/guide/topics/manifest/provider-element)\n* CVE-2021-41166: [Insufficient permission control in Nextcloud Android app](https://nvd.nist.gov/vuln/detail/CVE-2021-41166)\n* GitHub Security Lab Research: [Insufficient permission control in Nextcloud Android app](https://securitylab.github.com/advisories/GHSL-2021-1007-Nextcloud_Android_app/#issue-2-permission-bypass-in-disklruimagecachefileprovider-ghsl-2021-1008)\n* Common Weakness Enumeration: [CWE-926](https://cwe.mitre.org/data/definitions/926.html).\n"},"properties":{"tags":["security","external/cwe/cwe-926"],"description":"Android content providers which do not configure both read and write permissions can allow permission bypass.","id":"java/android/incomplete-provider-permissions","kind":"problem","name":"Missing read or write permission in a content provider","precision":"medium","problem.severity":"warning","security-severity":"8.2"}},{"id":"java/potentially-weak-cryptographic-algorithm","name":"java/potentially-weak-cryptographic-algorithm","shortDescription":{"text":"Use of a potentially broken or risky cryptographic algorithm"},"fullDescription":{"text":"Using broken or weak cryptographic algorithms can allow an attacker to compromise security."},"defaultConfiguration":{"enabled":true,"level":"warning"},"help":{"text":"# Use of a potentially broken or risky cryptographic algorithm\nUsing broken or weak cryptographic algorithms can leave data vulnerable to being decrypted.\n\nMany cryptographic algorithms provided by cryptography libraries are known to be weak, or flawed. Using such an algorithm means that an attacker may be able to easily decrypt the encrypted data.\n\n\n## Recommendation\nEnsure that you use a strong, modern cryptographic algorithm. Use at least AES-128 or RSA-2048. Do not use the ECB encryption mode since it is vulnerable to replay and other attacks.\n\n\n## Example\nThe following code shows an example of using a java `Cipher` to encrypt some data. When creating a `Cipher` instance, you must specify the encryption algorithm to use. The first example uses DES, which is an older algorithm that is now considered weak. The second example uses AES, which is a strong modern algorithm.\n\n\n```java\n// BAD: DES is a weak algorithm \nCipher des = Cipher.getInstance(\"DES\");\ncipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);\n\nbyte[] encrypted = cipher.doFinal(input.getBytes(\"UTF-8\"));\n\n// ...\n\n// GOOD: AES is a strong algorithm\nCipher aes = Cipher.getInstance(\"AES\");\n\n// ...\n\n```\n\n## References\n* NIST, FIPS 140 Annex a: [ Approved Security Functions](http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf).\n* NIST, SP 800-131A: [ Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf).\n* Common Weakness Enumeration: [CWE-327](https://cwe.mitre.org/data/definitions/327.html).\n* Common Weakness Enumeration: [CWE-328](https://cwe.mitre.org/data/definitions/328.html).\n","markdown":"# Use of a potentially broken or risky cryptographic algorithm\nUsing broken or weak cryptographic algorithms can leave data vulnerable to being decrypted.\n\nMany cryptographic algorithms provided by cryptography libraries are known to be weak, or flawed. Using such an algorithm means that an attacker may be able to easily decrypt the encrypted data.\n\n\n## Recommendation\nEnsure that you use a strong, modern cryptographic algorithm. Use at least AES-128 or RSA-2048. Do not use the ECB encryption mode since it is vulnerable to replay and other attacks.\n\n\n## Example\nThe following code shows an example of using a java `Cipher` to encrypt some data. When creating a `Cipher` instance, you must specify the encryption algorithm to use. The first example uses DES, which is an older algorithm that is now considered weak. The second example uses AES, which is a strong modern algorithm.\n\n\n```java\n// BAD: DES is a weak algorithm \nCipher des = Cipher.getInstance(\"DES\");\ncipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);\n\nbyte[] encrypted = cipher.doFinal(input.getBytes(\"UTF-8\"));\n\n// ...\n\n// GOOD: AES is a strong algorithm\nCipher aes = Cipher.getInstance(\"AES\");\n\n// ...\n\n```\n\n## References\n* NIST, FIPS 140 Annex a: [ Approved Security Functions](http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexa.pdf).\n* NIST, SP 800-131A: [ Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf).\n* Common Weakness Enumeration: [CWE-327](https://cwe.mitre.org/data/definitions/327.html).\n* Common Weakness Enumeration: [CWE-328](https://cwe.mitre.org/data/definitions/328.html).\n"},"properties":{"tags":["security","external/cwe/cwe-327","external/cwe/cwe-328","owasp-top10-2021","A02:2021 - Cryptographic Failures"],"description":"Using broken or weak cryptographic algorithms can allow an attacker to compromise security.","id":"java/potentially-weak-cryptographic-algorithm","kind":"path-problem","name":"Use of a potentially broken or risky cryptographic algorithm","precision":"medium","problem.severity":"warning","security-severity":"7.5"}},{"id":"java/summary/lines-of-code","name":"java/summary/lines-of-code","shortDescription":{"text":"Total lines of Java code in the database"},"fullDescription":{"text":"The total number of lines of code across all files. This is a useful metric of the size of a database. For all files that were seen during the build, this query counts the lines of code, excluding whitespace or comments."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","lines-of-code"],"description":"The total number of lines of code across all files. This is a useful metric of the size of a database.\n For all files that were seen during the build, this query counts the lines of code, excluding whitespace\n or comments.","id":"java/summary/lines-of-code","kind":"metric","name":"Total lines of Java code in the database"}},{"id":"java/telemetry/supported-external-api","name":"java/telemetry/supported-external-api","shortDescription":{"text":"Usage of supported APIs coming from external libraries"},"fullDescription":{"text":"A list of supported 3rd party APIs used in the codebase. Excludes test and generated code."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of supported 3rd party APIs used in the codebase. Excludes test and generated code.","id":"java/telemetry/supported-external-api","kind":"metric","name":"Usage of supported APIs coming from external libraries"}},{"id":"java/telemetry/supported-external-api-taint","name":"java/telemetry/supported-external-api-taint","shortDescription":{"text":"Supported flow steps in external libraries"},"fullDescription":{"text":"A list of 3rd party APIs detected as flow steps. Excludes test and generated code."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of 3rd party APIs detected as flow steps. Excludes test and generated code.","id":"java/telemetry/supported-external-api-taint","kind":"metric","name":"Supported flow steps in external libraries"}},{"id":"java/telemetry/supported-external-api-sinks","name":"java/telemetry/supported-external-api-sinks","shortDescription":{"text":"Supported sinks in external libraries"},"fullDescription":{"text":"A list of 3rd party APIs detected as sinks. Excludes test and generated code."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of 3rd party APIs detected as sinks. Excludes test and generated code.","id":"java/telemetry/supported-external-api-sinks","kind":"metric","name":"Supported sinks in external libraries"}},{"id":"java/telemetry/external-libs","name":"java/telemetry/external-libs","shortDescription":{"text":"External libraries"},"fullDescription":{"text":"A list of external libraries used in the code"},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of external libraries used in the code","id":"java/telemetry/external-libs","kind":"metric","name":"External libraries"}},{"id":"java/telemetry/unsupported-external-api","name":"java/telemetry/unsupported-external-api","shortDescription":{"text":"Usage of unsupported APIs coming from external libraries"},"fullDescription":{"text":"A list of 3rd party APIs used in the codebase. Excludes test and generated code."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of 3rd party APIs used in the codebase. Excludes test and generated code.","id":"java/telemetry/unsupported-external-api","kind":"metric","name":"Usage of unsupported APIs coming from external libraries"}},{"id":"java/telemetry/extraction-information","name":"java/telemetry/extraction-information","shortDescription":{"text":"Java extraction information"},"fullDescription":{"text":"Information about the extraction for a Java database"},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"Information about the extraction for a Java database","id":"java/telemetry/extraction-information","kind":"metric","name":"Java extraction information"}},{"id":"java/telemetry/supported-external-api-sources","name":"java/telemetry/supported-external-api-sources","shortDescription":{"text":"Supported sources in external libraries"},"fullDescription":{"text":"A list of 3rd party APIs detected as sources. Excludes test and generated code."},"defaultConfiguration":{"enabled":true},"properties":{"tags":["summary","telemetry"],"description":"A list of 3rd party APIs detected as sources. Excludes test and generated code.","id":"java/telemetry/supported-external-api-sources","kind":"metric","name":"Supported sources in external libraries"}}],"locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-queries/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/java-queries/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/python-all","semanticVersion":"0.7.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-all/0.7.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-all/0.7.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/cpp-queries","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-queries/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-queries/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/go-queries","semanticVersion":"0.4.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-queries/0.4.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-queries/0.4.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/suite-helpers","semanticVersion":"0.4.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/suite-helpers/0.4.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/suite-helpers/0.4.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/python-queries","semanticVersion":"0.6.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-queries/0.6.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/python-queries/0.6.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/cpp-all","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-all/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/cpp-all/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/ruby-queries","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-queries/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/ruby-queries/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/swift-all","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/swift-all/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/swift-all/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/typetracking","semanticVersion":"0.0.3+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/typetracking/0.0.3/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/typetracking/0.0.3/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/go-examples","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-examples/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/go-examples/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/swift-queries","semanticVersion":"0.0.0+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/swift-queries/0.0.0/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/swift-queries/0.0.0/qlpack.yml","description":{"text":"The QL pack definition file."}}]},{"name":"codeql/javascript-queries","semanticVersion":"0.5.2+aef66c462abe817e33aad91d97aa782a1e2ad2c7","locations":[{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-queries/0.5.2/","description":{"text":"The QL pack root directory."}},{"uri":"file:///opt/hostedtoolcache/CodeQL/2.12.2-20230207/x64/codeql/qlpacks/codeql/javascript-queries/0.5.2/qlpack.yml","description":{"text":"The QL pack definition file."}}]}]},"invocations":[{"toolExecutionNotifications":[{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/FlagController.java","uriBaseId":"%SRCROOT%","index":54}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/SimpleXXETest.java","uriBaseId":"%SRCROOT%","index":55}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsersTest.java","uriBaseId":"%SRCROOT%","index":56}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/StoredXssCommentsTest.java","uriBaseId":"%SRCROOT%","index":57}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignmentTest.java","uriBaseId":"%SRCROOT%","index":58}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/PasswordResetLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":59}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6aTest.java","uriBaseId":"%SRCROOT%","index":60}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/session/LessonTrackerTest.java","uriBaseId":"%SRCROOT%","index":61}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/IDORIntegrationTest.java","uriBaseId":"%SRCROOT%","index":62}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrievalTest.java","uriBaseId":"%SRCROOT%","index":63}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpointTest.java","uriBaseId":"%SRCROOT%","index":64}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequestTest.java","uriBaseId":"%SRCROOT%","index":65}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLessonTest.java","uriBaseId":"%SRCROOT%","index":66}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProviderTest.java","uriBaseId":"%SRCROOT%","index":67}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13Test.java","uriBaseId":"%SRCROOT%","index":68}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdminTest.java","uriBaseId":"%SRCROOT%","index":69}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java","uriBaseId":"%SRCROOT%","index":70}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/authbypass/BypassVerificationTest.java","uriBaseId":"%SRCROOT%","index":71}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxControllerTest.java","uriBaseId":"%SRCROOT%","index":72}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/ProgressRaceConditionIntegrationTest.java","uriBaseId":"%SRCROOT%","index":73}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/DeserializationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":74}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonMenuServiceTest.java","uriBaseId":"%SRCROOT%","index":75}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFixTest.java","uriBaseId":"%SRCROOT%","index":76}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/XSSIntegrationTest.java","uriBaseId":"%SRCROOT%","index":77}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":3}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/CryptoIntegrationTest.java","uriBaseId":"%SRCROOT%","index":78}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/ReportCardServiceTest.java","uriBaseId":"%SRCROOT%","index":79}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/plugins/LessonTest.java","uriBaseId":"%SRCROOT%","index":80}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/cia/CIAQuizTest.java","uriBaseId":"%SRCROOT%","index":81}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":82}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/csrf/CSRFFeedbackTest.java","uriBaseId":"%SRCROOT%","index":83}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/DisplayUserTest.java","uriBaseId":"%SRCROOT%","index":84}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpointTest.java","uriBaseId":"%SRCROOT%","index":85}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationTest.java","uriBaseId":"%SRCROOT%","index":86}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5Test.java","uriBaseId":"%SRCROOT%","index":87}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenusTest.java","uriBaseId":"%SRCROOT%","index":88}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1Test.java","uriBaseId":"%SRCROOT%","index":89}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionAdvancedIntegrationTest.java","uriBaseId":"%SRCROOT%","index":90}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest2.java","uriBaseId":"%SRCROOT%","index":91}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":92}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserValidatorTest.java","uriBaseId":"%SRCROOT%","index":93}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/WebGoatApplication.java","uriBaseId":"%SRCROOT%","index":94}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/CSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":95}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignmentTest.java","uriBaseId":"%SRCROOT%","index":96}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5aTest.java","uriBaseId":"%SRCROOT%","index":97}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/AccessControlIntegrationTest.java","uriBaseId":"%SRCROOT%","index":98}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/SqlLessonTest.java","uriBaseId":"%SRCROOT%","index":99}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/user/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":100}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserTrackerRepositoryTest.java","uriBaseId":"%SRCROOT%","index":101}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":102}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/WebWolfApplication.java","uriBaseId":"%SRCROOT%","index":103}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignmentTest.java","uriBaseId":"%SRCROOT%","index":104}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInputTest.java","uriBaseId":"%SRCROOT%","index":105}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingTest.java","uriBaseId":"%SRCROOT%","index":106}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevToolsTest.java","uriBaseId":"%SRCROOT%","index":107}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/WebWolfIntegrationTest.java","uriBaseId":"%SRCROOT%","index":108}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10Test.java","uriBaseId":"%SRCROOT%","index":109}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonProgressServiceTest.java","uriBaseId":"%SRCROOT%","index":110}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6bTest.java","uriBaseId":"%SRCROOT%","index":111}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2Test.java","uriBaseId":"%SRCROOT%","index":112}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionMitigationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":113}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":114}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpointTest.java","uriBaseId":"%SRCROOT%","index":115}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/cryptography/CryptoUtilTest.java","uriBaseId":"%SRCROOT%","index":116}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/PathTraversalIntegrationTest.java","uriBaseId":"%SRCROOT%","index":117}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpointTest.java","uriBaseId":"%SRCROOT%","index":118}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/session/LabelDebuggerTest.java","uriBaseId":"%SRCROOT%","index":119}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpointTest.java","uriBaseId":"%SRCROOT%","index":120}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDecTest.java","uriBaseId":"%SRCROOT%","index":121}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":122}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidationTest.java","uriBaseId":"%SRCROOT%","index":123}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SessionManagementIntegrationTest.java","uriBaseId":"%SRCROOT%","index":124}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionYourHashTest.java","uriBaseId":"%SRCROOT%","index":125}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/GeneralLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":126}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepositoryTest.java","uriBaseId":"%SRCROOT%","index":127}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserRepositoryTest.java","uriBaseId":"%SRCROOT%","index":128}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentTest.java","uriBaseId":"%SRCROOT%","index":129}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/deserialization/DeserializeTest.java","uriBaseId":"%SRCROOT%","index":130}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":131}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/challenges/Assignment1Test.java","uriBaseId":"%SRCROOT%","index":132}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9Test.java","uriBaseId":"%SRCROOT%","index":133}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest1.java","uriBaseId":"%SRCROOT%","index":134}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywordsTest.java","uriBaseId":"%SRCROOT%","index":135}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadTest.java","uriBaseId":"%SRCROOT%","index":136}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8Test.java","uriBaseId":"%SRCROOT%","index":137}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpointTest.java","uriBaseId":"%SRCROOT%","index":138}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/assignments/AssignmentEndpointTest.java","uriBaseId":"%SRCROOT%","index":139}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/ChallengeIntegrationTest.java","uriBaseId":"%SRCROOT%","index":140}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/IntegrationTest.java","uriBaseId":"%SRCROOT%","index":141}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/XXEIntegrationTest.java","uriBaseId":"%SRCROOT%","index":142}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/jwt/JWTTokenTest.java","uriBaseId":"%SRCROOT%","index":143}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":144}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/HintServiceTest.java","uriBaseId":"%SRCROOT%","index":145}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/WebSession.java","uriBaseId":"%SRCROOT%","index":146}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/CourseConfiguration.java","uriBaseId":"%SRCROOT%","index":147}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonMenuService.java","uriBaseId":"%SRCROOT%","index":148}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelDebugService.java","uriBaseId":"%SRCROOT%","index":149}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItem.java","uriBaseId":"%SRCROOT%","index":150}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdmin.java","uriBaseId":"%SRCROOT%","index":151}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Language.java","uriBaseId":"%SRCROOT%","index":152}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/EnvironmentService.java","uriBaseId":"%SRCROOT%","index":153}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofingTask.java","uriBaseId":"%SRCROOT%","index":154}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfileAltUrl.java","uriBaseId":"%SRCROOT%","index":155}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/ParentConfig.java","uriBaseId":"%SRCROOT%","index":156}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java","uriBaseId":"%SRCROOT%","index":157}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/controller/StartLesson.java","uriBaseId":"%SRCROOT%","index":158}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserRepository.java","uriBaseId":"%SRCROOT%","index":159}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":52}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjection.java","uriBaseId":"%SRCROOT%","index":160}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordResetEmail.java","uriBaseId":"%SRCROOT%","index":161}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Assignment1.java","uriBaseId":"%SRCROOT%","index":162}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTController.java","uriBaseId":"%SRCROOT%","index":163}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserService.java","uriBaseId":"%SRCROOT%","index":164}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevTools.java","uriBaseId":"%SRCROOT%","index":165}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":166}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/Salaries.java","uriBaseId":"%SRCROOT%","index":167}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/LessonTemplateResolver.java","uriBaseId":"%SRCROOT%","index":168}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/resetlink/PasswordChangeForm.java","uriBaseId":"%SRCROOT%","index":169}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/Authentication.java","uriBaseId":"%SRCROOT%","index":170}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsers.java","uriBaseId":"%SRCROOT%","index":171}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/SessionService.java","uriBaseId":"%SRCROOT%","index":172}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Ping.java","uriBaseId":"%SRCROOT%","index":173}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxController.java","uriBaseId":"%SRCROOT%","index":174}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRF.java","uriBaseId":"%SRCROOT%","index":175}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AttackResult.java","uriBaseId":"%SRCROOT%","index":176}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenus.java","uriBaseId":"%SRCROOT%","index":177}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/UsernameMacro.java","uriBaseId":"%SRCROOT%","index":178}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/LessonTracker.java","uriBaseId":"%SRCROOT%","index":179}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfMacro.java","uriBaseId":"%SRCROOT%","index":180}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/Requests.java","uriBaseId":"%SRCROOT%","index":181}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":182}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/OperatingSystemMacro.java","uriBaseId":"%SRCROOT%","index":183}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpoint.java","uriBaseId":"%SRCROOT%","index":184}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":41}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfile.java","uriBaseId":"%SRCROOT%","index":185}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookie.java","uriBaseId":"%SRCROOT%","index":186}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebWolf.java","uriBaseId":"%SRCROOT%","index":187}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java","uriBaseId":"%SRCROOT%","index":188}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignment.java","uriBaseId":"%SRCROOT%","index":189}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebGoat.java","uriBaseId":"%SRCROOT%","index":190}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRF.java","uriBaseId":"%SRCROOT%","index":191}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/HammerHead.java","uriBaseId":"%SRCROOT%","index":192}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkLesson.java","uriBaseId":"%SRCROOT%","index":193}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelService.java","uriBaseId":"%SRCROOT%","index":194}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonTitleService.java","uriBaseId":"%SRCROOT%","index":195}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordReset.java","uriBaseId":"%SRCROOT%","index":196}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswordsAssignment.java","uriBaseId":"%SRCROOT%","index":197}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java","uriBaseId":"%SRCROOT%","index":198}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingMitigation.java","uriBaseId":"%SRCROOT%","index":199}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/LessonTrackerInterceptor.java","uriBaseId":"%SRCROOT%","index":200}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionAC.java","uriBaseId":"%SRCROOT%","index":201}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Category.java","uriBaseId":"%SRCROOT%","index":202}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFFeedback.java","uriBaseId":"%SRCROOT%","index":203}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepository.java","uriBaseId":"%SRCROOT%","index":204}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/Review.java","uriBaseId":"%SRCROOT%","index":205}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingAccessControlUserRepository.java","uriBaseId":"%SRCROOT%","index":206}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/ForgedReviews.java","uriBaseId":"%SRCROOT%","index":207}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/dummy/insecure/framework/VulnerableTaskHolder.java","uriBaseId":"%SRCROOT%","index":208}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":2}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignment.java","uriBaseId":"%SRCROOT%","index":209}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofing.java","uriBaseId":"%SRCROOT%","index":210}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":211}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfRootMacro.java","uriBaseId":"%SRCROOT%","index":212}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpoint.java","uriBaseId":"%SRCROOT%","index":213}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItemType.java","uriBaseId":"%SRCROOT%","index":214}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":215}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatTmpDirMacro.java","uriBaseId":"%SRCROOT%","index":216}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWT.java","uriBaseId":"%SRCROOT%","index":217}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/UserSessionData.java","uriBaseId":"%SRCROOT%","index":218}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":51}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentEndpoint.java","uriBaseId":"%SRCROOT%","index":219}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTampering.java","uriBaseId":"%SRCROOT%","index":220}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flags.java","uriBaseId":"%SRCROOT%","index":221}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpProxies.java","uriBaseId":"%SRCROOT%","index":222}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsEndpoint.java","uriBaseId":"%SRCROOT%","index":223}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Hint.java","uriBaseId":"%SRCROOT%","index":224}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/controller/Welcome.java","uriBaseId":"%SRCROOT%","index":225}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":27}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Comment.java","uriBaseId":"%SRCROOT%","index":226}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/PathTraversal.java","uriBaseId":"%SRCROOT%","index":227}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonInfoService.java","uriBaseId":"%SRCROOT%","index":228}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonScanner.java","uriBaseId":"%SRCROOT%","index":229}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java","uriBaseId":"%SRCROOT%","index":230}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":42}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/VerifyAccount.java","uriBaseId":"%SRCROOT%","index":231}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/DatabaseConfiguration.java","uriBaseId":"%SRCROOT%","index":232}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonProgressService.java","uriBaseId":"%SRCROOT%","index":233}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasics.java","uriBaseId":"%SRCROOT%","index":234}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignment.java","uriBaseId":"%SRCROOT%","index":235}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFieldRestrictions.java","uriBaseId":"%SRCROOT%","index":236}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Challenge5.java","uriBaseId":"%SRCROOT%","index":237}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Challenge7.java","uriBaseId":"%SRCROOT%","index":238}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictions.java","uriBaseId":"%SRCROOT%","index":239}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Vote.java","uriBaseId":"%SRCROOT%","index":240}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/ImageServlet.java","uriBaseId":"%SRCROOT%","index":241}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Challenge1.java","uriBaseId":"%SRCROOT%","index":242}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":243}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/ReportCardService.java","uriBaseId":"%SRCROOT%","index":244}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpoint.java","uriBaseId":"%SRCROOT%","index":245}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":1}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTQuiz.java","uriBaseId":"%SRCROOT%","index":246}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/TriedQuestions.java","uriBaseId":"%SRCROOT%","index":247}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":248}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/SolutionConstants.java","uriBaseId":"%SRCROOT%","index":249}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDec.java","uriBaseId":"%SRCROOT%","index":250}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatVersionMacro.java","uriBaseId":"%SRCROOT%","index":251}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Email.java","uriBaseId":"%SRCROOT%","index":252}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson3.java","uriBaseId":"%SRCROOT%","index":253}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFLogin.java","uriBaseId":"%SRCROOT%","index":254}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/QuestionsAssignment.java","uriBaseId":"%SRCROOT%","index":255}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/Contact.java","uriBaseId":"%SRCROOT%","index":256}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/Comment.java","uriBaseId":"%SRCROOT%","index":257}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":53}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/WebWolfIntroduction.java","uriBaseId":"%SRCROOT%","index":258}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORLogin.java","uriBaseId":"%SRCROOT%","index":259}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/RestartLessonService.java","uriBaseId":"%SRCROOT%","index":260}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponents.java","uriBaseId":"%SRCROOT%","index":261}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/Cryptography.java","uriBaseId":"%SRCROOT%","index":262}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/SerializationHelper.java","uriBaseId":"%SRCROOT%","index":263}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserValidator.java","uriBaseId":"%SRCROOT%","index":264}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java","uriBaseId":"%SRCROOT%","index":265}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Assignment8.java","uriBaseId":"%SRCROOT%","index":266}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":50}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson4.java","uriBaseId":"%SRCROOT%","index":267}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/UserProfile.java","uriBaseId":"%SRCROOT%","index":268}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Assignment.java","uriBaseId":"%SRCROOT%","index":269}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSession.java","uriBaseId":"%SRCROOT%","index":270}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webgoatintroduction/WebGoatIntroduction.java","uriBaseId":"%SRCROOT%","index":271}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentHints.java","uriBaseId":"%SRCROOT%","index":272}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignment.java","uriBaseId":"%SRCROOT%","index":273}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserialization.java","uriBaseId":"%SRCROOT%","index":274}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHash.java","uriBaseId":"%SRCROOT%","index":275}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":46}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/SampleAttack.java","uriBaseId":"%SRCROOT%","index":276}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/User.java","uriBaseId":"%SRCROOT%","index":277}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOREditOtherProfiile.java","uriBaseId":"%SRCROOT%","index":278}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserRepository.java","uriBaseId":"%SRCROOT%","index":279}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java","uriBaseId":"%SRCROOT%","index":280}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignment.java","uriBaseId":"%SRCROOT%","index":281}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOR.java","uriBaseId":"%SRCROOT%","index":282}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOtherProfile.java","uriBaseId":"%SRCROOT%","index":283}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/AuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":284}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswords.java","uriBaseId":"%SRCROOT%","index":285}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/StartWebGoat.java","uriBaseId":"%SRCROOT%","index":286}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/LabelDebugger.java","uriBaseId":"%SRCROOT%","index":287}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/ContactImpl.java","uriBaseId":"%SRCROOT%","index":288}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Messages.java","uriBaseId":"%SRCROOT%","index":289}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsLesson.java","uriBaseId":"%SRCROOT%","index":290}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/EncodingAssignment.java","uriBaseId":"%SRCROOT%","index":291}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AuthBypass.java","uriBaseId":"%SRCROOT%","index":292}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Lesson.java","uriBaseId":"%SRCROOT%","index":293}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkDummy.java","uriBaseId":"%SRCROOT%","index":294}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/PluginMessages.java","uriBaseId":"%SRCROOT%","index":295}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidation.java","uriBaseId":"%SRCROOT%","index":296}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTamperingTask.java","uriBaseId":"%SRCROOT%","index":297}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentForgotPassword.java","uriBaseId":"%SRCROOT%","index":298}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionAdvanced.java","uriBaseId":"%SRCROOT%","index":299}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentPath.java","uriBaseId":"%SRCROOT%","index":300}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIA.java","uriBaseId":"%SRCROOT%","index":301}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLoginTask.java","uriBaseId":"%SRCROOT%","index":302}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingQuiz.java","uriBaseId":"%SRCROOT%","index":303}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLogin.java","uriBaseId":"%SRCROOT%","index":304}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/Email.java","uriBaseId":"%SRCROOT%","index":305}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonInfoModel.java","uriBaseId":"%SRCROOT%","index":306}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Challenge8.java","uriBaseId":"%SRCROOT%","index":307}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebWolfRedirect.java","uriBaseId":"%SRCROOT%","index":308}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/LessonTemplate.java","uriBaseId":"%SRCROOT%","index":309}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":310}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORDiffAttributes.java","uriBaseId":"%SRCROOT%","index":311}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1.java","uriBaseId":"%SRCROOT%","index":312}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/StartupMessage.java","uriBaseId":"%SRCROOT%","index":313}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFiltering.java","uriBaseId":"%SRCROOT%","index":314}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionMitigations.java","uriBaseId":"%SRCROOT%","index":315}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallengeLogin.java","uriBaseId":"%SRCROOT%","index":316}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10a.java","uriBaseId":"%SRCROOT%","index":317}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFGetFlag.java","uriBaseId":"%SRCROOT%","index":318}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/CrossSiteScriptingStored.java","uriBaseId":"%SRCROOT%","index":319}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flag.java","uriBaseId":"%SRCROOT%","index":320}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Views.java","uriBaseId":"%SRCROOT%","index":321}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/XXE.java","uriBaseId":"%SRCROOT%","index":322}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/WebWolfTraceRepository.java","uriBaseId":"%SRCROOT%","index":323}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonConnectionInvocationHandler.java","uriBaseId":"%SRCROOT%","index":324}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/HintService.java","uriBaseId":"%SRCROOT%","index":325}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTrackerRepository.java","uriBaseId":"%SRCROOT%","index":326}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/LessonDataSource.java","uriBaseId":"%SRCROOT%","index":327}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/Scoreboard.java","uriBaseId":"%SRCROOT%","index":328}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.java","uriBaseId":"%SRCROOT%","index":329}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIAQuiz.java","uriBaseId":"%SRCROOT%","index":330}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":331}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/XOREncodingAssignment.java","uriBaseId":"%SRCROOT%","index":332}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTracker.java","uriBaseId":"%SRCROOT%","index":333}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserSession.java","uriBaseId":"%SRCROOT%","index":334}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/Course.java","uriBaseId":"%SRCROOT%","index":335}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequest.java","uriBaseId":"%SRCROOT%","index":336}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6b.java","uriBaseId":"%SRCROOT%","index":337}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionQuiz.java","uriBaseId":"%SRCROOT%","index":338}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Initializeable.java","uriBaseId":"%SRCROOT%","index":339}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SimpleMailAssignment.java","uriBaseId":"%SRCROOT%","index":340}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/EnvironmentExposure.java","uriBaseId":"%SRCROOT%","index":341}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/ChallengeIntro.java","uriBaseId":"%SRCROOT%","index":342}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsQuiz.java","uriBaseId":"%SRCROOT%","index":343}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/CryptoUtil.java","uriBaseId":"%SRCROOT%","index":344}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFConfirmFlag1.java","uriBaseId":"%SRCROOT%","index":345}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTToken.java","uriBaseId":"%SRCROOT%","index":346}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/Email.java","uriBaseId":"%SRCROOT%","index":347}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/User.java","uriBaseId":"%SRCROOT%","index":348}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/diagnostics/successfully-extracted-files","index":1,"toolComponent":{"index":18}},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":1}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/HintService.java","uriBaseId":"%SRCROOT%","index":325}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/StartupMessage.java","uriBaseId":"%SRCROOT%","index":349}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/XOREncodingAssignment.java","uriBaseId":"%SRCROOT%","index":332}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpoint.java","uriBaseId":"%SRCROOT%","index":245}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/QuestionsAssignment.java","uriBaseId":"%SRCROOT%","index":255}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Initializeable.java","uriBaseId":"%SRCROOT%","index":339}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserRepository.java","uriBaseId":"%SRCROOT%","index":279}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasics.java","uriBaseId":"%SRCROOT%","index":234}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Assignment.java","uriBaseId":"%SRCROOT%","index":269}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":350}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java","uriBaseId":"%SRCROOT%","index":157}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/CommentsEndpoint.java","uriBaseId":"%SRCROOT%","index":351}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/CryptoUtil.java","uriBaseId":"%SRCROOT%","index":344}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":182}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxControllerTest.java","uriBaseId":"%SRCROOT%","index":352}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/CourseConfiguration.java","uriBaseId":"%SRCROOT%","index":353}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfMacro.java","uriBaseId":"%SRCROOT%","index":180}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenus.java","uriBaseId":"%SRCROOT%","index":177}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/WebWolfIntegrationTest.java","uriBaseId":"%SRCROOT%","index":108}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/SerializationHelper.java","uriBaseId":"%SRCROOT%","index":263}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionAdvanced.java","uriBaseId":"%SRCROOT%","index":299}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":354}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":355}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Views.java","uriBaseId":"%SRCROOT%","index":321}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/ReportCardServiceTest.java","uriBaseId":"%SRCROOT%","index":356}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Initializeable.java","uriBaseId":"%SRCROOT%","index":357}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/dummy/insecure/framework/VulnerableTaskHolder.java","uriBaseId":"%SRCROOT%","index":358}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignment.java","uriBaseId":"%SRCROOT%","index":359}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson3.java","uriBaseId":"%SRCROOT%","index":360}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswords.java","uriBaseId":"%SRCROOT%","index":361}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/SolutionConstants.java","uriBaseId":"%SRCROOT%","index":362}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6b.java","uriBaseId":"%SRCROOT%","index":337}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFieldRestrictions.java","uriBaseId":"%SRCROOT%","index":363}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/QuestionsAssignment.java","uriBaseId":"%SRCROOT%","index":364}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":365}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonTitleService.java","uriBaseId":"%SRCROOT%","index":195}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/HammerHead.java","uriBaseId":"%SRCROOT%","index":366}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/controller/StartLesson.java","uriBaseId":"%SRCROOT%","index":158}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Challenge8.java","uriBaseId":"%SRCROOT%","index":367}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Challenge7.java","uriBaseId":"%SRCROOT%","index":368}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/challenges/Assignment1Test.java","uriBaseId":"%SRCROOT%","index":369}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":370}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIA.java","uriBaseId":"%SRCROOT%","index":301}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2Test.java","uriBaseId":"%SRCROOT%","index":371}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/User.java","uriBaseId":"%SRCROOT%","index":277}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxController.java","uriBaseId":"%SRCROOT%","index":174}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingAccessControlUserRepository.java","uriBaseId":"%SRCROOT%","index":206}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":52}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFieldRestrictions.java","uriBaseId":"%SRCROOT%","index":236}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTController.java","uriBaseId":"%SRCROOT%","index":163}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingTest.java","uriBaseId":"%SRCROOT%","index":106}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Assignment.java","uriBaseId":"%SRCROOT%","index":372}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentEndpoint.java","uriBaseId":"%SRCROOT%","index":219}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":373}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFixTest.java","uriBaseId":"%SRCROOT%","index":76}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsEndpoint.java","uriBaseId":"%SRCROOT%","index":223}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/IDORIntegrationTest.java","uriBaseId":"%SRCROOT%","index":62}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":374}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/HintService.java","uriBaseId":"%SRCROOT%","index":375}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flags.java","uriBaseId":"%SRCROOT%","index":221}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/.mvn/wrapper/MavenWrapperDownloader.java","uriBaseId":"%SRCROOT%","index":376}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Hint.java","uriBaseId":"%SRCROOT%","index":377}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserTracker.java","uriBaseId":"%SRCROOT%","index":378}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasics.java","uriBaseId":"%SRCROOT%","index":379}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfileAltUrl.java","uriBaseId":"%SRCROOT%","index":380}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingMitigation.java","uriBaseId":"%SRCROOT%","index":199}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1.java","uriBaseId":"%SRCROOT%","index":312}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":381}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/VerifyAccount.java","uriBaseId":"%SRCROOT%","index":382}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/StartWebGoat.java","uriBaseId":"%SRCROOT%","index":383}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/DisplayUserTest.java","uriBaseId":"%SRCROOT%","index":84}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpoint.java","uriBaseId":"%SRCROOT%","index":384}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHash.java","uriBaseId":"%SRCROOT%","index":275}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AttackResult.java","uriBaseId":"%SRCROOT%","index":385}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWT.java","uriBaseId":"%SRCROOT%","index":386}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordReset.java","uriBaseId":"%SRCROOT%","index":196}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofingTask.java","uriBaseId":"%SRCROOT%","index":154}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebWolf.java","uriBaseId":"%SRCROOT%","index":187}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallengeLogin.java","uriBaseId":"%SRCROOT%","index":316}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/jwt/JWTController.java","uriBaseId":"%SRCROOT%","index":387}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":388}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":389}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":390}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenusTest.java","uriBaseId":"%SRCROOT%","index":391}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookie.java","uriBaseId":"%SRCROOT%","index":186}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenus.java","uriBaseId":"%SRCROOT%","index":392}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsLesson.java","uriBaseId":"%SRCROOT%","index":393}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/CrossSiteScriptingStored.java","uriBaseId":"%SRCROOT%","index":394}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/authbypass/BypassVerificationTest.java","uriBaseId":"%SRCROOT%","index":395}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":396}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/PluginMessages.java","uriBaseId":"%SRCROOT%","index":295}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentForgotPassword.java","uriBaseId":"%SRCROOT%","index":397}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/UserProfile.java","uriBaseId":"%SRCROOT%","index":398}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/StartupMessage.java","uriBaseId":"%SRCROOT%","index":313}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/authbypass/BypassVerificationTest.java","uriBaseId":"%SRCROOT%","index":71}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/AccessControlIntegrationTest.java","uriBaseId":"%SRCROOT%","index":98}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Flags.java","uriBaseId":"%SRCROOT%","index":399}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/Review.java","uriBaseId":"%SRCROOT%","index":400}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":401}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":402}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Category.java","uriBaseId":"%SRCROOT%","index":202}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/EncodingAssignment.java","uriBaseId":"%SRCROOT%","index":291}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/ContactImpl.java","uriBaseId":"%SRCROOT%","index":288}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProviderTest.java","uriBaseId":"%SRCROOT%","index":403}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserValidator.java","uriBaseId":"%SRCROOT%","index":404}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingAccessControlUserRepository.java","uriBaseId":"%SRCROOT%","index":405}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/ChallengeIntro.java","uriBaseId":"%SRCROOT%","index":406}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadTest.java","uriBaseId":"%SRCROOT%","index":136}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/DeserializationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":407}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsers.java","uriBaseId":"%SRCROOT%","index":408}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/TriedQuestions.java","uriBaseId":"%SRCROOT%","index":409}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":410}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/PasswordResetLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":411}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6bTest.java","uriBaseId":"%SRCROOT%","index":111}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/PluginMessages.java","uriBaseId":"%SRCROOT%","index":412}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/GeneralLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":413}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/OperatingSystemMacro.java","uriBaseId":"%SRCROOT%","index":183}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTampering.java","uriBaseId":"%SRCROOT%","index":414}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.java","uriBaseId":"%SRCROOT%","index":329}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Challenge5.java","uriBaseId":"%SRCROOT%","index":237}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserService.java","uriBaseId":"%SRCROOT%","index":164}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionMitigations.java","uriBaseId":"%SRCROOT%","index":415}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpointTest.java","uriBaseId":"%SRCROOT%","index":64}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/lessontemplate/SampleAttack.java","uriBaseId":"%SRCROOT%","index":416}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionMitigations.java","uriBaseId":"%SRCROOT%","index":315}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/SimpleMailAssignment.java","uriBaseId":"%SRCROOT%","index":417}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/LessonMenuServiceTest.java","uriBaseId":"%SRCROOT%","index":418}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":419}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Challenge5.java","uriBaseId":"%SRCROOT%","index":420}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Challenge1.java","uriBaseId":"%SRCROOT%","index":242}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLogin.java","uriBaseId":"%SRCROOT%","index":304}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":215}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelDebugService.java","uriBaseId":"%SRCROOT%","index":149}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/Email.java","uriBaseId":"%SRCROOT%","index":421}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/cia/CIAQuizTest.java","uriBaseId":"%SRCROOT%","index":81}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOtherProfile.java","uriBaseId":"%SRCROOT%","index":283}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":122}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":422}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignment.java","uriBaseId":"%SRCROOT%","index":423}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Comment.java","uriBaseId":"%SRCROOT%","index":226}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTrackerRepository.java","uriBaseId":"%SRCROOT%","index":326}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/cryptography/CryptoUtilTest.java","uriBaseId":"%SRCROOT%","index":424}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/ReportCardService.java","uriBaseId":"%SRCROOT%","index":425}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webgoatintroduction/WebGoatIntroduction.java","uriBaseId":"%SRCROOT%","index":271}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentEndpoint.java","uriBaseId":"%SRCROOT%","index":426}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/session/LessonTrackerTest.java","uriBaseId":"%SRCROOT%","index":61}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfRootMacro.java","uriBaseId":"%SRCROOT%","index":427}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":428}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/Email.java","uriBaseId":"%SRCROOT%","index":429}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8Test.java","uriBaseId":"%SRCROOT%","index":137}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdminTest.java","uriBaseId":"%SRCROOT%","index":69}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonMenuService.java","uriBaseId":"%SRCROOT%","index":148}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":430}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":431}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/SerializationHelper.java","uriBaseId":"%SRCROOT%","index":432}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/user/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":100}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/ParentConfig.java","uriBaseId":"%SRCROOT%","index":156}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/RestartLessonService.java","uriBaseId":"%SRCROOT%","index":260}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/controller/StartLesson.java","uriBaseId":"%SRCROOT%","index":433}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java","uriBaseId":"%SRCROOT%","index":434}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequestTest.java","uriBaseId":"%SRCROOT%","index":65}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6aTest.java","uriBaseId":"%SRCROOT%","index":435}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/WebWolfTraceRepository.java","uriBaseId":"%SRCROOT%","index":323}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Flag.java","uriBaseId":"%SRCROOT%","index":436}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Assignment1.java","uriBaseId":"%SRCROOT%","index":437}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORDiffAttributes.java","uriBaseId":"%SRCROOT%","index":311}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/PathTraversalIntegrationTest.java","uriBaseId":"%SRCROOT%","index":438}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/WebGoatApplication.java","uriBaseId":"%SRCROOT%","index":439}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevTools.java","uriBaseId":"%SRCROOT%","index":440}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDecTest.java","uriBaseId":"%SRCROOT%","index":121}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentPath.java","uriBaseId":"%SRCROOT%","index":300}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFixTest.java","uriBaseId":"%SRCROOT%","index":441}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":92}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/XSSIntegrationTest.java","uriBaseId":"%SRCROOT%","index":442}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingMitigation.java","uriBaseId":"%SRCROOT%","index":443}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponents.java","uriBaseId":"%SRCROOT%","index":261}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":53}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/Language.java","uriBaseId":"%SRCROOT%","index":444}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDec.java","uriBaseId":"%SRCROOT%","index":445}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentHints.java","uriBaseId":"%SRCROOT%","index":446}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Assignment8.java","uriBaseId":"%SRCROOT%","index":266}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/Course.java","uriBaseId":"%SRCROOT%","index":335}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":447}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepository.java","uriBaseId":"%SRCROOT%","index":204}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":131}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/Contact.java","uriBaseId":"%SRCROOT%","index":448}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Messages.java","uriBaseId":"%SRCROOT%","index":289}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/LessonTracker.java","uriBaseId":"%SRCROOT%","index":179}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":449}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/WebGoatApplication.java","uriBaseId":"%SRCROOT%","index":94}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5aTest.java","uriBaseId":"%SRCROOT%","index":97}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":144}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignment.java","uriBaseId":"%SRCROOT%","index":273}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/Salaries.java","uriBaseId":"%SRCROOT%","index":450}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10a.java","uriBaseId":"%SRCROOT%","index":317}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LabelDebugService.java","uriBaseId":"%SRCROOT%","index":451}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequest.java","uriBaseId":"%SRCROOT%","index":336}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionQuiz.java","uriBaseId":"%SRCROOT%","index":338}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/WebWolfIntroduction.java","uriBaseId":"%SRCROOT%","index":258}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/deserialization/DeserializeTest.java","uriBaseId":"%SRCROOT%","index":452}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SessionManagementIntegrationTest.java","uriBaseId":"%SRCROOT%","index":453}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/GeneralLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":126}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItemType.java","uriBaseId":"%SRCROOT%","index":454}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/XOREncodingAssignment.java","uriBaseId":"%SRCROOT%","index":455}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFFeedback.java","uriBaseId":"%SRCROOT%","index":203}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonProgressService.java","uriBaseId":"%SRCROOT%","index":233}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserRepository.java","uriBaseId":"%SRCROOT%","index":456}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":457}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":27}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/csrf/CSRFFeedbackTest.java","uriBaseId":"%SRCROOT%","index":83}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":211}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6aTest.java","uriBaseId":"%SRCROOT%","index":60}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/Messages.java","uriBaseId":"%SRCROOT%","index":458}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":459}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/ForgedReviews.java","uriBaseId":"%SRCROOT%","index":460}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionYourHashTest.java","uriBaseId":"%SRCROOT%","index":125}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrievalTest.java","uriBaseId":"%SRCROOT%","index":461}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":462}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonScanner.java","uriBaseId":"%SRCROOT%","index":463}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":82}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java","uriBaseId":"%SRCROOT%","index":464}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":465}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest2.java","uriBaseId":"%SRCROOT%","index":466}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORDiffAttributes.java","uriBaseId":"%SRCROOT%","index":467}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/CSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":468}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/XXEIntegrationTest.java","uriBaseId":"%SRCROOT%","index":469}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrievalTest.java","uriBaseId":"%SRCROOT%","index":63}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/CryptoUtil.java","uriBaseId":"%SRCROOT%","index":470}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/LessonDataSource.java","uriBaseId":"%SRCROOT%","index":327}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserValidatorTest.java","uriBaseId":"%SRCROOT%","index":93}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8Test.java","uriBaseId":"%SRCROOT%","index":471}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java","uriBaseId":"%SRCROOT%","index":472}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cia/CIA.java","uriBaseId":"%SRCROOT%","index":473}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5aTest.java","uriBaseId":"%SRCROOT%","index":474}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":475}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWT.java","uriBaseId":"%SRCROOT%","index":217}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentPath.java","uriBaseId":"%SRCROOT%","index":476}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/plugins/LessonTest.java","uriBaseId":"%SRCROOT%","index":477}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Email.java","uriBaseId":"%SRCROOT%","index":478}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/UserService.java","uriBaseId":"%SRCROOT%","index":479}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTQuiz.java","uriBaseId":"%SRCROOT%","index":246}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/UserSessionData.java","uriBaseId":"%SRCROOT%","index":480}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java","uriBaseId":"%SRCROOT%","index":280}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTracker.java","uriBaseId":"%SRCROOT%","index":333}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/AuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":284}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpoint.java","uriBaseId":"%SRCROOT%","index":481}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java","uriBaseId":"%SRCROOT%","index":70}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/ParentConfig.java","uriBaseId":"%SRCROOT%","index":482}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLoginTask.java","uriBaseId":"%SRCROOT%","index":302}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/PasswordResetLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":59}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":248}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonConnectionInvocationHandler.java","uriBaseId":"%SRCROOT%","index":483}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":484}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignment.java","uriBaseId":"%SRCROOT%","index":485}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponents.java","uriBaseId":"%SRCROOT%","index":486}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/WebWolfIntegrationTest.java","uriBaseId":"%SRCROOT%","index":487}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/UserRepository.java","uriBaseId":"%SRCROOT%","index":488}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentHints.java","uriBaseId":"%SRCROOT%","index":272}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsLesson.java","uriBaseId":"%SRCROOT%","index":290}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignmentTest.java","uriBaseId":"%SRCROOT%","index":489}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/csrf/CSRFFeedbackTest.java","uriBaseId":"%SRCROOT%","index":490}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6bTest.java","uriBaseId":"%SRCROOT%","index":491}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":492}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHash.java","uriBaseId":"%SRCROOT%","index":493}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/Cryptography.java","uriBaseId":"%SRCROOT%","index":262}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/LabelDebugger.java","uriBaseId":"%SRCROOT%","index":494}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/user/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":495}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/LessonDataSource.java","uriBaseId":"%SRCROOT%","index":496}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionAdvancedIntegrationTest.java","uriBaseId":"%SRCROOT%","index":497}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9Test.java","uriBaseId":"%SRCROOT%","index":133}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest2.java","uriBaseId":"%SRCROOT%","index":91}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpointTest.java","uriBaseId":"%SRCROOT%","index":498}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRF.java","uriBaseId":"%SRCROOT%","index":175}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/ForgedReviews.java","uriBaseId":"%SRCROOT%","index":207}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java","uriBaseId":"%SRCROOT%","index":188}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationTest.java","uriBaseId":"%SRCROOT%","index":86}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTamperingTask.java","uriBaseId":"%SRCROOT%","index":297}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/ContactImpl.java","uriBaseId":"%SRCROOT%","index":499}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/IntegrationTest.java","uriBaseId":"%SRCROOT%","index":500}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1Test.java","uriBaseId":"%SRCROOT%","index":89}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/CryptoIntegrationTest.java","uriBaseId":"%SRCROOT%","index":78}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/LessonTemplate.java","uriBaseId":"%SRCROOT%","index":309}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java","uriBaseId":"%SRCROOT%","index":230}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserValidator.java","uriBaseId":"%SRCROOT%","index":264}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10Test.java","uriBaseId":"%SRCROOT%","index":501}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevToolsTest.java","uriBaseId":"%SRCROOT%","index":502}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDOR.java","uriBaseId":"%SRCROOT%","index":503}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/session/LessonTrackerTest.java","uriBaseId":"%SRCROOT%","index":504}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionMitigationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":113}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/CryptoIntegrationTest.java","uriBaseId":"%SRCROOT%","index":505}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserTrackerRepository.java","uriBaseId":"%SRCROOT%","index":506}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidationTest.java","uriBaseId":"%SRCROOT%","index":123}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/jwt/JWTToken.java","uriBaseId":"%SRCROOT%","index":507}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/DatabaseConfiguration.java","uriBaseId":"%SRCROOT%","index":232}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/cryptography/CryptoUtilTest.java","uriBaseId":"%SRCROOT%","index":116}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":508}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpointTest.java","uriBaseId":"%SRCROOT%","index":115}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTampering.java","uriBaseId":"%SRCROOT%","index":220}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFGetFlag.java","uriBaseId":"%SRCROOT%","index":318}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/TriedQuestions.java","uriBaseId":"%SRCROOT%","index":247}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/PathTraversal.java","uriBaseId":"%SRCROOT%","index":227}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/Email.java","uriBaseId":"%SRCROOT%","index":305}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Lesson.java","uriBaseId":"%SRCROOT%","index":509}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":102}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Hint.java","uriBaseId":"%SRCROOT%","index":224}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Assignment1.java","uriBaseId":"%SRCROOT%","index":162}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepository.java","uriBaseId":"%SRCROOT%","index":510}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/votes/Vote.java","uriBaseId":"%SRCROOT%","index":511}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/DeserializationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":74}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/Cryptography.java","uriBaseId":"%SRCROOT%","index":512}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/Requests.java","uriBaseId":"%SRCROOT%","index":181}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/Course.java","uriBaseId":"%SRCROOT%","index":513}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentTest.java","uriBaseId":"%SRCROOT%","index":129}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionAdvancedIntegrationTest.java","uriBaseId":"%SRCROOT%","index":90}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LabelService.java","uriBaseId":"%SRCROOT%","index":514}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignment.java","uriBaseId":"%SRCROOT%","index":189}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Lesson.java","uriBaseId":"%SRCROOT%","index":293}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":515}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItemType.java","uriBaseId":"%SRCROOT%","index":214}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.java","uriBaseId":"%SRCROOT%","index":516}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepositoryTest.java","uriBaseId":"%SRCROOT%","index":517}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookie.java","uriBaseId":"%SRCROOT%","index":518}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/WebSession.java","uriBaseId":"%SRCROOT%","index":519}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/Salaries.java","uriBaseId":"%SRCROOT%","index":167}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordResetEmail.java","uriBaseId":"%SRCROOT%","index":520}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10Test.java","uriBaseId":"%SRCROOT%","index":109}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java","uriBaseId":"%SRCROOT%","index":521}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebGoat.java","uriBaseId":"%SRCROOT%","index":190}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRF.java","uriBaseId":"%SRCROOT%","index":191}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpointTest.java","uriBaseId":"%SRCROOT%","index":522}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFGetFlag.java","uriBaseId":"%SRCROOT%","index":523}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":524}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictions.java","uriBaseId":"%SRCROOT%","index":239}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":525}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/session/LabelDebuggerTest.java","uriBaseId":"%SRCROOT%","index":526}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpoint.java","uriBaseId":"%SRCROOT%","index":184}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/dummy/insecure/framework/VulnerableTaskHolder.java","uriBaseId":"%SRCROOT%","index":208}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignmentTest.java","uriBaseId":"%SRCROOT%","index":104}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":527}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":528}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":529}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserTrackerRepositoryTest.java","uriBaseId":"%SRCROOT%","index":530}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkLesson.java","uriBaseId":"%SRCROOT%","index":193}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/XXE.java","uriBaseId":"%SRCROOT%","index":322}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFConfirmFlag1.java","uriBaseId":"%SRCROOT%","index":345}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/CourseConfiguration.java","uriBaseId":"%SRCROOT%","index":147}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserValidatorTest.java","uriBaseId":"%SRCROOT%","index":531}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":532}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Vote.java","uriBaseId":"%SRCROOT%","index":240}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/UsernameMacro.java","uriBaseId":"%SRCROOT%","index":178}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignmentTest.java","uriBaseId":"%SRCROOT%","index":58}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java","uriBaseId":"%SRCROOT%","index":265}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfileAltUrl.java","uriBaseId":"%SRCROOT%","index":155}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/LessonTemplateResolver.java","uriBaseId":"%SRCROOT%","index":168}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionYourHashTest.java","uriBaseId":"%SRCROOT%","index":533}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserTrackerRepositoryTest.java","uriBaseId":"%SRCROOT%","index":101}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidation.java","uriBaseId":"%SRCROOT%","index":534}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxControllerTest.java","uriBaseId":"%SRCROOT%","index":72}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":535}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/cia/CIAQuizTest.java","uriBaseId":"%SRCROOT%","index":536}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserialization.java","uriBaseId":"%SRCROOT%","index":537}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepositoryTest.java","uriBaseId":"%SRCROOT%","index":127}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonConnectionInvocationHandler.java","uriBaseId":"%SRCROOT%","index":324}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSession.java","uriBaseId":"%SRCROOT%","index":538}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdmin.java","uriBaseId":"%SRCROOT%","index":539}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFConfirmFlag1.java","uriBaseId":"%SRCROOT%","index":540}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/Contact.java","uriBaseId":"%SRCROOT%","index":256}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/UsernameMacro.java","uriBaseId":"%SRCROOT%","index":541}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItem.java","uriBaseId":"%SRCROOT%","index":542}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/ImageServlet.java","uriBaseId":"%SRCROOT%","index":241}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":543}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/ChallengeIntro.java","uriBaseId":"%SRCROOT%","index":342}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/Email.java","uriBaseId":"%SRCROOT%","index":347}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":544}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORLogin.java","uriBaseId":"%SRCROOT%","index":259}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson3.java","uriBaseId":"%SRCROOT%","index":253}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/CSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":95}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpointTest.java","uriBaseId":"%SRCROOT%","index":545}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":546}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/EnvironmentService.java","uriBaseId":"%SRCROOT%","index":153}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":547}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5Test.java","uriBaseId":"%SRCROOT%","index":548}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/Review.java","uriBaseId":"%SRCROOT%","index":205}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonScanner.java","uriBaseId":"%SRCROOT%","index":229}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java","uriBaseId":"%SRCROOT%","index":549}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/ReportCardServiceTest.java","uriBaseId":"%SRCROOT%","index":79}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/User.java","uriBaseId":"%SRCROOT%","index":348}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1.java","uriBaseId":"%SRCROOT%","index":550}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdmin.java","uriBaseId":"%SRCROOT%","index":151}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":42}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":551}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":2}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingTest.java","uriBaseId":"%SRCROOT%","index":552}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/WebWolfTraceRepository.java","uriBaseId":"%SRCROOT%","index":553}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonInfoModel.java","uriBaseId":"%SRCROOT%","index":554}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest1.java","uriBaseId":"%SRCROOT%","index":555}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpointTest.java","uriBaseId":"%SRCROOT%","index":556}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/SqlLessonTest.java","uriBaseId":"%SRCROOT%","index":99}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationTest.java","uriBaseId":"%SRCROOT%","index":557}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswordsAssignment.java","uriBaseId":"%SRCROOT%","index":558}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/UserSessionData.java","uriBaseId":"%SRCROOT%","index":218}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":559}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkDummy.java","uriBaseId":"%SRCROOT%","index":560}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/SessionService.java","uriBaseId":"%SRCROOT%","index":561}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":562}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInputTest.java","uriBaseId":"%SRCROOT%","index":105}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatVersionMacro.java","uriBaseId":"%SRCROOT%","index":251}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/ChallengeIntegrationTest.java","uriBaseId":"%SRCROOT%","index":563}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenusTest.java","uriBaseId":"%SRCROOT%","index":88}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Email.java","uriBaseId":"%SRCROOT%","index":252}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/DisplayUserTest.java","uriBaseId":"%SRCROOT%","index":564}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/WebWolfIntroduction.java","uriBaseId":"%SRCROOT%","index":565}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/votes/Views.java","uriBaseId":"%SRCROOT%","index":566}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItem.java","uriBaseId":"%SRCROOT%","index":150}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AttackResult.java","uriBaseId":"%SRCROOT%","index":176}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignment.java","uriBaseId":"%SRCROOT%","index":281}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswords.java","uriBaseId":"%SRCROOT%","index":285}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/LessonProgressServiceTest.java","uriBaseId":"%SRCROOT%","index":567}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":568}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AuthBypass.java","uriBaseId":"%SRCROOT%","index":292}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/LessonTemplateResolver.java","uriBaseId":"%SRCROOT%","index":569}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonMenuServiceTest.java","uriBaseId":"%SRCROOT%","index":75}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/jwt/JWTTokenTest.java","uriBaseId":"%SRCROOT%","index":143}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/controller/Welcome.java","uriBaseId":"%SRCROOT%","index":570}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/jwt/JWTTokenTest.java","uriBaseId":"%SRCROOT%","index":571}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/StoredXssCommentsTest.java","uriBaseId":"%SRCROOT%","index":57}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":572}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1Test.java","uriBaseId":"%SRCROOT%","index":573}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserSession.java","uriBaseId":"%SRCROOT%","index":334}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOtherProfile.java","uriBaseId":"%SRCROOT%","index":574}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/lessontemplate/LessonTemplate.java","uriBaseId":"%SRCROOT%","index":575}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/plugins/LessonTest.java","uriBaseId":"%SRCROOT%","index":80}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/User.java","uriBaseId":"%SRCROOT%","index":576}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":3}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/assignments/AssignmentEndpointTest.java","uriBaseId":"%SRCROOT%","index":139}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/AccessControlIntegrationTest.java","uriBaseId":"%SRCROOT%","index":577}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":578}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonInfoService.java","uriBaseId":"%SRCROOT%","index":579}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/Comment.java","uriBaseId":"%SRCROOT%","index":580}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/controller/Welcome.java","uriBaseId":"%SRCROOT%","index":225}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/SessionService.java","uriBaseId":"%SRCROOT%","index":172}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInputTest.java","uriBaseId":"%SRCROOT%","index":581}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpointTest.java","uriBaseId":"%SRCROOT%","index":120}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/challenges/Assignment1Test.java","uriBaseId":"%SRCROOT%","index":132}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevToolsTest.java","uriBaseId":"%SRCROOT%","index":107}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserSession.java","uriBaseId":"%SRCROOT%","index":582}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/HintServiceTest.java","uriBaseId":"%SRCROOT%","index":145}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTQuiz.java","uriBaseId":"%SRCROOT%","index":583}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfMacro.java","uriBaseId":"%SRCROOT%","index":584}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProviderTest.java","uriBaseId":"%SRCROOT%","index":67}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/server/StartWebGoat.java","uriBaseId":"%SRCROOT%","index":286}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDecTest.java","uriBaseId":"%SRCROOT%","index":585}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/AuthBypass.java","uriBaseId":"%SRCROOT%","index":586}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Language.java","uriBaseId":"%SRCROOT%","index":152}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionAdvanced.java","uriBaseId":"%SRCROOT%","index":587}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserRepository.java","uriBaseId":"%SRCROOT%","index":159}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjection.java","uriBaseId":"%SRCROOT%","index":588}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsQuiz.java","uriBaseId":"%SRCROOT%","index":343}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLessonTest.java","uriBaseId":"%SRCROOT%","index":66}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignmentTest.java","uriBaseId":"%SRCROOT%","index":589}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpProxies.java","uriBaseId":"%SRCROOT%","index":590}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/PathTraversal.java","uriBaseId":"%SRCROOT%","index":591}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionAC.java","uriBaseId":"%SRCROOT%","index":592}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":593}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Challenge1.java","uriBaseId":"%SRCROOT%","index":594}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfile.java","uriBaseId":"%SRCROOT%","index":595}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadTest.java","uriBaseId":"%SRCROOT%","index":596}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallengeLogin.java","uriBaseId":"%SRCROOT%","index":597}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/OperatingSystemMacro.java","uriBaseId":"%SRCROOT%","index":598}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionMitigationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":599}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Ping.java","uriBaseId":"%SRCROOT%","index":173}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/AuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":600}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":601}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":51}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFiltering.java","uriBaseId":"%SRCROOT%","index":314}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofingTask.java","uriBaseId":"%SRCROOT%","index":602}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidation.java","uriBaseId":"%SRCROOT%","index":296}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/HammerHead.java","uriBaseId":"%SRCROOT%","index":192}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/Requests.java","uriBaseId":"%SRCROOT%","index":603}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/PathTraversalIntegrationTest.java","uriBaseId":"%SRCROOT%","index":117}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/Authentication.java","uriBaseId":"%SRCROOT%","index":604}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjection.java","uriBaseId":"%SRCROOT%","index":160}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsQuiz.java","uriBaseId":"%SRCROOT%","index":605}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java","uriBaseId":"%SRCROOT%","index":606}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/SimpleXXETest.java","uriBaseId":"%SRCROOT%","index":607}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":608}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6b.java","uriBaseId":"%SRCROOT%","index":609}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsersTest.java","uriBaseId":"%SRCROOT%","index":56}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":114}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10a.java","uriBaseId":"%SRCROOT%","index":610}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/IDORIntegrationTest.java","uriBaseId":"%SRCROOT%","index":611}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/HintServiceTest.java","uriBaseId":"%SRCROOT%","index":612}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/EncodingAssignment.java","uriBaseId":"%SRCROOT%","index":613}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/session/LabelDebuggerTest.java","uriBaseId":"%SRCROOT%","index":119}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatTmpDirMacro.java","uriBaseId":"%SRCROOT%","index":614}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentForgotPassword.java","uriBaseId":"%SRCROOT%","index":298}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonProgressServiceTest.java","uriBaseId":"%SRCROOT%","index":110}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":615}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpointTest.java","uriBaseId":"%SRCROOT%","index":616}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionQuiz.java","uriBaseId":"%SRCROOT%","index":617}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequest.java","uriBaseId":"%SRCROOT%","index":618}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/webwolf/WebWolfApplication.java","uriBaseId":"%SRCROOT%","index":103}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywordsTest.java","uriBaseId":"%SRCROOT%","index":619}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Category.java","uriBaseId":"%SRCROOT%","index":620}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkDummy.java","uriBaseId":"%SRCROOT%","index":294}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/XXE.java","uriBaseId":"%SRCROOT%","index":621}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpointTest.java","uriBaseId":"%SRCROOT%","index":622}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxController.java","uriBaseId":"%SRCROOT%","index":623}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSession.java","uriBaseId":"%SRCROOT%","index":270}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":41}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/assignments/AssignmentEndpointTest.java","uriBaseId":"%SRCROOT%","index":624}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":625}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/IntegrationTest.java","uriBaseId":"%SRCROOT%","index":141}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswordsAssignment.java","uriBaseId":"%SRCROOT%","index":197}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonTitleService.java","uriBaseId":"%SRCROOT%","index":626}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOR.java","uriBaseId":"%SRCROOT%","index":282}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpoint.java","uriBaseId":"%SRCROOT%","index":627}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13Test.java","uriBaseId":"%SRCROOT%","index":68}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/WebWolfApplication.java","uriBaseId":"%SRCROOT%","index":628}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingQuiz.java","uriBaseId":"%SRCROOT%","index":303}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserialization.java","uriBaseId":"%SRCROOT%","index":274}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flag.java","uriBaseId":"%SRCROOT%","index":320}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonMenuService.java","uriBaseId":"%SRCROOT%","index":629}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFiltering.java","uriBaseId":"%SRCROOT%","index":630}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/Comment.java","uriBaseId":"%SRCROOT%","index":631}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpProxies.java","uriBaseId":"%SRCROOT%","index":222}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequestTest.java","uriBaseId":"%SRCROOT%","index":632}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/WebSession.java","uriBaseId":"%SRCROOT%","index":146}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserRepositoryTest.java","uriBaseId":"%SRCROOT%","index":128}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/UserProfile.java","uriBaseId":"%SRCROOT%","index":268}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Assignment8.java","uriBaseId":"%SRCROOT%","index":633}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Challenge8.java","uriBaseId":"%SRCROOT%","index":307}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebWolfRedirect.java","uriBaseId":"%SRCROOT%","index":308}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRF.java","uriBaseId":"%SRCROOT%","index":634}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":635}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpoint.java","uriBaseId":"%SRCROOT%","index":213}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/EnvironmentService.java","uriBaseId":"%SRCROOT%","index":636}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/XXEIntegrationTest.java","uriBaseId":"%SRCROOT%","index":142}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":637}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/Ping.java","uriBaseId":"%SRCROOT%","index":638}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/DatabaseConfiguration.java","uriBaseId":"%SRCROOT%","index":639}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java","uriBaseId":"%SRCROOT%","index":198}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/LessonTrackerInterceptor.java","uriBaseId":"%SRCROOT%","index":640}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Challenge7.java","uriBaseId":"%SRCROOT%","index":238}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLoginTask.java","uriBaseId":"%SRCROOT%","index":641}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/LessonTracker.java","uriBaseId":"%SRCROOT%","index":642}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":50}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":331}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFFeedback.java","uriBaseId":"%SRCROOT%","index":643}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":644}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/deserialization/DeserializeTest.java","uriBaseId":"%SRCROOT%","index":130}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/LessonTrackerInterceptor.java","uriBaseId":"%SRCROOT%","index":200}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":645}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/Authentication.java","uriBaseId":"%SRCROOT%","index":170}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/User.java","uriBaseId":"%SRCROOT%","index":646}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebWolfRedirect.java","uriBaseId":"%SRCROOT%","index":647}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/SessionManagementIntegrationTest.java","uriBaseId":"%SRCROOT%","index":124}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":648}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/RestartLessonService.java","uriBaseId":"%SRCROOT%","index":649}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpointTest.java","uriBaseId":"%SRCROOT%","index":118}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordReset.java","uriBaseId":"%SRCROOT%","index":650}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkLesson.java","uriBaseId":"%SRCROOT%","index":651}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5Test.java","uriBaseId":"%SRCROOT%","index":87}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":243}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignmentTest.java","uriBaseId":"%SRCROOT%","index":96}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdminTest.java","uriBaseId":"%SRCROOT%","index":652}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywordsTest.java","uriBaseId":"%SRCROOT%","index":135}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/session/LabelDebugger.java","uriBaseId":"%SRCROOT%","index":287}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordResetEmail.java","uriBaseId":"%SRCROOT%","index":161}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/StoredXssCommentsTest.java","uriBaseId":"%SRCROOT%","index":653}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignment.java","uriBaseId":"%SRCROOT%","index":654}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson4.java","uriBaseId":"%SRCROOT%","index":267}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/EnvironmentExposure.java","uriBaseId":"%SRCROOT%","index":655}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/ProgressRaceConditionIntegrationTest.java","uriBaseId":"%SRCROOT%","index":73}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFLogin.java","uriBaseId":"%SRCROOT%","index":254}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":166}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTToken.java","uriBaseId":"%SRCROOT%","index":346}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2Test.java","uriBaseId":"%SRCROOT%","index":112}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":656}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofing.java","uriBaseId":"%SRCROOT%","index":210}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonProgressService.java","uriBaseId":"%SRCROOT%","index":657}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingQuiz.java","uriBaseId":"%SRCROOT%","index":658}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/Comment.java","uriBaseId":"%SRCROOT%","index":257}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRF.java","uriBaseId":"%SRCROOT%","index":659}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonInfoModel.java","uriBaseId":"%SRCROOT%","index":306}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignment.java","uriBaseId":"%SRCROOT%","index":660}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/resetlink/PasswordChangeForm.java","uriBaseId":"%SRCROOT%","index":169}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson4.java","uriBaseId":"%SRCROOT%","index":661}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/WebWolf.java","uriBaseId":"%SRCROOT%","index":662}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/ProgressRaceConditionIntegrationTest.java","uriBaseId":"%SRCROOT%","index":663}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/SqlLessonTest.java","uriBaseId":"%SRCROOT%","index":664}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/resetlink/PasswordChangeForm.java","uriBaseId":"%SRCROOT%","index":665}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/CrossSiteScriptingStored.java","uriBaseId":"%SRCROOT%","index":319}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":666}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatVersionMacro.java","uriBaseId":"%SRCROOT%","index":667}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/FlagController.java","uriBaseId":"%SRCROOT%","index":54}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webgoatintroduction/WebGoatIntroduction.java","uriBaseId":"%SRCROOT%","index":668}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":669}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonInfoService.java","uriBaseId":"%SRCROOT%","index":228}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java","uriBaseId":"%SRCROOT%","index":670}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfile.java","uriBaseId":"%SRCROOT%","index":185}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebGoat.java","uriBaseId":"%SRCROOT%","index":671}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserRepositoryTest.java","uriBaseId":"%SRCROOT%","index":672}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsers.java","uriBaseId":"%SRCROOT%","index":171}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/ReportCardService.java","uriBaseId":"%SRCROOT%","index":244}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/EnvironmentExposure.java","uriBaseId":"%SRCROOT%","index":341}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":673}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":674}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9Test.java","uriBaseId":"%SRCROOT%","index":675}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidationTest.java","uriBaseId":"%SRCROOT%","index":676}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":310}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIAQuiz.java","uriBaseId":"%SRCROOT%","index":330}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDOREditOtherProfiile.java","uriBaseId":"%SRCROOT%","index":677}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLogin.java","uriBaseId":"%SRCROOT%","index":678}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/Scoreboard.java","uriBaseId":"%SRCROOT%","index":679}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsersTest.java","uriBaseId":"%SRCROOT%","index":680}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORLogin.java","uriBaseId":"%SRCROOT%","index":681}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignmentTest.java","uriBaseId":"%SRCROOT%","index":682}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofing.java","uriBaseId":"%SRCROOT%","index":683}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/SampleAttack.java","uriBaseId":"%SRCROOT%","index":276}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionAC.java","uriBaseId":"%SRCROOT%","index":201}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLessonTest.java","uriBaseId":"%SRCROOT%","index":684}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignment.java","uriBaseId":"%SRCROOT%","index":209}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":".mvn/wrapper/MavenWrapperDownloader.java","uriBaseId":"%SRCROOT%","index":685}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/SolutionConstants.java","uriBaseId":"%SRCROOT%","index":249}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":686}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SimpleMailAssignment.java","uriBaseId":"%SRCROOT%","index":340}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":687}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13Test.java","uriBaseId":"%SRCROOT%","index":688}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cia/CIAQuiz.java","uriBaseId":"%SRCROOT%","index":689}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/ImageServlet.java","uriBaseId":"%SRCROOT%","index":690}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOREditOtherProfiile.java","uriBaseId":"%SRCROOT%","index":278}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelService.java","uriBaseId":"%SRCROOT%","index":194}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":691}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":692}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/FlagController.java","uriBaseId":"%SRCROOT%","index":693}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfRootMacro.java","uriBaseId":"%SRCROOT%","index":212}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpointTest.java","uriBaseId":"%SRCROOT%","index":138}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/Scoreboard.java","uriBaseId":"%SRCROOT%","index":328}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/VerifyAccount.java","uriBaseId":"%SRCROOT%","index":231}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentTest.java","uriBaseId":"%SRCROOT%","index":694}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":46}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest1.java","uriBaseId":"%SRCROOT%","index":134}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/XSSIntegrationTest.java","uriBaseId":"%SRCROOT%","index":77}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDec.java","uriBaseId":"%SRCROOT%","index":250}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":695}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/ChallengeIntegrationTest.java","uriBaseId":"%SRCROOT%","index":140}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatTmpDirMacro.java","uriBaseId":"%SRCROOT%","index":216}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFLogin.java","uriBaseId":"%SRCROOT%","index":696}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevTools.java","uriBaseId":"%SRCROOT%","index":165}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/SimpleXXETest.java","uriBaseId":"%SRCROOT%","index":55}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpointTest.java","uriBaseId":"%SRCROOT%","index":85}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictions.java","uriBaseId":"%SRCROOT%","index":697}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTamperingTask.java","uriBaseId":"%SRCROOT%","index":698}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignment.java","uriBaseId":"%SRCROOT%","index":235}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":699}}}],"message":{"text":""},"level":"none","descriptor":{"id":"java/baseline/expected-extracted-files","index":0},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/scoreboardApp.js","uriBaseId":"%SRCROOT%","index":700}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/assignment3.js","uriBaseId":"%SRCROOT%","index":701}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/csrf/js/csrf-review.js","uriBaseId":"%SRCROOT%","index":702}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/xxe/js/xxe.js","uriBaseId":"%SRCROOT%","index":703}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/jwt/js/jwt-buy.js","uriBaseId":"%SRCROOT%","index":704}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/challenges/js/challenge8.js","uriBaseId":"%SRCROOT%","index":705}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/mode-java.js","uriBaseId":"%SRCROOT%","index":706}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/assignment10b.js","uriBaseId":"%SRCROOT%","index":707}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/TitleView.js","uriBaseId":"%SRCROOT%","index":708}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/idor/js/idor.js","uriBaseId":"%SRCROOT%","index":709}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery_form/jquery.form.js","uriBaseId":"%SRCROOT%","index":710}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/pathtraversal/js/path_traversal.js","uriBaseId":"%SRCROOT%","index":711}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/controller/MenuController.js","uriBaseId":"%SRCROOT%","index":712}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ErrorNotificationView.js","uriBaseId":"%SRCROOT%","index":713}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuButtonView.js","uriBaseId":"%SRCROOT%","index":714}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuData.js","uriBaseId":"%SRCROOT%","index":715}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/jquery/jquery-1.10.2.min.js","uriBaseId":"%SRCROOT%","index":716}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-slider/js/bootstrap-slider.js","uriBaseId":"%SRCROOT%","index":717}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/UserAndInfoView.js","uriBaseId":"%SRCROOT%","index":718}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/text.js","uriBaseId":"%SRCROOT%","index":719}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuModel.js","uriBaseId":"%SRCROOT%","index":720}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-base.js","uriBaseId":"%SRCROOT%","index":721}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/wysihtml5-0.3.0.js","uriBaseId":"%SRCROOT%","index":722}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/jwt/js/jwt-refresh.js","uriBaseId":"%SRCROOT%","index":723}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-ui-1.10.4.js","uriBaseId":"%SRCROOT%","index":724}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/challenge.js","uriBaseId":"%SRCROOT%","index":725}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/theme-monokai.js","uriBaseId":"%SRCROOT%","index":726}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/AssignmentStatusModel.js","uriBaseId":"%SRCROOT%","index":727}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonOverviewCollection.js","uriBaseId":"%SRCROOT%","index":728}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HTMLContentModel.js","uriBaseId":"%SRCROOT%","index":729}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/ssrf/js/credentials.js","uriBaseId":"%SRCROOT%","index":730}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/clientsidefiltering/js/clientSideFilteringFree.js","uriBaseId":"%SRCROOT%","index":731}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/authbypass/js/bypass.js","uriBaseId":"%SRCROOT%","index":732}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuCollection.js","uriBaseId":"%SRCROOT%","index":733}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/GoatUtils.js","uriBaseId":"%SRCROOT%","index":734}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonInfoModel.js","uriBaseId":"%SRCROOT%","index":735}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/idor/js/idor.js","uriBaseId":"%SRCROOT%","index":736}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/TitleView.js","uriBaseId":"%SRCROOT%","index":737}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/PaginationControlView.js","uriBaseId":"%SRCROOT%","index":738}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonContentModel.js","uriBaseId":"%SRCROOT%","index":739}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HintModel.js","uriBaseId":"%SRCROOT%","index":740}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/jwt/js/jwt-voting.js","uriBaseId":"%SRCROOT%","index":741}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/goatApp.js","uriBaseId":"%SRCROOT%","index":742}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuModel.js","uriBaseId":"%SRCROOT%","index":743}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/FlagModel.js","uriBaseId":"%SRCROOT%","index":744}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/PaginationControlView.js","uriBaseId":"%SRCROOT%","index":745}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/jwt.js","uriBaseId":"%SRCROOT%","index":746}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webwolf/static/js/jwt.js","uriBaseId":"%SRCROOT%","index":747}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/csrf/js/csrf-review.js","uriBaseId":"%SRCROOT%","index":748}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/csrf/js/feedback.js","uriBaseId":"%SRCROOT%","index":749}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/quiz.js","uriBaseId":"%SRCROOT%","index":750}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/search.js","uriBaseId":"%SRCROOT%","index":751}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/jquery_form/jquery.form.js","uriBaseId":"%SRCROOT%","index":752}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-final.js","uriBaseId":"%SRCROOT%","index":753}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/challenges/js/challenge6.js","uriBaseId":"%SRCROOT%","index":754}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/underscore-min.js","uriBaseId":"%SRCROOT%","index":755}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/xss/js/assignment4.js","uriBaseId":"%SRCROOT%","index":756}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/sqlinjection/js/assignment10b.js","uriBaseId":"%SRCROOT%","index":757}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-refresh.js","uriBaseId":"%SRCROOT%","index":758}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/nanoScroller/jquery.nanoscroller.min.js","uriBaseId":"%SRCROOT%","index":759}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LabelDebugModel.js","uriBaseId":"%SRCROOT%","index":760}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuView.js","uriBaseId":"%SRCROOT%","index":761}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/pathtraversal/js/path_traversal.js","uriBaseId":"%SRCROOT%","index":762}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/GoatRouter.js","uriBaseId":"%SRCROOT%","index":763}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/insecurelogin/js/credentials.js","uriBaseId":"%SRCROOT%","index":764}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuData.js","uriBaseId":"%SRCROOT%","index":765}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ScoreboardView.js","uriBaseId":"%SRCROOT%","index":766}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webwolf/static/js/mail.js","uriBaseId":"%SRCROOT%","index":767}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-weak-keys.js","uriBaseId":"%SRCROOT%","index":768}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-ui.min.js","uriBaseId":"%SRCROOT%","index":769}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/controller/LessonController.js","uriBaseId":"%SRCROOT%","index":770}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/passwordreset/js/password-reset-simple.js","uriBaseId":"%SRCROOT%","index":771}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/controller/MenuController.js","uriBaseId":"%SRCROOT%","index":772}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonInfoModel.js","uriBaseId":"%SRCROOT%","index":773}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HTMLContentModel.js","uriBaseId":"%SRCROOT%","index":774}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/clientsidefiltering/js/clientSideFilteringFree.js","uriBaseId":"%SRCROOT%","index":775}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/CustomGoat.js","uriBaseId":"%SRCROOT%","index":776}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/toggle.js","uriBaseId":"%SRCROOT%","index":777}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/theme-monokai.js","uriBaseId":"%SRCROOT%","index":778}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/ssrf/js/credentials.js","uriBaseId":"%SRCROOT%","index":779}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webwolf/static/js/fileUpload.js","uriBaseId":"%SRCROOT%","index":780}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery.min.js","uriBaseId":"%SRCROOT%","index":781}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/GoatRouter.js","uriBaseId":"%SRCROOT%","index":782}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/goatConstants.js","uriBaseId":"%SRCROOT%","index":783}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-ui.min.js","uriBaseId":"%SRCROOT%","index":784}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/plugins/nanoScroller/jquery.nanoscroller.min.js","uriBaseId":"%SRCROOT%","index":785}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/goatAsyncErrorHandler.js","uriBaseId":"%SRCROOT%","index":786}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/clientsidefiltering/js/clientSideFiltering.js","uriBaseId":"%SRCROOT%","index":787}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/polyglot.min.js","uriBaseId":"%SRCROOT%","index":788}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/clientsidefiltering/js/clientSideFiltering.js","uriBaseId":"%SRCROOT%","index":789}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/ReportCardModel.js","uriBaseId":"%SRCROOT%","index":790}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/FlagsCollection.js","uriBaseId":"%SRCROOT%","index":791}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/ace.js","uriBaseId":"%SRCROOT%","index":792}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":793}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/insecurelogin/js/credentials.js","uriBaseId":"%SRCROOT%","index":794}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-buy.js","uriBaseId":"%SRCROOT%","index":795}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/goatApp.js","uriBaseId":"%SRCROOT%","index":796}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/AssignmentStatusModel.js","uriBaseId":"%SRCROOT%","index":797}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery.form.js","uriBaseId":"%SRCROOT%","index":798}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/ace.js","uriBaseId":"%SRCROOT%","index":799}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/backbone-min.js","uriBaseId":"%SRCROOT%","index":800}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuView.js","uriBaseId":"%SRCROOT%","index":801}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/LessonContentView.js","uriBaseId":"%SRCROOT%","index":802}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/authbypass/js/bypass.js","uriBaseId":"%SRCROOT%","index":803}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HintCollection.js","uriBaseId":"%SRCROOT%","index":804}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/sqlinjection/js/assignment13.js","uriBaseId":"%SRCROOT%","index":805}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/csrf/js/feedback.js","uriBaseId":"%SRCROOT%","index":806}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/application.js","uriBaseId":"%SRCROOT%","index":807}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/main.js","uriBaseId":"%SRCROOT%","index":808}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuCollection.js","uriBaseId":"%SRCROOT%","index":809}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/wysihtml5-0.3.0.js","uriBaseId":"%SRCROOT%","index":810}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/bootstrap3-wysihtml5.js","uriBaseId":"%SRCROOT%","index":811}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-2.1.4.min.js","uriBaseId":"%SRCROOT%","index":812}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/polyglot.min.js","uriBaseId":"%SRCROOT%","index":813}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/jwt/js/jwt-final.js","uriBaseId":"%SRCROOT%","index":814}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/HelpControlsView.js","uriBaseId":"%SRCROOT%","index":815}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/lessontemplate/js/idor.js","uriBaseId":"%SRCROOT%","index":816}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/require.min.js","uriBaseId":"%SRCROOT%","index":817}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HintModel.js","uriBaseId":"%SRCROOT%","index":818}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/ReportCardModel.js","uriBaseId":"%SRCROOT%","index":819}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/assignment4.js","uriBaseId":"%SRCROOT%","index":820}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/challenge8.js","uriBaseId":"%SRCROOT%","index":821}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/spoofcookie/js/handler.js","uriBaseId":"%SRCROOT%","index":822}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuItemView.js","uriBaseId":"%SRCROOT%","index":823}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/underscore-min.js","uriBaseId":"%SRCROOT%","index":824}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/search.js","uriBaseId":"%SRCROOT%","index":825}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonContentModel.js","uriBaseId":"%SRCROOT%","index":826}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/HintView.js","uriBaseId":"%SRCROOT%","index":827}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuItemView.js","uriBaseId":"%SRCROOT%","index":828}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-vuln.js","uriBaseId":"%SRCROOT%","index":829}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ScoreboardView.js","uriBaseId":"%SRCROOT%","index":830}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/assignment13.js","uriBaseId":"%SRCROOT%","index":831}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/lessontemplate/js/idor.js","uriBaseId":"%SRCROOT%","index":832}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/HelpControlsView.js","uriBaseId":"%SRCROOT%","index":833}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-slider/js/bootstrap-slider.js","uriBaseId":"%SRCROOT%","index":834}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/xss/js/stored-xss.js","uriBaseId":"%SRCROOT%","index":835}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/UserAndInfoView.js","uriBaseId":"%SRCROOT%","index":836}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery.min.js","uriBaseId":"%SRCROOT%","index":837}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":838}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery/jquery-1.10.2.min.js","uriBaseId":"%SRCROOT%","index":839}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/text.js","uriBaseId":"%SRCROOT%","index":840}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/backbone-min.js","uriBaseId":"%SRCROOT%","index":841}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/toggle.js","uriBaseId":"%SRCROOT%","index":842}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/fileUpload.js","uriBaseId":"%SRCROOT%","index":843}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-base.js","uriBaseId":"%SRCROOT%","index":844}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/jquery/jquery-ui-1.10.4.custom.min.js","uriBaseId":"%SRCROOT%","index":845}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/jwt/js/jwt-weak-keys.js","uriBaseId":"%SRCROOT%","index":846}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HintCollection.js","uriBaseId":"%SRCROOT%","index":847}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/bootstrap3-wysihtml5.js","uriBaseId":"%SRCROOT%","index":848}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/goatConstants.js","uriBaseId":"%SRCROOT%","index":849}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-voting.js","uriBaseId":"%SRCROOT%","index":850}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-2.1.4.min.js","uriBaseId":"%SRCROOT%","index":851}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ReportCardView.js","uriBaseId":"%SRCROOT%","index":852}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LabelDebugModel.js","uriBaseId":"%SRCROOT%","index":853}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/challenges/js/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":854}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/scoreboardApp.js","uriBaseId":"%SRCROOT%","index":855}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/controller/LessonController.js","uriBaseId":"%SRCROOT%","index":856}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/sqlinjection/js/challenge.js","uriBaseId":"%SRCROOT%","index":857}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery/jquery-ui-1.10.4.custom.min.js","uriBaseId":"%SRCROOT%","index":858}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/FlagsCollection.js","uriBaseId":"%SRCROOT%","index":859}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonOverviewCollection.js","uriBaseId":"%SRCROOT%","index":860}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/xxe/js/xxe.js","uriBaseId":"%SRCROOT%","index":861}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/FlagModel.js","uriBaseId":"%SRCROOT%","index":862}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/passwordreset/js/password-reset-simple.js","uriBaseId":"%SRCROOT%","index":863}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ReportCardView.js","uriBaseId":"%SRCROOT%","index":864}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/scoreboard.js","uriBaseId":"%SRCROOT%","index":865}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":866}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/GoatUtils.js","uriBaseId":"%SRCROOT%","index":867}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/CustomGoat.js","uriBaseId":"%SRCROOT%","index":868}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/scoreboard.js","uriBaseId":"%SRCROOT%","index":869}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/modernizr.min.js","uriBaseId":"%SRCROOT%","index":870}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/mode-java.js","uriBaseId":"%SRCROOT%","index":871}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ErrorNotificationView.js","uriBaseId":"%SRCROOT%","index":872}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/HintView.js","uriBaseId":"%SRCROOT%","index":873}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/stored-xss.js","uriBaseId":"%SRCROOT%","index":874}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/challenge6.js","uriBaseId":"%SRCROOT%","index":875}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/spoofcookie/js/handler.js","uriBaseId":"%SRCROOT%","index":876}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/main.js","uriBaseId":"%SRCROOT%","index":877}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/application.js","uriBaseId":"%SRCROOT%","index":878}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuButtonView.js","uriBaseId":"%SRCROOT%","index":879}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/lessons/xss/js/assignment3.js","uriBaseId":"%SRCROOT%","index":880}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/mail.js","uriBaseId":"%SRCROOT%","index":881}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/LessonContentView.js","uriBaseId":"%SRCROOT%","index":882}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/require.min.js","uriBaseId":"%SRCROOT%","index":883}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-vuln.js","uriBaseId":"%SRCROOT%","index":884}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/quiz.js","uriBaseId":"%SRCROOT%","index":885}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-ui-1.10.4.js","uriBaseId":"%SRCROOT%","index":886}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/goatAsyncErrorHandler.js","uriBaseId":"%SRCROOT%","index":887}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery.form.js","uriBaseId":"%SRCROOT%","index":888}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}},{"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/resources/webgoat/static/js/modernizr.min.js","uriBaseId":"%SRCROOT%","index":889}}}],"message":{"text":""},"level":"none","descriptor":{"id":"js/baseline/expected-extracted-files","index":1},"properties":{"formattedMessage":{"text":""},"relatedLocations":[]}}],"executionSuccessful":true}],"artifacts":[{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":1}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":2}},{"location":{"uri":"src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":3}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":27}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":41}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":42}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":46}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":50}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":51}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":52}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":53}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/FlagController.java","uriBaseId":"%SRCROOT%","index":54}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/SimpleXXETest.java","uriBaseId":"%SRCROOT%","index":55}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsersTest.java","uriBaseId":"%SRCROOT%","index":56}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/StoredXssCommentsTest.java","uriBaseId":"%SRCROOT%","index":57}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignmentTest.java","uriBaseId":"%SRCROOT%","index":58}},{"location":{"uri":"src/it/java/org/owasp/webgoat/PasswordResetLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":59}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6aTest.java","uriBaseId":"%SRCROOT%","index":60}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/session/LessonTrackerTest.java","uriBaseId":"%SRCROOT%","index":61}},{"location":{"uri":"src/it/java/org/owasp/webgoat/IDORIntegrationTest.java","uriBaseId":"%SRCROOT%","index":62}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrievalTest.java","uriBaseId":"%SRCROOT%","index":63}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpointTest.java","uriBaseId":"%SRCROOT%","index":64}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequestTest.java","uriBaseId":"%SRCROOT%","index":65}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLessonTest.java","uriBaseId":"%SRCROOT%","index":66}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProviderTest.java","uriBaseId":"%SRCROOT%","index":67}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13Test.java","uriBaseId":"%SRCROOT%","index":68}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdminTest.java","uriBaseId":"%SRCROOT%","index":69}},{"location":{"uri":"src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java","uriBaseId":"%SRCROOT%","index":70}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/authbypass/BypassVerificationTest.java","uriBaseId":"%SRCROOT%","index":71}},{"location":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxControllerTest.java","uriBaseId":"%SRCROOT%","index":72}},{"location":{"uri":"src/it/java/org/owasp/webgoat/ProgressRaceConditionIntegrationTest.java","uriBaseId":"%SRCROOT%","index":73}},{"location":{"uri":"src/it/java/org/owasp/webgoat/DeserializationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":74}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonMenuServiceTest.java","uriBaseId":"%SRCROOT%","index":75}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFixTest.java","uriBaseId":"%SRCROOT%","index":76}},{"location":{"uri":"src/it/java/org/owasp/webgoat/XSSIntegrationTest.java","uriBaseId":"%SRCROOT%","index":77}},{"location":{"uri":"src/it/java/org/owasp/webgoat/CryptoIntegrationTest.java","uriBaseId":"%SRCROOT%","index":78}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/service/ReportCardServiceTest.java","uriBaseId":"%SRCROOT%","index":79}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/plugins/LessonTest.java","uriBaseId":"%SRCROOT%","index":80}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/cia/CIAQuizTest.java","uriBaseId":"%SRCROOT%","index":81}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":82}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/csrf/CSRFFeedbackTest.java","uriBaseId":"%SRCROOT%","index":83}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/DisplayUserTest.java","uriBaseId":"%SRCROOT%","index":84}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpointTest.java","uriBaseId":"%SRCROOT%","index":85}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationTest.java","uriBaseId":"%SRCROOT%","index":86}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5Test.java","uriBaseId":"%SRCROOT%","index":87}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenusTest.java","uriBaseId":"%SRCROOT%","index":88}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1Test.java","uriBaseId":"%SRCROOT%","index":89}},{"location":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionAdvancedIntegrationTest.java","uriBaseId":"%SRCROOT%","index":90}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest2.java","uriBaseId":"%SRCROOT%","index":91}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":92}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserValidatorTest.java","uriBaseId":"%SRCROOT%","index":93}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/WebGoatApplication.java","uriBaseId":"%SRCROOT%","index":94}},{"location":{"uri":"src/it/java/org/owasp/webgoat/CSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":95}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignmentTest.java","uriBaseId":"%SRCROOT%","index":96}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5aTest.java","uriBaseId":"%SRCROOT%","index":97}},{"location":{"uri":"src/it/java/org/owasp/webgoat/AccessControlIntegrationTest.java","uriBaseId":"%SRCROOT%","index":98}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/SqlLessonTest.java","uriBaseId":"%SRCROOT%","index":99}},{"location":{"uri":"src/test/java/org/owasp/webgoat/webwolf/user/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":100}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserTrackerRepositoryTest.java","uriBaseId":"%SRCROOT%","index":101}},{"location":{"uri":"src/it/java/org/owasp/webgoat/SSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":102}},{"location":{"uri":"src/test/java/org/owasp/webgoat/webwolf/WebWolfApplication.java","uriBaseId":"%SRCROOT%","index":103}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignmentTest.java","uriBaseId":"%SRCROOT%","index":104}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInputTest.java","uriBaseId":"%SRCROOT%","index":105}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingTest.java","uriBaseId":"%SRCROOT%","index":106}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevToolsTest.java","uriBaseId":"%SRCROOT%","index":107}},{"location":{"uri":"src/it/java/org/owasp/webgoat/WebWolfIntegrationTest.java","uriBaseId":"%SRCROOT%","index":108}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10Test.java","uriBaseId":"%SRCROOT%","index":109}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/service/LessonProgressServiceTest.java","uriBaseId":"%SRCROOT%","index":110}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6bTest.java","uriBaseId":"%SRCROOT%","index":111}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2Test.java","uriBaseId":"%SRCROOT%","index":112}},{"location":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionMitigationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":113}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":114}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpointTest.java","uriBaseId":"%SRCROOT%","index":115}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/cryptography/CryptoUtilTest.java","uriBaseId":"%SRCROOT%","index":116}},{"location":{"uri":"src/it/java/org/owasp/webgoat/PathTraversalIntegrationTest.java","uriBaseId":"%SRCROOT%","index":117}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpointTest.java","uriBaseId":"%SRCROOT%","index":118}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/session/LabelDebuggerTest.java","uriBaseId":"%SRCROOT%","index":119}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpointTest.java","uriBaseId":"%SRCROOT%","index":120}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDecTest.java","uriBaseId":"%SRCROOT%","index":121}},{"location":{"uri":"src/it/java/org/owasp/webgoat/SqlInjectionLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":122}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidationTest.java","uriBaseId":"%SRCROOT%","index":123}},{"location":{"uri":"src/it/java/org/owasp/webgoat/SessionManagementIntegrationTest.java","uriBaseId":"%SRCROOT%","index":124}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionYourHashTest.java","uriBaseId":"%SRCROOT%","index":125}},{"location":{"uri":"src/it/java/org/owasp/webgoat/GeneralLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":126}},{"location":{"uri":"src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepositoryTest.java","uriBaseId":"%SRCROOT%","index":127}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserRepositoryTest.java","uriBaseId":"%SRCROOT%","index":128}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentTest.java","uriBaseId":"%SRCROOT%","index":129}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/deserialization/DeserializeTest.java","uriBaseId":"%SRCROOT%","index":130}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/users/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":131}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/challenges/Assignment1Test.java","uriBaseId":"%SRCROOT%","index":132}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9Test.java","uriBaseId":"%SRCROOT%","index":133}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest1.java","uriBaseId":"%SRCROOT%","index":134}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywordsTest.java","uriBaseId":"%SRCROOT%","index":135}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadTest.java","uriBaseId":"%SRCROOT%","index":136}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8Test.java","uriBaseId":"%SRCROOT%","index":137}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpointTest.java","uriBaseId":"%SRCROOT%","index":138}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/assignments/AssignmentEndpointTest.java","uriBaseId":"%SRCROOT%","index":139}},{"location":{"uri":"src/it/java/org/owasp/webgoat/ChallengeIntegrationTest.java","uriBaseId":"%SRCROOT%","index":140}},{"location":{"uri":"src/it/java/org/owasp/webgoat/IntegrationTest.java","uriBaseId":"%SRCROOT%","index":141}},{"location":{"uri":"src/it/java/org/owasp/webgoat/XXEIntegrationTest.java","uriBaseId":"%SRCROOT%","index":142}},{"location":{"uri":"src/test/java/org/owasp/webgoat/webwolf/jwt/JWTTokenTest.java","uriBaseId":"%SRCROOT%","index":143}},{"location":{"uri":"src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":144}},{"location":{"uri":"src/test/java/org/owasp/webgoat/container/service/HintServiceTest.java","uriBaseId":"%SRCROOT%","index":145}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/session/WebSession.java","uriBaseId":"%SRCROOT%","index":146}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/CourseConfiguration.java","uriBaseId":"%SRCROOT%","index":147}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonMenuService.java","uriBaseId":"%SRCROOT%","index":148}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelDebugService.java","uriBaseId":"%SRCROOT%","index":149}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItem.java","uriBaseId":"%SRCROOT%","index":150}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdmin.java","uriBaseId":"%SRCROOT%","index":151}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Language.java","uriBaseId":"%SRCROOT%","index":152}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/EnvironmentService.java","uriBaseId":"%SRCROOT%","index":153}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofingTask.java","uriBaseId":"%SRCROOT%","index":154}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfileAltUrl.java","uriBaseId":"%SRCROOT%","index":155}},{"location":{"uri":"src/main/java/org/owasp/webgoat/server/ParentConfig.java","uriBaseId":"%SRCROOT%","index":156}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java","uriBaseId":"%SRCROOT%","index":157}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/controller/StartLesson.java","uriBaseId":"%SRCROOT%","index":158}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserRepository.java","uriBaseId":"%SRCROOT%","index":159}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjection.java","uriBaseId":"%SRCROOT%","index":160}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordResetEmail.java","uriBaseId":"%SRCROOT%","index":161}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Assignment1.java","uriBaseId":"%SRCROOT%","index":162}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTController.java","uriBaseId":"%SRCROOT%","index":163}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserService.java","uriBaseId":"%SRCROOT%","index":164}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevTools.java","uriBaseId":"%SRCROOT%","index":165}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":166}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/Salaries.java","uriBaseId":"%SRCROOT%","index":167}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/LessonTemplateResolver.java","uriBaseId":"%SRCROOT%","index":168}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/resetlink/PasswordChangeForm.java","uriBaseId":"%SRCROOT%","index":169}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/Authentication.java","uriBaseId":"%SRCROOT%","index":170}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsers.java","uriBaseId":"%SRCROOT%","index":171}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/SessionService.java","uriBaseId":"%SRCROOT%","index":172}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Ping.java","uriBaseId":"%SRCROOT%","index":173}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxController.java","uriBaseId":"%SRCROOT%","index":174}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRF.java","uriBaseId":"%SRCROOT%","index":175}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AttackResult.java","uriBaseId":"%SRCROOT%","index":176}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenus.java","uriBaseId":"%SRCROOT%","index":177}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/UsernameMacro.java","uriBaseId":"%SRCROOT%","index":178}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/LessonTracker.java","uriBaseId":"%SRCROOT%","index":179}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfMacro.java","uriBaseId":"%SRCROOT%","index":180}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/Requests.java","uriBaseId":"%SRCROOT%","index":181}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":182}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/OperatingSystemMacro.java","uriBaseId":"%SRCROOT%","index":183}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpoint.java","uriBaseId":"%SRCROOT%","index":184}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfile.java","uriBaseId":"%SRCROOT%","index":185}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookie.java","uriBaseId":"%SRCROOT%","index":186}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebWolf.java","uriBaseId":"%SRCROOT%","index":187}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java","uriBaseId":"%SRCROOT%","index":188}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignment.java","uriBaseId":"%SRCROOT%","index":189}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/WebGoat.java","uriBaseId":"%SRCROOT%","index":190}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRF.java","uriBaseId":"%SRCROOT%","index":191}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/HammerHead.java","uriBaseId":"%SRCROOT%","index":192}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkLesson.java","uriBaseId":"%SRCROOT%","index":193}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LabelService.java","uriBaseId":"%SRCROOT%","index":194}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonTitleService.java","uriBaseId":"%SRCROOT%","index":195}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordReset.java","uriBaseId":"%SRCROOT%","index":196}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswordsAssignment.java","uriBaseId":"%SRCROOT%","index":197}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java","uriBaseId":"%SRCROOT%","index":198}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingMitigation.java","uriBaseId":"%SRCROOT%","index":199}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/LessonTrackerInterceptor.java","uriBaseId":"%SRCROOT%","index":200}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionAC.java","uriBaseId":"%SRCROOT%","index":201}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Category.java","uriBaseId":"%SRCROOT%","index":202}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFFeedback.java","uriBaseId":"%SRCROOT%","index":203}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepository.java","uriBaseId":"%SRCROOT%","index":204}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/Review.java","uriBaseId":"%SRCROOT%","index":205}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingAccessControlUserRepository.java","uriBaseId":"%SRCROOT%","index":206}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/ForgedReviews.java","uriBaseId":"%SRCROOT%","index":207}},{"location":{"uri":"src/main/java/org/dummy/insecure/framework/VulnerableTaskHolder.java","uriBaseId":"%SRCROOT%","index":208}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignment.java","uriBaseId":"%SRCROOT%","index":209}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofing.java","uriBaseId":"%SRCROOT%","index":210}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":211}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfRootMacro.java","uriBaseId":"%SRCROOT%","index":212}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpoint.java","uriBaseId":"%SRCROOT%","index":213}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItemType.java","uriBaseId":"%SRCROOT%","index":214}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":215}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatTmpDirMacro.java","uriBaseId":"%SRCROOT%","index":216}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWT.java","uriBaseId":"%SRCROOT%","index":217}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/session/UserSessionData.java","uriBaseId":"%SRCROOT%","index":218}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentEndpoint.java","uriBaseId":"%SRCROOT%","index":219}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTampering.java","uriBaseId":"%SRCROOT%","index":220}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flags.java","uriBaseId":"%SRCROOT%","index":221}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpProxies.java","uriBaseId":"%SRCROOT%","index":222}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsEndpoint.java","uriBaseId":"%SRCROOT%","index":223}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Hint.java","uriBaseId":"%SRCROOT%","index":224}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/controller/Welcome.java","uriBaseId":"%SRCROOT%","index":225}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/Comment.java","uriBaseId":"%SRCROOT%","index":226}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/PathTraversal.java","uriBaseId":"%SRCROOT%","index":227}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonInfoService.java","uriBaseId":"%SRCROOT%","index":228}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonScanner.java","uriBaseId":"%SRCROOT%","index":229}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java","uriBaseId":"%SRCROOT%","index":230}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/VerifyAccount.java","uriBaseId":"%SRCROOT%","index":231}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/DatabaseConfiguration.java","uriBaseId":"%SRCROOT%","index":232}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/LessonProgressService.java","uriBaseId":"%SRCROOT%","index":233}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasics.java","uriBaseId":"%SRCROOT%","index":234}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignment.java","uriBaseId":"%SRCROOT%","index":235}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFieldRestrictions.java","uriBaseId":"%SRCROOT%","index":236}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Challenge5.java","uriBaseId":"%SRCROOT%","index":237}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Challenge7.java","uriBaseId":"%SRCROOT%","index":238}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictions.java","uriBaseId":"%SRCROOT%","index":239}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Vote.java","uriBaseId":"%SRCROOT%","index":240}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/ImageServlet.java","uriBaseId":"%SRCROOT%","index":241}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Challenge1.java","uriBaseId":"%SRCROOT%","index":242}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":243}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/ReportCardService.java","uriBaseId":"%SRCROOT%","index":244}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpoint.java","uriBaseId":"%SRCROOT%","index":245}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTQuiz.java","uriBaseId":"%SRCROOT%","index":246}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/TriedQuestions.java","uriBaseId":"%SRCROOT%","index":247}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":248}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/SolutionConstants.java","uriBaseId":"%SRCROOT%","index":249}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDec.java","uriBaseId":"%SRCROOT%","index":250}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatVersionMacro.java","uriBaseId":"%SRCROOT%","index":251}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Email.java","uriBaseId":"%SRCROOT%","index":252}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson3.java","uriBaseId":"%SRCROOT%","index":253}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFLogin.java","uriBaseId":"%SRCROOT%","index":254}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/QuestionsAssignment.java","uriBaseId":"%SRCROOT%","index":255}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/Contact.java","uriBaseId":"%SRCROOT%","index":256}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/Comment.java","uriBaseId":"%SRCROOT%","index":257}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/WebWolfIntroduction.java","uriBaseId":"%SRCROOT%","index":258}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORLogin.java","uriBaseId":"%SRCROOT%","index":259}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/RestartLessonService.java","uriBaseId":"%SRCROOT%","index":260}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponents.java","uriBaseId":"%SRCROOT%","index":261}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/Cryptography.java","uriBaseId":"%SRCROOT%","index":262}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/SerializationHelper.java","uriBaseId":"%SRCROOT%","index":263}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserValidator.java","uriBaseId":"%SRCROOT%","index":264}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java","uriBaseId":"%SRCROOT%","index":265}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Assignment8.java","uriBaseId":"%SRCROOT%","index":266}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson4.java","uriBaseId":"%SRCROOT%","index":267}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/UserProfile.java","uriBaseId":"%SRCROOT%","index":268}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Assignment.java","uriBaseId":"%SRCROOT%","index":269}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSession.java","uriBaseId":"%SRCROOT%","index":270}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/webgoatintroduction/WebGoatIntroduction.java","uriBaseId":"%SRCROOT%","index":271}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentHints.java","uriBaseId":"%SRCROOT%","index":272}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignment.java","uriBaseId":"%SRCROOT%","index":273}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserialization.java","uriBaseId":"%SRCROOT%","index":274}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHash.java","uriBaseId":"%SRCROOT%","index":275}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/SampleAttack.java","uriBaseId":"%SRCROOT%","index":276}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/User.java","uriBaseId":"%SRCROOT%","index":277}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOREditOtherProfiile.java","uriBaseId":"%SRCROOT%","index":278}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/user/UserRepository.java","uriBaseId":"%SRCROOT%","index":279}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java","uriBaseId":"%SRCROOT%","index":280}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignment.java","uriBaseId":"%SRCROOT%","index":281}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDOR.java","uriBaseId":"%SRCROOT%","index":282}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOtherProfile.java","uriBaseId":"%SRCROOT%","index":283}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/AuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":284}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswords.java","uriBaseId":"%SRCROOT%","index":285}},{"location":{"uri":"src/main/java/org/owasp/webgoat/server/StartWebGoat.java","uriBaseId":"%SRCROOT%","index":286}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/session/LabelDebugger.java","uriBaseId":"%SRCROOT%","index":287}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/ContactImpl.java","uriBaseId":"%SRCROOT%","index":288}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/Messages.java","uriBaseId":"%SRCROOT%","index":289}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsLesson.java","uriBaseId":"%SRCROOT%","index":290}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/EncodingAssignment.java","uriBaseId":"%SRCROOT%","index":291}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AuthBypass.java","uriBaseId":"%SRCROOT%","index":292}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Lesson.java","uriBaseId":"%SRCROOT%","index":293}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkDummy.java","uriBaseId":"%SRCROOT%","index":294}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/i18n/PluginMessages.java","uriBaseId":"%SRCROOT%","index":295}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidation.java","uriBaseId":"%SRCROOT%","index":296}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTamperingTask.java","uriBaseId":"%SRCROOT%","index":297}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentForgotPassword.java","uriBaseId":"%SRCROOT%","index":298}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionAdvanced.java","uriBaseId":"%SRCROOT%","index":299}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/assignments/AssignmentPath.java","uriBaseId":"%SRCROOT%","index":300}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIA.java","uriBaseId":"%SRCROOT%","index":301}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLoginTask.java","uriBaseId":"%SRCROOT%","index":302}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingQuiz.java","uriBaseId":"%SRCROOT%","index":303}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLogin.java","uriBaseId":"%SRCROOT%","index":304}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/mailbox/Email.java","uriBaseId":"%SRCROOT%","index":305}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonInfoModel.java","uriBaseId":"%SRCROOT%","index":306}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Challenge8.java","uriBaseId":"%SRCROOT%","index":307}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/WebWolfRedirect.java","uriBaseId":"%SRCROOT%","index":308}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/lessontemplate/LessonTemplate.java","uriBaseId":"%SRCROOT%","index":309}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":310}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/idor/IDORDiffAttributes.java","uriBaseId":"%SRCROOT%","index":311}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1.java","uriBaseId":"%SRCROOT%","index":312}},{"location":{"uri":"src/main/java/org/owasp/webgoat/server/StartupMessage.java","uriBaseId":"%SRCROOT%","index":313}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFiltering.java","uriBaseId":"%SRCROOT%","index":314}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionMitigations.java","uriBaseId":"%SRCROOT%","index":315}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallengeLogin.java","uriBaseId":"%SRCROOT%","index":316}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10a.java","uriBaseId":"%SRCROOT%","index":317}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFGetFlag.java","uriBaseId":"%SRCROOT%","index":318}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/stored/CrossSiteScriptingStored.java","uriBaseId":"%SRCROOT%","index":319}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/Flag.java","uriBaseId":"%SRCROOT%","index":320}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/votes/Views.java","uriBaseId":"%SRCROOT%","index":321}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/XXE.java","uriBaseId":"%SRCROOT%","index":322}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/WebWolfTraceRepository.java","uriBaseId":"%SRCROOT%","index":323}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/LessonConnectionInvocationHandler.java","uriBaseId":"%SRCROOT%","index":324}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/service/HintService.java","uriBaseId":"%SRCROOT%","index":325}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTrackerRepository.java","uriBaseId":"%SRCROOT%","index":326}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/LessonDataSource.java","uriBaseId":"%SRCROOT%","index":327}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/Scoreboard.java","uriBaseId":"%SRCROOT%","index":328}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.java","uriBaseId":"%SRCROOT%","index":329}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cia/CIAQuiz.java","uriBaseId":"%SRCROOT%","index":330}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":331}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/XOREncodingAssignment.java","uriBaseId":"%SRCROOT%","index":332}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserTracker.java","uriBaseId":"%SRCROOT%","index":333}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserSession.java","uriBaseId":"%SRCROOT%","index":334}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/session/Course.java","uriBaseId":"%SRCROOT%","index":335}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequest.java","uriBaseId":"%SRCROOT%","index":336}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6b.java","uriBaseId":"%SRCROOT%","index":337}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionQuiz.java","uriBaseId":"%SRCROOT%","index":338}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/lessons/Initializeable.java","uriBaseId":"%SRCROOT%","index":339}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/passwordreset/SimpleMailAssignment.java","uriBaseId":"%SRCROOT%","index":340}},{"location":{"uri":"src/main/java/org/owasp/webgoat/container/asciidoc/EnvironmentExposure.java","uriBaseId":"%SRCROOT%","index":341}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/ChallengeIntro.java","uriBaseId":"%SRCROOT%","index":342}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsQuiz.java","uriBaseId":"%SRCROOT%","index":343}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/CryptoUtil.java","uriBaseId":"%SRCROOT%","index":344}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/csrf/CSRFConfirmFlag1.java","uriBaseId":"%SRCROOT%","index":345}},{"location":{"uri":"src/main/java/org/owasp/webgoat/webwolf/jwt/JWTToken.java","uriBaseId":"%SRCROOT%","index":346}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/Email.java","uriBaseId":"%SRCROOT%","index":347}},{"location":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/User.java","uriBaseId":"%SRCROOT%","index":348}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/StartupMessage.java","uriBaseId":"%SRCROOT%","index":349}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":350}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/CommentsEndpoint.java","uriBaseId":"%SRCROOT%","index":351}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxControllerTest.java","uriBaseId":"%SRCROOT%","index":352}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/CourseConfiguration.java","uriBaseId":"%SRCROOT%","index":353}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":354}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":355}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/ReportCardServiceTest.java","uriBaseId":"%SRCROOT%","index":356}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Initializeable.java","uriBaseId":"%SRCROOT%","index":357}},{"location":{"uri":"src-delomboked/src/main/java/org/dummy/insecure/framework/VulnerableTaskHolder.java","uriBaseId":"%SRCROOT%","index":358}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignment.java","uriBaseId":"%SRCROOT%","index":359}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson3.java","uriBaseId":"%SRCROOT%","index":360}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswords.java","uriBaseId":"%SRCROOT%","index":361}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/SolutionConstants.java","uriBaseId":"%SRCROOT%","index":362}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFieldRestrictions.java","uriBaseId":"%SRCROOT%","index":363}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/QuestionsAssignment.java","uriBaseId":"%SRCROOT%","index":364}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":365}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/HammerHead.java","uriBaseId":"%SRCROOT%","index":366}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Challenge8.java","uriBaseId":"%SRCROOT%","index":367}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Challenge7.java","uriBaseId":"%SRCROOT%","index":368}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/challenges/Assignment1Test.java","uriBaseId":"%SRCROOT%","index":369}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":370}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2Test.java","uriBaseId":"%SRCROOT%","index":371}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Assignment.java","uriBaseId":"%SRCROOT%","index":372}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":373}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":374}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/HintService.java","uriBaseId":"%SRCROOT%","index":375}},{"location":{"uri":"src-delomboked/.mvn/wrapper/MavenWrapperDownloader.java","uriBaseId":"%SRCROOT%","index":376}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Hint.java","uriBaseId":"%SRCROOT%","index":377}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserTracker.java","uriBaseId":"%SRCROOT%","index":378}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasics.java","uriBaseId":"%SRCROOT%","index":379}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfileAltUrl.java","uriBaseId":"%SRCROOT%","index":380}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":381}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/VerifyAccount.java","uriBaseId":"%SRCROOT%","index":382}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/StartWebGoat.java","uriBaseId":"%SRCROOT%","index":383}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpoint.java","uriBaseId":"%SRCROOT%","index":384}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AttackResult.java","uriBaseId":"%SRCROOT%","index":385}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWT.java","uriBaseId":"%SRCROOT%","index":386}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/jwt/JWTController.java","uriBaseId":"%SRCROOT%","index":387}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":388}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":389}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":390}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenusTest.java","uriBaseId":"%SRCROOT%","index":391}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACHiddenMenus.java","uriBaseId":"%SRCROOT%","index":392}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsLesson.java","uriBaseId":"%SRCROOT%","index":393}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/CrossSiteScriptingStored.java","uriBaseId":"%SRCROOT%","index":394}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/authbypass/BypassVerificationTest.java","uriBaseId":"%SRCROOT%","index":395}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":396}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentForgotPassword.java","uriBaseId":"%SRCROOT%","index":397}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/UserProfile.java","uriBaseId":"%SRCROOT%","index":398}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Flags.java","uriBaseId":"%SRCROOT%","index":399}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/Review.java","uriBaseId":"%SRCROOT%","index":400}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":401}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":402}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProviderTest.java","uriBaseId":"%SRCROOT%","index":403}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserValidator.java","uriBaseId":"%SRCROOT%","index":404}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingAccessControlUserRepository.java","uriBaseId":"%SRCROOT%","index":405}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/ChallengeIntro.java","uriBaseId":"%SRCROOT%","index":406}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/DeserializationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":407}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsers.java","uriBaseId":"%SRCROOT%","index":408}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/TriedQuestions.java","uriBaseId":"%SRCROOT%","index":409}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":410}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/PasswordResetLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":411}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/PluginMessages.java","uriBaseId":"%SRCROOT%","index":412}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/GeneralLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":413}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTampering.java","uriBaseId":"%SRCROOT%","index":414}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionMitigations.java","uriBaseId":"%SRCROOT%","index":415}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/lessontemplate/SampleAttack.java","uriBaseId":"%SRCROOT%","index":416}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/SimpleMailAssignment.java","uriBaseId":"%SRCROOT%","index":417}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/LessonMenuServiceTest.java","uriBaseId":"%SRCROOT%","index":418}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":419}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Challenge5.java","uriBaseId":"%SRCROOT%","index":420}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/Email.java","uriBaseId":"%SRCROOT%","index":421}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":422}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignment.java","uriBaseId":"%SRCROOT%","index":423}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/cryptography/CryptoUtilTest.java","uriBaseId":"%SRCROOT%","index":424}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/ReportCardService.java","uriBaseId":"%SRCROOT%","index":425}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentEndpoint.java","uriBaseId":"%SRCROOT%","index":426}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfRootMacro.java","uriBaseId":"%SRCROOT%","index":427}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":428}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/Email.java","uriBaseId":"%SRCROOT%","index":429}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":430}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":431}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/SerializationHelper.java","uriBaseId":"%SRCROOT%","index":432}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/controller/StartLesson.java","uriBaseId":"%SRCROOT%","index":433}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13.java","uriBaseId":"%SRCROOT%","index":434}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6aTest.java","uriBaseId":"%SRCROOT%","index":435}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Flag.java","uriBaseId":"%SRCROOT%","index":436}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Assignment1.java","uriBaseId":"%SRCROOT%","index":437}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/PathTraversalIntegrationTest.java","uriBaseId":"%SRCROOT%","index":438}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/WebGoatApplication.java","uriBaseId":"%SRCROOT%","index":439}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevTools.java","uriBaseId":"%SRCROOT%","index":440}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFixTest.java","uriBaseId":"%SRCROOT%","index":441}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/XSSIntegrationTest.java","uriBaseId":"%SRCROOT%","index":442}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingMitigation.java","uriBaseId":"%SRCROOT%","index":443}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/Language.java","uriBaseId":"%SRCROOT%","index":444}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDec.java","uriBaseId":"%SRCROOT%","index":445}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentHints.java","uriBaseId":"%SRCROOT%","index":446}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":447}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/Contact.java","uriBaseId":"%SRCROOT%","index":448}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":449}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/Salaries.java","uriBaseId":"%SRCROOT%","index":450}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LabelDebugService.java","uriBaseId":"%SRCROOT%","index":451}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/deserialization/DeserializeTest.java","uriBaseId":"%SRCROOT%","index":452}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SessionManagementIntegrationTest.java","uriBaseId":"%SRCROOT%","index":453}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItemType.java","uriBaseId":"%SRCROOT%","index":454}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/XOREncodingAssignment.java","uriBaseId":"%SRCROOT%","index":455}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserRepository.java","uriBaseId":"%SRCROOT%","index":456}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":457}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/i18n/Messages.java","uriBaseId":"%SRCROOT%","index":458}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":459}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/ForgedReviews.java","uriBaseId":"%SRCROOT%","index":460}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrievalTest.java","uriBaseId":"%SRCROOT%","index":461}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":462}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonScanner.java","uriBaseId":"%SRCROOT%","index":463}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredXssComments.java","uriBaseId":"%SRCROOT%","index":464}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":465}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest2.java","uriBaseId":"%SRCROOT%","index":466}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORDiffAttributes.java","uriBaseId":"%SRCROOT%","index":467}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/CSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":468}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/XXEIntegrationTest.java","uriBaseId":"%SRCROOT%","index":469}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/CryptoUtil.java","uriBaseId":"%SRCROOT%","index":470}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8Test.java","uriBaseId":"%SRCROOT%","index":471}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/LabelAndHintIntegrationTest.java","uriBaseId":"%SRCROOT%","index":472}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cia/CIA.java","uriBaseId":"%SRCROOT%","index":473}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5aTest.java","uriBaseId":"%SRCROOT%","index":474}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":475}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/AssignmentPath.java","uriBaseId":"%SRCROOT%","index":476}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/plugins/LessonTest.java","uriBaseId":"%SRCROOT%","index":477}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/Email.java","uriBaseId":"%SRCROOT%","index":478}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/UserService.java","uriBaseId":"%SRCROOT%","index":479}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/UserSessionData.java","uriBaseId":"%SRCROOT%","index":480}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpoint.java","uriBaseId":"%SRCROOT%","index":481}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/server/ParentConfig.java","uriBaseId":"%SRCROOT%","index":482}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonConnectionInvocationHandler.java","uriBaseId":"%SRCROOT%","index":483}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":484}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignment.java","uriBaseId":"%SRCROOT%","index":485}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponents.java","uriBaseId":"%SRCROOT%","index":486}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/WebWolfIntegrationTest.java","uriBaseId":"%SRCROOT%","index":487}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/UserRepository.java","uriBaseId":"%SRCROOT%","index":488}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringAssignmentTest.java","uriBaseId":"%SRCROOT%","index":489}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/csrf/CSRFFeedbackTest.java","uriBaseId":"%SRCROOT%","index":490}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson6bTest.java","uriBaseId":"%SRCROOT%","index":491}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":492}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHash.java","uriBaseId":"%SRCROOT%","index":493}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/LabelDebugger.java","uriBaseId":"%SRCROOT%","index":494}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/user/UserServiceTest.java","uriBaseId":"%SRCROOT%","index":495}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/LessonDataSource.java","uriBaseId":"%SRCROOT%","index":496}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionAdvancedIntegrationTest.java","uriBaseId":"%SRCROOT%","index":497}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpointTest.java","uriBaseId":"%SRCROOT%","index":498}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/ContactImpl.java","uriBaseId":"%SRCROOT%","index":499}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/IntegrationTest.java","uriBaseId":"%SRCROOT%","index":500}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10Test.java","uriBaseId":"%SRCROOT%","index":501}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/chromedevtools/ChromeDevToolsTest.java","uriBaseId":"%SRCROOT%","index":502}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDOR.java","uriBaseId":"%SRCROOT%","index":503}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/session/LessonTrackerTest.java","uriBaseId":"%SRCROOT%","index":504}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/CryptoIntegrationTest.java","uriBaseId":"%SRCROOT%","index":505}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserTrackerRepository.java","uriBaseId":"%SRCROOT%","index":506}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/jwt/JWTToken.java","uriBaseId":"%SRCROOT%","index":507}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":508}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Lesson.java","uriBaseId":"%SRCROOT%","index":509}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepository.java","uriBaseId":"%SRCROOT%","index":510}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/votes/Vote.java","uriBaseId":"%SRCROOT%","index":511}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/Cryptography.java","uriBaseId":"%SRCROOT%","index":512}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/Course.java","uriBaseId":"%SRCROOT%","index":513}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LabelService.java","uriBaseId":"%SRCROOT%","index":514}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":515}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/AccountVerificationHelper.java","uriBaseId":"%SRCROOT%","index":516}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/mailbox/MailboxRepositoryTest.java","uriBaseId":"%SRCROOT%","index":517}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookie.java","uriBaseId":"%SRCROOT%","index":518}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/session/WebSession.java","uriBaseId":"%SRCROOT%","index":519}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordResetEmail.java","uriBaseId":"%SRCROOT%","index":520}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson6a.java","uriBaseId":"%SRCROOT%","index":521}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpointTest.java","uriBaseId":"%SRCROOT%","index":522}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFGetFlag.java","uriBaseId":"%SRCROOT%","index":523}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":524}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":525}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/session/LabelDebuggerTest.java","uriBaseId":"%SRCROOT%","index":526}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/user/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":527}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":528}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/stored/StoredCrossSiteScriptingVerifier.java","uriBaseId":"%SRCROOT%","index":529}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserTrackerRepositoryTest.java","uriBaseId":"%SRCROOT%","index":530}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserValidatorTest.java","uriBaseId":"%SRCROOT%","index":531}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":532}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionYourHashTest.java","uriBaseId":"%SRCROOT%","index":533}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidation.java","uriBaseId":"%SRCROOT%","index":534}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":535}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/cia/CIAQuizTest.java","uriBaseId":"%SRCROOT%","index":536}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserialization.java","uriBaseId":"%SRCROOT%","index":537}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/HijackSession.java","uriBaseId":"%SRCROOT%","index":538}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdmin.java","uriBaseId":"%SRCROOT%","index":539}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFConfirmFlag1.java","uriBaseId":"%SRCROOT%","index":540}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/UsernameMacro.java","uriBaseId":"%SRCROOT%","index":541}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonMenuItem.java","uriBaseId":"%SRCROOT%","index":542}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/hijacksession/HijackSessionAssignmentTest.java","uriBaseId":"%SRCROOT%","index":543}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":544}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTSecretKeyEndpointTest.java","uriBaseId":"%SRCROOT%","index":545}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":546}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/MvcConfiguration.java","uriBaseId":"%SRCROOT%","index":547}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5Test.java","uriBaseId":"%SRCROOT%","index":548}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask1.java","uriBaseId":"%SRCROOT%","index":549}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1.java","uriBaseId":"%SRCROOT%","index":550}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":551}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/DOMCrossSiteScriptingTest.java","uriBaseId":"%SRCROOT%","index":552}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/WebWolfTraceRepository.java","uriBaseId":"%SRCROOT%","index":553}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/LessonInfoModel.java","uriBaseId":"%SRCROOT%","index":554}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/ssrf/SSRFTest1.java","uriBaseId":"%SRCROOT%","index":555}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpointTest.java","uriBaseId":"%SRCROOT%","index":556}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationTest.java","uriBaseId":"%SRCROOT%","index":557}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/securepasswords/SecurePasswordsAssignment.java","uriBaseId":"%SRCROOT%","index":558}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/HijackSessionAuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":559}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkDummy.java","uriBaseId":"%SRCROOT%","index":560}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/SessionService.java","uriBaseId":"%SRCROOT%","index":561}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":562}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/ChallengeIntegrationTest.java","uriBaseId":"%SRCROOT%","index":563}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/DisplayUserTest.java","uriBaseId":"%SRCROOT%","index":564}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/WebWolfIntroduction.java","uriBaseId":"%SRCROOT%","index":565}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/votes/Views.java","uriBaseId":"%SRCROOT%","index":566}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/LessonProgressServiceTest.java","uriBaseId":"%SRCROOT%","index":567}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":568}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/LessonTemplateResolver.java","uriBaseId":"%SRCROOT%","index":569}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/controller/Welcome.java","uriBaseId":"%SRCROOT%","index":570}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/jwt/JWTTokenTest.java","uriBaseId":"%SRCROOT%","index":571}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":572}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson1Test.java","uriBaseId":"%SRCROOT%","index":573}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOtherProfile.java","uriBaseId":"%SRCROOT%","index":574}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/lessontemplate/LessonTemplate.java","uriBaseId":"%SRCROOT%","index":575}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/User.java","uriBaseId":"%SRCROOT%","index":576}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/AccessControlIntegrationTest.java","uriBaseId":"%SRCROOT%","index":577}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":578}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonInfoService.java","uriBaseId":"%SRCROOT%","index":579}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/Comment.java","uriBaseId":"%SRCROOT%","index":580}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInputTest.java","uriBaseId":"%SRCROOT%","index":581}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/UserSession.java","uriBaseId":"%SRCROOT%","index":582}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTQuiz.java","uriBaseId":"%SRCROOT%","index":583}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebWolfMacro.java","uriBaseId":"%SRCROOT%","index":584}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/spoofcookie/encoders/EncDecTest.java","uriBaseId":"%SRCROOT%","index":585}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/authbypass/AuthBypass.java","uriBaseId":"%SRCROOT%","index":586}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionAdvanced.java","uriBaseId":"%SRCROOT%","index":587}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjection.java","uriBaseId":"%SRCROOT%","index":588}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignmentTest.java","uriBaseId":"%SRCROOT%","index":589}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpProxies.java","uriBaseId":"%SRCROOT%","index":590}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/PathTraversal.java","uriBaseId":"%SRCROOT%","index":591}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/missingac/MissingFunctionAC.java","uriBaseId":"%SRCROOT%","index":592}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":593}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/Challenge1.java","uriBaseId":"%SRCROOT%","index":594}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORViewOwnProfile.java","uriBaseId":"%SRCROOT%","index":595}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadTest.java","uriBaseId":"%SRCROOT%","index":596}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallengeLogin.java","uriBaseId":"%SRCROOT%","index":597}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/OperatingSystemMacro.java","uriBaseId":"%SRCROOT%","index":598}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SqlInjectionMitigationIntegrationTest.java","uriBaseId":"%SRCROOT%","index":599}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/AuthenticationProvider.java","uriBaseId":"%SRCROOT%","index":600}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":601}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofingTask.java","uriBaseId":"%SRCROOT%","index":602}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/Requests.java","uriBaseId":"%SRCROOT%","index":603}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/hijacksession/cas/Authentication.java","uriBaseId":"%SRCROOT%","index":604}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpbasics/HttpBasicsQuiz.java","uriBaseId":"%SRCROOT%","index":605}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/MailAssignment.java","uriBaseId":"%SRCROOT%","index":606}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/SimpleXXETest.java","uriBaseId":"%SRCROOT%","index":607}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":608}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6b.java","uriBaseId":"%SRCROOT%","index":609}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10a.java","uriBaseId":"%SRCROOT%","index":610}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/IDORIntegrationTest.java","uriBaseId":"%SRCROOT%","index":611}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/service/HintServiceTest.java","uriBaseId":"%SRCROOT%","index":612}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/EncodingAssignment.java","uriBaseId":"%SRCROOT%","index":613}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatTmpDirMacro.java","uriBaseId":"%SRCROOT%","index":614}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":615}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ShopEndpointTest.java","uriBaseId":"%SRCROOT%","index":616}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionQuiz.java","uriBaseId":"%SRCROOT%","index":617}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequest.java","uriBaseId":"%SRCROOT%","index":618}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywordsTest.java","uriBaseId":"%SRCROOT%","index":619}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/lessons/Category.java","uriBaseId":"%SRCROOT%","index":620}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/XXE.java","uriBaseId":"%SRCROOT%","index":621}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpointTest.java","uriBaseId":"%SRCROOT%","index":622}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/mailbox/MailboxController.java","uriBaseId":"%SRCROOT%","index":623}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/assignments/AssignmentEndpointTest.java","uriBaseId":"%SRCROOT%","index":624}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":625}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonTitleService.java","uriBaseId":"%SRCROOT%","index":626}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/jwt/JWTDecodeEndpoint.java","uriBaseId":"%SRCROOT%","index":627}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/webwolf/WebWolfApplication.java","uriBaseId":"%SRCROOT%","index":628}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonMenuService.java","uriBaseId":"%SRCROOT%","index":629}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFiltering.java","uriBaseId":"%SRCROOT%","index":630}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/Comment.java","uriBaseId":"%SRCROOT%","index":631}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/httpproxies/HttpBasicsInterceptRequestTest.java","uriBaseId":"%SRCROOT%","index":632}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge8/Assignment8.java","uriBaseId":"%SRCROOT%","index":633}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/ssrf/SSRF.java","uriBaseId":"%SRCROOT%","index":634}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":635}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/EnvironmentService.java","uriBaseId":"%SRCROOT%","index":636}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/SSRFIntegrationTest.java","uriBaseId":"%SRCROOT%","index":637}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/Ping.java","uriBaseId":"%SRCROOT%","index":638}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/DatabaseConfiguration.java","uriBaseId":"%SRCROOT%","index":639}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/assignments/LessonTrackerInterceptor.java","uriBaseId":"%SRCROOT%","index":640}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLoginTask.java","uriBaseId":"%SRCROOT%","index":641}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/LessonTracker.java","uriBaseId":"%SRCROOT%","index":642}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFFeedback.java","uriBaseId":"%SRCROOT%","index":643}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":644}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":645}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xxe/User.java","uriBaseId":"%SRCROOT%","index":646}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebWolfRedirect.java","uriBaseId":"%SRCROOT%","index":647}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":648}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/RestartLessonService.java","uriBaseId":"%SRCROOT%","index":649}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/PasswordReset.java","uriBaseId":"%SRCROOT%","index":650}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/chromedevtools/NetworkLesson.java","uriBaseId":"%SRCROOT%","index":651}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACYourHashAdminTest.java","uriBaseId":"%SRCROOT%","index":652}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xss/StoredXssCommentsTest.java","uriBaseId":"%SRCROOT%","index":653}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignment.java","uriBaseId":"%SRCROOT%","index":654}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/EnvironmentExposure.java","uriBaseId":"%SRCROOT%","index":655}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":656}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/service/LessonProgressService.java","uriBaseId":"%SRCROOT%","index":657}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingQuiz.java","uriBaseId":"%SRCROOT%","index":658}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRF.java","uriBaseId":"%SRCROOT%","index":659}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/SecurityQuestionAssignment.java","uriBaseId":"%SRCROOT%","index":660}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson4.java","uriBaseId":"%SRCROOT%","index":661}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/webwolf/WebWolf.java","uriBaseId":"%SRCROOT%","index":662}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/ProgressRaceConditionIntegrationTest.java","uriBaseId":"%SRCROOT%","index":663}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/SqlLessonTest.java","uriBaseId":"%SRCROOT%","index":664}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/passwordreset/resetlink/PasswordChangeForm.java","uriBaseId":"%SRCROOT%","index":665}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScripting.java","uriBaseId":"%SRCROOT%","index":666}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/asciidoc/WebGoatVersionMacro.java","uriBaseId":"%SRCROOT%","index":667}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webgoatintroduction/WebGoatIntroduction.java","uriBaseId":"%SRCROOT%","index":668}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":669}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/webwolfintroduction/LandingAssignment.java","uriBaseId":"%SRCROOT%","index":670}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/WebGoat.java","uriBaseId":"%SRCROOT%","index":671}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/container/users/UserRepositoryTest.java","uriBaseId":"%SRCROOT%","index":672}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":673}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":674}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9Test.java","uriBaseId":"%SRCROOT%","index":675}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictionsFrontendValidationTest.java","uriBaseId":"%SRCROOT%","index":676}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDOREditOtherProfiile.java","uriBaseId":"%SRCROOT%","index":677}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/insecurelogin/InsecureLogin.java","uriBaseId":"%SRCROOT%","index":678}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/Scoreboard.java","uriBaseId":"%SRCROOT%","index":679}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/missingac/MissingFunctionACUsersTest.java","uriBaseId":"%SRCROOT%","index":680}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/idor/IDORLogin.java","uriBaseId":"%SRCROOT%","index":681}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignmentTest.java","uriBaseId":"%SRCROOT%","index":682}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/logging/LogSpoofing.java","uriBaseId":"%SRCROOT%","index":683}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLessonTest.java","uriBaseId":"%SRCROOT%","index":684}},{"location":{"uri":".mvn/wrapper/MavenWrapperDownloader.java","uriBaseId":"%SRCROOT%","index":685}},{"location":{"uri":"src-delomboked/src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":686}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/clientsidefiltering/ClientSideFilteringFreeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":687}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson13Test.java","uriBaseId":"%SRCROOT%","index":688}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/cia/CIAQuiz.java","uriBaseId":"%SRCROOT%","index":689}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/challenge1/ImageServlet.java","uriBaseId":"%SRCROOT%","index":690}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":691}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":692}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/challenges/FlagController.java","uriBaseId":"%SRCROOT%","index":693}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/passwordreset/ResetLinkAssignmentTest.java","uriBaseId":"%SRCROOT%","index":694}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":695}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/csrf/CSRFLogin.java","uriBaseId":"%SRCROOT%","index":696}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/bypassrestrictions/BypassRestrictions.java","uriBaseId":"%SRCROOT%","index":697}},{"location":{"uri":"src-delomboked/src/main/java/org/owasp/webgoat/lessons/htmltampering/HtmlTamperingTask.java","uriBaseId":"%SRCROOT%","index":698}},{"location":{"uri":"src-delomboked/src/test/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignmentTest.java","uriBaseId":"%SRCROOT%","index":699}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/scoreboardApp.js","uriBaseId":"%SRCROOT%","index":700}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/assignment3.js","uriBaseId":"%SRCROOT%","index":701}},{"location":{"uri":"src/main/resources/lessons/csrf/js/csrf-review.js","uriBaseId":"%SRCROOT%","index":702}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/xxe/js/xxe.js","uriBaseId":"%SRCROOT%","index":703}},{"location":{"uri":"src/main/resources/lessons/jwt/js/jwt-buy.js","uriBaseId":"%SRCROOT%","index":704}},{"location":{"uri":"src/main/resources/lessons/challenges/js/challenge8.js","uriBaseId":"%SRCROOT%","index":705}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/mode-java.js","uriBaseId":"%SRCROOT%","index":706}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/assignment10b.js","uriBaseId":"%SRCROOT%","index":707}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/TitleView.js","uriBaseId":"%SRCROOT%","index":708}},{"location":{"uri":"src/main/resources/lessons/idor/js/idor.js","uriBaseId":"%SRCROOT%","index":709}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery_form/jquery.form.js","uriBaseId":"%SRCROOT%","index":710}},{"location":{"uri":"src/main/resources/lessons/pathtraversal/js/path_traversal.js","uriBaseId":"%SRCROOT%","index":711}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/controller/MenuController.js","uriBaseId":"%SRCROOT%","index":712}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ErrorNotificationView.js","uriBaseId":"%SRCROOT%","index":713}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuButtonView.js","uriBaseId":"%SRCROOT%","index":714}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuData.js","uriBaseId":"%SRCROOT%","index":715}},{"location":{"uri":"src/main/resources/webgoat/static/js/jquery/jquery-1.10.2.min.js","uriBaseId":"%SRCROOT%","index":716}},{"location":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-slider/js/bootstrap-slider.js","uriBaseId":"%SRCROOT%","index":717}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/UserAndInfoView.js","uriBaseId":"%SRCROOT%","index":718}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/text.js","uriBaseId":"%SRCROOT%","index":719}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuModel.js","uriBaseId":"%SRCROOT%","index":720}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-base.js","uriBaseId":"%SRCROOT%","index":721}},{"location":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/wysihtml5-0.3.0.js","uriBaseId":"%SRCROOT%","index":722}},{"location":{"uri":"src/main/resources/lessons/jwt/js/jwt-refresh.js","uriBaseId":"%SRCROOT%","index":723}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-ui-1.10.4.js","uriBaseId":"%SRCROOT%","index":724}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/challenge.js","uriBaseId":"%SRCROOT%","index":725}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/theme-monokai.js","uriBaseId":"%SRCROOT%","index":726}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/AssignmentStatusModel.js","uriBaseId":"%SRCROOT%","index":727}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonOverviewCollection.js","uriBaseId":"%SRCROOT%","index":728}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HTMLContentModel.js","uriBaseId":"%SRCROOT%","index":729}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/ssrf/js/credentials.js","uriBaseId":"%SRCROOT%","index":730}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/clientsidefiltering/js/clientSideFilteringFree.js","uriBaseId":"%SRCROOT%","index":731}},{"location":{"uri":"src/main/resources/lessons/authbypass/js/bypass.js","uriBaseId":"%SRCROOT%","index":732}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuCollection.js","uriBaseId":"%SRCROOT%","index":733}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/GoatUtils.js","uriBaseId":"%SRCROOT%","index":734}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonInfoModel.js","uriBaseId":"%SRCROOT%","index":735}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/idor/js/idor.js","uriBaseId":"%SRCROOT%","index":736}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/TitleView.js","uriBaseId":"%SRCROOT%","index":737}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/PaginationControlView.js","uriBaseId":"%SRCROOT%","index":738}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LessonContentModel.js","uriBaseId":"%SRCROOT%","index":739}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HintModel.js","uriBaseId":"%SRCROOT%","index":740}},{"location":{"uri":"src/main/resources/lessons/jwt/js/jwt-voting.js","uriBaseId":"%SRCROOT%","index":741}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/goatApp.js","uriBaseId":"%SRCROOT%","index":742}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuModel.js","uriBaseId":"%SRCROOT%","index":743}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/FlagModel.js","uriBaseId":"%SRCROOT%","index":744}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/PaginationControlView.js","uriBaseId":"%SRCROOT%","index":745}},{"location":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/jwt.js","uriBaseId":"%SRCROOT%","index":746}},{"location":{"uri":"src/main/resources/webwolf/static/js/jwt.js","uriBaseId":"%SRCROOT%","index":747}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/csrf/js/csrf-review.js","uriBaseId":"%SRCROOT%","index":748}},{"location":{"uri":"src/main/resources/lessons/csrf/js/feedback.js","uriBaseId":"%SRCROOT%","index":749}},{"location":{"uri":"src/main/resources/webgoat/static/js/quiz.js","uriBaseId":"%SRCROOT%","index":750}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/search.js","uriBaseId":"%SRCROOT%","index":751}},{"location":{"uri":"src/main/resources/webgoat/static/js/jquery_form/jquery.form.js","uriBaseId":"%SRCROOT%","index":752}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-final.js","uriBaseId":"%SRCROOT%","index":753}},{"location":{"uri":"src/main/resources/lessons/challenges/js/challenge6.js","uriBaseId":"%SRCROOT%","index":754}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/underscore-min.js","uriBaseId":"%SRCROOT%","index":755}},{"location":{"uri":"src/main/resources/lessons/xss/js/assignment4.js","uriBaseId":"%SRCROOT%","index":756}},{"location":{"uri":"src/main/resources/lessons/sqlinjection/js/assignment10b.js","uriBaseId":"%SRCROOT%","index":757}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-refresh.js","uriBaseId":"%SRCROOT%","index":758}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/nanoScroller/jquery.nanoscroller.min.js","uriBaseId":"%SRCROOT%","index":759}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LabelDebugModel.js","uriBaseId":"%SRCROOT%","index":760}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuView.js","uriBaseId":"%SRCROOT%","index":761}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/pathtraversal/js/path_traversal.js","uriBaseId":"%SRCROOT%","index":762}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/GoatRouter.js","uriBaseId":"%SRCROOT%","index":763}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/insecurelogin/js/credentials.js","uriBaseId":"%SRCROOT%","index":764}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/MenuData.js","uriBaseId":"%SRCROOT%","index":765}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ScoreboardView.js","uriBaseId":"%SRCROOT%","index":766}},{"location":{"uri":"src/main/resources/webwolf/static/js/mail.js","uriBaseId":"%SRCROOT%","index":767}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-weak-keys.js","uriBaseId":"%SRCROOT%","index":768}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-ui.min.js","uriBaseId":"%SRCROOT%","index":769}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/controller/LessonController.js","uriBaseId":"%SRCROOT%","index":770}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/passwordreset/js/password-reset-simple.js","uriBaseId":"%SRCROOT%","index":771}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/controller/MenuController.js","uriBaseId":"%SRCROOT%","index":772}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonInfoModel.js","uriBaseId":"%SRCROOT%","index":773}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HTMLContentModel.js","uriBaseId":"%SRCROOT%","index":774}},{"location":{"uri":"src/main/resources/lessons/clientsidefiltering/js/clientSideFilteringFree.js","uriBaseId":"%SRCROOT%","index":775}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/CustomGoat.js","uriBaseId":"%SRCROOT%","index":776}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/toggle.js","uriBaseId":"%SRCROOT%","index":777}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/theme-monokai.js","uriBaseId":"%SRCROOT%","index":778}},{"location":{"uri":"src/main/resources/lessons/ssrf/js/credentials.js","uriBaseId":"%SRCROOT%","index":779}},{"location":{"uri":"src/main/resources/webwolf/static/js/fileUpload.js","uriBaseId":"%SRCROOT%","index":780}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery.min.js","uriBaseId":"%SRCROOT%","index":781}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/GoatRouter.js","uriBaseId":"%SRCROOT%","index":782}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/goatConstants.js","uriBaseId":"%SRCROOT%","index":783}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-ui.min.js","uriBaseId":"%SRCROOT%","index":784}},{"location":{"uri":"src/main/resources/webgoat/static/plugins/nanoScroller/jquery.nanoscroller.min.js","uriBaseId":"%SRCROOT%","index":785}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/goatAsyncErrorHandler.js","uriBaseId":"%SRCROOT%","index":786}},{"location":{"uri":"src/main/resources/lessons/clientsidefiltering/js/clientSideFiltering.js","uriBaseId":"%SRCROOT%","index":787}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/polyglot.min.js","uriBaseId":"%SRCROOT%","index":788}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/clientsidefiltering/js/clientSideFiltering.js","uriBaseId":"%SRCROOT%","index":789}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/ReportCardModel.js","uriBaseId":"%SRCROOT%","index":790}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/FlagsCollection.js","uriBaseId":"%SRCROOT%","index":791}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/ace.js","uriBaseId":"%SRCROOT%","index":792}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":793}},{"location":{"uri":"src/main/resources/lessons/insecurelogin/js/credentials.js","uriBaseId":"%SRCROOT%","index":794}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-buy.js","uriBaseId":"%SRCROOT%","index":795}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/goatApp.js","uriBaseId":"%SRCROOT%","index":796}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/AssignmentStatusModel.js","uriBaseId":"%SRCROOT%","index":797}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery.form.js","uriBaseId":"%SRCROOT%","index":798}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/ace.js","uriBaseId":"%SRCROOT%","index":799}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/backbone-min.js","uriBaseId":"%SRCROOT%","index":800}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuView.js","uriBaseId":"%SRCROOT%","index":801}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/LessonContentView.js","uriBaseId":"%SRCROOT%","index":802}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/authbypass/js/bypass.js","uriBaseId":"%SRCROOT%","index":803}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/HintCollection.js","uriBaseId":"%SRCROOT%","index":804}},{"location":{"uri":"src/main/resources/lessons/sqlinjection/js/assignment13.js","uriBaseId":"%SRCROOT%","index":805}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/csrf/js/feedback.js","uriBaseId":"%SRCROOT%","index":806}},{"location":{"uri":"src/main/resources/webgoat/static/js/application.js","uriBaseId":"%SRCROOT%","index":807}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/main.js","uriBaseId":"%SRCROOT%","index":808}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/MenuCollection.js","uriBaseId":"%SRCROOT%","index":809}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/wysihtml5-0.3.0.js","uriBaseId":"%SRCROOT%","index":810}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/bootstrap3-wysihtml5.js","uriBaseId":"%SRCROOT%","index":811}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-2.1.4.min.js","uriBaseId":"%SRCROOT%","index":812}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/polyglot.min.js","uriBaseId":"%SRCROOT%","index":813}},{"location":{"uri":"src/main/resources/lessons/jwt/js/jwt-final.js","uriBaseId":"%SRCROOT%","index":814}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/HelpControlsView.js","uriBaseId":"%SRCROOT%","index":815}},{"location":{"uri":"src/main/resources/lessons/lessontemplate/js/idor.js","uriBaseId":"%SRCROOT%","index":816}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/require.min.js","uriBaseId":"%SRCROOT%","index":817}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HintModel.js","uriBaseId":"%SRCROOT%","index":818}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/ReportCardModel.js","uriBaseId":"%SRCROOT%","index":819}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/assignment4.js","uriBaseId":"%SRCROOT%","index":820}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/challenge8.js","uriBaseId":"%SRCROOT%","index":821}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/spoofcookie/js/handler.js","uriBaseId":"%SRCROOT%","index":822}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/MenuItemView.js","uriBaseId":"%SRCROOT%","index":823}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/underscore-min.js","uriBaseId":"%SRCROOT%","index":824}},{"location":{"uri":"src/main/resources/webgoat/static/js/search.js","uriBaseId":"%SRCROOT%","index":825}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonContentModel.js","uriBaseId":"%SRCROOT%","index":826}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/HintView.js","uriBaseId":"%SRCROOT%","index":827}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuItemView.js","uriBaseId":"%SRCROOT%","index":828}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-vuln.js","uriBaseId":"%SRCROOT%","index":829}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ScoreboardView.js","uriBaseId":"%SRCROOT%","index":830}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/sqlinjection/js/assignment13.js","uriBaseId":"%SRCROOT%","index":831}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/lessontemplate/js/idor.js","uriBaseId":"%SRCROOT%","index":832}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/HelpControlsView.js","uriBaseId":"%SRCROOT%","index":833}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/plugins/bootstrap-slider/js/bootstrap-slider.js","uriBaseId":"%SRCROOT%","index":834}},{"location":{"uri":"src/main/resources/lessons/xss/js/stored-xss.js","uriBaseId":"%SRCROOT%","index":835}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/UserAndInfoView.js","uriBaseId":"%SRCROOT%","index":836}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery.min.js","uriBaseId":"%SRCROOT%","index":837}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":838}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery/jquery-1.10.2.min.js","uriBaseId":"%SRCROOT%","index":839}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/text.js","uriBaseId":"%SRCROOT%","index":840}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/backbone-min.js","uriBaseId":"%SRCROOT%","index":841}},{"location":{"uri":"src/main/resources/webgoat/static/js/toggle.js","uriBaseId":"%SRCROOT%","index":842}},{"location":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/fileUpload.js","uriBaseId":"%SRCROOT%","index":843}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-base.js","uriBaseId":"%SRCROOT%","index":844}},{"location":{"uri":"src/main/resources/webgoat/static/js/jquery/jquery-ui-1.10.4.custom.min.js","uriBaseId":"%SRCROOT%","index":845}},{"location":{"uri":"src/main/resources/lessons/jwt/js/jwt-weak-keys.js","uriBaseId":"%SRCROOT%","index":846}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/HintCollection.js","uriBaseId":"%SRCROOT%","index":847}},{"location":{"uri":"src/main/resources/webgoat/static/plugins/bootstrap-wysihtml5/js/bootstrap3-wysihtml5.js","uriBaseId":"%SRCROOT%","index":848}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/goatConstants.js","uriBaseId":"%SRCROOT%","index":849}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/jwt/js/jwt-voting.js","uriBaseId":"%SRCROOT%","index":850}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-2.1.4.min.js","uriBaseId":"%SRCROOT%","index":851}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/view/ReportCardView.js","uriBaseId":"%SRCROOT%","index":852}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/LabelDebugModel.js","uriBaseId":"%SRCROOT%","index":853}},{"location":{"uri":"src/main/resources/lessons/challenges/js/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":854}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/scoreboardApp.js","uriBaseId":"%SRCROOT%","index":855}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/controller/LessonController.js","uriBaseId":"%SRCROOT%","index":856}},{"location":{"uri":"src/main/resources/lessons/sqlinjection/js/challenge.js","uriBaseId":"%SRCROOT%","index":857}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/jquery/jquery-ui-1.10.4.custom.min.js","uriBaseId":"%SRCROOT%","index":858}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/FlagsCollection.js","uriBaseId":"%SRCROOT%","index":859}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/model/LessonOverviewCollection.js","uriBaseId":"%SRCROOT%","index":860}},{"location":{"uri":"src/main/resources/lessons/xxe/js/xxe.js","uriBaseId":"%SRCROOT%","index":861}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/model/FlagModel.js","uriBaseId":"%SRCROOT%","index":862}},{"location":{"uri":"src/main/resources/lessons/passwordreset/js/password-reset-simple.js","uriBaseId":"%SRCROOT%","index":863}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ReportCardView.js","uriBaseId":"%SRCROOT%","index":864}},{"location":{"uri":"src/main/resources/webgoat/static/js/scoreboard.js","uriBaseId":"%SRCROOT%","index":865}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/bootstrap.min.js","uriBaseId":"%SRCROOT%","index":866}},{"location":{"uri":"src/main/resources/webgoat/static/js/goatApp/support/GoatUtils.js","uriBaseId":"%SRCROOT%","index":867}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/CustomGoat.js","uriBaseId":"%SRCROOT%","index":868}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/scoreboard.js","uriBaseId":"%SRCROOT%","index":869}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/modernizr.min.js","uriBaseId":"%SRCROOT%","index":870}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/mode-java.js","uriBaseId":"%SRCROOT%","index":871}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/ErrorNotificationView.js","uriBaseId":"%SRCROOT%","index":872}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/HintView.js","uriBaseId":"%SRCROOT%","index":873}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/xss/js/stored-xss.js","uriBaseId":"%SRCROOT%","index":874}},{"location":{"uri":"src-delomboked/src/main/resources/lessons/challenges/js/challenge6.js","uriBaseId":"%SRCROOT%","index":875}},{"location":{"uri":"src/main/resources/lessons/spoofcookie/js/handler.js","uriBaseId":"%SRCROOT%","index":876}},{"location":{"uri":"src/main/resources/webgoat/static/js/main.js","uriBaseId":"%SRCROOT%","index":877}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/application.js","uriBaseId":"%SRCROOT%","index":878}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/MenuButtonView.js","uriBaseId":"%SRCROOT%","index":879}},{"location":{"uri":"src/main/resources/lessons/xss/js/assignment3.js","uriBaseId":"%SRCROOT%","index":880}},{"location":{"uri":"src-delomboked/src/main/resources/webwolf/static/js/mail.js","uriBaseId":"%SRCROOT%","index":881}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/view/LessonContentView.js","uriBaseId":"%SRCROOT%","index":882}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/require.min.js","uriBaseId":"%SRCROOT%","index":883}},{"location":{"uri":"src/main/resources/webgoat/static/js/libs/jquery-vuln.js","uriBaseId":"%SRCROOT%","index":884}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/quiz.js","uriBaseId":"%SRCROOT%","index":885}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery-ui-1.10.4.js","uriBaseId":"%SRCROOT%","index":886}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/goatApp/support/goatAsyncErrorHandler.js","uriBaseId":"%SRCROOT%","index":887}},{"location":{"uri":"src-delomboked/src/main/resources/webgoat/static/js/libs/jquery.form.js","uriBaseId":"%SRCROOT%","index":888}},{"location":{"uri":"src/main/resources/webgoat/static/js/modernizr.min.js","uriBaseId":"%SRCROOT%","index":889}}],"results":[{"ruleId":"java/insecure-cookie","rule":{"id":"java/insecure-cookie","index":10,"toolComponent":{"index":18}},"message":{"text":"Cookie is added to response without the 'secure' flag being set."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":131,"startColumn":7,"endColumn":33}}}],"partialFingerprints":{"primaryLocationLineHash":"84a4c92c523d81a1:1","primaryLocationStartColumnFingerprint":"0"}},{"ruleId":"java/insecure-cookie","rule":{"id":"java/insecure-cookie","index":10,"toolComponent":{"index":18}},"message":{"text":"Cookie is added to response without the 'secure' flag being set."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":136,"startColumn":7,"endColumn":33}}}],"partialFingerprints":{"primaryLocationLineHash":"178a5d22f3f4ca47:1","primaryLocationStartColumnFingerprint":"0"}},{"ruleId":"java/insecure-cookie","rule":{"id":"java/insecure-cookie","index":10,"toolComponent":{"index":18}},"message":{"text":"Cookie is added to response without the 'secure' flag being set."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/spoofcookie/SpoofCookieAssignment.java","uriBaseId":"%SRCROOT%","index":1},"region":{"startLine":78,"startColumn":5,"endColumn":31}}}],"partialFingerprints":{"primaryLocationLineHash":"598c4a4ab35135b9:1","primaryLocationStartColumnFingerprint":"0"}},{"ruleId":"java/stack-trace-exposure","rule":{"id":"java/stack-trace-exposure","index":13,"toolComponent":{"index":18}},"message":{"text":"[Error information](1) can be exposed to an external user."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":2},"region":{"startLine":54,"startColumn":31,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"69b1bde9108b11cf:1","primaryLocationStartColumnFingerprint":"24"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AjaxAuthenticationEntryPoint.java","uriBaseId":"%SRCROOT%","index":2},"region":{"startLine":54,"startColumn":31,"endColumn":57}},"message":{"text":"Error information"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":3},"region":{"startLine":68,"startColumn":19,"endColumn":76}}}],"partialFingerprints":{"primaryLocationLineHash":"31eaf1239ab18658:1","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/it/java/org/owasp/webgoat/JWTLessonIntegrationTest.java","uriBaseId":"%SRCROOT%","index":3},"region":{"startLine":68,"startColumn":19,"endColumn":76}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4},"region":{"startLine":107,"startColumn":17,"endColumn":58}}}],"partialFingerprints":{"primaryLocationLineHash":"25e8034b7fe5b633:1","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4},"region":{"startLine":107,"startColumn":17,"endColumn":58}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4},"region":{"startLine":137,"startColumn":11,"endColumn":52}}}],"partialFingerprints":{"primaryLocationLineHash":"c1626ca7a4cc054e:1","primaryLocationStartColumnFingerprint":"0"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTRefreshEndpoint.java","uriBaseId":"%SRCROOT%","index":4},"region":{"startLine":137,"startColumn":11,"endColumn":52}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":155,"startColumn":19,"endColumn":60}}}],"partialFingerprints":{"primaryLocationLineHash":"55fa3c43091de850:1","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":155,"startColumn":19,"endColumn":60}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":180,"startColumn":19,"endColumn":60}}}],"partialFingerprints":{"primaryLocationLineHash":"55fa3c43091de850:2","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":180,"startColumn":19,"endColumn":60}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":203,"startColumn":19,"endColumn":60}}}],"partialFingerprints":{"primaryLocationLineHash":"55fa3c43091de850:3","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTVotesEndpoint.java","uriBaseId":"%SRCROOT%","index":0},"region":{"startLine":203,"startColumn":19,"endColumn":60}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5},"region":{"startLine":55,"startColumn":15,"endColumn":62}}}],"partialFingerprints":{"primaryLocationLineHash":"ea6a64ef5a45e8bd:1","primaryLocationStartColumnFingerprint":"10"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5},"region":{"startLine":55,"startColumn":15,"endColumn":62}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/missing-jwt-signature-check","rule":{"id":"java/missing-jwt-signature-check","index":17,"toolComponent":{"index":18}},"message":{"text":"This parses a [JWT signing key](1), but the signature is not verified."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5},"region":{"startLine":59,"startColumn":12,"endLine":65,"endColumn":8}}}],"partialFingerprints":{"primaryLocationLineHash":"43c8407c9464bbdd:1","primaryLocationStartColumnFingerprint":"6"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/test/java/org/owasp/webgoat/lessons/jwt/TokenTest.java","uriBaseId":"%SRCROOT%","index":5},"region":{"startLine":59,"startColumn":12,"endLine":65,"endColumn":8}},"message":{"text":"JWT signing key"}}]},{"ruleId":"java/path-injection","rule":{"id":"java/path-injection","index":24,"toolComponent":{"index":18}},"message":{"text":"This path depends on a [user-provided value](1).\nThis path depends on a [user-provided value](2).\nThis path depends on a [user-provided value](3).\nThis path depends on a [user-provided value](4)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":42,"startColumn":26,"endColumn":61}}}],"partialFingerprints":{"primaryLocationLineHash":"f9dec27c2aee101b:1","primaryLocationStartColumnFingerprint":"19"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7},"region":{"startLine":38,"startColumn":7,"endColumn":77}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7},"region":{"startLine":39,"startColumn":51,"endColumn":59}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7},"region":{"startLine":39,"startColumn":51,"endColumn":78}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7},"region":{"startLine":39,"startColumn":32,"endColumn":83}},"message":{"text":"...?...:... : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":31,"startColumn":54,"endColumn":69}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":42,"startColumn":52,"endColumn":60}},"message":{"text":"fullName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":35,"startColumn":7,"endColumn":70}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":36,"startColumn":32,"endColumn":36}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":36,"startColumn":32,"endColumn":58}},"message":{"text":"getOriginalFilename(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":31,"startColumn":54,"endColumn":69}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":42,"startColumn":52,"endColumn":60}},"message":{"text":"fullName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9},"region":{"startLine":38,"startColumn":7,"endColumn":74}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9},"region":{"startLine":39,"startColumn":32,"endColumn":40}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":31,"startColumn":54,"endColumn":69}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":42,"startColumn":52,"endColumn":60}},"message":{"text":"fullName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":36,"startColumn":32,"endColumn":58}},"message":{"text":"getOriginalFilename(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":31,"startColumn":54,"endColumn":69}},"message":{"text":"fullName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadBase.java","uriBaseId":"%SRCROOT%","index":6},"region":{"startLine":42,"startColumn":52,"endColumn":60}},"message":{"text":"fullName"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadFix.java","uriBaseId":"%SRCROOT%","index":7},"region":{"startLine":38,"startColumn":7,"endColumn":77}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":35,"startColumn":7,"endColumn":70}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUpload.java","uriBaseId":"%SRCROOT%","index":9},"region":{"startLine":38,"startColumn":7,"endColumn":74}},"message":{"text":"user-provided value"}},{"id":4,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRemoveUserInput.java","uriBaseId":"%SRCROOT%","index":8},"region":{"startLine":36,"startColumn":32,"endColumn":58}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/path-injection","rule":{"id":"java/path-injection","index":24,"toolComponent":{"index":18}},"message":{"text":"This path depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":93,"startColumn":25,"endColumn":112}}}],"partialFingerprints":{"primaryLocationLineHash":"45dae355bcc6e27f:1","primaryLocationStartColumnFingerprint":"17"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":90,"startColumn":16,"endColumn":42}},"message":{"text":"getParameter(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":93,"startColumn":56,"endColumn":111}},"message":{"text":"... + ..."}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":90,"startColumn":16,"endColumn":42}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/path-injection","rule":{"id":"java/path-injection","index":24,"toolComponent":{"index":18}},"message":{"text":"This path depends on a [user-provided value](1).\nThis path depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":66,"startColumn":29,"endColumn":80}}}],"partialFingerprints":{"primaryLocationLineHash":"f91d2819131b20b6:1","primaryLocationStartColumnFingerprint":"22"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":51,"startColumn":41,"endColumn":96}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":55,"startColumn":31,"endColumn":35}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":60,"startColumn":41,"endColumn":59}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":66,"startColumn":53,"endColumn":57}},"message":{"text":"file : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":66,"startColumn":53,"endColumn":79}},"message":{"text":"getOriginalFilename(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":51,"startColumn":41,"endColumn":96}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":66,"startColumn":53,"endColumn":79}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/path-injection","rule":{"id":"java/path-injection","index":24,"toolComponent":{"index":18}},"message":{"text":"This path depends on a [user-provided value](1).\nThis path depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":78,"startColumn":23,"endColumn":77}}}],"partialFingerprints":{"primaryLocationLineHash":"79bc479a53e1b374:1","primaryLocationStartColumnFingerprint":"18"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":78,"startColumn":48,"endColumn":54}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":78,"startColumn":48,"endColumn":76}},"message":{"text":"getOriginalFilename(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":78,"startColumn":48,"endColumn":76}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/path-injection","rule":{"id":"java/path-injection","index":24,"toolComponent":{"index":18}},"message":{"text":"This path depends on a [user-provided value](1).\nThis path depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":35,"endColumn":89}}}],"partialFingerprints":{"primaryLocationLineHash":"ef803e80edfe5b1e:1","primaryLocationStartColumnFingerprint":"30"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":66}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":88}},"message":{"text":"getOriginalFilename(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":88}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/zipslip","rule":{"id":"java/zipslip","index":25,"toolComponent":{"index":18}},"message":{"text":"Unsanitized archive entry, which may contain '..', is used in a [file system operation](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":73,"startColumn":53,"endColumn":64}}}],"partialFingerprints":{"primaryLocationLineHash":"a67d7aacb4287388:1","primaryLocationStartColumnFingerprint":"44"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":73,"startColumn":53,"endColumn":64}},"message":{"text":"getName(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":73,"startColumn":18,"endColumn":65}},"message":{"text":"new File(...) : File"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":75,"startColumn":24,"endColumn":25}},"message":{"text":"f : File"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":75,"startColumn":24,"endColumn":34}},"message":{"text":"toPath(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileZipSlip.java","uriBaseId":"%SRCROOT%","index":11},"region":{"startLine":75,"startColumn":24,"endColumn":34}},"message":{"text":"file system operation"}}]},{"ruleId":"java/xxe","rule":{"id":"java/xxe","index":37,"toolComponent":{"index":18}},"message":{"text":"XML parsing depends on a [user-provided value](1) without guarding against external entity expansion.\nXML parsing depends on a [user-provided value](2) without guarding against external entity expansion.\nXML parsing depends on a [user-provided value](3) without guarding against external entity expansion."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":41,"endColumn":62}}}],"partialFingerprints":{"primaryLocationLineHash":"1c93f3ad0a8f54:1","primaryLocationStartColumnFingerprint":"36"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14},"region":{"startLine":87,"startColumn":34,"endColumn":64}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14},"region":{"startLine":96,"startColumn":43,"endColumn":53}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":96,"startColumn":30,"endColumn":40}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":58,"endColumn":61}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":41,"endColumn":62}},"message":{"text":"new StringReader(...)"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15},"region":{"startLine":62,"startColumn":7,"endColumn":37}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15},"region":{"startLine":75,"startColumn":45,"endColumn":55}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":96,"startColumn":30,"endColumn":40}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":58,"endColumn":61}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":41,"endColumn":62}},"message":{"text":"new StringReader(...)"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16},"region":{"startLine":73,"startColumn":68,"endColumn":98}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16},"region":{"startLine":76,"startColumn":39,"endColumn":49}},"message":{"text":"commentStr : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":96,"startColumn":30,"endColumn":40}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":58,"endColumn":61}},"message":{"text":"xml : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/CommentsCache.java","uriBaseId":"%SRCROOT%","index":13},"region":{"startLine":105,"startColumn":41,"endColumn":62}},"message":{"text":"new StringReader(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/BlindSendFileAssignment.java","uriBaseId":"%SRCROOT%","index":14},"region":{"startLine":87,"startColumn":34,"endColumn":64}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/ContentTypeAssignment.java","uriBaseId":"%SRCROOT%","index":15},"region":{"startLine":62,"startColumn":7,"endColumn":37}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xxe/SimpleXXE.java","uriBaseId":"%SRCROOT%","index":16},"region":{"startLine":73,"startColumn":68,"endColumn":98}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/unsafe-deserialization","rule":{"id":"java/unsafe-deserialization","index":41,"toolComponent":{"index":18}},"message":{"text":"Unsafe deserialization depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":60,"startColumn":18,"endColumn":34}}}],"partialFingerprints":{"primaryLocationLineHash":"6c850a3d150d9bb4:1","primaryLocationStartColumnFingerprint":"11"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":49,"startColumn":33,"endColumn":59}},"message":{"text":"token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":21}},"message":{"text":"token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":57}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":58,"startColumn":83,"endColumn":91}},"message":{"text":"b64token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":58,"startColumn":56,"endColumn":92}},"message":{"text":"decode(...) : byte[]"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":60,"startColumn":18,"endColumn":21}},"message":{"text":"ois"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":49,"startColumn":33,"endColumn":59}},"message":{"text":"token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":21}},"message":{"text":"token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":55,"startColumn":16,"endColumn":57}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":58,"startColumn":83,"endColumn":91}},"message":{"text":"b64token : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":58,"startColumn":56,"endColumn":92}},"message":{"text":"decode(...) : byte[]"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":58,"startColumn":31,"endColumn":93}},"message":{"text":"new ByteArrayInputStream(...) : ByteArrayInputStream"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":60,"startColumn":18,"endColumn":21}},"message":{"text":"ois"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/deserialization/InsecureDeserializationTask.java","uriBaseId":"%SRCROOT%","index":17},"region":{"startLine":49,"startColumn":33,"endColumn":59}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/unsafe-deserialization","rule":{"id":"java/unsafe-deserialization","index":41,"toolComponent":{"index":18}},"message":{"text":"Unsafe deserialization depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":57,"startColumn":27,"endColumn":51}}}],"partialFingerprints":{"primaryLocationLineHash":"350c8895428d29a7:1","primaryLocationStartColumnFingerprint":"20"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":40,"startColumn":47,"endColumn":75}},"message":{"text":"payload : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":57,"startColumn":43,"endColumn":50}},"message":{"text":"payload"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":40,"startColumn":47,"endColumn":75}},"message":{"text":"payload : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endColumn":20}},"message":{"text":"payload : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endLine":51,"endColumn":34}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endLine":52,"endColumn":35}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endLine":53,"endColumn":35}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endLine":54,"endColumn":36}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":50,"startColumn":13,"endLine":55,"endColumn":36}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":57,"startColumn":43,"endColumn":50}},"message":{"text":"payload"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/vulnerablecomponents/VulnerableComponentsLesson.java","uriBaseId":"%SRCROOT%","index":18},"region":{"startLine":40,"startColumn":47,"endColumn":75}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/polynomial-redos","rule":{"id":"java/polynomial-redos","index":45,"toolComponent":{"index":18}},"message":{"text":"This [regular expression](1) that depends on a [user-provided value](2) may run slow on strings with many repetitions of ' '.\nThis [regular expression](3) that depends on a [user-provided value](2) may run slow on strings starting with 'union' and with many repetitions of 'union('.\nThis [regular expression](1) that depends on a [user-provided value](4) may run slow on strings with many repetitions of ' '.\nThis [regular expression](3) that depends on a [user-provided value](4) may run slow on strings starting with 'union' and with many repetitions of 'union('.\nThis [regular expression](1) that depends on a [user-provided value](5) may run slow on strings with many repetitions of ' '.\nThis [regular expression](3) that depends on a [user-provided value](5) may run slow on strings starting with 'union' and with many repetitions of 'union('."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}}}],"partialFingerprints":{"primaryLocationLineHash":"f222904dc5afe3ce:1","primaryLocationStartColumnFingerprint":"5"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":56,"startColumn":33,"endColumn":81}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":57,"startColumn":28,"endColumn":34}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":56,"startColumn":33,"endColumn":81}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":57,"startColumn":28,"endColumn":34}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":47,"startColumn":30,"endColumn":93}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":51,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":47,"startColumn":30,"endColumn":93}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":51,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":52,"startColumn":7,"endColumn":82}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":20}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":34}},"message":{"text":"toUpperCase(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":54}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":76}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":57,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":52,"startColumn":7,"endColumn":82}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":20}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":34}},"message":{"text":"toUpperCase(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":54}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":76}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":57,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":12,"endColumn":23}},"message":{"text":"accountName"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":50,"endColumn":54}},"message":{"text":"regular expression"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":56,"startColumn":33,"endColumn":81}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":68,"startColumn":61,"endColumn":63}},"message":{"text":"regular expression"}},{"id":4,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":47,"startColumn":30,"endColumn":93}},"message":{"text":"user-provided value"}},{"id":5,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":52,"startColumn":7,"endColumn":82}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/polynomial-redos","rule":{"id":"java/polynomial-redos","index":45,"toolComponent":{"index":18}},"message":{"text":"This [regular expression](1) that depends on a [user-provided value](2) may run slow on strings starting with '<' and with many repetitions of '<'."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22},"region":{"startLine":63,"startColumn":16,"endColumn":22}}}],"partialFingerprints":{"primaryLocationLineHash":"c108af4381cebe6f:1","primaryLocationStartColumnFingerprint":"9"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22},"region":{"startLine":59,"startColumn":33,"endColumn":60}},"message":{"text":"editor : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22},"region":{"startLine":63,"startColumn":16,"endColumn":22}},"message":{"text":"editor"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22},"region":{"startLine":63,"startColumn":38,"endColumn":41}},"message":{"text":"regular expression"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlInjectionLesson10b.java","uriBaseId":"%SRCROOT%","index":22},"region":{"startLine":59,"startColumn":33,"endColumn":60}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/polynomial-redos","rule":{"id":"java/polynomial-redos","index":45,"toolComponent":{"index":18}},"message":{"text":"This [regular expression](1) that depends on a [user-provided value](2) may run slow on strings starting with '' and with many repetitions of ')'."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":63,"startColumn":26,"endColumn":32}}}],"partialFingerprints":{"primaryLocationLineHash":"113b34bd21123106:1","primaryLocationStartColumnFingerprint":"21"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":61,"startColumn":7,"endColumn":34}},"message":{"text":"field2 : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":63,"startColumn":26,"endColumn":32}},"message":{"text":"field2"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":61,"startColumn":7,"endColumn":34}},"message":{"text":"field2 : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":63,"startColumn":26,"endColumn":32}},"message":{"text":"field2"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":49,"startColumn":50,"endColumn":52}},"message":{"text":"regular expression"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":61,"startColumn":7,"endColumn":34}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":49,"startColumn":66,"endColumn":68}},"message":{"text":"regular expression"}}]},{"ruleId":"java/polynomial-redos","rule":{"id":"java/polynomial-redos","index":45,"toolComponent":{"index":18}},"message":{"text":"This [regular expression](1) that depends on a [user-provided value](2) may run slow on strings starting with '' and with many repetitions of ')'."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":85,"startColumn":26,"endColumn":32}}}],"partialFingerprints":{"primaryLocationLineHash":"de4f1e66fe5d59eb:1","primaryLocationStartColumnFingerprint":"21"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":60,"startColumn":7,"endColumn":34}},"message":{"text":"field1 : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":85,"startColumn":26,"endColumn":32}},"message":{"text":"field1"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":60,"startColumn":7,"endColumn":34}},"message":{"text":"field1 : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":85,"startColumn":26,"endColumn":32}},"message":{"text":"field1"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":49,"startColumn":50,"endColumn":52}},"message":{"text":"regular expression"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":60,"startColumn":7,"endColumn":34}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/xss/CrossSiteScriptingLesson5a.java","uriBaseId":"%SRCROOT%","index":23},"region":{"startLine":49,"startColumn":66,"endColumn":68}},"message":{"text":"regular expression"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":26,"endColumn":97}}}],"partialFingerprints":{"primaryLocationLineHash":"c375853e645b5747:1","primaryLocationStartColumnFingerprint":"21"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":38,"startColumn":31,"endColumn":83}},"message":{"text":"userForm : UserForm"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":44,"startColumn":25,"endColumn":47}},"message":{"text":"getUsername(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":39,"startColumn":23,"endColumn":38}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":59,"endColumn":67}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":32,"startColumn":22,"endColumn":37}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":33,"startColumn":10,"endColumn":18}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":36,"startColumn":22,"endColumn":37}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":37,"startColumn":21,"endColumn":29}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":37,"startColumn":5,"endColumn":9}},"message":{"text":"this [post update] [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":33,"startColumn":5,"endColumn":41}},"message":{"text":"this [post update] [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":43,"endColumn":78}},"message":{"text":"new WebGoatUser(...) [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":23,"endColumn":79}},"message":{"text":"save(...) [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":47,"startColumn":28,"endColumn":39}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":51,"startColumn":37,"endColumn":60}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":47,"endColumn":58}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":55,"startColumn":17,"endColumn":28}},"message":{"text":"parameter this [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":56,"startColumn":12,"endColumn":16}},"message":{"text":"this [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":56,"startColumn":12,"endColumn":25}},"message":{"text":"this.username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":47,"endColumn":72}},"message":{"text":"getUsername(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":26,"endColumn":97}},"message":{"text":"... + ..."}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":38,"startColumn":31,"endColumn":83}},"message":{"text":"userForm : UserForm"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":44,"startColumn":25,"endColumn":33}},"message":{"text":"userForm : UserForm"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":27},"region":{"startLine":30,"startColumn":18,"endColumn":29}},"message":{"text":"parameter this : UserForm"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserForm.java","uriBaseId":"%SRCROOT%","index":27},"region":{"startLine":30,"startColumn":45,"endColumn":58}},"message":{"text":"this.username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":44,"startColumn":25,"endColumn":47}},"message":{"text":"getUsername(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":39,"startColumn":23,"endColumn":38}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":59,"endColumn":67}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":32,"startColumn":22,"endColumn":37}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":33,"startColumn":10,"endColumn":18}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":36,"startColumn":22,"endColumn":37}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":37,"startColumn":21,"endColumn":29}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":37,"startColumn":5,"endColumn":9}},"message":{"text":"this [post update] [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":33,"startColumn":5,"endColumn":41}},"message":{"text":"this [post update] [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":43,"endColumn":78}},"message":{"text":"new WebGoatUser(...) [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":42,"startColumn":23,"endColumn":79}},"message":{"text":"save(...) [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":47,"startColumn":28,"endColumn":39}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":51,"startColumn":37,"endColumn":60}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":47,"endColumn":58}},"message":{"text":"webGoatUser [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":55,"startColumn":17,"endColumn":28}},"message":{"text":"parameter this [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":56,"startColumn":12,"endColumn":16}},"message":{"text":"this [username] : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/WebGoatUser.java","uriBaseId":"%SRCROOT%","index":26},"region":{"startLine":56,"startColumn":12,"endColumn":25}},"message":{"text":"this.username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":47,"endColumn":72}},"message":{"text":"getUsername(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/UserService.java","uriBaseId":"%SRCROOT%","index":24},"region":{"startLine":52,"startColumn":26,"endColumn":97}},"message":{"text":"... + ..."}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/users/RegistrationController.java","uriBaseId":"%SRCROOT%","index":25},"region":{"startLine":38,"startColumn":31,"endColumn":83}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":64,"startColumn":66,"endColumn":188}}}],"partialFingerprints":{"primaryLocationLineHash":"1a0c1f7d5956e4f8:1","primaryLocationStartColumnFingerprint":"58"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":50,"startColumn":30,"endColumn":65}},"message":{"text":"username_login : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":64,"startColumn":66,"endColumn":188}},"message":{"text":"... + ..."}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":50,"startColumn":67,"endColumn":102}},"message":{"text":"password_login : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":64,"startColumn":66,"endColumn":188}},"message":{"text":"... + ..."}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":50,"startColumn":30,"endColumn":65}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge5/Assignment5.java","uriBaseId":"%SRCROOT%","index":28},"region":{"startLine":50,"startColumn":67,"endColumn":102}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29},"region":{"startLine":69,"startColumn":54,"endColumn":68}}}],"partialFingerprints":{"primaryLocationLineHash":"f774d9651c9c378c:1","primaryLocationStartColumnFingerprint":"45"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29},"region":{"startLine":60,"startColumn":40,"endColumn":73}},"message":{"text":"username_reg : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29},"region":{"startLine":69,"startColumn":54,"endColumn":68}},"message":{"text":"checkUserQuery"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionChallenge.java","uriBaseId":"%SRCROOT%","index":29},"region":{"startLine":60,"startColumn":40,"endColumn":73}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2).\nThis query depends on a [user-provided value](3)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":74,"startColumn":52,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"5e5ec10e89273e98:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":56,"startColumn":33,"endColumn":81}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":57,"startColumn":28,"endColumn":34}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":74,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":47,"startColumn":30,"endColumn":93}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":51,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":74,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":52,"startColumn":7,"endColumn":82}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":20}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":34}},"message":{"text":"toUpperCase(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":54}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":53,"startColumn":14,"endColumn":76}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":57,"startColumn":58,"endColumn":64}},"message":{"text":"userId : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":62,"startColumn":39,"endColumn":57}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":74,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/advanced/SqlInjectionLesson6a.java","uriBaseId":"%SRCROOT%","index":19},"region":{"startLine":56,"startColumn":33,"endColumn":81}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidation.java","uriBaseId":"%SRCROOT%","index":20},"region":{"startLine":47,"startColumn":30,"endColumn":93}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/SqlOnlyInputValidationOnKeywords.java","uriBaseId":"%SRCROOT%","index":21},"region":{"startLine":52,"startColumn":7,"endColumn":82}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":71,"startColumn":52,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"983b99783dada75a:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":58,"startColumn":33,"endColumn":67}},"message":{"text":"action_string : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":59,"startColumn":40,"endColumn":53}},"message":{"text":"action_string : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":62,"startColumn":54,"endColumn":67}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":71,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson10.java","uriBaseId":"%SRCROOT%","index":30},"region":{"startLine":58,"startColumn":33,"endColumn":67}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":65,"startColumn":50,"endColumn":55}}}],"partialFingerprints":{"primaryLocationLineHash":"67dc1330c3a571f7:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":58,"startColumn":33,"endColumn":59}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":59,"startColumn":28,"endColumn":33}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":62,"startColumn":42,"endColumn":54}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":65,"startColumn":50,"endColumn":55}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson2.java","uriBaseId":"%SRCROOT%","index":31},"region":{"startLine":58,"startColumn":33,"endColumn":59}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":62,"startColumn":33,"endColumn":38}}}],"partialFingerprints":{"primaryLocationLineHash":"70e3ff06f7af756a:1","primaryLocationStartColumnFingerprint":"24"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":54,"startColumn":33,"endColumn":59}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":55,"startColumn":28,"endColumn":33}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":58,"startColumn":42,"endColumn":54}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":62,"startColumn":33,"endColumn":38}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson4.java","uriBaseId":"%SRCROOT%","index":32},"region":{"startLine":54,"startColumn":33,"endColumn":59}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":80,"startColumn":32,"endColumn":37}}}],"partialFingerprints":{"primaryLocationLineHash":"31dcbb8961cbab44:1","primaryLocationStartColumnFingerprint":"23"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":70,"startColumn":33,"endColumn":45}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":72,"startColumn":28,"endColumn":33}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":75,"startColumn":42,"endColumn":54}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":80,"startColumn":32,"endColumn":37}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5.java","uriBaseId":"%SRCROOT%","index":33},"region":{"startLine":70,"startColumn":33,"endColumn":45}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":63,"startColumn":33,"endColumn":38}}}],"partialFingerprints":{"primaryLocationLineHash":"d339c823409c314d:1","primaryLocationStartColumnFingerprint":"24"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":53,"startColumn":33,"endColumn":59}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":54,"startColumn":28,"endColumn":33}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":57,"startColumn":42,"endColumn":54}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":63,"startColumn":33,"endColumn":38}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson3.java","uriBaseId":"%SRCROOT%","index":34},"region":{"startLine":53,"startColumn":33,"endColumn":59}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2).\nThis query depends on a [user-provided value](3)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":67,"startColumn":52,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"2b95e3c48ba92cd0:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":7,"endColumn":35}},"message":{"text":"account : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":56,"startColumn":28,"endColumn":70}},"message":{"text":"... + ... : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":59,"startColumn":42,"endColumn":60}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":67,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":37,"endColumn":66}},"message":{"text":"operator : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":56,"startColumn":28,"endColumn":70}},"message":{"text":"... + ... : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":59,"startColumn":42,"endColumn":60}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":67,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":68,"endColumn":98}},"message":{"text":"injection : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":56,"startColumn":28,"endColumn":70}},"message":{"text":"... + ... : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":59,"startColumn":42,"endColumn":60}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":67,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":7,"endColumn":35}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":37,"endColumn":66}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5a.java","uriBaseId":"%SRCROOT%","index":35},"region":{"startLine":55,"startColumn":68,"endColumn":98}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":66,"startColumn":15,"endColumn":26}}}],"partialFingerprints":{"primaryLocationLineHash":"ba7f4a519474e8ae:1","primaryLocationStartColumnFingerprint":"0"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":56,"startColumn":7,"endColumn":34}},"message":{"text":"userid : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":58,"startColumn":41,"endColumn":47}},"message":{"text":"userid : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":61,"startColumn":62,"endColumn":80}},"message":{"text":"accountName : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":66,"startColumn":15,"endColumn":26}},"message":{"text":"queryString"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson5b.java","uriBaseId":"%SRCROOT%","index":36},"region":{"startLine":56,"startColumn":7,"endColumn":34}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":78,"startColumn":52,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"615295edb2bddc7:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":33,"endColumn":58}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":60,"startColumn":43,"endColumn":47}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":63,"startColumn":57,"endColumn":68}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":78,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":60,"endColumn":89}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":60,"startColumn":49,"endColumn":57}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":63,"startColumn":70,"endColumn":85}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":78,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":33,"endColumn":58}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":60,"endColumn":89}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":76,"startColumn":52,"endColumn":57}}}],"partialFingerprints":{"primaryLocationLineHash":"c3579bd895056390:1","primaryLocationStartColumnFingerprint":"43"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":33,"endColumn":58}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":61,"startColumn":37,"endColumn":41}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":64,"startColumn":51,"endColumn":62}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":76,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":60,"endColumn":89}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":61,"startColumn":43,"endColumn":51}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":64,"startColumn":64,"endColumn":79}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":76,"startColumn":52,"endColumn":57}},"message":{"text":"query"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":33,"endColumn":58}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":60,"endColumn":89}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1).\nThis query depends on a [user-provided value](2).\nThis query depends on a [user-provided value](3).\nThis query depends on a [user-provided value](4)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":158,"startColumn":31,"endColumn":39}}}],"partialFingerprints":{"primaryLocationLineHash":"86ab9021267dc726:1","primaryLocationStartColumnFingerprint":"24"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":33,"endColumn":58}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":60,"startColumn":43,"endColumn":47}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":63,"startColumn":57,"endColumn":68}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":77,"startColumn":25,"endColumn":30}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":147,"startColumn":49,"endColumn":62}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":20}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":158,"startColumn":31,"endColumn":39}},"message":{"text":"logQuery"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":60,"endColumn":89}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":60,"startColumn":49,"endColumn":57}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":63,"startColumn":70,"endColumn":85}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":77,"startColumn":25,"endColumn":30}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":147,"startColumn":49,"endColumn":62}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":20}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":158,"startColumn":31,"endColumn":39}},"message":{"text":"logQuery"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":33,"endColumn":58}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":61,"startColumn":37,"endColumn":41}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":64,"startColumn":51,"endColumn":62}},"message":{"text":"name : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":75,"startColumn":45,"endColumn":50}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":147,"startColumn":49,"endColumn":62}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":20}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":158,"startColumn":31,"endColumn":39}},"message":{"text":"logQuery"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":60,"endColumn":89}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":61,"startColumn":43,"endColumn":51}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":64,"startColumn":64,"endColumn":79}},"message":{"text":"auth_tan : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":75,"startColumn":45,"endColumn":50}},"message":{"text":"query : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":147,"startColumn":49,"endColumn":62}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":20}},"message":{"text":"action : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":148,"startColumn":14,"endColumn":39}},"message":{"text":"replace(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":158,"startColumn":31,"endColumn":39}},"message":{"text":"logQuery"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":33,"endColumn":58}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson8.java","uriBaseId":"%SRCROOT%","index":37},"region":{"startLine":59,"startColumn":60,"endColumn":89}},"message":{"text":"user-provided value"}},{"id":3,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":33,"endColumn":58}},"message":{"text":"user-provided value"}},{"id":4,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/introduction/SqlInjectionLesson9.java","uriBaseId":"%SRCROOT%","index":38},"region":{"startLine":60,"startColumn":60,"endColumn":89}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sql-injection","rule":{"id":"java/sql-injection","index":47,"toolComponent":{"index":18}},"message":{"text":"This query depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39},"region":{"startLine":75,"startColumn":57,"endColumn":178}}}],"partialFingerprints":{"primaryLocationLineHash":"7cc0e97ef836b73a:1","primaryLocationStartColumnFingerprint":"49"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39},"region":{"startLine":67,"startColumn":28,"endColumn":55}},"message":{"text":"column : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39},"region":{"startLine":75,"startColumn":57,"endColumn":178}},"message":{"text":"... + ..."}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/sqlinjection/mitigation/Servers.java","uriBaseId":"%SRCROOT%","index":39},"region":{"startLine":67,"startColumn":28,"endColumn":55}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/ssrf","rule":{"id":"java/ssrf","index":49,"toolComponent":{"index":18}},"message":{"text":"Potential server-side request forgery due to a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":51,"startColumn":29,"endColumn":41}}}],"partialFingerprints":{"primaryLocationLineHash":"6be77af73d304fec:1","primaryLocationStartColumnFingerprint":"22"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":44,"startColumn":33,"endColumn":57}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":45,"startColumn":20,"endColumn":23}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":48,"startColumn":34,"endColumn":44}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":51,"startColumn":29,"endColumn":41}},"message":{"text":"new URL(...)"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":44,"startColumn":33,"endColumn":57}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":45,"startColumn":20,"endColumn":23}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":48,"startColumn":34,"endColumn":44}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":51,"startColumn":37,"endColumn":40}},"message":{"text":"url : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":51,"startColumn":29,"endColumn":41}},"message":{"text":"new URL(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/ssrf/SSRFTask2.java","uriBaseId":"%SRCROOT%","index":40},"region":{"startLine":44,"startColumn":33,"endColumn":57}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/spring-disabled-csrf-protection","rule":{"id":"java/spring-disabled-csrf-protection","index":56,"toolComponent":{"index":18}},"message":{"text":"CSRF vulnerability due to protection being disabled."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":41},"region":{"startLine":80,"startColumn":5,"endColumn":36}}}],"partialFingerprints":{"primaryLocationLineHash":"5a3b59dcf16b392d:1","primaryLocationStartColumnFingerprint":"0"}},{"ruleId":"java/spring-disabled-csrf-protection","rule":{"id":"java/spring-disabled-csrf-protection","index":56,"toolComponent":{"index":18}},"message":{"text":"CSRF vulnerability due to protection being disabled."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/WebSecurityConfig.java","uriBaseId":"%SRCROOT%","index":42},"region":{"startLine":60,"startColumn":5,"endColumn":36}}}],"partialFingerprints":{"primaryLocationLineHash":"25bab9a440f2318b:1","primaryLocationStartColumnFingerprint":"0"}},{"ruleId":"java/weak-cryptographic-algorithm","rule":{"id":"java/weak-cryptographic-algorithm","index":57,"toolComponent":{"index":18}},"message":{"text":"Cryptographic algorithm [MD5](1) is weak and should not be used."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":55,"startColumn":26,"endColumn":58}}}],"partialFingerprints":{"primaryLocationLineHash":"99e2d6034d1626c0:1","primaryLocationStartColumnFingerprint":"19"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":55,"startColumn":52,"endColumn":57}},"message":{"text":"MD5"}}]},{"ruleId":"java/log-injection","rule":{"id":"java/log-injection","index":75,"toolComponent":{"index":18}},"message":{"text":"This log entry depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44},"region":{"startLine":164,"startColumn":40,"endColumn":50}}}],"partialFingerprints":{"primaryLocationLineHash":"6e872ef1bcf9d5da:1","primaryLocationStartColumnFingerprint":"31"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44},"region":{"startLine":162,"startColumn":27,"endColumn":76}},"message":{"text":"getHeader(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44},"region":{"startLine":164,"startColumn":40,"endColumn":50}},"message":{"text":"langHeader"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/container/AsciiDoctorTemplateResolver.java","uriBaseId":"%SRCROOT%","index":44},"region":{"startLine":162,"startColumn":27,"endColumn":76}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/log-injection","rule":{"id":"java/log-injection","index":75,"toolComponent":{"index":18}},"message":{"text":"This log entry depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45},"region":{"startLine":81,"startColumn":40,"endColumn":47}}}],"partialFingerprints":{"primaryLocationLineHash":"c60f6a54a39c911a:1","primaryLocationStartColumnFingerprint":"33"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45},"region":{"startLine":73,"startColumn":62,"endColumn":90}},"message":{"text":"modulus : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45},"region":{"startLine":81,"startColumn":40,"endColumn":47}},"message":{"text":"modulus"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SigningAssignment.java","uriBaseId":"%SRCROOT%","index":45},"region":{"startLine":73,"startColumn":62,"endColumn":90}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/log-injection","rule":{"id":"java/log-injection","index":75,"toolComponent":{"index":18}},"message":{"text":"This log entry depends on a [user-provided value](1).\nThis log entry depends on a [user-provided value](2)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":35,"endColumn":89}}}],"partialFingerprints":{"primaryLocationLineHash":"ef803e80edfe5b1e:1","primaryLocationStartColumnFingerprint":"30"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":66}},"message":{"text":"myFile : MultipartFile"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":88}},"message":{"text":"getOriginalFilename(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":35,"endColumn":89}},"message":{"text":"new File(...)"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":88}},"message":{"text":"getOriginalFilename(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":35,"endColumn":89}},"message":{"text":"new File(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":74,"startColumn":34,"endColumn":76}},"message":{"text":"user-provided value"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/FileServer.java","uriBaseId":"%SRCROOT%","index":12},"region":{"startLine":79,"startColumn":60,"endColumn":88}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/log-injection","rule":{"id":"java/log-injection","index":75,"toolComponent":{"index":18}},"message":{"text":"This log entry depends on a [user-provided value](1)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":46},"region":{"startLine":48,"startColumn":45,"endColumn":68}}}],"partialFingerprints":{"primaryLocationLineHash":"27ba78a11a332dd5:1","primaryLocationStartColumnFingerprint":"38"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/webwolf/requests/LandingPage.java","uriBaseId":"%SRCROOT%","index":46},"region":{"startLine":48,"startColumn":45,"endColumn":68}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/sensitive-log","rule":{"id":"java/sensitive-log","index":76,"toolComponent":{"index":18}},"message":{"text":"This [potentially sensitive information](1) is written to a log file."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47},"region":{"startLine":50,"startColumn":9,"endColumn":86}}}],"partialFingerprints":{"primaryLocationLineHash":"fb9ac546c80284d7:1","primaryLocationStartColumnFingerprint":"0"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47},"region":{"startLine":50,"startColumn":44,"endColumn":52}},"message":{"text":"password : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47},"region":{"startLine":50,"startColumn":44,"endColumn":85}},"message":{"text":"getBytes(...) : byte[]"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47},"region":{"startLine":50,"startColumn":9,"endColumn":86}},"message":{"text":"encodeToString(...)"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/logging/LogBleedingTask.java","uriBaseId":"%SRCROOT%","index":47},"region":{"startLine":50,"startColumn":44,"endColumn":52}},"message":{"text":"potentially sensitive information"}}]},{"ruleId":"java/sensitive-log","rule":{"id":"java/sensitive-log","index":76,"toolComponent":{"index":18}},"message":{"text":"This [potentially sensitive information](1) is written to a log file."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":68,"startColumn":50,"endColumn":65}}}],"partialFingerprints":{"primaryLocationLineHash":"7ccb022cc5fb1739:1","primaryLocationStartColumnFingerprint":"43"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/pathtraversal/ProfileUploadRetrieval.java","uriBaseId":"%SRCROOT%","index":10},"region":{"startLine":68,"startColumn":50,"endColumn":65}},"message":{"text":"potentially sensitive information"}}]},{"ruleId":"java/tainted-arithmetic","rule":{"id":"java/tainted-arithmetic","index":86,"toolComponent":{"index":18}},"message":{"text":"This arithmetic expression depends on a [user-provided value](1), potentially causing an overflow."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":283,"startColumn":10,"endColumn":25}}}],"partialFingerprints":{"primaryLocationLineHash":"ff289147dde00d14:1","primaryLocationStartColumnFingerprint":"5"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49},"region":{"startLine":75,"startColumn":46,"endColumn":72}},"message":{"text":"email : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49},"region":{"startLine":77,"startColumn":25,"endColumn":30}},"message":{"text":"email : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49},"region":{"startLine":77,"startColumn":25,"endColumn":63}},"message":{"text":"substring(...) : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49},"region":{"startLine":91,"startColumn":207,"endColumn":215}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":50},"region":{"startLine":13,"startColumn":37,"endColumn":52}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/PasswordResetLink.java","uriBaseId":"%SRCROOT%","index":50},"region":{"startLine":19,"startColumn":81,"endColumn":89}},"message":{"text":"username : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":207,"startColumn":38,"endColumn":46}},"message":{"text":"s : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":209,"startColumn":16,"endColumn":17}},"message":{"text":"s : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":371,"startColumn":22,"endColumn":30}},"message":{"text":"s : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":372,"startColumn":12,"endColumn":13}},"message":{"text":"s : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":372,"startColumn":12,"endColumn":24}},"message":{"text":"getBytes(...) : byte[]"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":348,"startColumn":22,"endColumn":35}},"message":{"text":"buffer : byte[]"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":349,"startColumn":23,"endColumn":36}},"message":{"text":"buffer.length : Number"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":325,"startColumn":49,"endColumn":59}},"message":{"text":"length : Number"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":326,"startColumn":42,"endColumn":48}},"message":{"text":"length : Number"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":278,"startColumn":66,"endColumn":76}},"message":{"text":"length : Number"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java","uriBaseId":"%SRCROOT%","index":48},"region":{"startLine":283,"startColumn":10,"endColumn":16}},"message":{"text":"length"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/Assignment7.java","uriBaseId":"%SRCROOT%","index":49},"region":{"startLine":75,"startColumn":46,"endColumn":72}},"message":{"text":"user-provided value"}}]},{"ruleId":"java/concatenated-sql-query","rule":{"id":"java/concatenated-sql-query","index":92,"toolComponent":{"index":18}},"message":{"text":"Query built by concatenation with [this expression](1), which may be untrusted."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":51},"region":{"startLine":90,"startColumn":39,"endColumn":90}}}],"partialFingerprints":{"primaryLocationLineHash":"b977808836279b6e:1","primaryLocationStartColumnFingerprint":"0"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/jwt/JWTFinalEndpoint.java","uriBaseId":"%SRCROOT%","index":51},"region":{"startLine":90,"startColumn":81,"endColumn":84}},"message":{"text":"this expression"}}]},{"ruleId":"java/potentially-weak-cryptographic-algorithm","rule":{"id":"java/potentially-weak-cryptographic-algorithm","index":95,"toolComponent":{"index":18}},"message":{"text":"Cryptographic algorithm [SHA-256](1) may not be secure, consider using a different algorithm.\nCryptographic algorithm [SHA-256](2) may not be secure, consider using a different algorithm."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":100,"startColumn":24,"endColumn":60}}}],"partialFingerprints":{"primaryLocationLineHash":"2b5742fe12aaef84:1","primaryLocationStartColumnFingerprint":"19"},"codeFlows":[{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":72,"startColumn":32,"endColumn":41}},"message":{"text":"\"SHA-256\" : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":99,"startColumn":47,"endColumn":63}},"message":{"text":"algorithm : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":100,"startColumn":50,"endColumn":59}},"message":{"text":"algorithm"}}}]}]},{"threadFlows":[{"locations":[{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":52},"region":{"startLine":49,"startColumn":52,"endColumn":61}},"message":{"text":"\"SHA-256\" : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":99,"startColumn":47,"endColumn":63}},"message":{"text":"algorithm : String"}}},{"location":{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":100,"startColumn":50,"endColumn":59}},"message":{"text":"algorithm"}}}]}]}],"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/HashingAssignment.java","uriBaseId":"%SRCROOT%","index":43},"region":{"startLine":72,"startColumn":32,"endColumn":41}},"message":{"text":"SHA-256"}},{"id":2,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/cryptography/SecureDefaultsAssignment.java","uriBaseId":"%SRCROOT%","index":52},"region":{"startLine":49,"startColumn":52,"endColumn":61}},"message":{"text":"SHA-256"}}]},{"ruleId":"java/potentially-weak-cryptographic-algorithm","rule":{"id":"java/potentially-weak-cryptographic-algorithm","index":95,"toolComponent":{"index":18}},"message":{"text":"Cryptographic algorithm [SHA-256](1) may not be secure, consider using a different algorithm."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":53},"region":{"startLine":55,"startColumn":24,"endColumn":60}}}],"partialFingerprints":{"primaryLocationLineHash":"555233fa65523009:1","primaryLocationStartColumnFingerprint":"19"},"relatedLocations":[{"id":1,"physicalLocation":{"artifactLocation":{"uri":"src/main/java/org/owasp/webgoat/lessons/missingac/DisplayUser.java","uriBaseId":"%SRCROOT%","index":53},"region":{"startLine":55,"startColumn":50,"endColumn":59}},"message":{"text":"SHA-256"}}]}],"columnKind":"utf16CodeUnits","properties":{"metricResults":[{"rule":{"id":"java/summary/lines-of-code","index":96,"toolComponent":{"index":18}},"ruleId":"java/summary/lines-of-code","value":16389,"baseline":34524},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":231,"message":{"text":"java.util.Map#put(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":125,"message":{"text":"java.lang.String#equals(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":63,"message":{"text":"java.lang.StringBuilder#append(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":60,"message":{"text":"java.util.Map#clear()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":60,"message":{"text":"java.util.Map#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":58,"message":{"text":"java.lang.String#contains(CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":49,"message":{"text":"java.lang.String#replace(CharSequence,CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":48,"message":{"text":"java.lang.Throwable#getMessage()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":39,"message":{"text":"java.lang.Object#equals(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":37,"message":{"text":"java.lang.StringBuilder#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":33,"message":{"text":"java.lang.Object#hashCode()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":33,"message":{"text":"java.util.Collection#stream()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":24,"message":{"text":"java.lang.String#getBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":24,"message":{"text":"java.lang.String#length()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":23,"message":{"text":"java.lang.String#indexOf(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":22,"message":{"text":"java.util.List#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":20,"message":{"text":"java.lang.String#substring(int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":20,"message":{"text":"java.lang.Object#getClass()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":19,"message":{"text":"java.lang.String#toLowerCase()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":17,"message":{"text":"java.util.Map#of(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":16,"message":{"text":"javax.servlet.http.Cookie#Cookie(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":16,"message":{"text":"org.springframework.http.HeadersBuilder#build()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":16,"message":{"text":"java.lang.String#concat(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"java.io.PrintStream#println(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"java.util.stream.Stream#filter(Predicate)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"javax.servlet.http.HttpServletRequest#getHeader(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"java.util.Map#of(Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"org.slf4j.Logger#debug(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":15,"message":{"text":"java.lang.String#format(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":14,"message":{"text":"java.sql.Statement#executeQuery(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":13,"message":{"text":"java.util.stream.Stream#map(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":13,"message":{"text":"java.lang.String#String(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":12,"message":{"text":"java.io.File#File(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":12,"message":{"text":"org.slf4j.Logger#debug(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":12,"message":{"text":"java.lang.String#matches(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"org.springframework.http.ResponseEntity#ok(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"java.util.Map#getOrDefault(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"java.util.List#size()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"java.lang.Object#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"java.lang.String#getBytes(Charset)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":11,"message":{"text":"java.sql.ResultSet#next()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"java.io.File#File(File,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"org.springframework.data.repository.CrudRepository#save(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"org.slf4j.Logger#error(String,Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"java.util.Map#isEmpty()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"java.lang.String#equalsIgnoreCase(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"java.util.stream.Stream#toList()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#readValue(String,Class)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":10,"message":{"text":"java.lang.String#substring(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":9,"message":{"text":"java.util.Encoder#encode(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":9,"message":{"text":"java.io.File#toPath()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":9,"message":{"text":"java.sql.PreparedStatement#setString(int,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.io.File#exists()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.lang.Class#getName()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.sql.Connection#prepareStatement(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"org.springframework.http.BodyBuilder#body(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.time.Instant#now()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.lang.String#split(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"org.apache.commons.lang3.StringUtils#reverse(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":8,"message":{"text":"java.util.stream.Stream#findFirst()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.net.URI#URI(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.nio.file.Path#toFile()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.util.Arrays#asList(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.lang.String#String(byte\\[\\],Charset)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.io.File#getName()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.util.Decoder#decode(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.util.Optional#orElse(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":7,"message":{"text":"java.util.List#contains(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"org.slf4j.Logger#info(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.Class#getSimpleName()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.nio.file.Paths#get(String,String\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.System#currentTimeMillis()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.String#startsWith(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.String#trim()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.util.stream.Collectors#toList()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.String#replaceAll(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.lang.String#replaceFirst(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":6,"message":{"text":"java.util.ArrayList#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.Encoder#encodeToString(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.sql.ResultSet#getString(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.List#get(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.lang.String#formatted(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.lang.Class#getClassLoader()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"org.springframework.web.multipart.MultipartFile#getOriginalFilename()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.lang.Integer#intValue()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.Set#size()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.Map#values()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.Collection#toArray(IntFunction)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.math.BigInteger#valueOf(long)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.util.HashMap#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.lang.String#toUpperCase()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"javax.servlet.http.HttpServletResponse#addCookie(Cookie)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"java.lang.String#endsWith(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":5,"message":{"text":"org.springframework.util.MultiValueMap#getFirst(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.nio.file.Path#resolve(Path)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.math.BigInteger#toByteArray()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"org.springframework.web.client.RestTemplate#postForEntity(String,Object,Class,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Entry#getValue()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Entry#getKey()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.lang.StringBuffer#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.List#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"javax.servlet.ServletRequest#getParameter(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Decoder#decode(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"javax.servlet.http.HttpServletRequest#getRequestURL()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"org.apache.commons.lang3.ArrayUtils#addAll(Object\\[\\],Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Map#entrySet()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"org.slf4j.Logger#error(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Optional#ifPresent(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.lang.String#charAt(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.stream.Stream#of(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.UUID#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.UUID#randomUUID()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.util.Set#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.lang.Iterable#forEach(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.io.File#File(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":4,"message":{"text":"java.io.InputStream#readAllBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.String#replace(char,char)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.nio.file.Path#resolve(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"org.springframework.validation.Errors#rejectValue(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.List#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.Optional#ofNullable(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.stream.Stream#sorted(Comparator)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.io.File#getCanonicalPath()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.HashMap#put(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.Date#Date(long)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.Properties#putAll(Map)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.sql.Statement#executeUpdate(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.Map#remove(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.List#of(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.util.Map#size()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"org.springframework.http.ResponseEntity#ResponseEntity(Object,HttpStatus)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.String#String(char\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.System#arraycopy(Object,int,Object,int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.IllegalStateException#IllegalStateException(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.String#getBytes(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.io.FileOutputStream#FileOutputStream(File)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"java.lang.StringBuilder#StringBuilder(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":3,"message":{"text":"org.springframework.http.BodyBuilder#contentType(MediaType)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.stream.Stream#anyMatch(Predicate)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.slf4j.Logger#warn(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.InputStreamReader#InputStreamReader(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.ObjectInputStream#readObject()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.Enum#Enum(String,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.stream.Stream#flatMap(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.stream.Stream#mapToInt(ToIntFunction)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.String#toCharArray()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.ObjectInputStream#ObjectInputStream(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"com.google.common.collect.Lists#newArrayList(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.Integer#valueOf(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.ByteArrayInputStream#ByteArrayInputStream(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.ByteArrayOutputStream#toByteArray()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Objects#requireNonNull(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.File#toURI()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Arrays#stream(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.Float#parseFloat(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.net.URI#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Map#containsKey(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copyToByteArray(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copy(InputStream,OutputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copyToByteArray(File)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copy(byte\\[\\],File)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.web.multipart.MultipartFile#getBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.util.Base64Utils#decodeFromUrlSafeString(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Set#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.slf4j.Logger#warn(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.String#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.StringBuilder#reverse()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Collections#emptyList()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.String#isEmpty()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Map#of(Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractMessageSource#getMessage(String,Object\\[\\],Locale)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractMessageSource#getMessage(String,Object\\[\\],String,Locale)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.core.NestedRuntimeException#getMessage()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Optional#isPresent()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Collection#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.validation.Errors#getFieldError(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.ArrayList#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"org.springframework.http.HeadersBuilder#location(URI)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Collection#size()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.lang.Throwable#getCause()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Optional#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.List#of(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.Optional#map(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.function.Predicate#test(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.regex.Pattern#compile(String,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.io.InputStream#read(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":2,"message":{"text":"java.util.regex.Pattern#matcher(CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Queue#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Set#of(Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Set#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Set#contains(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Arrays#copyOfRange(byte\\[\\],int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Collections#list(Enumeration)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Collections#singleton(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Enumeration#nextElement()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Optional#stream()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Optional#get()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Optional#empty()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Properties#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Properties#getProperty(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.Enum#name()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.IllegalArgumentException#IllegalArgumentException(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.Integer#parseInt(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.Integer#toHexString(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.Long#intValue()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.Math#min(int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.List#isEmpty()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.RuntimeException#RuntimeException(Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.String#valueOf(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Collection#parallelStream()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.HashMap#entrySet()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.StringBuilder#append(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.lang.StringBuilder#StringBuilder(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.HashMap#replace(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#writeValueAsBytes(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#readValue(byte\\[\\],Class)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectWriter#writeValueAsString(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.stream.Stream#reduce(Object,BiFunction,BinaryOperator)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.stream.Stream#forEach(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.stream.Stream#sorted()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.stream.Stream#distinct()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"com.google.common.collect.EvictingQueue#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.BufferedReader#readLine()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.BufferedReader#BufferedReader(Reader)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.File#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.File#getCanonicalFile()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.File#getAbsoluteFile()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.FilterOutputStream#write(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.ObjectOutputStream#writeObject(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.PrintWriter#println(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.PrintWriter#PrintWriter(File)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.StringReader#StringReader(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.io.StringWriter#getBuffer()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.net.URL#openStream()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.net.URL#URL(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#writeString(Path,CharSequence,Charset,OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#writeString(Path,CharSequence,OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#write(Path,byte\\[\\],OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#copy(InputStream,Path,CopyOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#createTempDirectory(String,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#createDirectories(Path,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.nio.file.Files#createFile(Path,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.sql.Connection#prepareStatement(String,int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.sql.PreparedStatement#setInt(int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.xml.sax.InputSource#InputSource(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.sql.Statement#execute(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Map#putAll(Map)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.text.DateFormat#format(Date)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.text.SimpleDateFormat#SimpleDateFormat(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.regex.Pattern#asMatchPredicate()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.regex.Pattern#compile(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.regex.Matcher#matches()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.regex.Matcher#group(int)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.servlet.ServletRequest#getParameterNames()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.servlet.http.Cookie#getValue()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.servlet.http.Cookie#getName()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Map#keySet()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.servlet.http.HttpServletRequest#getQueryString()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.servlet.http.HttpServletResponse#sendError(int,String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"javax.xml.xpath.XPath#evaluate(String,InputSource,QName)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.apache.commons.io.FileUtils#byteCountToDisplaySize(long)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.apache.commons.io.FilenameUtils#isExtension(String,Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.apache.commons.logging.Log#error(Object,Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.http.HttpEntity#HttpEntity(MultiValueMap)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.http.HeadersBuilder#header(String,String\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.util.StringUtils#arrayToCommaDelimitedString(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.slf4j.Logger#error(String,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.slf4j.Logger#error(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.slf4j.Logger#info(String,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.slf4j.Logger#info(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Map#forEach(BiConsumer)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Map#of()"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.slf4j.Logger#trace(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.jdbc.core.JdbcTemplate#execute(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.jdbc.datasource.AbstractDriverBasedDataSource#setUrl(String)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.ui.Model#addAttribute(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.ui.ModelMap#addAttribute(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"org.springframework.web.client.RestTemplate#exchange(String,HttpMethod,HttpEntity,Class,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.ArrayList#ArrayList(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api","index":97,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api","value":1,"message":{"text":"java.util.Queue#remove()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":231,"message":{"text":"java.util.Map#put(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":125,"message":{"text":"java.lang.String#equals(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":63,"message":{"text":"java.lang.StringBuilder#append(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":60,"message":{"text":"java.util.Map#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":49,"message":{"text":"java.lang.String#replace(CharSequence,CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":48,"message":{"text":"java.lang.Throwable#getMessage()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":39,"message":{"text":"java.lang.Object#equals(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":37,"message":{"text":"java.lang.StringBuilder#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":33,"message":{"text":"java.util.Collection#stream()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":24,"message":{"text":"java.lang.String#getBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":22,"message":{"text":"java.util.List#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":20,"message":{"text":"java.lang.String#substring(int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":19,"message":{"text":"java.lang.String#toLowerCase()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":17,"message":{"text":"java.util.Map#of(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":16,"message":{"text":"org.springframework.http.HeadersBuilder#build()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":16,"message":{"text":"javax.servlet.http.Cookie#Cookie(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":16,"message":{"text":"java.lang.String#concat(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":15,"message":{"text":"java.util.Map#of(Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":15,"message":{"text":"java.util.stream.Stream#filter(Predicate)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":15,"message":{"text":"java.lang.String#format(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":13,"message":{"text":"java.util.stream.Stream#map(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":13,"message":{"text":"java.lang.String#String(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":12,"message":{"text":"java.io.File#File(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":11,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":11,"message":{"text":"java.util.Map#getOrDefault(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":11,"message":{"text":"java.lang.String#getBytes(Charset)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":11,"message":{"text":"org.springframework.http.ResponseEntity#ok(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":10,"message":{"text":"java.lang.String#substring(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":10,"message":{"text":"java.io.File#File(File,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":10,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#readValue(String,Class)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":10,"message":{"text":"java.util.stream.Stream#toList()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":10,"message":{"text":"org.springframework.data.repository.CrudRepository#save(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":9,"message":{"text":"java.sql.PreparedStatement#setString(int,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":9,"message":{"text":"java.util.Encoder#encode(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":9,"message":{"text":"java.io.File#toPath()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":8,"message":{"text":"org.apache.commons.lang3.StringUtils#reverse(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":8,"message":{"text":"java.util.stream.Stream#findFirst()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":8,"message":{"text":"org.springframework.http.BodyBuilder#body(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":8,"message":{"text":"java.lang.String#split(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.nio.file.Path#toFile()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.util.Arrays#asList(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.net.URI#URI(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.util.Optional#orElse(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.io.File#getName()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.lang.String#String(byte\\[\\],Charset)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":7,"message":{"text":"java.util.Decoder#decode(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":6,"message":{"text":"java.lang.String#replaceAll(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":6,"message":{"text":"java.lang.String#trim()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":6,"message":{"text":"java.util.ArrayList#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":6,"message":{"text":"java.lang.String#replaceFirst(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":6,"message":{"text":"java.nio.file.Paths#get(String,String\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.lang.String#formatted(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.util.Collection#toArray(IntFunction)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.lang.String#toUpperCase()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"org.springframework.web.multipart.MultipartFile#getOriginalFilename()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.util.List#get(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.math.BigInteger#valueOf(long)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.util.HashMap#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"org.springframework.util.MultiValueMap#getFirst(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.util.Map#values()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.util.Encoder#encodeToString(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.lang.Integer#intValue()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":5,"message":{"text":"java.sql.ResultSet#getString(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.lang.Iterable#forEach(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"org.apache.commons.lang3.ArrayUtils#addAll(Object\\[\\],Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Map#entrySet()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Optional#ifPresent(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.io.InputStream#readAllBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.lang.StringBuffer#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.nio.file.Path#resolve(Path)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Entry#getValue()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.lang.String#charAt(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Set#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Decoder#decode(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.List#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.math.BigInteger#toByteArray()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.io.File#File(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.Entry#getKey()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":4,"message":{"text":"java.util.stream.Stream#of(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"org.springframework.validation.Errors#rejectValue(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.HashMap#put(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.nio.file.Path#resolve(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"org.springframework.http.BodyBuilder#contentType(MediaType)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"org.springframework.http.ResponseEntity#ResponseEntity(Object,HttpStatus)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.Optional#ofNullable(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.Properties#putAll(Map)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.IllegalStateException#IllegalStateException(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.List#of(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.String#replace(char,char)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.String#getBytes(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.List#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.StringBuilder#StringBuilder(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.String#String(char\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.lang.System#arraycopy(Object,int,Object,int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.Map#remove(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.util.stream.Stream#sorted(Comparator)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":3,"message":{"text":"java.io.File#getCanonicalPath()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copy(InputStream,OutputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Optional#map(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.ByteArrayOutputStream#toByteArray()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.ObjectInputStream#ObjectInputStream(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.web.multipart.MultipartFile#getBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.ObjectInputStream#readObject()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.File#toURI()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.Throwable#getCause()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.validation.Errors#getFieldError(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.ArrayList#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Collection#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.core.NestedRuntimeException#getMessage()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.context.support.AbstractMessageSource#getMessage(String,Object\\[\\],String,Locale)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.InputStreamReader#InputStreamReader(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.context.support.AbstractMessageSource#getMessage(String,Object\\[\\],Locale)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Objects#requireNonNull(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.stream.Stream#anyMatch(Predicate)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copy(byte\\[\\],File)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copyToByteArray(File)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Optional#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.InputStream#read(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.util.FileCopyUtils#copyToByteArray(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Set#of(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.stream.Stream#flatMap(Function)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.stream.Stream#mapToInt(ToIntFunction)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.util.Base64Utils#decodeFromUrlSafeString(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"org.springframework.http.HeadersBuilder#location(URI)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.regex.Pattern#matcher(CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"com.google.common.collect.Lists#newArrayList(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.net.URI#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Arrays#stream(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.String#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.String#toCharArray()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.Integer#valueOf(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.io.ByteArrayInputStream#ByteArrayInputStream(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.Map#of(Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.StringBuilder#reverse()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.lang.Float#parseFloat(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":2,"message":{"text":"java.util.List#of(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Map#of()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Map#forEach(BiConsumer)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Map#keySet()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Map#putAll(Map)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.HashMap#replace(Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.HashMap#entrySet()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Collection#parallelStream()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.List#of(Object,Object,Object,Object,Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.ArrayList#ArrayList(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Queue#remove()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Queue#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Set#of(Object,Object,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Set#addAll(Collection)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Arrays#copyOfRange(byte\\[\\],int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Collections#list(Enumeration)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Collections#singleton(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Enumeration#nextElement()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Optional#stream()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Optional#get()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Properties#get(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.Properties#getProperty(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.IllegalArgumentException#IllegalArgumentException(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.Integer#parseInt(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.Integer#toHexString(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.Long#intValue()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.RuntimeException#RuntimeException(Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.StringBuilder#append(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.lang.StringBuilder#StringBuilder(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#writeValueAsBytes(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#readValue(byte\\[\\],Class)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectWriter#writeValueAsString(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.stream.Stream#reduce(Object,BiFunction,BinaryOperator)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.stream.Stream#forEach(Consumer)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.stream.Stream#sorted()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.stream.Stream#distinct()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"com.google.common.collect.EvictingQueue#add(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.BufferedReader#readLine()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.BufferedReader#BufferedReader(Reader)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.File#toString()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.File#getCanonicalFile()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.File#getAbsoluteFile()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.FilterOutputStream#write(byte\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.ObjectOutputStream#writeObject(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.StringReader#StringReader(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.io.StringWriter#getBuffer()"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.net.URL#URL(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"java.util.regex.Matcher#group(int)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.springframework.http.HttpEntity#HttpEntity(MultiValueMap)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.springframework.http.HeadersBuilder#header(String,String\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.springframework.util.StringUtils#arrayToCommaDelimitedString(Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.springframework.ui.Model#addAttribute(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.springframework.ui.ModelMap#addAttribute(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-taint","index":98,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-taint","value":1,"message":{"text":"org.xml.sax.InputSource#InputSource(InputStream)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":15,"message":{"text":"org.slf4j.Logger#debug(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":15,"message":{"text":"java.io.PrintStream#println(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":14,"message":{"text":"java.sql.Statement#executeQuery(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":12,"message":{"text":"org.slf4j.Logger#debug(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":12,"message":{"text":"java.lang.String#matches(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":10,"message":{"text":"org.slf4j.Logger#error(String,Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":8,"message":{"text":"java.lang.String#split(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":8,"message":{"text":"java.sql.Connection#prepareStatement(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":6,"message":{"text":"java.lang.String#replaceFirst(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":6,"message":{"text":"java.lang.String#replaceAll(String,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":6,"message":{"text":"org.slf4j.Logger#info(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":5,"message":{"text":"javax.servlet.http.HttpServletResponse#addCookie(Cookie)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":4,"message":{"text":"org.springframework.web.client.RestTemplate#postForEntity(String,Object,Class,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":4,"message":{"text":"org.slf4j.Logger#error(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":3,"message":{"text":"java.io.FileOutputStream#FileOutputStream(File)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":3,"message":{"text":"java.sql.Statement#executeUpdate(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":2,"message":{"text":"java.util.regex.Pattern#compile(String,int)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":2,"message":{"text":"java.util.regex.Pattern#matcher(CharSequence)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":2,"message":{"text":"java.util.function.Predicate#test(Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":2,"message":{"text":"org.slf4j.Logger#warn(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":2,"message":{"text":"org.slf4j.Logger#warn(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.util.regex.Pattern#asMatchPredicate()"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.util.regex.Pattern#compile(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.util.regex.Matcher#matches()"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"javax.servlet.http.HttpServletResponse#sendError(int,String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#writeString(Path,CharSequence,Charset,OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"javax.xml.xpath.XPath#evaluate(String,InputSource,QName)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#createTempDirectory(String,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.net.URL#openStream()"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.slf4j.Logger#error(String,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.slf4j.Logger#error(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.slf4j.Logger#info(String,Object,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.io.PrintWriter#PrintWriter(File)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.slf4j.Logger#info(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.io.PrintWriter#println(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.slf4j.Logger#trace(String,Object)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.springframework.jdbc.core.JdbcTemplate#execute(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.springframework.jdbc.datasource.AbstractDriverBasedDataSource#setUrl(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.springframework.web.client.RestTemplate#exchange(String,HttpMethod,HttpEntity,Class,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#copy(InputStream,Path,CopyOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"org.apache.commons.logging.Log#error(Object,Throwable)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#createDirectories(Path,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#createFile(Path,FileAttribute\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.sql.Connection#prepareStatement(String,int,int)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#write(Path,byte\\[\\],OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.sql.Statement#execute(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sinks","index":99,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sinks","value":1,"message":{"text":"java.nio.file.Files#writeString(Path,CharSequence,OpenOption\\[\\])"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":4104,"message":{"text":"rt.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":792,"message":{"text":"rest-assured-4.5.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":162,"message":{"text":"jjwt-0.9.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":110,"message":{"text":"spring-web-5.3.21.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":100,"message":{"text":"jakarta.servlet-api-4.0.4.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":97,"message":{"text":"slf4j-api-1.7.36.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":77,"message":{"text":"spring-webmvc-5.3.21.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":74,"message":{"text":"spring-core-5.3.21.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":51,"message":{"text":"spring-security-config-5.7.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":47,"message":{"text":"jackson-databind-2.13.3.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":42,"message":{"text":"spring-security-core-5.7.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":40,"message":{"text":"spring-context-5.3.21.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":31,"message":{"text":"commons-lang3-3.12.0.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":25,"message":{"text":"asciidoctorj-api-2.5.3.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":20,"message":{"text":"thymeleaf-3.0.15.RELEASE.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":17,"message":{"text":"json-path-4.5.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":17,"message":{"text":"zxcvbn-1.5.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":16,"message":{"text":"jose4j-0.9.3.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":16,"message":{"text":"xstream-1.4.5.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":16,"message":{"text":"flyway-core-8.5.13.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":13,"message":{"text":"spring-boot-2.7.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":13,"message":{"text":"spring-jdbc-5.3.21.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":12,"message":{"text":"spring-boot-actuator-2.7.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":11,"message":{"text":"spring-data-commons-2.7.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":9,"message":{"text":"guava-30.1-jre.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":9,"message":{"text":"jaxb-api-2.3.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":8,"message":{"text":"lombok-1.18.24.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":8,"message":{"text":"jsoup-1.15.4.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":6,"message":{"text":"spring-boot-autoconfigure-2.7.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":6,"message":{"text":"spring-data-jpa-2.7.1.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":6,"message":{"text":"jcommander-1.81.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":4,"message":{"text":"commons-exec-1.3.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":4,"message":{"text":"spring-security-crypto-5.7.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":4,"message":{"text":"thymeleaf-spring5-3.0.15.RELEASE.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":3,"message":{"text":"log4j-api-2.17.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":2,"message":{"text":"commons-text-1.9.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":2,"message":{"text":"commons-io-2.6.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":2,"message":{"text":"spring-security-web-5.7.2.jar"}},{"rule":{"id":"java/telemetry/external-libs","index":100,"toolComponent":{"index":18}},"ruleId":"java/telemetry/external-libs","value":1,"message":{"text":"spring-jcl-5.3.21.jar"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":83,"message":{"text":"io.restassured.RestAssured#given()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":82,"message":{"text":"io.restassured.specification.RequestSpecification#relaxedHTTPSValidation()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":82,"message":{"text":"io.restassured.specification.RequestSpecification#when()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":81,"message":{"text":"io.restassured.response.Validatable#then()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":79,"message":{"text":"io.restassured.specification.RequestSpecification#cookie(String,Object,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":66,"message":{"text":"io.restassured.response.ValidatableResponseOptions#extract()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":59,"message":{"text":"io.restassured.response.ValidatableResponseOptions#statusCode(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":48,"message":{"text":"io.restassured.specification.RequestSenderOptions#get(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":40,"message":{"text":"org.slf4j.LoggerFactory#getLogger(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":32,"message":{"text":"io.restassured.specification.RequestSenderOptions#post(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":25,"message":{"text":"java.time.LocalDateTime#now()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":23,"message":{"text":"io.restassured.response.ResponseBodyExtractionOptions#path(String,String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":22,"message":{"text":"io.restassured.response.ResponseBodyData#asString()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":19,"message":{"text":"io.jsonwebtoken.JwtBuilder#compact()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":19,"message":{"text":"io.jsonwebtoken.Jwts#builder()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":18,"message":{"text":"io.restassured.specification.RequestSpecification#contentType(ContentType)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":18,"message":{"text":"io.restassured.specification.RequestSpecification#header(String,Object,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":17,"message":{"text":"javax.servlet.http.HttpServletRequest#getSession()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":16,"message":{"text":"io.restassured.specification.RequestSpecification#formParam(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":15,"message":{"text":"io.jsonwebtoken.JwtBuilder#signWith(SignatureAlgorithm,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":14,"message":{"text":"java.sql.Connection#createStatement(int,int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":14,"message":{"text":"java.time.LocalDateTime#format(DateTimeFormatter)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":14,"message":{"text":"io.restassured.response.ResponseBodyExtractionOptions#jsonPath()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":14,"message":{"text":"org.springframework.web.servlet.ModelAndView#addObject(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":13,"message":{"text":"org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry#addResourceHandler(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":13,"message":{"text":"org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration#addResourceLocations(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":12,"message":{"text":"org.springframework.http.ResponseEntity#status(HttpStatus)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":12,"message":{"text":"org.springframework.util.StringUtils#hasText(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":12,"message":{"text":"io.jsonwebtoken.JwtBuilder#setClaims(Claims)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":12,"message":{"text":"java.lang.reflect.Method#getAnnotation(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":12,"message":{"text":"io.restassured.response.ExtractableResponse#response()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":11,"message":{"text":"java.sql.ResultSet#first()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":11,"message":{"text":"java.sql.ResultSet#getString(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":11,"message":{"text":"io.restassured.response.ResponseOptions#getBody()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":11,"message":{"text":"org.springframework.web.servlet.ModelAndView#setViewName(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":11,"message":{"text":"java.util.stream.Stream#collect(Collector)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":10,"message":{"text":"io.jsonwebtoken.Jwts#parser()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":10,"message":{"text":"java.util.Random#nextInt(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":10,"message":{"text":"java.util.Base64#getEncoder()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":10,"message":{"text":"javax.servlet.http.HttpSession#getAttribute(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":10,"message":{"text":"org.springframework.core.io.ResourceLoader#getResource(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":9,"message":{"text":"org.apache.commons.lang3.StringUtils#isEmpty(CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":9,"message":{"text":"io.jsonwebtoken.JwtBuilder#claim(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":9,"message":{"text":"io.restassured.path.json.JsonPath#getString(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"java.util.Date#from(Instant)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"io.jsonwebtoken.JwtParser#setSigningKey(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"javax.servlet.http.HttpSession#setAttribute(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"java.lang.System#getProperty(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"io.restassured.specification.RequestSpecification#formParams(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"org.springframework.boot.actuate.trace.http.Request#getUri()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"io.jsonwebtoken.JwtParser#parse(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":8,"message":{"text":"lombok.Lombok#sneakyThrow(Throwable)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"org.springframework.security.core.context.SecurityContext#getAuthentication()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"io.jsonwebtoken.Jwts#claims()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"org.springframework.core.env.PropertyResolver#getProperty(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"org.springframework.security.config.annotation.web.configurers.ExpressionInterceptUrlRegistry#and()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"org.springframework.security.core.Authentication#getPrincipal()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"java.lang.Throwable#printStackTrace()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"java.util.Base64#getDecoder()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"java.lang.String#lastIndexOf(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"io.jsonwebtoken.Jwt#getBody()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":7,"message":{"text":"org.springframework.security.core.context.SecurityContextHolder#getContext()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"java.sql.PreparedStatement#executeQuery()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"com.beust.jcommander.internal.Lists#newArrayList(Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"javax.xml.bind.DatatypeConverter#printHexBinary(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"io.restassured.specification.RequestSpecification#multiPart(String,String,byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"org.asciidoctor.extension.JavaExtensionRegistry#inlineMacro(String,Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"org.springframework.web.servlet.config.annotation.ViewControllerRegistration#setViewName(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"org.springframework.web.servlet.config.annotation.ViewControllerRegistry#addViewController(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"java.util.HashMap#containsKey(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#enable(DeserializationFeature)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"io.jsonwebtoken.JwtBuilder#setIssuedAt(Date)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"org.springframework.http.ResponseEntity#ok()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"java.util.List#of()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":6,"message":{"text":"org.springframework.data.jpa.repository.JpaRepository#saveAndFlush(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"org.asciidoctor.extension.InlineMacroProcessor#InlineMacroProcessor(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"java.io.File#getParentFile()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"org.springframework.web.servlet.ModelAndView#ModelAndView(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"com.nulabinc.zxcvbn.Strength#getScore()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"java.net.URI#getPath()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"io.restassured.response.ExtractableResponse#cookie(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"java.time.format.DateTimeFormatter#ofPattern(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"java.sql.ResultSet#getMetaData()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"org.springframework.validation.Errors#hasErrors()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"org.asciidoctor.extension.InlineMacroProcessor#InlineMacroProcessor(String,Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"io.jsonwebtoken.JwtBuilder#setHeaderParam(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":5,"message":{"text":"java.time.Duration#ofDays(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.security.interfaces.RSAKey#getModulus()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"io.jsonwebtoken.impl.TextCodec#encode(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.util.function.Supplier#get()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.util.Base64#getUrlDecoder()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"io.restassured.response.ValidatableResponseOptions#cookie(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"io.restassured.path.json.JsonPath#get(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.util.Base64#getUrlEncoder()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.asciidoctor.extension.BaseProcessor#createPhraseNode(ContentNode,String,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"io.restassured.specification.RequestSpecification#body(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.io.File#mkdirs()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.http.HttpStatus#value()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.io.FileInputStream#FileInputStream(File)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.util.StringUtils#isEmpty(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.util.Calendar#getTime()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.google.common.collect.Lists#newArrayList()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.nulabinc.zxcvbn.Strength#getFeedback()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.core.io.ClassPathResource#ClassPathResource(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.core.io.InputStreamSource#getInputStream()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.nio.charset.Charset#defaultCharset()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.http.converter.json.MappingJacksonValue#setSerializationView(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.nio.file.Files#readAllBytes(Path)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.jdbc.core.namedparam.MapSqlParameterSource#addValue(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.util.Calendar#getInstance()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.thoughtworks.xstream.XStream#ignoreUnknownElements()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.security.KeyPair#getPublic()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.thoughtworks.xstream.XStream#setClassLoader(ClassLoader)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.thoughtworks.xstream.XStream#alias(String,Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"com.thoughtworks.xstream.XStream#fromXML(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.sql.ResultSet#getRow()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.sql.ResultSet#last()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"java.sql.ResultSet#beforeFirst()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.springframework.web.servlet.ModelAndView#getViewName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.thymeleaf.templateresolver.AbstractTemplateResolver#setOrder(Integer)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":4,"message":{"text":"org.thymeleaf.templateresource.StringTemplateResource#StringTemplateResource(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.JwtBuilder#setSubject(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"com.fasterxml.jackson.databind.JsonNode#toString()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.apache.commons.lang3.RandomStringUtils#randomAlphabetic(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AuthorizedUrl#authenticated()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.validation.BeanPropertyBindingResult#BeanPropertyBindingResult(Object,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#readTree(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.sql.Connection#createStatement()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.sql.PreparedStatement#execute()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.restassured.path.json.JsonPath#getList(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.core.io.ClassPathResource#getInputStream()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.sql.ResultSetMetaData#getColumnCount()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.sql.ResultSet#getStatement()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.time.Instant#plus(TemporalAmount)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.security.MessageDigest#getInstance(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.web.context.request.RequestContextHolder#currentRequestAttributes()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.web.context.request.ServletRequestAttributes#getRequest()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.JwtBuilder#setExpiration(Date)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer#loginPage(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.JwtBuilder#setAudience(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.util.function.Function#apply(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.JwtBuilder#setClaims(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.Claims#setIssuedAt(Date)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.util.Locale#getLanguage()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.lang.Class#getPackageName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.core.env.EnvironmentCapable#getEnvironment()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver#setCharacterEncoding(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.boot.autoconfigure.jdbc.DataSourceProperties#getDriverClassName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.nio.charset.Charset#forName(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.boot.context.event.ApplicationReadyEvent#getApplicationContext()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.http.MediaType#parseMediaType(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#formLogin()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#web(WebApplicationType)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.context.support.PropertiesHolder#getProperties()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.time.Instant#plusSeconds(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#authorizeRequests()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.jsonwebtoken.JwtBuilder#setIssuer(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.core.userdetails.UserDetails#getUsername()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.net.URI#getQuery()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.flywaydb.core.Flyway#migrate()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.apache.logging.log4j.util.Strings#isEmpty(CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.restassured.specification.RequestSpecification#formParams(String,Object,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.util.stream.Collectors#toMap(Function,Function)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.apache.commons.lang3.exception.ExceptionUtils#getStackTrace(Throwable)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"com.fasterxml.jackson.databind.node.ObjectNode#put(String,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.boot.actuate.trace.http.HttpTrace#getRequest()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.util.concurrent.TimeUnit#toDays(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"org.springframework.security.core.token.Sha512DigestUtils#shaHex(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"java.lang.Throwable#toString()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":3,"message":{"text":"io.restassured.specification.RequestSpecification#queryParams(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.UsernameNotFoundException#UsernameNotFoundException(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.apache.commons.text.StringEscapeUtils#escapeJson(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.apache.commons.lang3.StringUtils#contains(CharSequence,CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.restassured.specification.RequestSenderOptions#put(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.crypto.password.NoOpPasswordEncoder#getInstance()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.apache.commons.exec.OS#isFamilyMac()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.apache.commons.exec.OS#isFamilyUnix()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.sql.ResultSetMetaData#getColumnName(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.time.format.DateTimeFormatter#format(TemporalAccessor)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.xml.stream.XMLInputFactory#setProperty(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.jsonwebtoken.JwtParser#parseClaimsJws(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.util.Properties#stringPropertyNames()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.util.Comparator#reversed()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.http.HttpServletResponse#setStatus(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.http.HttpServletRequest#getMethod()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.util.stream.IntStream#range(int,int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.http.ResponseEntity#badRequest()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.http.ResponseEntity#accepted()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.jsoup.select.Elements#first()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.lang.String#isBlank()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.jsoup.nodes.Element#select(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.jsoup.nodes.Element#text()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.http.HttpServletRequest#getUserPrincipal()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.util.CollectionUtils#isEmpty(Collection)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.lang.String#lastIndexOf(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.io.File#listFiles()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.jsonwebtoken.impl.TextCodec#decode(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.jose4j.keys.HmacKey#HmacKey(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.http.Cookie#setPath(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.ConfigurableApplicationContext#getEnvironment()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.restassured.specification.RequestSpecification#param(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.http.Cookie#setSecure(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.api.configuration.FluentConfiguration#configuration(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#bannerMode(Mode)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"com.fasterxml.jackson.databind.JsonNode#size()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"com.nulabinc.zxcvbn.Feedback#getSuggestions()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"com.nulabinc.zxcvbn.Feedback#getWarning()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractResourceBasedMessageSource#setFallbackToSystemLocale(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractResourceBasedMessageSource#setDefaultEncoding(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractResourceBasedMessageSource#setBasenames(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.AbstractResourceBasedMessageSource#setBasename(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.DefaultMessageSourceResolvable#getCode()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"javax.servlet.ServletResponse#setContentType(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.context.support.ReloadableResourceBundleMessageSource#getMergedProperties(Locale)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.api.configuration.FluentConfiguration#load()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.core.io.Resource#isReadable()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.api.configuration.FluentConfiguration#locations(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.core.io.support.ResourcePatternResolver#getResources(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.jsonwebtoken.JwtParser#setSigningKeyResolver(SigningKeyResolver)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.util.Comparator#comparing(Function)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.nio.file.Files#delete(Path)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#reader()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.thymeleaf.templateresolver.AbstractTemplateResolver#setResolvablePatterns(Set)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.lang.reflect.Method#getGenericReturnType()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver#setCacheable(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.time.Instant#minus(TemporalAmount)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder#userDetailsService(UserDetailsService)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.AbstractRequestMatcherRegistry#antMatchers(HttpMethod,String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.AbstractRequestMatcherRegistry#anyRequest()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#logout()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#csrf()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"com.fasterxml.jackson.databind.ObjectReader#readTree(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer#disable()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.security.MessageDigest#digest()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer#permitAll()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer#defaultSuccessUrl(String,boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.security.MessageDigest#update(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AuthorizedUrl#permitAll()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.api.configuration.FluentConfiguration#schemas(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.security.Principal#getName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.security.Signature#update(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"io.jsonwebtoken.Claims#setExpiration(Date)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.api.configuration.FluentConfiguration#dataSource(DataSource)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#authenticationManager()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"java.security.Signature#getInstance(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.flywaydb.core.Flyway#configure()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.User#isCredentialsNonExpired()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.User#isAccountNonLocked()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.User#isAccountNonExpired()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.User#isEnabled()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":2,"message":{"text":"org.springframework.security.core.userdetails.User#User(String,String,Collection)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver#setTemplateMode(TemplateMode)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver#setSuffix(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver#setPrefix(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.w3c.dom.NodeList#getLength()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.w3c.dom.NodeList#item(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.w3c.dom.Node#getTextContent()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.w3c.dom.Node#getNodeName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.time.LocalDateTime#isBefore(ChronoLocalDateTime)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.HashMap#size()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Collection#contains(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.List#sort(Comparator)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.List#remove(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.ArrayList#sort(Comparator)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.ArrayList#clear()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Set#clear()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Set#containsAll(Collection)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Comparator#comparingLong(ToLongFunction)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Arrays#equals(byte\\[\\],byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Collections#reverse(List)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Enumeration#hasMoreElements()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Locale#getDefault()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Properties#containsKey(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Properties#load(InputStream)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Random#nextLong()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Random#nextInt()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.Random#setSeed(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Boolean#valueOf(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Class#getAnnotationsByType(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Class#isAnnotationPresent(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Class#getResourceAsStream(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Class#getMethods()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.IllegalStateException#IllegalStateException(Throwable)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Integer#sum(int,int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Math#round(double)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Math#ceil(double)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Process#getInputStream()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Runtime#exec(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.Runtime#getRuntime()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.String#valueOf(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.String#indexOf(String,int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.System#exit(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#writerWithDefaultPrettyPrinter()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.fasterxml.jackson.databind.ObjectMapper#addMixIn(Class,Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.reflect.InvocationTargetException#getTargetException()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.reflect.Method#invoke(Object,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.reflect.Method#getReturnType()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.reflect.ParameterizedType#getActualTypeArguments()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.lang.reflect.Proxy#newProxyInstance(ClassLoader,Class\\[\\],InvocationHandler)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.function.DoublePredicate#test(double)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.concurrent.Future#get()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.concurrent.ExecutorService#invokeAll(Collection)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.concurrent.Executors#newWorkStealingPool(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.concurrent.ThreadLocalRandom#nextDouble()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.concurrent.ThreadLocalRandom#current()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.Collectors#groupingBy(Function)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.Collectors#counting()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.IntStream#sum()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.IntStream#reduce(int,IntBinaryOperator)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.IntStream#forEach(IntConsumer)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.IntStream#mapToObj(IntFunction)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.stream.Stream#count()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.google.common.collect.EvictingQueue#create(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.google.common.collect.Maps#newHashMap()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.nulabinc.zxcvbn.CrackTimeSeconds#getOnlineNoThrottling10perSecond()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.nulabinc.zxcvbn.Strength#getCrackTimeSeconds()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.nulabinc.zxcvbn.Strength#getGuesses()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"com.nulabinc.zxcvbn.Zxcvbn#measure(CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.ClaimJwtException#getClaims()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.Claims#setAudience(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.Claims#setSubject(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.Claims#setIssuer(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.Jwt#getHeader()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.JwtBuilder#addClaims(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.jsonwebtoken.JwtBuilder#setHeader(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ExtractableResponse#header(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ResponseOptions#getStatusCode()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ResponseOptions#andReturn()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ResponseBodyData#asByteArray()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ValidatableResponseOptions#body(String,Matcher,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.response.ValidatableResponseOptions#body(Matcher,Matcher\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.path.json.JsonPath#getObject(String,Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.specification.RequestSenderOptions#delete(String,Object\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.specification.RequestSpecification#urlEncodingEnabled(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"io.restassured.specification.RequestSpecification#params(Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.DataOutputStream#writeLong(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.DataOutputStream#DataOutputStream(OutputStream)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#mkdir()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#listFiles(FileFilter)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#delete()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#createNewFile()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#length()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.File#isFile()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.FileInputStream#FileInputStream(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.FilterOutputStream#close()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.ObjectInputStream#close()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.ObjectInputStream#defaultReadObject()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.ObjectOutputStream#close()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.ObjectOutputStream#ObjectOutputStream(OutputStream)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.io.PrintStream#println()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.net.InetAddress#getLocalHost()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.net.InetAddress#getHostAddress()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.net.URI#getHost()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.net.URI#getScheme()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.net.URL#toString()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.nio.charset.Charset#displayName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.Key#getEncoded()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyFactory#generatePrivate(KeySpec)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyFactory#getInstance(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyPair#getPrivate()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyPairGenerator#generateKeyPair()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyPairGenerator#initialize(AlgorithmParameterSpec)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.KeyPairGenerator#getInstance(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.MessageDigest#digest(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.Signature#verify(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.Signature#sign()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.Signature#initSign(PrivateKey)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.Signature#initVerify(PublicKey)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.interfaces.RSAPublicKey#getPublicExponent()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.spec.PKCS8EncodedKeySpec#PKCS8EncodedKeySpec(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.security.spec.RSAKeyGenParameterSpec#RSAKeyGenParameterSpec(int,BigInteger)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.sql.Connection#commit()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.sql.ResultSet#getBoolean(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.sql.Wrapper#isWrapperFor(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.sql.Wrapper#unwrap(Class)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.text.DecimalFormatSymbols#getInstance(Locale)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.text.DecimalFormat#setMaximumFractionDigits(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.text.DecimalFormat#DecimalFormat(String,DecimalFormatSymbols)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.text.NumberFormat#format(double)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.time.Instant#toEpochMilli()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.time.LocalDateTime#isAfter(ChronoLocalDateTime)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.time.LocalDateTime#minusMinutes(long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.regex.Matcher#find()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipEntry#getName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipEntry#ZipEntry(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipFile#entries()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipFile#getInputStream(ZipEntry)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipFile#ZipFile(File)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipOutputStream#putNextEntry(ZipEntry)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"java.util.zip.ZipOutputStream#ZipOutputStream(OutputStream)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.servlet.ServletRequest#getContentType()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.servlet.http.Cookie#setMaxAge(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.servlet.http.HttpServletRequest#login(String,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.servlet.http.HttpServletRequest#getCookies()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.CommonDataSource#getParentLogger()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#getLoginTimeout()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#setLoginTimeout(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#setLogWriter(PrintWriter)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#getLogWriter()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#getConnection(String,String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.sql.DataSource#getConnection()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.Diagnostic#getMessage(Locale)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.DiagnosticCollector#getDiagnostics()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.CompilationTask#call()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.SimpleJavaFileObject#SimpleJavaFileObject(URI,Kind)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.JavaCompiler#getStandardFileManager(DiagnosticListener,Locale,Charset)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.JavaCompiler#getTask(Writer,JavaFileManager,DiagnosticListener,Iterable,Iterable,Iterable)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.tools.ToolProvider#getSystemJavaCompiler()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.bind.JAXBContext#createUnmarshaller()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.bind.JAXBContext#newInstance(Class\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.bind.Unmarshaller#unmarshal(XMLStreamReader)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.stream.XMLInputFactory#createXMLStreamReader(Reader)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.stream.XMLInputFactory#newInstance()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.xpath.XPathFactory#newXPath()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"javax.xml.xpath.XPathFactory#newInstance()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.apache.commons.lang3.RandomUtils#nextInt(int,int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.apache.commons.lang3.StringUtils#isNotEmpty(CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.asciidoctor.Factory#create()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.asciidoctor.Asciidoctor#javaExtensionRegistry()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.asciidoctor.Asciidoctor#convert(Reader,Writer,Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.asciidoctor.ast.PhraseNode#convert()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.asciidoctor.extension.BaseProcessor#createPhraseNode(ContentNode,String,String,Map,Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.flywaydb.core.Flyway#clean()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jws.JsonWebSignature#getEncodedPayload()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jws.JsonWebSignature#getCompactSerialization()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jws.JsonWebSignature#setPayload(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwt.consumer.JwtConsumer#processToClaims(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwt.consumer.JwtConsumerBuilder#build()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwt.consumer.JwtConsumerBuilder#setRelaxVerificationKeyValidation()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwt.consumer.JwtConsumerBuilder#setVerificationKey(Key)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwt.consumer.JwtConsumerBuilder#setSkipAllValidators()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.CompactSerializer#serialize(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.Headers#getEncodedHeader()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.JsonWebStructure#setDoKeyValidation(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.JsonWebStructure#setKey(Key)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.JsonWebStructure#setHeader(String,Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jose4j.jwx.JsonWebStructure#getHeaders()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jsoup.Jsoup#parse(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.jsoup.parser.Parser#unescapeEntities(String,boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.http.HttpMethod#matches(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.http.ResponseEntity#notFound()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.http.ResponseEntity#status(int)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.data.repository.CrudRepository#deleteAll()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.owasp.webgoat.lessons.challenges.Flag#number()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.util.FileSystemUtils#deleteRecursively(File)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.slf4j.LoggerFactory#getLogger(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.context.ApplicationContext#getApplicationName()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.actuate.trace.http.HttpTrace#getTimestamp()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.autoconfigure.jdbc.DataSourceProperties#getPassword()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.autoconfigure.jdbc.DataSourceProperties#getUsername()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.autoconfigure.jdbc.DataSourceProperties#getUrl()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#sibling(Class\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#parent(Class\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#child(Class\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#run(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.boot.builder.SpringApplicationBuilder#SpringApplicationBuilder(Class\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.context.support.AbstractMessageSource#setParentMessageSource(MessageSource)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.context.support.PropertiesHolder#PropertiesHolder(Properties,long)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.context.support.ReloadableResourceBundleMessageSource#refreshProperties(String,PropertiesHolder)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.core.io.Resource#getURI()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.core.io.Resource#getURL()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.http.converter.json.MappingJacksonValue#MappingJacksonValue(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate#update(String,SqlParameterSource)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate#query(String,RowMapper)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate#query(String,SqlParameterSource,RowMapper)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate#NamedParameterJdbcTemplate(DataSource)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.datasource.AbstractDriverBasedDataSource#setPassword(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.datasource.AbstractDriverBasedDataSource#setUsername(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.jdbc.datasource.DriverManagerDataSource#setDriverClassName(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.AbstractRequestMatcherRegistry#antMatchers(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#exceptionHandling()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.builders.HttpSecurity#headers()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer#failureUrl(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.ExceptionHandlingConfigurer#authenticationEntryPoint(AuthenticationEntryPoint)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer#passwordParameter(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer#usernameParameter(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.CacheControlConfig#disable()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.HeadersConfigurer#cacheControl()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.LogoutConfigurer#deleteCookies(String\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.LogoutConfigurer#permitAll()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.config.annotation.web.configurers.LogoutConfigurer#invalidateHttpSession(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.core.userdetails.User#hashCode()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.core.userdetails.User#equals(Object)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.core.authority.SimpleGrantedAuthority#SimpleGrantedAuthority(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.crypto.codec.Hex#decode(CharSequence)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.crypto.codec.Hex#encode(byte\\[\\])"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint#commence(HttpServletRequest,HttpServletResponse,AuthenticationException)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint#LoginUrlAuthenticationEntryPoint(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.RequestMapping#path()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.RequestMapping#value()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.GetMapping#value()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.GetMapping#path()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.PostMapping#value()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.PostMapping#path()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.PutMapping#path()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.bind.annotation.PutMapping#value()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.multipart.MultipartFile#transferTo(File)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.multipart.MultipartFile#isEmpty()"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.servlet.LocaleResolver#resolveLocale(HttpServletRequest)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.servlet.ModelAndView#ModelAndView(View,Map)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.servlet.config.annotation.InterceptorRegistry#addInterceptor(HandlerInterceptor)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.servlet.i18n.LocaleChangeInterceptor#setParamName(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.springframework.web.servlet.view.RedirectView#RedirectView(String,boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.TemplateEngine#setTemplateResolvers(Set)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.TemplateEngine#addDialect(IDialect)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.spring5.SpringTemplateEngine#setEnableSpringELCompiler(boolean)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver#setApplicationContext(ApplicationContext)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.spring5.view.ThymeleafViewResolver#setCharacterEncoding(String)"}},{"rule":{"id":"java/telemetry/unsupported-external-api","index":101,"toolComponent":{"index":18}},"ruleId":"java/telemetry/unsupported-external-api","value":1,"message":{"text":"org.thymeleaf.spring5.view.ThymeleafViewResolver#setTemplateEngine(ISpringTemplateEngine)"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":5571,"message":{"text":"Number of files"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":31145,"message":{"text":"Total number of lines"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":20314,"message":{"text":"Number of lines of code"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":15,"message":{"text":"Number of files with extension xml"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":75,"message":{"text":"Number of files with extension jar"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":349,"message":{"text":"Number of files with extension java"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":5131,"message":{"text":"Number of files with extension class"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":3925,"message":{"text":"Total number of lines with extension xml"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":27220,"message":{"text":"Total number of lines with extension java"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":3925,"message":{"text":"Number of lines of code with extension xml"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":16389,"message":{"text":"Number of lines of code with extension java"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":2,"message":{"text":"Number of diagnostics from CodeQL Java extractor with severity 2"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":75,"message":{"text":"Number of diagnostics from CodeQL Java extractor with severity 3"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":3,"message":{"text":"Number of diagnostics from CodeQL Java extractor with severity 4"}},{"rule":{"id":"java/telemetry/extraction-information","index":102,"toolComponent":{"index":18}},"ruleId":"java/telemetry/extraction-information","value":80,"message":{"text":"Total number of diagnostics from CodeQL Java extractor"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":15,"message":{"text":"javax.servlet.http.HttpServletRequest#getHeader(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":5,"message":{"text":"org.springframework.web.multipart.MultipartFile#getOriginalFilename()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":4,"message":{"text":"org.springframework.web.client.RestTemplate#postForEntity(String,Object,Class,Object\\[\\])"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":4,"message":{"text":"javax.servlet.http.HttpServletRequest#getRequestURL()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":4,"message":{"text":"javax.servlet.ServletRequest#getParameter(String)"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":2,"message":{"text":"org.springframework.web.multipart.MultipartFile#getBytes()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":1,"message":{"text":"javax.servlet.ServletRequest#getParameterNames()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":1,"message":{"text":"javax.servlet.http.Cookie#getValue()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":1,"message":{"text":"javax.servlet.http.Cookie#getName()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":1,"message":{"text":"javax.servlet.http.HttpServletRequest#getQueryString()"}},{"rule":{"id":"java/telemetry/supported-external-api-sources","index":103,"toolComponent":{"index":18}},"ruleId":"java/telemetry/supported-external-api-sources","value":1,"message":{"text":"org.springframework.web.client.RestTemplate#exchange(String,HttpMethod,HttpEntity,Class,Object\\[\\])"}}],"semmle.formatSpecifier":"sarif-latest"}}]} \ No newline at end of file