From 0da7afb3328c34329ee5577932152f575262a97e Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 15 Oct 2024 10:17:05 -0500 Subject: [PATCH] Bulk operations dashboard: Add software page (#22584) Related to #21928 Changes: - Added a /software page, a page where users can manage (upload/edit/download/delete) software installers on their Fleet instance across multiple teams at once. - ~~Removed the `deploy-bulk-operations-dashboard-on-heroku` GitHub action (This dashboard will be hosted in Render in the future)~~ Reverted this change to unblock merging this PR, I will remove this file in a separate PR. --- ee/bulk-operations-dashboard/.eslintrc | 3 +- .../api/controllers/get-software.js | 109 + .../controllers/software/delete-software.js | 46 + .../controllers/software/download-software.js | 74 + .../api/controllers/software/edit-software.js | 343 + .../controllers/software/upload-software.js | 111 + .../api/controllers/software/view-software.js | 112 + .../api/hooks/custom/index.js | 2 +- .../api/models/UndeployedSoftware.js | 77 + ee/bulk-operations-dashboard/assets/.eslintrc | 1 + .../assets/dependencies/ace-editor/ace.js | 21389 +++++++++++ .../ace-editor/mode-fleet-highlight-rules.js | 30737 ++++++++++++++++ .../dependencies/ace-editor/mode-fleet.js | 35 + .../ace-editor/mode-powershell.js | 567 + .../assets/dependencies/ace-editor/mode-sh.js | 387 + .../dependencies/ace-editor/mode-sql.js | 221 + .../dependencies/ace-editor/theme-fleet.js | 195 + .../dependencies/ace-editor/worker-base.js | 1332 + .../images/icon-chevron-down-32x32@2x.png | Bin 0 -> 317 bytes .../images/icon-edit-software-16x16@2x.png | Bin 0 -> 524 bytes .../images/icon-external-link-12x12@2x.png | Bin 0 -> 519 bytes .../assets/images/icon-software-34x40@2x.png | Bin 0 -> 3184 bytes .../assets/images/software-icon-34x40@2x.png | Bin 0 -> 3184 bytes .../assets/js/cloud.setup.js | 2 +- .../js/components/ace-editor.component.js | 160 + .../js/components/file-upload.component.js | 41 +- .../assets/js/pages/software/software.page.js | 143 + .../components/file-upload.component.less | 1 - .../assets/styles/importer.less | 1 + .../styles/pages/software/software.less | 271 + .../config/env/production.js | 10 +- ee/bulk-operations-dashboard/config/routes.js | 7 +- ee/bulk-operations-dashboard/package.json | 4 +- .../scripts/test-file-upload.js | 464 + .../views/layouts/layout.ejs | 11 + .../views/pages/software/software.ejs | 200 + 36 files changed, 57046 insertions(+), 10 deletions(-) create mode 100644 ee/bulk-operations-dashboard/api/controllers/get-software.js create mode 100644 ee/bulk-operations-dashboard/api/controllers/software/delete-software.js create mode 100644 ee/bulk-operations-dashboard/api/controllers/software/download-software.js create mode 100644 ee/bulk-operations-dashboard/api/controllers/software/edit-software.js create mode 100644 ee/bulk-operations-dashboard/api/controllers/software/upload-software.js create mode 100644 ee/bulk-operations-dashboard/api/controllers/software/view-software.js create mode 100644 ee/bulk-operations-dashboard/api/models/UndeployedSoftware.js create mode 100644 ee/bulk-operations-dashboard/assets/dependencies/ace-editor/ace.js create mode 100644 ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-fleet-highlight-rules.js create mode 100644 ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-fleet.js create mode 100644 ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-powershell.js create mode 100644 ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-sh.js create mode 100644 ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-sql.js create mode 100644 ee/bulk-operations-dashboard/assets/dependencies/ace-editor/theme-fleet.js create mode 100644 ee/bulk-operations-dashboard/assets/dependencies/ace-editor/worker-base.js create mode 100644 ee/bulk-operations-dashboard/assets/images/icon-chevron-down-32x32@2x.png create mode 100644 ee/bulk-operations-dashboard/assets/images/icon-edit-software-16x16@2x.png create mode 100644 ee/bulk-operations-dashboard/assets/images/icon-external-link-12x12@2x.png create mode 100644 ee/bulk-operations-dashboard/assets/images/icon-software-34x40@2x.png create mode 100644 ee/bulk-operations-dashboard/assets/images/software-icon-34x40@2x.png create mode 100644 ee/bulk-operations-dashboard/assets/js/components/ace-editor.component.js create mode 100644 ee/bulk-operations-dashboard/assets/js/pages/software/software.page.js create mode 100644 ee/bulk-operations-dashboard/assets/styles/pages/software/software.less create mode 100644 ee/bulk-operations-dashboard/scripts/test-file-upload.js create mode 100644 ee/bulk-operations-dashboard/views/pages/software/software.ejs diff --git a/ee/bulk-operations-dashboard/.eslintrc b/ee/bulk-operations-dashboard/.eslintrc index 37e02b3724..f7696d7a04 100644 --- a/ee/bulk-operations-dashboard/.eslintrc +++ b/ee/bulk-operations-dashboard/.eslintrc @@ -41,7 +41,8 @@ // Models: "User": true, "UndeployedProfile": true, - "UndeployedScript": true + "UndeployedScript": true, + "UndeployedSoftware": true // …and any others. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ee/bulk-operations-dashboard/api/controllers/get-software.js b/ee/bulk-operations-dashboard/api/controllers/get-software.js new file mode 100644 index 0000000000..b490e5331d --- /dev/null +++ b/ee/bulk-operations-dashboard/api/controllers/get-software.js @@ -0,0 +1,109 @@ +module.exports = { + + + friendlyName: 'Get software', + + + description: 'Builds and returns an array of deployed software installers on the Fleet instance and undeployed software stored in the dashboard\'s datastore.', + + + exits: { + success: { + outputType: [{}], + } + }, + + + fn: async function () { + + let teamsResponseData = await sails.helpers.http.get.with({ + url: '/api/v1/fleet/teams', + baseUrl: sails.config.custom.fleetBaseUrl, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}` + } + }) + .timeout(120000) + .retry(['requestFailed', {name: 'TimeoutError'}]); + + let allTeams = teamsResponseData.teams; + let teams = []; + for(let team of allTeams) { + teams.push({ + fleetApid: team.id, + teamName: team.name, + }); + } + // Add the "team" for hosts with no team + teams.push({ + fleetApid: 0, + teamName: 'No team', + }); + + let allSoftware = []; + + let allSoftwareWithPackages = []; + let teamsinformationForSoftware = []; + let teamApids = _.pluck(teams, 'fleetApid'); + // Get all of the software packages on the Fleet instance. + for(let teamApid of teamApids){ + let configurationProfilesResponseData = await sails.helpers.http.get.with({ + url: `/api/latest/fleet/software/titles?team_id=${teamApid}`, + baseUrl: sails.config.custom.fleetBaseUrl, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}` + } + }) + .timeout(120000) + .retry(['requestFailed', {name: 'TimeoutError'}]); + let softwareForThisTeam = configurationProfilesResponseData.software_titles; + + let softwareWithSoftwarePackages = _.filter(softwareForThisTeam, (software)=>{ + return !_.isEmpty(software.software_package); + }); + for(let softwareWithInstaller of softwareWithSoftwarePackages) { + let softwareWithInstallerResponse = await sails.helpers.http.get.with({ + url: `/api/latest/fleet/software/titles/${softwareWithInstaller.id}?team_id=${teamApid}&available_for_install=true`, + baseUrl: sails.config.custom.fleetBaseUrl, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}` + } + }) + .timeout(120000) + .retry(['requestFailed', {name: 'TimeoutError'}]); + let packageInformation = softwareWithInstallerResponse.software_title.software_package; + let packageInfo = { + fleetApid: softwareWithInstaller.id, + name: packageInformation.name, + createdAt: new Date(packageInformation.uploaded_at).getTime(), + platform: _.endsWith(packageInformation.name, 'deb') ? 'Linux' : _.endsWith(packageInformation.name, 'pkg') ? 'macOS' : 'Windows', + preInstallQuery: packageInformation.pre_install_query, + installScript: packageInformation.install_script, + postInstallScript: packageInformation.post_install_script, + uninstallScript: packageInformation.uninstall_script, + teams: [], + }; + let teamInfo = { + softwareFleetApid: softwareWithInstaller.id, + fleetApid: teamApid, + teamName: _.find(teams, {fleetApid: teamApid}).teamName, + }; + teamsinformationForSoftware.push(teamInfo); + + allSoftware.push(packageInfo); + allSoftwareWithPackages.push(packageInfo); + } + } + for(let software of allSoftwareWithPackages) { + software.teams = _.where(teamsinformationForSoftware, {'softwareFleetApid': software.fleetApid}); + allSoftware.push(software); + } + allSoftware = _.uniq(allSoftware, 'fleetApid'); + let undeployedSoftware = await UndeployedSoftware.find(); + allSoftware = allSoftware.concat(undeployedSoftware); + return allSoftware; + + } + + +}; diff --git a/ee/bulk-operations-dashboard/api/controllers/software/delete-software.js b/ee/bulk-operations-dashboard/api/controllers/software/delete-software.js new file mode 100644 index 0000000000..c60f71e7ec --- /dev/null +++ b/ee/bulk-operations-dashboard/api/controllers/software/delete-software.js @@ -0,0 +1,46 @@ +module.exports = { + + + friendlyName: 'Delete software', + + + description: 'Deletes deployed software for all teams on a Fleet instance, or undeployed software in the app\'s database', + + inputs: { + software: { + type: {}, + description: 'The software that will be deleted.', + required: true, + } + }, + + + exits: { + + }, + + + fn: async function ({software}) { + // If the provided software does not have a teams array and has an ID, it is an undeployed software that will be deleted. + if(software.id && !software.teams){ + await sails.rm(sails.config.uploads.prefixForFileDeletion+software.uploadFd); + await UndeployedSoftware.destroy({id: software.id}); + } else {// Otherwise, this is a deployed software, and we'll use information from the teams array to remove the software. + for(let team of software.teams){ + await sails.helpers.http.sendHttpRequest.with({ + method: 'DELETE', + baseUrl: sails.config.custom.fleetBaseUrl, + url: `/api/v1/fleet/software/titles/${software.fleetApid}/available_for_install?team_id=${team.fleetApid}`, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + } + }); + } + } + // All done. + return; + + } + + +}; diff --git a/ee/bulk-operations-dashboard/api/controllers/software/download-software.js b/ee/bulk-operations-dashboard/api/controllers/software/download-software.js new file mode 100644 index 0000000000..c6b558f31f --- /dev/null +++ b/ee/bulk-operations-dashboard/api/controllers/software/download-software.js @@ -0,0 +1,74 @@ +module.exports = { + + + friendlyName: 'Download software', + + + description: 'Downloads a software installer for deployed or undeployed software.', + + + inputs: { + id: { + type: 'number', + description: 'The database ID of the undeployed software to download.' + }, + fleetApid: { + type: 'string', + description: 'The fleetApid of a software on a team.' + }, + teamApid: { + type: 'string', + description: 'The team API ID of a team that the software is deployed to.' + } + }, + + + exits: { + success: { + outputFriendlyName: 'File', + outputDescription: 'The streaming bytes of the file.', + outputType: 'ref' + }, + + notFound: { + description: 'No software exists with the specified ID.', + responseType: 'notFound' + }, + }, + + + fn: async function ({id, fleetApid, teamApid}) { + if(!fleetApid && !id){ + return this.res.badRequest(); + } + let downloading; + + if(id){ + let softwareToDownload = await UndeployedSoftware.findOne({id: id}); + downloading = await sails.startDownload(softwareToDownload.uploadFd, {bucket: sails.config.uploads.bucketWithPostfix}); + this.res.type(softwareToDownload.uploadMime); + this.res.attachment(softwareToDownload.name); + } else { + // Get information about the installer package from the Fleet server. + let packageInformation = await sails.helpers.http.get.with({ + url: `${sails.config.custom.fleetBaseUrl}/api/latest/fleet/software/titles/${fleetApid}?team_id=${teamApid}&available_for_install=true`, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + } + }); + let filename = packageInformation.software_title.software_package.name; + // [?]: https://fleetdm.com/docs/rest-api/rest-api#download-package + // GET /api/v1/fleet/software/titles/:software_title_id/package?team_id=${teamId} + downloading = await sails.helpers.http.getStream.with({ + url: `${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/titles/${fleetApid}/package?alt=media&team_id=${teamApid}`, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + } + }); + this.res.attachment(filename); + } + return downloading; + } + + +}; diff --git a/ee/bulk-operations-dashboard/api/controllers/software/edit-software.js b/ee/bulk-operations-dashboard/api/controllers/software/edit-software.js new file mode 100644 index 0000000000..4793c2f00e --- /dev/null +++ b/ee/bulk-operations-dashboard/api/controllers/software/edit-software.js @@ -0,0 +1,343 @@ +module.exports = { + + + friendlyName: 'Edit software', + + + description: 'Edits deployed software on a Fleet instance or undeployed software in the app\'s database', + + files: ['newSoftware'], + + inputs: { + newSoftware: { + type: 'ref', + description: 'The optional streaming bytes of a new software version.' + }, + newTeamIds: { + type: ['string'], + description: 'The new teams that this software will be deployed to.' + }, + software: { + type: {}, + description: 'The software that will be editted.' + }, + + preInstallQuery: { + type: 'string', + }, + + installScript: { + type: 'string', + }, + + postInstallScript: { + type: 'string', + }, + + uninstallScript: { + type: 'string', + }, + + }, + + + exits: { + wrongInstallerExtension: { + description: 'The provided replacement software\'s has the wrong extension.', + statusCode: 400, + }, + softwareUploadFailed: { + description: 'The software upload failed' + } + }, + + + fn: async function ({newSoftware, newTeamIds, software, preInstallQuery, installScript, postInstallScript, uninstallScript}) { + if(newSoftware.isNoop) { + newSoftware.noMoreFiles(); + newSoftware = undefined; + } + var WritableStream = require('stream').Writable; + // let { Readable } = require('stream'); + let axios = require('axios'); + // Cast the strings in the newTeamIds array to numbers. + newTeamIds = newTeamIds.map(Number); + let currentSoftwareTeamIds = _.pluck(software.teams, 'fleetApid'); + // If the teams have changed, or a new installer package was provided, we'll need to upload the package to an s3 bucket to deploy it to other teams. + if(_.xor(newTeamIds, currentSoftwareTeamIds).length !== 0 || newSoftware) { + let softwareFd; + let softwareName; + let softwareMime; + if(software.teams && !newSoftware) { + // console.log('Editing deployed software!'); + // This software is deployed. + // get software from Fleet instance and upload to s3. + let teamIdToGetInstallerFrom = software.teams[0].fleetApid; + let downloadApiUrl = `${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/titles/${software.fleetApid}/package?alt=media&team_id=${teamIdToGetInstallerFrom}`; + let softwareStream = await sails.helpers.http.getStream.with({ + url: downloadApiUrl, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + } + }); + let tempUploadedSoftware = await sails.uploadOne(softwareStream, {bucket: sails.config.uploads.bucketWithPostfix}); + softwareFd = tempUploadedSoftware.fd; + softwareName = software.name; + softwareMime = tempUploadedSoftware.type; + } else if(newSoftware) { + // If a new copy of the installer was uploaded, we'll + // console.log('replacing software package!'); + let uploadedSoftware = await sails.uploadOne(newSoftware, {bucket: sails.config.uploads.bucketWithPostfix}); + softwareFd = uploadedSoftware.fd; + softwareName = uploadedSoftware.filename; + softwareMime = uploadedSoftware.type; + let newSoftwareExtension = '.'+softwareName.split('.').pop(); + let existingSoftwareExtension = '.'+software.name.split('.').pop(); + if(newSoftwareExtension !== existingSoftwareExtension) { + await sails.rm(sails.config.uploads.prefixForFileDeletion+softwareFd); + throw {wrongInstallerExtension: `Couldn't edit ${software.name}. The selected package should be a ${existingSoftwareExtension} file`}; + } + } else { + // console.log('Editing undeployed software!'); + softwareFd = software.uploadFd; + softwareName = software.name; + softwareMime = software.uploadMime; + } + // Now apply the edits. + if(newTeamIds.length !== 0) { + let currentSoftwareTeamIds = _.pluck(software.teams, 'fleetApid') || []; + let addedTeams = _.difference(newTeamIds, currentSoftwareTeamIds); + let removedTeams = _.difference(currentSoftwareTeamIds, newTeamIds); + let unchangedTeamIds = _.difference(currentSoftwareTeamIds, removedTeams); + // for(let team of addedTeams) { + await sails.helpers.flow.simultaneouslyForEach(addedTeams, async (team)=>{ + // console.log(`transfering ${software.name} to fleet instance for team id ${team}`); + // Send an api request to send the file to the Fleet server for each added team. + await sails.cp(softwareFd, {bucket: sails.config.uploads.bucketWithPostfix}, + { + adapter: ()=>{ + return { + ls: undefined, + rm: undefined, + read: undefined, + receive: (unusedOpts)=>{ + // This `_write` method is invoked each time a new file is received + // from the Readable stream (Upstream) which is pumping filestreams + // into this receiver. (filename === `__newFile.filename`). + var receiver__ = WritableStream({ objectMode: true }); + // Create a new drain (writable stream) to send through the individual bytes of this file. + receiver__._write = (__newFile, encoding, doneWithThisFile)=>{ + + let FormData = require('form-data'); + let form = new FormData(); + form.append('team_id', team); + form.append('install_script', installScript); + form.append('post_install_script', postInstallScript); + form.append('pre_install_query', preInstallQuery); + form.append('uninstall_script', uninstallScript); + form.append('software', __newFile, { + filename: software.name, + contentType: 'application/octet-stream' + }); + (async ()=>{ + await axios.post(`${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/package`, form, { + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + ...form.getHeaders() + }, + }); + })() + .then(()=>{ + // console.log('ok supposedly a file is finished uploading'); + doneWithThisFile(); + }) + .catch((err)=>{ + doneWithThisFile(err); + }); + };//ƒ + return receiver__; + } + }; + }, + }) + .intercept((error)=>{ + // Note: with this current behavior, all errors from this upload are currently swallowed and a softwareUploadFailed response is returned. + // FUTURE: Test to make sure that uploading duplicate software to a team results in a 409 response. + return {'softwareUploadFailed': error}; + }); + // console.timeEnd(`transfering ${software.name} to fleet instance for team id ${team}`); + }); + // }// After every new team this is deployed to. + if(newSoftware) { + // If a new installer package was provided, send patch requests to update the installer package on teams that it is already deployed to. + await sails.helpers.flow.simultaneouslyForEach(unchangedTeamIds, async (teamApid)=>{ + // console.log(`Adding new version of ${softwareName} to teamId ${teamApid}`); + await sails.helpers.http.sendHttpRequest.with({ + method: 'DELETE', + baseUrl: sails.config.custom.fleetBaseUrl, + url: `/api/v1/fleet/software/titles/${software.fleetApid}/available_for_install?team_id=${teamApid}`, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + } + }); + // console.log(`transfering the changed installer ${software.name} to fleet instance for team id ${teamApid}`); + // console.time(`transfering ${software.name} to fleet instance for team id ${teamApid}`); + await sails.cp(softwareFd, {bucket: sails.config.uploads.bucketWithPostfix}, + { + adapter: ()=>{ + return { + ls: undefined, + rm: undefined, + read: undefined, + receive: (unusedOpts)=>{ + // This `_write` method is invoked each time a new file is received + // from the Readable stream (Upstream) which is pumping filestreams + // into this receiver. (filename === `__newFile.filename`). + var receiver__ = WritableStream({ objectMode: true }); + // Create a new drain (writable stream) to send through the individual bytes of this file. + receiver__._write = (__newFile, encoding, doneWithThisFile)=>{ + + let FormData = require('form-data'); + let form = new FormData(); + form.append('team_id', teamApid); + form.append('install_script', installScript); + form.append('post_install_script', postInstallScript); + form.append('pre_install_query', preInstallQuery); + form.append('uninstall_script', uninstallScript); + form.append('software', __newFile, { + filename: software.name, + contentType: 'application/octet-stream' + }); + (async ()=>{ + await axios.post(`${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/package`, form, { + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + ...form.getHeaders() + }, + }); + })() + .then(()=>{ + // console.log('ok supposedly a file is finished uploading'); + doneWithThisFile(); + }) + .catch((err)=>{ + doneWithThisFile(err); + }); + };//ƒ + return receiver__; + } + }; + }, + }) + .intercept((error)=>{ + // Note: with this current behavior, all errors from this upload are currently swallowed and a softwareUploadFailed response is returned. + // FUTURE: Test to make sure that uploading duplicate software to a team results in a 409 response. + return {'softwareUploadFailed': error}; + }); + // console.timeEnd(`transfering ${software.name} to fleet instance for team id ${teamApid}`); + });// After every team the software is currently deployed to. + } + // Now delete the software from teams it was removed from. + for(let team of removedTeams) { + await sails.helpers.http.sendHttpRequest.with({ + method: 'DELETE', + baseUrl: sails.config.custom.fleetBaseUrl, + url: `/api/v1/fleet/software/titles/${software.fleetApid}/available_for_install?team_id=${team}`, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + } + }); + } + // If the software had been previously undeployed, delete the installer in s3 and the db record. + if(software.id) { + await sails.rm(sails.config.uploads.prefixForFileDeletion+software.uploadFd); + await UndeployedSoftware.destroyOne({id: software.id}); + } + + } else if(software.teams && newTeamIds.length === 0) { + // If this is a deployed software that is being unassigned, save information about the uploaded file in our s3 bucket. + if(newSoftware) { + // remove the old copy. + // console.log('Removing old package for ',softwareName); + await UndeployedSoftware.create({ + uploadFd: softwareFd, + uploadMime: softwareMime, + name: softwareName, + platform: _.endsWith(softwareName, '.deb') ? 'Linux' : _.endsWith(softwareName, '.pkg') ? 'macOS' : 'Windows', + }); + } else { + // Save the information about the undeployed software in the app's DB. + await UndeployedSoftware.create({ + uploadFd: softwareFd, + uploadMime: softwareMime, + name: software.name, + platform: software.platform, + postInstallScript, + preInstallQuery, + installScript, + uninstallScript, + }); + // Now delete the software on the Fleet instance. + for(let team of software.teams) { + await sails.helpers.http.sendHttpRequest.with({ + method: 'DELETE', + baseUrl: sails.config.custom.fleetBaseUrl, + url: `/api/v1/fleet/software/titles/${software.fleetApid}/available_for_install?team_id=${team.fleetApid}`, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + } + }); + } + } + + } else { + // console.log('updating existing db record!'); + await UndeployedSoftware.updateOne({id: software.id}).set({ + name: softwareName, + uploadMime: softwareMime, + uploadFd: softwareFd, + }); + // console.log('removing old stored copy of '+softwareName); + await sails.rm(sails.config.uploads.prefixForFileDeletion+software.uploadFd); + } + } else if(preInstallQuery !== software.preInstallQuery || + installScript !== software.installScript || + postInstallScript !== software.postInstallScript || + uninstallScript !== software.uninstallScript) { + // PATCH /api/v1/fleet/software/titles/:title_id/package + if(newTeamIds.length !== 0) { + for(let teamApid of newTeamIds){ + await sails.helpers.http.sendHttpRequest.with({ + method: 'PATCH', + baseUrl: sails.config.custom.fleetBaseUrl, + url: `/api/v1/fleet/software/titles/${software.fleetApid}/package?team_id=${teamApid}`, + enctype: 'multipart/form-data', + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}` + }, + body: { + team_id: teamApid, // eslint-disable-line camelcase + pre_install_query: preInstallQuery, // eslint-disable-line camelcase + install_script: installScript, // eslint-disable-line camelcase + post_install_script: postInstallScript, // eslint-disable-line camelcase + uninstall_script: uninstallScript, // eslint-disable-line camelcase + } + }); + } + } else if(software.id) { + await UndeployedSoftware.updateOne({id: software.id}).set({ + preInstallQuery, + installScript, + postInstallScript, + uninstallScript, + }); + } + } + + + return; + + } + + +}; diff --git a/ee/bulk-operations-dashboard/api/controllers/software/upload-software.js b/ee/bulk-operations-dashboard/api/controllers/software/upload-software.js new file mode 100644 index 0000000000..25897ab1b4 --- /dev/null +++ b/ee/bulk-operations-dashboard/api/controllers/software/upload-software.js @@ -0,0 +1,111 @@ +module.exports = { + + + friendlyName: 'Upload software', + + + description: '', + + files: ['newSoftware'], + + inputs: { + newSoftware: { + type: 'ref', + description: 'An Upstream with an incoming file upload.', + required: true, + }, + + teams: { + type: ['string'], + description: 'An array of team IDs that this profile will be added to' + } + }, + + + exits: { + success: { + outputDescription: 'The new software has been uploaded', + outputType: {}, + }, + + softwareAlreadyExistsOnThisTeam: { + description: 'A software with this name already exists on the Fleet Instance', + statusCode: 409, + }, + + }, + + + fn: async function ({newSoftware, teams}) { + let uploadedSoftware; + if(!teams) { + uploadedSoftware = await sails.uploadOne(newSoftware, {bucket: sails.config.uploads.bucketWithPostfix}); + let datelessFilename = uploadedSoftware.filename.replace(/^\d{4}-\d{2}-\d{2}\s/, ''); + // Build a dictonary of information about this software to return to the softwares page. + let newSoftwareInfo = { + name: datelessFilename, + platform: _.endsWith(datelessFilename, '.deb') ? 'Linux' : _.endsWith(datelessFilename, '.pkg') ? 'macOS' : 'Windows', + createdAt: Date.now(), + uploadFd: uploadedSoftware.fd, + uploadMime: uploadedSoftware.type, + }; + await UndeployedSoftware.create(newSoftwareInfo); + } else { + for(let teamApid of teams) { + uploadedSoftware = await sails.uploadOne(newSoftware, {bucket: sails.config.uploads.bucketWithPostfix}); + var WritableStream = require('stream').Writable; + await sails.cp(uploadedSoftware.fd, {bucket: sails.config.uploads.bucketWithPostfix}, { + adapter: ()=>{ + return { + ls: undefined, + rm: undefined, + read: undefined, + receive: (unusedOpts)=>{ + // This `_write` method is invoked each time a new file is received + // from the Readable stream (Upstream) which is pumping filestreams + // into this receiver. (filename === `__newFile.filename`). + var receiver__ = WritableStream({ objectMode: true }); + // Create a new drain (writable stream) to send through the individual bytes of this file. + receiver__._write = (__newFile, encoding, doneWithThisFile)=>{ + let axios = require('axios'); + let FormData = require('form-data'); + let form = new FormData(); + form.append('team_id', teamApid); + form.append('software', __newFile, { + filename: uploadedSoftware.filename, + contentType: 'application/octet-stream' + }); + (async ()=>{ + await axios.post(`${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/package`, form, { + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + ...form.getHeaders() + }, + }); + })() + .then(()=>{ + // console.log('ok supposedly a file is finished uploading'); + doneWithThisFile(); + }) + .catch((err)=>{ + doneWithThisFile(err); + }); + };//ƒ + return receiver__; + } + }; + } + }) + .intercept({response: {status: 409}}, (error)=>{ + return {'softwareAlreadyExistsOnThisTeam': error}; + }); + } + // Remove the file from the s3 bucket after it has been sent to the Fleet server. + await sails.rm(sails.config.uploads.prefixForFileDeletion+uploadedSoftware.fd); + } + return; + + } + + +}; diff --git a/ee/bulk-operations-dashboard/api/controllers/software/view-software.js b/ee/bulk-operations-dashboard/api/controllers/software/view-software.js new file mode 100644 index 0000000000..8a8a8ccb5e --- /dev/null +++ b/ee/bulk-operations-dashboard/api/controllers/software/view-software.js @@ -0,0 +1,112 @@ +module.exports = { + + + friendlyName: 'View software', + + + description: 'Display "Software" page.', + + + exits: { + + success: { + viewTemplatePath: 'pages/software/software' + } + + }, + + + fn: async function () { + let teamsResponseData = await sails.helpers.http.get.with({ + url: '/api/v1/fleet/teams', + baseUrl: sails.config.custom.fleetBaseUrl, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}` + } + }) + .timeout(120000) + .retry(['requestFailed', {name: 'TimeoutError'}]); + + let allTeams = teamsResponseData.teams; + let teams = []; + for(let team of allTeams) { + teams.push({ + fleetApid: team.id, + teamName: team.name, + }); + } + // Add the "team" for hosts with no team + teams.push({ + fleetApid: 0, + teamName: 'No team', + }); + let allSoftware = []; + let allSoftwareWithPackages = []; + let teamsinformationForSoftware = []; + let teamApids = _.pluck(teams, 'fleetApid'); + // Get all of the software packages on the Fleet instance. + for(let teamApid of teamApids){ + let configurationProfilesResponseData = await sails.helpers.http.get.with({ + url: `/api/latest/fleet/software/titles?team_id=${teamApid}`, + baseUrl: sails.config.custom.fleetBaseUrl, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}` + } + }) + .timeout(120000) + .retry(['requestFailed', {name: 'TimeoutError'}]); + let softwareForThisTeam = configurationProfilesResponseData.software_titles; + + let softwareWithSoftwarePackages = _.filter(softwareForThisTeam, (software)=>{ + return !_.isEmpty(software.software_package); + }); + for(let softwareWithInstaller of softwareWithSoftwarePackages) { + let softwareWithInstallerResponse = await sails.helpers.http.get.with({ + url: `/api/latest/fleet/software/titles/${softwareWithInstaller.id}?team_id=${teamApid}&available_for_install=true`, + baseUrl: sails.config.custom.fleetBaseUrl, + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}` + } + }) + .timeout(120000) + .retry(['requestFailed', {name: 'TimeoutError'}]); + let packageInformation = softwareWithInstallerResponse.software_title.software_package; + if(!packageInformation){ console.log('skipping a softwareWithInstallerResponse', softwareWithInstallerResponse); continue;} + let packageInfo = { + fleetApid: softwareWithInstaller.id, + name: packageInformation.name, + createdAt: new Date(packageInformation.uploaded_at).getTime(), + platform: _.endsWith(packageInformation.name, 'deb') ? 'Linux' : _.endsWith(packageInformation.name, 'pkg') ? 'macOS' : 'Windows', + preInstallQuery: packageInformation.pre_install_query, + installScript: packageInformation.install_script, + postInstallScript: packageInformation.post_install_script, + uninstallScript: packageInformation.uninstall_script, + teams: [], + }; + let teamInfo = { + softwareFleetApid: softwareWithInstaller.id, + fleetApid: teamApid, + teamName: _.find(teams, {fleetApid: teamApid}).teamName, + }; + teamsinformationForSoftware.push(teamInfo); + + allSoftware.push(packageInfo); + allSoftwareWithPackages.push(packageInfo); + } + } + // console.log(teamsinformationForSoftware); + for(let software of allSoftwareWithPackages) { + software.teams = _.where(teamsinformationForSoftware, {'softwareFleetApid': software.fleetApid}); + // console.log(software) + allSoftware.push(software); + } + allSoftware = _.uniq(allSoftware, 'fleetApid'); + let undeployedSoftware = await UndeployedSoftware.find(); + allSoftware = allSoftware.concat(undeployedSoftware); + + return {software: allSoftware, teams}; + + } + + +}; diff --git a/ee/bulk-operations-dashboard/api/hooks/custom/index.js b/ee/bulk-operations-dashboard/api/hooks/custom/index.js index be391d7097..f9207c867e 100644 --- a/ee/bulk-operations-dashboard/api/hooks/custom/index.js +++ b/ee/bulk-operations-dashboard/api/hooks/custom/index.js @@ -67,7 +67,7 @@ module.exports = function defineCustomHook(sails) { sails.config.custom.fleetBaseUrl = _.trimRight(sails.config.custom.fleetBaseUrl, '/'); sails.log.warn('Warning: The provided sails.config.custom.fleetBaseUrl has a trailing slash. To make sure all auto-generated URLs work as expected, this trailing slash has been removed for you.'); } - if (!_.startsWith(sails.config.custom.fleetBaseUrl, 'https://')) { + if (!_.startsWith(sails.config.custom.fleetBaseUrl, 'https://') && !_.startsWith(sails.config.custom.fleetBaseUrl, 'http://')) { sails.log.warn('Warning: The provided sails.config.custom.fleetBaseUrl is missing a protocol (https://). To make sure all auto-generated URLs work as expected, the protocol has been added to the fleetBaseUrl.'); sails.config.custom.fleetBaseUrl = 'https://'+sails.config.custom.fleetBaseUrl; } diff --git a/ee/bulk-operations-dashboard/api/models/UndeployedSoftware.js b/ee/bulk-operations-dashboard/api/models/UndeployedSoftware.js new file mode 100644 index 0000000000..0896fabf85 --- /dev/null +++ b/ee/bulk-operations-dashboard/api/models/UndeployedSoftware.js @@ -0,0 +1,77 @@ +/** + * UndeployedSoftware.js + * + * @description :: A model definition represents a database table/collection. + * @docs :: https://sailsjs.com/docs/concepts/models-and-orm/models + */ + +module.exports = { + + attributes: { + + // ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦ ╦╔═╗╔═╗ + // ╠═╝╠╦╝║║║║║ ║ ║╚╗╔╝║╣ ╚═╗ + // ╩ ╩╚═╩╩ ╩╩ ╩ ╩ ╚╝ ╚═╝╚═╝ + name: { + type: 'string', + required: true, + description: 'The filename of the software installer package.', + }, + + platform: { + type: 'string', + description: 'The type of operating system this software installer is for.', + required: true, + isIn: [ + 'macOS', + 'Linux', + 'Windows' + ], + }, + + uploadMime: { + type: 'string', + defaultsTo: '', + description: 'The mime type of the uploaded software installer' + }, + + uploadFd: { + type: 'string', + defaultsTo: '', + description: 'The file descriptor of the installer file.' + }, + + preInstallQuery: { + type: 'string', + defaultsTo: '', + }, + + installScript: { + type: 'string', + defaultsTo: '', + }, + + postInstallScript: { + type: 'string', + defaultsTo: '', + }, + + uninstallScript: { + type: 'string', + defaultsTo: '', + }, + + + // ╔═╗╔╦╗╔╗ ╔═╗╔╦╗╔═╗ + // ║╣ ║║║╠╩╗║╣ ║║╚═╗ + // ╚═╝╩ ╩╚═╝╚═╝═╩╝╚═╝ + + + // ╔═╗╔═╗╔═╗╔═╗╔═╗╦╔═╗╔╦╗╦╔═╗╔╗╔╔═╗ + // ╠═╣╚═╗╚═╗║ ║║ ║╠═╣ ║ ║║ ║║║║╚═╗ + // ╩ ╩╚═╝╚═╝╚═╝╚═╝╩╩ ╩ ╩ ╩╚═╝╝╚╝╚═╝ + + }, + +}; + diff --git a/ee/bulk-operations-dashboard/assets/.eslintrc b/ee/bulk-operations-dashboard/assets/.eslintrc index 28cf2eb151..cdf7c77808 100644 --- a/ee/bulk-operations-dashboard/assets/.eslintrc +++ b/ee/bulk-operations-dashboard/assets/.eslintrc @@ -46,6 +46,7 @@ "Vue": true, "VueRouter": true, "moment": true, + "ace": true, // "google": true, // ...etc. // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/ace.js b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/ace.js new file mode 100644 index 0000000000..114ffde01a --- /dev/null +++ b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/ace.js @@ -0,0 +1,21389 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +/** + * Define a module along with a payload + * @param module a name for the payload + * @param payload a function to call with (require, exports, module) params + */ + +(function() { + +var ACE_NAMESPACE = "ace"; + +var global = (function() { return this; })(); +if (!global && typeof window != "undefined") global = window; // strict mode + + +if (!ACE_NAMESPACE && typeof requirejs !== "undefined") + return; + + +var define = function(module, deps, payload) { + if (typeof module !== "string") { + if (define.original) + define.original.apply(this, arguments); + else { + console.error("dropping module because define wasn\'t a string."); + console.trace(); + } + return; + } + if (arguments.length == 2) + payload = deps; + if (!define.modules[module]) { + define.payloads[module] = payload; + define.modules[module] = null; + } +}; + +define.modules = {}; +define.payloads = {}; + +/** + * Get at functionality define()ed using the function above + */ +var _require = function(parentId, module, callback) { + if (typeof module === "string") { + var payload = lookup(parentId, module); + if (payload != undefined) { + callback && callback(); + return payload; + } + } else if (Object.prototype.toString.call(module) === "[object Array]") { + var params = []; + for (var i = 0, l = module.length; i < l; ++i) { + var dep = lookup(parentId, module[i]); + if (dep == undefined && require.original) + return; + params.push(dep); + } + return callback && callback.apply(null, params) || true; + } +}; + +var require = function(module, callback) { + var packagedModule = _require("", module, callback); + if (packagedModule == undefined && require.original) + return require.original.apply(this, arguments); + return packagedModule; +}; + +var normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + moduleName = base + "/" + moduleName; + + while(moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + return moduleName; +}; + +/** + * Internal function to lookup moduleNames and resolve them by calling the + * definition function if needed. + */ +var lookup = function(parentId, moduleName) { + moduleName = normalizeModule(parentId, moduleName); + + var module = define.modules[moduleName]; + if (!module) { + module = define.payloads[moduleName]; + if (typeof module === 'function') { + var exports = {}; + var mod = { + id: moduleName, + uri: '', + exports: exports, + packaged: true + }; + + var req = function(module, callback) { + return _require(moduleName, module, callback); + }; + + var returnValue = module(req, exports, mod); + exports = returnValue || mod.exports; + define.modules[moduleName] = exports; + delete define.payloads[moduleName]; + } + module = define.modules[moduleName] = exports || module; + } + return module; +}; + +function exportAce(ns) { + var root = global; + if (ns) { + if (!global[ns]) + global[ns] = {}; + root = global[ns]; + } + + if (!root.define || !root.define.packaged) { + define.original = root.define; + root.define = define; + root.define.packaged = true; + } + + if (!root.require || !root.require.packaged) { + require.original = root.require; + root.require = require; + root.require.packaged = true; + } +} + +exportAce(ACE_NAMESPACE); + +})(); + +ace.define("ace/lib/es6-shim",["require","exports","module"], function(require, exports, module){function defineProp(obj, name, val) { + Object.defineProperty(obj, name, { + value: val, + enumerable: false, + writable: true, + configurable: true + }); +} +if (!String.prototype.startsWith) { + defineProp(String.prototype, "startsWith", function (searchString, position) { + position = position || 0; + return this.lastIndexOf(searchString, position) === position; + }); +} +if (!String.prototype.endsWith) { + defineProp(String.prototype, "endsWith", function (searchString, position) { + var subjectString = this; + if (position === undefined || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }); +} +if (!String.prototype.repeat) { + defineProp(String.prototype, "repeat", function (count) { + var result = ""; + var string = this; + while (count > 0) { + if (count & 1) + result += string; + if ((count >>= 1)) + string += string; + } + return result; + }); +} +if (!String.prototype.includes) { + defineProp(String.prototype, "includes", function (str, position) { + return this.indexOf(str, position) != -1; + }); +} +if (!Object.assign) { + Object.assign = function (target) { + if (target === undefined || target === null) { + throw new TypeError("Cannot convert undefined or null to object"); + } + var output = Object(target); + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + if (source !== undefined && source !== null) { + Object.keys(source).forEach(function (key) { + output[key] = source[key]; + }); + } + } + return output; + }; +} +if (!Object.values) { + Object.values = function (o) { + return Object.keys(o).map(function (k) { + return o[k]; + }); + }; +} +if (!Array.prototype.find) { + defineProp(Array.prototype, "find", function (predicate) { + var len = this.length; + var thisArg = arguments[1]; + for (var k = 0; k < len; k++) { + var kValue = this[k]; + if (predicate.call(thisArg, kValue, k, this)) { + return kValue; + } + } + }); +} +if (!Array.prototype.findIndex) { + defineProp(Array.prototype, "findIndex", function (predicate) { + var len = this.length; + var thisArg = arguments[1]; + for (var k = 0; k < len; k++) { + var kValue = this[k]; + if (predicate.call(thisArg, kValue, k, this)) { + return k; + } + } + }); +} +if (!Array.prototype.includes) { + defineProp(Array.prototype, "includes", function (item, position) { + return this.indexOf(item, position) != -1; + }); +} +if (!Array.prototype.fill) { + defineProp(Array.prototype, "fill", function (value) { + var O = this; + var len = O.length >>> 0; + var start = arguments[1]; + var relativeStart = start >> 0; + var k = relativeStart < 0 + ? Math.max(len + relativeStart, 0) + : Math.min(relativeStart, len); + var end = arguments[2]; + var relativeEnd = end === undefined ? len : end >> 0; + var final = relativeEnd < 0 + ? Math.max(len + relativeEnd, 0) + : Math.min(relativeEnd, len); + while (k < final) { + O[k] = value; + k++; + } + return O; + }); +} +if (!Array.of) { + defineProp(Array, "of", function () { + return Array.prototype.slice.call(arguments); + }); +} + +}); + +ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/es6-shim"], function(require, exports, module){// vim:set ts=4 sts=4 sw=4 st: +"use strict"; +require("./es6-shim"); + +}); + +ace.define("ace/lib/deep_copy",["require","exports","module"], function(require, exports, module){exports.deepCopy = function deepCopy(obj) { + if (typeof obj !== "object" || !obj) + return obj; + var copy; + if (Array.isArray(obj)) { + copy = []; + for (var key = 0; key < obj.length; key++) { + copy[key] = deepCopy(obj[key]); + } + return copy; + } + if (Object.prototype.toString.call(obj) !== "[object Object]") + return obj; + copy = {}; + for (var key in obj) + copy[key] = deepCopy(obj[key]); + return copy; +}; + +}); + +ace.define("ace/lib/lang",["require","exports","module","ace/lib/deep_copy"], function(require, exports, module){"use strict"; +exports.last = function (a) { + return a[a.length - 1]; +}; +exports.stringReverse = function (string) { + return string.split("").reverse().join(""); +}; +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + if (count >>= 1) + string += string; + } + return result; +}; +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; +exports.copyObject = function (obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; +exports.copyArray = function (array) { + var copy = []; + for (var i = 0, l = array.length; i < l; i++) { + if (array[i] && typeof array[i] == "object") + copy[i] = this.copyObject(array[i]); + else + copy[i] = array[i]; + } + return copy; +}; +exports.deepCopy = require("./deep_copy").deepCopy; +exports.arrayToMap = function (arr) { + var map = {}; + for (var i = 0; i < arr.length; i++) { + map[arr[i]] = 1; + } + return map; +}; +exports.createMap = function (props) { + var map = Object.create(null); + for (var i in props) { + map[i] = props[i]; + } + return map; +}; +exports.arrayRemove = function (array, value) { + for (var i = 0; i <= array.length; i++) { + if (value === array[i]) { + array.splice(i, 1); + } + } +}; +exports.escapeRegExp = function (str) { + return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1'); +}; +exports.escapeHTML = function (str) { + return ("" + str).replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/ 0xffff ? 2 : 1; +}; + +}); + +ace.define("ace/lib/useragent",["require","exports","module"], function(require, exports, module){"use strict"; +exports.OS = { + LINUX: "LINUX", + MAC: "MAC", + WINDOWS: "WINDOWS" +}; +exports.getOS = function () { + if (exports.isMac) { + return exports.OS.MAC; + } + else if (exports.isLinux) { + return exports.OS.LINUX; + } + else { + return exports.OS.WINDOWS; + } +}; +var _navigator = typeof navigator == "object" ? navigator : {}; +var os = (/mac|win|linux/i.exec(_navigator.platform) || ["other"])[0].toLowerCase(); +var ua = _navigator.userAgent || ""; +var appName = _navigator.appName || ""; +exports.isWin = (os == "win"); +exports.isMac = (os == "mac"); +exports.isLinux = (os == "linux"); +exports.isIE = + (appName == "Microsoft Internet Explorer" || appName.indexOf("MSAppHost") >= 0) + ? parseFloat((ua.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/) || [])[1]) + : parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/) || [])[1]); // for ie +exports.isOldIE = exports.isIE && exports.isIE < 9; +exports.isGecko = exports.isMozilla = ua.match(/ Gecko\/\d+/); +exports.isOpera = typeof opera == "object" && Object.prototype.toString.call(window["opera"]) == "[object Opera]"; +exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined; +exports.isChrome = parseFloat(ua.split(" Chrome/")[1]) || undefined; +exports.isSafari = parseFloat(ua.split(" Safari/")[1]) && !exports.isChrome || undefined; +exports.isEdge = parseFloat(ua.split(" Edge/")[1]) || undefined; +exports.isAIR = ua.indexOf("AdobeAIR") >= 0; +exports.isAndroid = ua.indexOf("Android") >= 0; +exports.isChromeOS = ua.indexOf(" CrOS ") >= 0; +exports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window["MSStream"]; +if (exports.isIOS) + exports.isMac = true; +exports.isMobile = exports.isIOS || exports.isAndroid; + +}); + +ace.define("ace/lib/dom",["require","exports","module","ace/lib/useragent"], function(require, exports, module){"use strict"; +var useragent = require("./useragent"); +var XHTML_NS = "http://www.w3.org/1999/xhtml"; +exports.buildDom = function buildDom(arr, parent, refs) { + if (typeof arr == "string" && arr) { + var txt = document.createTextNode(arr); + if (parent) + parent.appendChild(txt); + return txt; + } + if (!Array.isArray(arr)) { + if (arr && arr.appendChild && parent) + parent.appendChild(arr); + return arr; + } + if (typeof arr[0] != "string" || !arr[0]) { + var els = []; + for (var i = 0; i < arr.length; i++) { + var ch = buildDom(arr[i], parent, refs); + ch && els.push(ch); + } + return els; + } + var el = document.createElement(arr[0]); + var options = arr[1]; + var childIndex = 1; + if (options && typeof options == "object" && !Array.isArray(options)) + childIndex = 2; + for (var i = childIndex; i < arr.length; i++) + buildDom(arr[i], el, refs); + if (childIndex == 2) { + Object.keys(options).forEach(function (n) { + var val = options[n]; + if (n === "class") { + el.className = Array.isArray(val) ? val.join(" ") : val; + } + else if (typeof val == "function" || n == "value" || n[0] == "$") { + el[n] = val; + } + else if (n === "ref") { + if (refs) + refs[val] = el; + } + else if (n === "style") { + if (typeof val == "string") + el.style.cssText = val; + } + else if (val != null) { + el.setAttribute(n, val); + } + }); + } + if (parent) + parent.appendChild(el); + return el; +}; +exports.getDocumentHead = function (doc) { + if (!doc) + doc = document; + return doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement; +}; +exports.createElement = function (tag, ns) { + return document.createElementNS ? + document.createElementNS(ns || XHTML_NS, tag) : + document.createElement(tag); +}; +exports.removeChildren = function (element) { + element.innerHTML = ""; +}; +exports.createTextNode = function (textContent, element) { + var doc = element ? element.ownerDocument : document; + return doc.createTextNode(textContent); +}; +exports.createFragment = function (element) { + var doc = element ? element.ownerDocument : document; + return doc.createDocumentFragment(); +}; +exports.hasCssClass = function (el, name) { + var classes = (el.className + "").split(/\s+/g); + return classes.indexOf(name) !== -1; +}; +exports.addCssClass = function (el, name) { + if (!exports.hasCssClass(el, name)) { + el.className += " " + name; + } +}; +exports.removeCssClass = function (el, name) { + var classes = el.className.split(/\s+/g); + while (true) { + var index = classes.indexOf(name); + if (index == -1) { + break; + } + classes.splice(index, 1); + } + el.className = classes.join(" "); +}; +exports.toggleCssClass = function (el, name) { + var classes = el.className.split(/\s+/g), add = true; + while (true) { + var index = classes.indexOf(name); + if (index == -1) { + break; + } + add = false; + classes.splice(index, 1); + } + if (add) + classes.push(name); + el.className = classes.join(" "); + return add; +}; +exports.setCssClass = function (node, className, include) { + if (include) { + exports.addCssClass(node, className); + } + else { + exports.removeCssClass(node, className); + } +}; +exports.hasCssString = function (id, doc) { + var index = 0, sheets; + doc = doc || document; + if ((sheets = doc.querySelectorAll("style"))) { + while (index < sheets.length) { + if (sheets[index++].id === id) { + return true; + } + } + } +}; +exports.removeElementById = function (id, doc) { + doc = doc || document; + if (doc.getElementById(id)) { + doc.getElementById(id).remove(); + } +}; +var strictCSP; +var cssCache = []; +exports.useStrictCSP = function (value) { + strictCSP = value; + if (value == false) + insertPendingStyles(); + else if (!cssCache) + cssCache = []; +}; +function insertPendingStyles() { + var cache = cssCache; + cssCache = null; + cache && cache.forEach(function (item) { + importCssString(item[0], item[1]); + }); +} +function importCssString(cssText, id, target) { + if (typeof document == "undefined") + return; + if (cssCache) { + if (target) { + insertPendingStyles(); + } + else if (target === false) { + return cssCache.push([cssText, id]); + } + } + if (strictCSP) + return; + var container = target; + if (!target || !target.getRootNode) { + container = document; + } + else { + container = target.getRootNode(); + if (!container || container == target) + container = document; + } + var doc = container.ownerDocument || container; + if (id && exports.hasCssString(id, container)) + return null; + if (id) + cssText += "\n/*# sourceURL=ace/css/" + id + " */"; + var style = exports.createElement("style"); + style.appendChild(doc.createTextNode(cssText)); + if (id) + style.id = id; + if (container == doc) + container = exports.getDocumentHead(doc); + container.insertBefore(style, container.firstChild); +} +exports.importCssString = importCssString; +exports.importCssStylsheet = function (uri, doc) { + exports.buildDom(["link", { rel: "stylesheet", href: uri }], exports.getDocumentHead(doc)); +}; +exports.scrollbarWidth = function (doc) { + var inner = exports.createElement("ace_inner"); + inner.style.width = "100%"; + inner.style.minWidth = "0px"; + inner.style.height = "200px"; + inner.style.display = "block"; + var outer = exports.createElement("ace_outer"); + var style = outer.style; + style.position = "absolute"; + style.left = "-10000px"; + style.overflow = "hidden"; + style.width = "200px"; + style.minWidth = "0px"; + style.height = "150px"; + style.display = "block"; + outer.appendChild(inner); + var body = (doc && doc.documentElement) || (document && document.documentElement); + if (!body) + return 0; + body.appendChild(outer); + var noScrollbar = inner.offsetWidth; + style.overflow = "scroll"; + var withScrollbar = inner.offsetWidth; + if (noScrollbar === withScrollbar) { + withScrollbar = outer.clientWidth; + } + body.removeChild(outer); + return noScrollbar - withScrollbar; +}; +exports.computedStyle = function (element, style) { + return window.getComputedStyle(element, "") || {}; +}; +exports.setStyle = function (styles, property, value) { + if (styles[property] !== value) { + styles[property] = value; + } +}; +exports.HAS_CSS_ANIMATION = false; +exports.HAS_CSS_TRANSFORMS = false; +exports.HI_DPI = useragent.isWin + ? typeof window !== "undefined" && window.devicePixelRatio >= 1.5 + : true; +if (useragent.isChromeOS) + exports.HI_DPI = false; +if (typeof document !== "undefined") { + var div = document.createElement("div"); + if (exports.HI_DPI && div.style.transform !== undefined) + exports.HAS_CSS_TRANSFORMS = true; + if (!useragent.isEdge && typeof div.style.animationName !== "undefined") + exports.HAS_CSS_ANIMATION = true; + div = null; +} +if (exports.HAS_CSS_TRANSFORMS) { + exports.translate = function (element, tx, ty) { + element.style.transform = "translate(" + Math.round(tx) + "px, " + Math.round(ty) + "px)"; + }; +} +else { + exports.translate = function (element, tx, ty) { + element.style.top = Math.round(ty) + "px"; + element.style.left = Math.round(tx) + "px"; + }; +} + +}); + +ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"], function(require, exports, module){/* + * based on code from: + * + * @license RequireJS text 0.25.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/requirejs for details + */ +"use strict"; +var dom = require("./dom"); +exports.get = function (url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + callback(xhr.responseText); + } + }; + xhr.send(null); +}; +exports.loadScript = function (path, callback) { + var head = dom.getDocumentHead(); + var s = document.createElement('script'); + s.src = path; + head.appendChild(s); + s.onload = s.onreadystatechange = function (_, isAbort) { + if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") { + s = s.onload = s.onreadystatechange = null; + if (!isAbort) + callback(); + } + }; +}; +exports.qualifyURL = function (url) { + var a = document.createElement('a'); + a.href = url; + return a.href; +}; + +}); + +ace.define("ace/lib/oop",["require","exports","module"], function(require, exports, module){"use strict"; +exports.inherits = function (ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; +exports.mixin = function (obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; +exports.implement = function (proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +ace.define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module){"use strict"; +var EventEmitter = {}; +var stopPropagation = function () { this.propagationStopped = true; }; +var preventDefault = function () { this.defaultPrevented = true; }; +EventEmitter._emit = + EventEmitter._dispatchEvent = function (eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + if (typeof e != "object" || !e) + e = {}; + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + listeners = listeners.slice(); + for (var i = 0; i < listeners.length; i++) { + listeners[i](e, this); + if (e.propagationStopped) + break; + } + if (defaultHandler && !e.defaultPrevented) + return defaultHandler(e, this); + }; +EventEmitter._signal = function (eventName, e) { + var listeners = (this._eventRegistry || {})[eventName]; + if (!listeners) + return; + listeners = listeners.slice(); + for (var i = 0; i < listeners.length; i++) + listeners[i](e, this); +}; +EventEmitter.once = function (eventName, callback) { + var _self = this; + this.on(eventName, function newCallback() { + _self.off(eventName, newCallback); + callback.apply(null, arguments); + }); + if (!callback) { + return new Promise(function (resolve) { + callback = resolve; + }); + } +}; +EventEmitter.setDefaultHandler = function (eventName, callback) { + var handlers = this._defaultHandlers; + if (!handlers) + handlers = this._defaultHandlers = { _disabled_: {} }; + if (handlers[eventName]) { + var old = handlers[eventName]; + var disabled = handlers._disabled_[eventName]; + if (!disabled) + handlers._disabled_[eventName] = disabled = []; + disabled.push(old); + var i = disabled.indexOf(callback); + if (i != -1) + disabled.splice(i, 1); + } + handlers[eventName] = callback; +}; +EventEmitter.removeDefaultHandler = function (eventName, callback) { + var handlers = this._defaultHandlers; + if (!handlers) + return; + var disabled = handlers._disabled_[eventName]; + if (handlers[eventName] == callback) { + if (disabled) + this.setDefaultHandler(eventName, disabled.pop()); + } + else if (disabled) { + var i = disabled.indexOf(callback); + if (i != -1) + disabled.splice(i, 1); + } +}; +EventEmitter.on = + EventEmitter.addEventListener = function (eventName, callback, capturing) { + this._eventRegistry = this._eventRegistry || {}; + var listeners = this._eventRegistry[eventName]; + if (!listeners) + listeners = this._eventRegistry[eventName] = []; + if (listeners.indexOf(callback) == -1) + listeners[capturing ? "unshift" : "push"](callback); + return callback; + }; +EventEmitter.off = + EventEmitter.removeListener = + EventEmitter.removeEventListener = function (eventName, callback) { + this._eventRegistry = this._eventRegistry || {}; + var listeners = this._eventRegistry[eventName]; + if (!listeners) + return; + var index = listeners.indexOf(callback); + if (index !== -1) + listeners.splice(index, 1); + }; +EventEmitter.removeAllListeners = function (eventName) { + if (!eventName) + this._eventRegistry = this._defaultHandlers = undefined; + if (this._eventRegistry) + this._eventRegistry[eventName] = undefined; + if (this._defaultHandlers) + this._defaultHandlers[eventName] = undefined; +}; +exports.EventEmitter = EventEmitter; + +}); + +ace.define("ace/lib/report_error",["require","exports","module"], function(require, exports, module){exports.reportError = function reportError(msg, data) { + var e = new Error(msg); + e["data"] = data; + if (typeof console == "object" && console.error) + console.error(e); + setTimeout(function () { throw e; }); +}; + +}); + +ace.define("ace/lib/default_english_messages",["require","exports","module"], function(require, exports, module){var defaultEnglishMessages = { + "autocomplete.popup.aria-roledescription": "Autocomplete suggestions", + "autocomplete.popup.aria-label": "Autocomplete suggestions", + "autocomplete.popup.item.aria-roledescription": "item", + "autocomplete.loading": "Loading...", + "editor.scroller.aria-roledescription": "editor", + "editor.scroller.aria-label": "Editor content, press Enter to start editing, press Escape to exit", + "editor.gutter.aria-roledescription": "editor", + "editor.gutter.aria-label": "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit", + "error-marker.good-state": "Looks good!", + "prompt.recently-used": "Recently used", + "prompt.other-commands": "Other commands", + "prompt.no-matching-commands": "No matching commands", + "search-box.find.placeholder": "Search for", + "search-box.find-all.text": "All", + "search-box.replace.placeholder": "Replace with", + "search-box.replace-next.text": "Replace", + "search-box.replace-all.text": "All", + "search-box.toggle-replace.title": "Toggle Replace mode", + "search-box.toggle-regexp.title": "RegExp Search", + "search-box.toggle-case.title": "CaseSensitive Search", + "search-box.toggle-whole-word.title": "Whole Word Search", + "search-box.toggle-in-selection.title": "Search In Selection", + "search-box.search-counter": "$0 of $1", + "text-input.aria-roledescription": "editor", + "text-input.aria-label": "Cursor at row $0", + "gutter.code-folding.range.aria-label": "Toggle code folding, rows $0 through $1", + "gutter.code-folding.closed.aria-label": "Toggle code folding, rows $0 through $1", + "gutter.code-folding.open.aria-label": "Toggle code folding, row $0", + "gutter.code-folding.closed.title": "Unfold code", + "gutter.code-folding.open.title": "Fold code", + "gutter.annotation.aria-label.error": "Error, read annotations row $0", + "gutter.annotation.aria-label.warning": "Warning, read annotations row $0", + "gutter.annotation.aria-label.info": "Info, read annotations row $0", + "inline-fold.closed.title": "Unfold code", + "gutter-tooltip.aria-label.error.singular": "error", + "gutter-tooltip.aria-label.error.plural": "errors", + "gutter-tooltip.aria-label.warning.singular": "warning", + "gutter-tooltip.aria-label.warning.plural": "warnings", + "gutter-tooltip.aria-label.info.singular": "information message", + "gutter-tooltip.aria-label.info.plural": "information messages", + "gutter.annotation.aria-label.security": "Security finding, read annotations row $0", + "gutter.annotation.aria-label.hint": "Suggestion, read annotations row $0", + "gutter-tooltip.aria-label.security.singular": "security finding", + "gutter-tooltip.aria-label.security.plural": "security findings", + "gutter-tooltip.aria-label.hint.singular": "suggestion", + "gutter-tooltip.aria-label.hint.plural": "suggestions" +}; +exports.defaultEnglishMessages = defaultEnglishMessages; + +}); + +ace.define("ace/lib/app_config",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/report_error","ace/lib/default_english_messages"], function(require, exports, module){"no use strict"; +var oop = require("./oop"); +var EventEmitter = require("./event_emitter").EventEmitter; +var reportError = require("./report_error").reportError; +var defaultEnglishMessages = require("./default_english_messages").defaultEnglishMessages; +var optionsProvider = { + setOptions: function (optList) { + Object.keys(optList).forEach(function (key) { + this.setOption(key, optList[key]); + }, this); + }, + getOptions: function (optionNames) { + var result = {}; + if (!optionNames) { + var options = this.$options; + optionNames = Object.keys(options).filter(function (key) { + return !options[key].hidden; + }); + } + else if (!Array.isArray(optionNames)) { + result = optionNames; + optionNames = Object.keys(result); + } + optionNames.forEach(function (key) { + result[key] = this.getOption(key); + }, this); + return result; + }, + setOption: function (name, value) { + if (this["$" + name] === value) + return; + var opt = this.$options[name]; + if (!opt) { + return warn('misspelled option "' + name + '"'); + } + if (opt.forwardTo) + return this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value); + if (!opt.handlesSet) + this["$" + name] = value; + if (opt && opt.set) + opt.set.call(this, value); + }, + getOption: function (name) { + var opt = this.$options[name]; + if (!opt) { + return warn('misspelled option "' + name + '"'); + } + if (opt.forwardTo) + return this[opt.forwardTo] && this[opt.forwardTo].getOption(name); + return opt && opt.get ? opt.get.call(this) : this["$" + name]; + } +}; +function warn(message) { + if (typeof console != "undefined" && console.warn) + console.warn.apply(console, arguments); +} +var messages; +var nlsPlaceholders; +var AppConfig = /** @class */ (function () { + function AppConfig() { + this.$defaultOptions = {}; + messages = defaultEnglishMessages; + nlsPlaceholders = "dollarSigns"; + } + AppConfig.prototype.defineOptions = function (obj, path, options) { + if (!obj.$options) + this.$defaultOptions[path] = obj.$options = {}; + Object.keys(options).forEach(function (key) { + var opt = options[key]; + if (typeof opt == "string") + opt = { forwardTo: opt }; + opt.name || (opt.name = key); + obj.$options[opt.name] = opt; + if ("initialValue" in opt) + obj["$" + opt.name] = opt.initialValue; + }); + oop.implement(obj, optionsProvider); + return this; + }; + AppConfig.prototype.resetOptions = function (obj) { + Object.keys(obj.$options).forEach(function (key) { + var opt = obj.$options[key]; + if ("value" in opt) + obj.setOption(key, opt.value); + }); + }; + AppConfig.prototype.setDefaultValue = function (path, name, value) { + if (!path) { + for (path in this.$defaultOptions) + if (this.$defaultOptions[path][name]) + break; + if (!this.$defaultOptions[path][name]) + return false; + } + var opts = this.$defaultOptions[path] || (this.$defaultOptions[path] = {}); + if (opts[name]) { + if (opts.forwardTo) + this.setDefaultValue(opts.forwardTo, name, value); + else + opts[name].value = value; + } + }; + AppConfig.prototype.setDefaultValues = function (path, optionHash) { + Object.keys(optionHash).forEach(function (key) { + this.setDefaultValue(path, key, optionHash[key]); + }, this); + }; + AppConfig.prototype.setMessages = function (value, options) { + messages = value; + if (options && options.placeholders) { + nlsPlaceholders = options.placeholders; + } + }; + AppConfig.prototype.nls = function (key, defaultString, params) { + if (!messages[key]) { + warn("No message found for the key '" + key + "' in the provided messages, trying to find a translation for the default string '" + defaultString + "'."); + if (!messages[defaultString]) { + warn("No message found for the default string '" + defaultString + "' in the provided messages. Falling back to the default English message."); + } + } + var translated = messages[key] || messages[defaultString] || defaultString; + if (params) { + if (nlsPlaceholders === "dollarSigns") { + translated = translated.replace(/\$(\$|[\d]+)/g, function (_, dollarMatch) { + if (dollarMatch == "$") + return "$"; + return params[dollarMatch]; + }); + } + if (nlsPlaceholders === "curlyBrackets") { + translated = translated.replace(/\{([^\}]+)\}/g, function (_, curlyBracketMatch) { + return params[curlyBracketMatch]; + }); + } + } + return translated; + }; + return AppConfig; +}()); +AppConfig.prototype.warn = warn; +AppConfig.prototype.reportError = reportError; +oop.implement(AppConfig.prototype, EventEmitter); +exports.AppConfig = AppConfig; + +}); + +ace.define("ace/theme/textmate-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tm .ace_gutter {\n background: #f0f0f0;\n color: #333;\n}\n\n.ace-tm .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-tm .ace_fold {\n background-color: #6B72E6;\n}\n\n.ace-tm {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-tm .ace_cursor {\n color: black;\n}\n \n.ace-tm .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-tm .ace_storage,\n.ace-tm .ace_keyword {\n color: blue;\n}\n\n.ace-tm .ace_constant {\n color: rgb(197, 6, 11);\n}\n\n.ace-tm .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-tm .ace_constant.ace_language {\n color: rgb(88, 92, 246);\n}\n\n.ace-tm .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-tm .ace_invalid {\n background-color: rgba(255, 0, 0, 0.1);\n color: red;\n}\n\n.ace-tm .ace_support.ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-tm .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-tm .ace_support.ace_type,\n.ace-tm .ace_support.ace_class {\n color: rgb(109, 121, 222);\n}\n\n.ace-tm .ace_keyword.ace_operator {\n color: rgb(104, 118, 135);\n}\n\n.ace-tm .ace_string {\n color: rgb(3, 106, 7);\n}\n\n.ace-tm .ace_comment {\n color: rgb(76, 136, 107);\n}\n\n.ace-tm .ace_comment.ace_doc {\n color: rgb(0, 102, 255);\n}\n\n.ace-tm .ace_comment.ace_doc.ace_tag {\n color: rgb(128, 159, 191);\n}\n\n.ace-tm .ace_constant.ace_numeric {\n color: rgb(0, 0, 205);\n}\n\n.ace-tm .ace_variable {\n color: rgb(49, 132, 149);\n}\n\n.ace-tm .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-tm .ace_entity.ace_name.ace_function {\n color: #0000A2;\n}\n\n\n.ace-tm .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-tm .ace_list {\n color:rgb(185, 6, 144);\n}\n\n.ace-tm .ace_meta.ace_tag {\n color:rgb(0, 22, 142);\n}\n\n.ace-tm .ace_string.ace_regex {\n color: rgb(255, 0, 0)\n}\n\n.ace-tm .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n.ace-tm.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px white;\n}\n.ace-tm .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-tm .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-tm .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-tm .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-tm .ace_gutter-active-line {\n background-color : #dcdcdc;\n}\n\n.ace-tm .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-tm .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-tm .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; + +}); + +ace.define("ace/theme/textmate",["require","exports","module","ace/theme/textmate-css","ace/lib/dom"], function(require, exports, module){"use strict"; +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.cssText = require("./textmate-css"); +exports.$id = "ace/theme/textmate"; +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); + +}); + +ace.define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/net","ace/lib/dom","ace/lib/app_config","ace/theme/textmate"], function(require, exports, module){"no use strict"; +var lang = require("./lib/lang"); +var net = require("./lib/net"); +var dom = require("./lib/dom"); +var AppConfig = require("./lib/app_config").AppConfig; +module.exports = exports = new AppConfig(); +var options = { + packaged: false, + workerPath: null, + modePath: null, + themePath: null, + basePath: "", + suffix: ".js", + $moduleUrls: {}, + loadWorkerFromBlob: true, + sharedPopups: false, + useStrictCSP: null +}; +exports.get = function (key) { + if (!options.hasOwnProperty(key)) + throw new Error("Unknown config key: " + key); + return options[key]; +}; +exports.set = function (key, value) { + if (options.hasOwnProperty(key)) + options[key] = value; + else if (this.setDefaultValue("", key, value) == false) + throw new Error("Unknown config key: " + key); + if (key == "useStrictCSP") + dom.useStrictCSP(value); +}; +exports.all = function () { + return lang.copyObject(options); +}; +exports.$modes = {}; +exports.moduleUrl = function (name, component) { + if (options.$moduleUrls[name]) + return options.$moduleUrls[name]; + var parts = name.split("/"); + component = component || parts[parts.length - 2] || ""; + var sep = component == "snippets" ? "/" : "-"; + var base = parts[parts.length - 1]; + if (component == "worker" && sep == "-") { + var re = new RegExp("^" + component + "[\\-_]|[\\-_]" + component + "$", "g"); + base = base.replace(re, ""); + } + if ((!base || base == component) && parts.length > 1) + base = parts[parts.length - 2]; + var path = options[component + "Path"]; + if (path == null) { + path = options.basePath; + } + else if (sep == "/") { + component = sep = ""; + } + if (path && path.slice(-1) != "/") + path += "/"; + return path + component + sep + base + this.get("suffix"); +}; +exports.setModuleUrl = function (name, subst) { + return options.$moduleUrls[name] = subst; +}; +var loader = function (moduleName, cb) { + if (moduleName === "ace/theme/textmate" || moduleName === "./theme/textmate") + return cb(null, require("./theme/textmate")); + if (customLoader) + return customLoader(moduleName, cb); + console.error("loader is not configured"); +}; +var customLoader; +exports.setLoader = function (cb) { + customLoader = cb; +}; +exports.dynamicModules = Object.create(null); +exports.$loading = {}; +exports.$loaded = {}; +exports.loadModule = function (moduleId, onLoad) { + var loadedModule; + if (Array.isArray(moduleId)) { + var moduleType = moduleId[0]; + var moduleName = moduleId[1]; + } + else if (typeof moduleId == "string") { + var moduleName = moduleId; + } + var load = function (module) { + if (module && !exports.$loading[moduleName]) + return onLoad && onLoad(module); + if (!exports.$loading[moduleName]) + exports.$loading[moduleName] = []; + exports.$loading[moduleName].push(onLoad); + if (exports.$loading[moduleName].length > 1) + return; + var afterLoad = function () { + loader(moduleName, function (err, module) { + if (module) + exports.$loaded[moduleName] = module; + exports._emit("load.module", { name: moduleName, module: module }); + var listeners = exports.$loading[moduleName]; + exports.$loading[moduleName] = null; + listeners.forEach(function (onLoad) { + onLoad && onLoad(module); + }); + }); + }; + if (!exports.get("packaged")) + return afterLoad(); + net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); + reportErrorIfPathIsNotConfigured(); + }; + if (exports.dynamicModules[moduleName]) { + exports.dynamicModules[moduleName]().then(function (module) { + if (module.default) { + load(module.default); + } + else { + load(module); + } + }); + } + else { + try { + loadedModule = this.$require(moduleName); + } + catch (e) { } + load(loadedModule || exports.$loaded[moduleName]); + } +}; +exports.$require = function (moduleName) { + if (typeof module["require"] == "function") { + var req = "require"; + return module[req](moduleName); + } +}; +exports.setModuleLoader = function (moduleName, onLoad) { + exports.dynamicModules[moduleName] = onLoad; +}; +var reportErrorIfPathIsNotConfigured = function () { + if (!options.basePath && !options.workerPath + && !options.modePath && !options.themePath + && !Object.keys(options.$moduleUrls).length) { + console.error("Unable to infer path to ace from script src,", "use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes", "or with webpack use ace/webpack-resolver"); + reportErrorIfPathIsNotConfigured = function () { }; + } +}; +exports.version = "1.36.2"; + +}); + +ace.define("ace/loader_build",["require","exports","module","ace/lib/fixoldbrowsers","ace/config"], function(require, exports, module) { +"use strict"; + +require("./lib/fixoldbrowsers"); +var config = require("./config"); +config.setLoader(function(moduleName, cb) { + require([moduleName], function(module) { + cb(null, module); + }); +}); + +var global = (function() { + return this || typeof window != "undefined" && window; +})(); + +module.exports = function(ace) { + config.init = init; + config.$require = require; + ace.require = require; + + if (typeof define === "function") + ace.define = define; +}; +init(true);function init(packaged) { + + if (!global || !global.document) + return; + + config.set("packaged", packaged || require.packaged || module.packaged || (global.define && define.packaged)); + + var scriptOptions = {}; + var scriptUrl = ""; + var currentScript = (document.currentScript || document._currentScript ); // native or polyfill + var currentDocument = currentScript && currentScript.ownerDocument || document; + + if (currentScript && currentScript.src) { + scriptUrl = currentScript.src.split(/[?#]/)[0].split("/").slice(0, -1).join("/") || ""; + } + + var scripts = currentDocument.getElementsByTagName("script"); + for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); + }; + Range.prototype.contains = function (row, column) { + return this.compare(row, column) == 0; + }; + Range.prototype.compareRange = function (range) { + var cmp, end = range.end, start = range.start; + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } + else if (cmp == 0) { + return 1; + } + else { + return 0; + } + } + else if (cmp == -1) { + return -2; + } + else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } + else if (cmp == 1) { + return 42; + } + else { + return 0; + } + } + }; + Range.prototype.comparePoint = function (p) { + return this.compare(p.row, p.column); + }; + Range.prototype.containsRange = function (range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + Range.prototype.intersects = function (range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + Range.prototype.isEnd = function (row, column) { + return this.end.row == row && this.end.column == column; + }; + Range.prototype.isStart = function (row, column) { + return this.start.row == row && this.start.column == column; + }; + Range.prototype.setStart = function (row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } + else { + this.start.row = row; + this.start.column = column; + } + }; + Range.prototype.setEnd = function (row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } + else { + this.end.row = row; + this.end.column = column; + } + }; + Range.prototype.inside = function (row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } + else { + return true; + } + } + return false; + }; + Range.prototype.insideStart = function (row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } + else { + return true; + } + } + return false; + }; + Range.prototype.insideEnd = function (row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } + else { + return true; + } + } + return false; + }; + Range.prototype.compare = function (row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + if (row < this.start.row) + return -1; + if (row > this.end.row) + return 1; + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + return 0; + }; + Range.prototype.compareStart = function (row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } + else { + return this.compare(row, column); + } + }; + Range.prototype.compareEnd = function (row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } + else { + return this.compare(row, column); + } + }; + Range.prototype.compareInside = function (row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } + else if (this.start.row == row && this.start.column == column) { + return -1; + } + else { + return this.compare(row, column); + } + }; + Range.prototype.clipRows = function (firstRow, lastRow) { + if (this.end.row > lastRow) + var end = { row: lastRow + 1, column: 0 }; + else if (this.end.row < firstRow) + var end = { row: firstRow, column: 0 }; + if (this.start.row > lastRow) + var start = { row: lastRow + 1, column: 0 }; + else if (this.start.row < firstRow) + var start = { row: firstRow, column: 0 }; + return Range.fromPoints(start || this.start, end || this.end); + }; + Range.prototype.extend = function (row, column) { + var cmp = this.compare(row, column); + if (cmp == 0) + return this; + else if (cmp == -1) + var start = { row: row, column: column }; + else + var end = { row: row, column: column }; + return Range.fromPoints(start || this.start, end || this.end); + }; + Range.prototype.isEmpty = function () { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + Range.prototype.isMultiLine = function () { + return (this.start.row !== this.end.row); + }; + Range.prototype.clone = function () { + return Range.fromPoints(this.start, this.end); + }; + Range.prototype.collapseRows = function () { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0); + else + return new Range(this.start.row, 0, this.end.row, 0); + }; + Range.prototype.toScreenRange = function (session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + return new Range(screenPosStart.row, screenPosStart.column, screenPosEnd.row, screenPosEnd.column); + }; + Range.prototype.moveBy = function (row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + return Range; +}()); +Range.fromPoints = function (start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = function (p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; +exports.Range = Range; + +}); + +ace.define("ace/lib/keys",["require","exports","module","ace/lib/oop"], function(require, exports, module){"use strict"; +var oop = require("./oop"); +var Keys = { + MODIFIER_KEYS: { + 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta', + 91: 'MetaLeft', 92: 'MetaRight', 93: 'ContextMenu' + }, + KEY_MODS: { + "ctrl": 1, "alt": 2, "option": 2, "shift": 4, + "super": 8, "meta": 8, "command": 8, "cmd": 8, + "control": 1 + }, + FUNCTION_KEYS: { + 8: "Backspace", + 9: "Tab", + 13: "Return", + 19: "Pause", + 27: "Esc", + 32: "Space", + 33: "PageUp", + 34: "PageDown", + 35: "End", + 36: "Home", + 37: "Left", + 38: "Up", + 39: "Right", + 40: "Down", + 44: "Print", + 45: "Insert", + 46: "Delete", + '-13': "NumpadEnter", + 144: "Numlock", + 145: "Scrolllock" + }, + PRINTABLE_KEYS: { + 32: ' ', 59: ';', 61: '=', 107: '+', 109: '-', 110: '.', + 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', + 219: '[', 220: '\\', 221: ']', 222: "'", 111: '/', 106: '*' + } +}; +var codeToKeyCode = { + Command: 224, + Backspace: 8, + Tab: 9, + Return: 13, + Enter: 13, + Pause: 19, + Escape: 27, + PageUp: 33, + PageDown: 34, + End: 35, + Home: 36, + Insert: 45, + Delete: 46, + ArrowLeft: 37, + ArrowUp: 38, + ArrowRight: 39, + ArrowDown: 40, + Backquote: 192, + Minus: 189, + Equal: 187, + BracketLeft: 219, + Backslash: 220, + BracketRight: 221, + Semicolon: 186, + Quote: 222, + Comma: 188, + Period: 190, + Slash: 191, + Space: 32, + NumpadAdd: 107, + NumpadDecimal: 110, + NumpadSubtract: 109, + NumpadDivide: 111, + NumpadMultiply: 106 +}; +for (var i = 0; i < 10; i++) { + codeToKeyCode["Digit" + i] = 48 + i; + codeToKeyCode["Numpad" + i] = 96 + i; + Keys.PRINTABLE_KEYS[48 + i] = "" + i; + Keys.FUNCTION_KEYS[96 + i] = "Numpad" + i; +} +for (var i = 65; i < 91; i++) { + var chr = String.fromCharCode(i + 32); + codeToKeyCode["Key" + chr.toUpperCase()] = i; + Keys.PRINTABLE_KEYS[i] = chr; +} +for (var i = 1; i < 13; i++) { + codeToKeyCode["F" + i] = 111 + i; + Keys.FUNCTION_KEYS[111 + i] = "F" + i; +} +var modifiers = { + Shift: 16, + Control: 17, + Alt: 18, + Meta: 224 +}; +for (var mod in modifiers) { + codeToKeyCode[mod] = codeToKeyCode[mod + "Left"] + = codeToKeyCode[mod + "Right"] = modifiers[mod]; +} +exports.$codeToKeyCode = codeToKeyCode; +Keys.PRINTABLE_KEYS[173] = '-'; +for (var j in Keys.FUNCTION_KEYS) { + var name = Keys.FUNCTION_KEYS[j].toLowerCase(); + Keys[name] = parseInt(j, 10); +} +for (var j in Keys.PRINTABLE_KEYS) { + var name = Keys.PRINTABLE_KEYS[j].toLowerCase(); + Keys[name] = parseInt(j, 10); +} +oop.mixin(Keys, Keys.MODIFIER_KEYS); +oop.mixin(Keys, Keys.PRINTABLE_KEYS); +oop.mixin(Keys, Keys.FUNCTION_KEYS); +Keys.enter = Keys["return"]; +Keys.escape = Keys.esc; +Keys.del = Keys["delete"]; +(function () { + var mods = ["cmd", "ctrl", "alt", "shift"]; + for (var i = Math.pow(2, mods.length); i--;) { + Keys.KEY_MODS[i] = mods.filter(function (x) { + return i & Keys.KEY_MODS[x]; + }).join("-") + "-"; + } +})(); +Keys.KEY_MODS[0] = ""; +Keys.KEY_MODS[-1] = "input-"; +oop.mixin(exports, Keys); +exports.default = exports; +exports.keyCodeToString = function (keyCode) { + var keyString = Keys[keyCode]; + if (typeof keyString != "string") + keyString = String.fromCharCode(keyCode); + return keyString.toLowerCase(); +}; + +}); + +ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module){"use strict"; var keys = require("./keys"); +var useragent = require("./useragent"); +var pressedKeys = null; +var ts = 0; +var activeListenerOptions; +function detectListenerOptionsSupport() { + activeListenerOptions = false; + try { + document.createComment("").addEventListener("test", function () { }, { + get passive() { + activeListenerOptions = { passive: false }; + return true; + } + }); + } + catch (e) { } +} +function getListenerOptions() { + if (activeListenerOptions == undefined) + detectListenerOptionsSupport(); + return activeListenerOptions; +} +function EventListener(elem, type, callback) { + this.elem = elem; + this.type = type; + this.callback = callback; +} +EventListener.prototype.destroy = function () { + removeListener(this.elem, this.type, this.callback); + this.elem = this.type = this.callback = undefined; +}; +var addListener = exports.addListener = function (elem, type, callback, /**@type{any?}*/ destroyer) { + elem.addEventListener(type, callback, getListenerOptions()); + if (destroyer) + destroyer.$toDestroy.push(new EventListener(elem, type, callback)); +}; +var removeListener = exports.removeListener = function (elem, type, callback) { + elem.removeEventListener(type, callback, getListenerOptions()); +}; +exports.stopEvent = function (e) { + exports.stopPropagation(e); + exports.preventDefault(e); + return false; +}; +exports.stopPropagation = function (e) { + if (e.stopPropagation) + e.stopPropagation(); +}; +exports.preventDefault = function (e) { + if (e.preventDefault) + e.preventDefault(); +}; +exports.getButton = function (e) { + if (e.type == "dblclick") + return 0; + if (e.type == "contextmenu" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey))) + return 2; + return e.button; +}; +exports.capture = function (el, eventHandler, releaseCaptureHandler) { + var ownerDocument = el && el.ownerDocument || document; + function onMouseUp(e) { + eventHandler && eventHandler(e); + releaseCaptureHandler && releaseCaptureHandler(e); + removeListener(ownerDocument, "mousemove", eventHandler); + removeListener(ownerDocument, "mouseup", onMouseUp); + removeListener(ownerDocument, "dragstart", onMouseUp); + } + addListener(ownerDocument, "mousemove", eventHandler); + addListener(ownerDocument, "mouseup", onMouseUp); + addListener(ownerDocument, "dragstart", onMouseUp); + return onMouseUp; +}; +exports.addMouseWheelListener = function (el, callback, destroyer) { + addListener(el, "wheel", function (e) { + var factor = 0.15; + var deltaX = e.deltaX || 0; + var deltaY = e.deltaY || 0; + switch (e.deltaMode) { + case e.DOM_DELTA_PIXEL: + e.wheelX = deltaX * factor; + e.wheelY = deltaY * factor; + break; + case e.DOM_DELTA_LINE: + var linePixels = 15; + e.wheelX = deltaX * linePixels; + e.wheelY = deltaY * linePixels; + break; + case e.DOM_DELTA_PAGE: + var pagePixels = 150; + e.wheelX = deltaX * pagePixels; + e.wheelY = deltaY * pagePixels; + break; + } + callback(e); + }, destroyer); +}; +exports.addMultiMouseDownListener = function (elements, timeouts, eventHandler, callbackName, destroyer) { + var clicks = 0; + var startX, startY, timer; + var eventNames = { + 2: "dblclick", + 3: "tripleclick", + 4: "quadclick" + }; + function onMousedown(e) { + if (exports.getButton(e) !== 0) { + clicks = 0; + } + else if (e.detail > 1) { + clicks++; + if (clicks > 4) + clicks = 1; + } + else { + clicks = 1; + } + if (useragent.isIE) { + var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; + if (!timer || isNewClick) + clicks = 1; + if (timer) + clearTimeout(timer); + timer = setTimeout(function () { timer = null; }, timeouts[clicks - 1] || 600); + if (clicks == 1) { + startX = e.clientX; + startY = e.clientY; + } + } + e._clicks = clicks; + eventHandler[callbackName]("mousedown", e); + if (clicks > 4) + clicks = 0; + else if (clicks > 1) + return eventHandler[callbackName](eventNames[clicks], e); + } + if (!Array.isArray(elements)) + elements = [elements]; + elements.forEach(function (el) { + addListener(el, "mousedown", onMousedown, destroyer); + }); +}; +function getModifierHash(e) { + return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); +} +exports.getModifierString = function (e) { + return keys.KEY_MODS[getModifierHash(e)]; +}; +function normalizeCommandKeys(callback, e, keyCode) { + var hashId = getModifierHash(e); + if (!keyCode && e.code) { + keyCode = keys.$codeToKeyCode[e.code] || keyCode; + } + if (!useragent.isMac && pressedKeys) { + if (e.getModifierState && (e.getModifierState("OS") || e.getModifierState("Win"))) + hashId |= 8; + if (pressedKeys.altGr) { + if ((3 & hashId) != 3) + pressedKeys.altGr = 0; + else + return; + } + if (keyCode === 18 || keyCode === 17) { + var location = e.location; + if (keyCode === 17 && location === 1) { + if (pressedKeys[keyCode] == 1) + ts = e.timeStamp; + } + else if (keyCode === 18 && hashId === 3 && location === 2) { + var dt = e.timeStamp - ts; + if (dt < 50) + pressedKeys.altGr = true; + } + } + } + if (keyCode in keys.MODIFIER_KEYS) { + keyCode = -1; + } + if (!hashId && keyCode === 13) { + if (e.location === 3) { + callback(e, hashId, -keyCode); + if (e.defaultPrevented) + return; + } + } + if (useragent.isChromeOS && hashId & 8) { + callback(e, hashId, keyCode); + if (e.defaultPrevented) + return; + else + hashId &= ~8; + } + if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { + return false; + } + return callback(e, hashId, keyCode); +} +exports.addCommandKeyListener = function (el, callback, destroyer) { + var lastDefaultPrevented = null; + addListener(el, "keydown", function (e) { + pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1; + var result = normalizeCommandKeys(callback, e, e.keyCode); + lastDefaultPrevented = e.defaultPrevented; + return result; + }, destroyer); + addListener(el, "keypress", function (e) { + if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) { + exports.stopEvent(e); + lastDefaultPrevented = null; + } + }, destroyer); + addListener(el, "keyup", function (e) { + pressedKeys[e.keyCode] = null; + }, destroyer); + if (!pressedKeys) { + resetPressedKeys(); + addListener(window, "focus", resetPressedKeys); + } +}; +function resetPressedKeys() { + pressedKeys = Object.create(null); +} +if (typeof window == "object" && window.postMessage && !useragent.isOldIE) { + var postMessageId = 1; + exports.nextTick = function (callback, win) { + win = win || window; + var messageName = "zero-timeout-message-" + (postMessageId++); + var listener = function (e) { + if (e.data == messageName) { + exports.stopPropagation(e); + removeListener(win, "message", listener); + callback(); + } + }; + addListener(win, "message", listener); + win.postMessage(messageName, "*"); + }; +} +exports.$idleBlocked = false; +exports.onIdle = function (cb, timeout) { + return setTimeout(function handler() { + if (!exports.$idleBlocked) { + cb(); + } + else { + setTimeout(handler, 100); + } + }, timeout); +}; +exports.$idleBlockId = null; +exports.blockIdle = function (delay) { + if (exports.$idleBlockId) + clearTimeout(exports.$idleBlockId); + exports.$idleBlocked = true; + exports.$idleBlockId = setTimeout(function () { + exports.$idleBlocked = false; + }, delay || 100); +}; +exports.nextFrame = typeof window == "object" && (window.requestAnimationFrame + || window["mozRequestAnimationFrame"] + || window["webkitRequestAnimationFrame"] + || window["msRequestAnimationFrame"] + || window["oRequestAnimationFrame"]); +if (exports.nextFrame) + exports.nextFrame = exports.nextFrame.bind(window); +else + exports.nextFrame = function (callback) { + setTimeout(callback, 17); + }; + +}); + +ace.define("ace/clipboard",["require","exports","module"], function(require, exports, module){"use strict"; +var $cancelT; +module.exports = { + lineMode: false, + pasteCancelled: function () { + if ($cancelT && $cancelT > Date.now() - 50) + return true; + return $cancelT = false; + }, + cancel: function () { + $cancelT = Date.now(); + } +}; + +}); + +ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/config","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/clipboard","ace/lib/keys"], function(require, exports, module){"use strict"; +var event = require("../lib/event"); +var nls = require("../config").nls; +var useragent = require("../lib/useragent"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var clipboard = require("../clipboard"); +var BROKEN_SETDATA = useragent.isChrome < 18; +var USE_IE_MIME_TYPE = useragent.isIE; +var HAS_FOCUS_ARGS = useragent.isChrome > 63; +var MAX_LINE_LENGTH = 400; +var KEYS = require("../lib/keys"); +var MODS = KEYS.KEY_MODS; +var isIOS = useragent.isIOS; +var valueResetRegex = isIOS ? /\s/ : /\n/; +var isMobile = useragent.isMobile; +var TextInput; +TextInput = function (parentNode, host) { + var text = dom.createElement("textarea"); + text.className = "ace_text-input"; + text.setAttribute("wrap", "off"); + text.setAttribute("autocorrect", "off"); + text.setAttribute("autocapitalize", "off"); + text.setAttribute("spellcheck", "false"); + text.style.opacity = "0"; + parentNode.insertBefore(text, parentNode.firstChild); + var copied = false; + var pasted = false; + var inComposition = false; + var sendingText = false; + var tempStyle = ''; + if (!isMobile) + text.style.fontSize = "1px"; + var commandMode = false; + var ignoreFocusEvents = false; + var lastValue = ""; + var lastSelectionStart = 0; + var lastSelectionEnd = 0; + var lastRestoreEnd = 0; + var rowStart = Number.MAX_SAFE_INTEGER; + var rowEnd = Number.MIN_SAFE_INTEGER; + var numberOfExtraLines = 0; + try { + var isFocused = document.activeElement === text; + } + catch (e) { } + this.setNumberOfExtraLines = function (number) { + rowStart = Number.MAX_SAFE_INTEGER; + rowEnd = Number.MIN_SAFE_INTEGER; + if (number < 0) { + numberOfExtraLines = 0; + return; + } + numberOfExtraLines = number; + }; + this.setAriaOptions = function (options) { + if (options.activeDescendant) { + text.setAttribute("aria-haspopup", "true"); + text.setAttribute("aria-autocomplete", options.inline ? "both" : "list"); + text.setAttribute("aria-activedescendant", options.activeDescendant); + } + else { + text.setAttribute("aria-haspopup", "false"); + text.setAttribute("aria-autocomplete", "both"); + text.removeAttribute("aria-activedescendant"); + } + if (options.role) { + text.setAttribute("role", options.role); + } + if (options.setLabel) { + text.setAttribute("aria-roledescription", nls("text-input.aria-roledescription", "editor")); + var arialLabel = ""; + if (host.$textInputAriaLabel) { + arialLabel += "".concat(host.$textInputAriaLabel, ", "); + } + if (host.session) { + var row = host.session.selection.cursor.row; + arialLabel += nls("text-input.aria-label", "Cursor at row $0", [row + 1]); + } + text.setAttribute("aria-label", arialLabel); + } + }; + this.setAriaOptions({ role: "textbox" }); + event.addListener(text, "blur", function (e) { + if (ignoreFocusEvents) + return; + host.onBlur(e); + isFocused = false; + }, host); + event.addListener(text, "focus", function (e) { + if (ignoreFocusEvents) + return; + isFocused = true; + if (useragent.isEdge) { + try { + if (!document.hasFocus()) + return; + } + catch (e) { } + } + host.onFocus(e); + if (useragent.isEdge) + setTimeout(resetSelection); + else + resetSelection(); + }, host); + this.$focusScroll = false; + this.focus = function () { + this.setAriaOptions({ + setLabel: host.renderer.enableKeyboardAccessibility + }); + if (tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == "browser") + return text.focus({ preventScroll: true }); + var top = text.style.top; + text.style.position = "fixed"; + text.style.top = "0px"; + try { + var isTransformed = text.getBoundingClientRect().top != 0; + } + catch (e) { + return; + } + var ancestors = []; + if (isTransformed) { + var t = text.parentElement; + while (t && t.nodeType == 1) { + ancestors.push(t); + t.setAttribute("ace_nocontext", "true"); + if (!t.parentElement && t.getRootNode) + t = t.getRootNode()["host"]; + else + t = t.parentElement; + } + } + text.focus({ preventScroll: true }); + if (isTransformed) { + ancestors.forEach(function (p) { + p.removeAttribute("ace_nocontext"); + }); + } + setTimeout(function () { + text.style.position = ""; + if (text.style.top == "0px") + text.style.top = top; + }, 0); + }; + this.blur = function () { + text.blur(); + }; + this.isFocused = function () { + return isFocused; + }; + host.on("beforeEndOperation", function () { + var curOp = host.curOp; + var commandName = curOp && curOp.command && curOp.command.name; + if (commandName == "insertstring") + return; + var isUserAction = commandName && (curOp.docChanged || curOp.selectionChanged); + if (inComposition && isUserAction) { + lastValue = text.value = ""; + onCompositionEnd(); + } + resetSelection(); + }); + var positionToSelection = function (row, column) { + var selection = column; + for (var i = 1; i <= row - rowStart && i < 2 * numberOfExtraLines + 1; i++) { + selection += host.session.getLine(row - i).length + 1; + } + return selection; + }; + var resetSelection = isIOS + ? function (value) { + if (!isFocused || (copied && !value) || sendingText) + return; + if (!value) + value = ""; + var newValue = "\n ab" + value + "cde fg\n"; + if (newValue != text.value) + text.value = lastValue = newValue; + var selectionStart = 4; + var selectionEnd = 4 + (value.length || (host.selection.isEmpty() ? 0 : 1)); + if (lastSelectionStart != selectionStart || lastSelectionEnd != selectionEnd) { + text.setSelectionRange(selectionStart, selectionEnd); + } + lastSelectionStart = selectionStart; + lastSelectionEnd = selectionEnd; + } + : function () { + if (inComposition || sendingText) + return; + if (!isFocused && !afterContextMenu) + return; + inComposition = true; + var selectionStart = 0; + var selectionEnd = 0; + var line = ""; + if (host.session) { + var selection = host.selection; + var range = selection.getRange(); + var row = selection.cursor.row; + if (row === rowEnd + 1) { + rowStart = rowEnd + 1; + rowEnd = rowStart + 2 * numberOfExtraLines; + } + else if (row === rowStart - 1) { + rowEnd = rowStart - 1; + rowStart = rowEnd - 2 * numberOfExtraLines; + } + else if (row < rowStart - 1 || row > rowEnd + 1) { + rowStart = row > numberOfExtraLines ? row - numberOfExtraLines : 0; + rowEnd = row > numberOfExtraLines ? row + numberOfExtraLines : 2 * numberOfExtraLines; + } + var lines = []; + for (var i = rowStart; i <= rowEnd; i++) { + lines.push(host.session.getLine(i)); + } + line = lines.join('\n'); + selectionStart = positionToSelection(range.start.row, range.start.column); + selectionEnd = positionToSelection(range.end.row, range.end.column); + if (range.start.row < rowStart) { + var prevLine = host.session.getLine(rowStart - 1); + selectionStart = range.start.row < rowStart - 1 ? 0 : selectionStart; + selectionEnd += prevLine.length + 1; + line = prevLine + "\n" + line; + } + else if (range.end.row > rowEnd) { + var nextLine = host.session.getLine(rowEnd + 1); + selectionEnd = range.end.row > rowEnd + 1 ? nextLine.length : range.end.column; + selectionEnd += line.length + 1; + line = line + "\n" + nextLine; + } + else if (isMobile && row > 0) { + line = "\n" + line; + selectionEnd += 1; + selectionStart += 1; + } + if (line.length > MAX_LINE_LENGTH) { + if (selectionStart < MAX_LINE_LENGTH && selectionEnd < MAX_LINE_LENGTH) { + line = line.slice(0, MAX_LINE_LENGTH); + } + else { + line = "\n"; + if (selectionStart == selectionEnd) { + selectionStart = selectionEnd = 0; + } + else { + selectionStart = 0; + selectionEnd = 1; + } + } + } + var newValue = line + "\n\n"; + if (newValue != lastValue) { + text.value = lastValue = newValue; + lastSelectionStart = lastSelectionEnd = newValue.length; + } + } + if (afterContextMenu) { + lastSelectionStart = text.selectionStart; + lastSelectionEnd = text.selectionEnd; + } + if (lastSelectionEnd != selectionEnd + || lastSelectionStart != selectionStart + || text.selectionEnd != lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization + ) { + try { + text.setSelectionRange(selectionStart, selectionEnd); + lastSelectionStart = selectionStart; + lastSelectionEnd = selectionEnd; + } + catch (e) { } + } + inComposition = false; + }; + this.resetSelection = resetSelection; + if (isFocused) + host.onFocus(); + var isAllSelected = function (text) { + return text.selectionStart === 0 && text.selectionEnd >= lastValue.length + && text.value === lastValue && lastValue + && text.selectionEnd !== lastSelectionEnd; + }; + var onSelect = function (e) { + if (inComposition) + return; + if (copied) { + copied = false; + } + else if (isAllSelected(text)) { + host.selectAll(); + resetSelection(); + } + else if (isMobile && text.selectionStart != lastSelectionStart) { + resetSelection(); + } + }; + var inputHandler = null; + this.setInputHandler = function (cb) { inputHandler = cb; }; + this.getInputHandler = function () { return inputHandler; }; + var afterContextMenu = false; + var sendText = function (value, fromInput) { + if (afterContextMenu) + afterContextMenu = false; + if (pasted) { + resetSelection(); + if (value) + host.onPaste(value); + pasted = false; + return ""; + } + else { + var selectionStart = text.selectionStart; + var selectionEnd = text.selectionEnd; + var extendLeft = lastSelectionStart; + var extendRight = lastValue.length - lastSelectionEnd; + var inserted = value; + var restoreStart = value.length - selectionStart; + var restoreEnd = value.length - selectionEnd; + var i = 0; + while (extendLeft > 0 && lastValue[i] == value[i]) { + i++; + extendLeft--; + } + inserted = inserted.slice(i); + i = 1; + while (extendRight > 0 && lastValue.length - i > lastSelectionStart - 1 && lastValue[lastValue.length - i] == value[value.length - i]) { + i++; + extendRight--; + } + restoreStart -= i - 1; + restoreEnd -= i - 1; + var endIndex = inserted.length - i + 1; + if (endIndex < 0) { + extendLeft = -endIndex; + endIndex = 0; + } + inserted = inserted.slice(0, endIndex); + if (!fromInput && !inserted && !restoreStart && !extendLeft && !extendRight && !restoreEnd) + return ""; + sendingText = true; + var shouldReset = false; + if (useragent.isAndroid && inserted == ". ") { + inserted = " "; + shouldReset = true; + } + if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || commandMode) { + host.onTextInput(inserted); + } + else { + host.onTextInput(inserted, { + extendLeft: extendLeft, + extendRight: extendRight, + restoreStart: restoreStart, + restoreEnd: restoreEnd + }); + } + sendingText = false; + lastValue = value; + lastSelectionStart = selectionStart; + lastSelectionEnd = selectionEnd; + lastRestoreEnd = restoreEnd; + return shouldReset ? "\n" : inserted; + } + }; + var onInput = function (e) { + if (inComposition) + return onCompositionUpdate(); + if (e && e.inputType) { + if (e.inputType == "historyUndo") + return host.execCommand("undo"); + if (e.inputType == "historyRedo") + return host.execCommand("redo"); + } + var data = text.value; + var inserted = sendText(data, true); + if (data.length > MAX_LINE_LENGTH + 100 + || valueResetRegex.test(inserted) + || isMobile && lastSelectionStart < 1 && lastSelectionStart == lastSelectionEnd) { + resetSelection(); + } + }; + var handleClipboardData = function (e, data, forceIEMime) { + var clipboardData = e.clipboardData || window["clipboardData"]; + if (!clipboardData || BROKEN_SETDATA) + return; + var mime = USE_IE_MIME_TYPE || forceIEMime ? "Text" : "text/plain"; + try { + if (data) { + return clipboardData.setData(mime, data) !== false; + } + else { + return clipboardData.getData(mime); + } + } + catch (e) { + if (!forceIEMime) + return handleClipboardData(e, data, true); + } + }; + var doCopy = function (e, isCut) { + var data = host.getCopyText(); + if (!data) + return event.preventDefault(e); + if (handleClipboardData(e, data)) { + if (isIOS) { + resetSelection(data); + copied = data; + setTimeout(function () { + copied = false; + }, 10); + } + isCut ? host.onCut() : host.onCopy(); + event.preventDefault(e); + } + else { + copied = true; + text.value = data; + text.select(); + setTimeout(function () { + copied = false; + resetSelection(); + isCut ? host.onCut() : host.onCopy(); + }); + } + }; + var onCut = function (e) { + doCopy(e, true); + }; + var onCopy = function (e) { + doCopy(e, false); + }; + var onPaste = function (e) { + var data = handleClipboardData(e); + if (clipboard.pasteCancelled()) + return; + if (typeof data == "string") { + if (data) + host.onPaste(data, e); + if (useragent.isIE) + setTimeout(resetSelection); + event.preventDefault(e); + } + else { + text.value = ""; + pasted = true; + } + }; + event.addCommandKeyListener(text, function (e, hashId, keyCode) { + if (inComposition) + return; + return host.onCommandKey(e, hashId, keyCode); + }, host); + event.addListener(text, "select", onSelect, host); + event.addListener(text, "input", onInput, host); + event.addListener(text, "cut", onCut, host); + event.addListener(text, "copy", onCopy, host); + event.addListener(text, "paste", onPaste, host); + if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) { + event.addListener(parentNode, "keydown", function (e) { + if ((useragent.isMac && !e.metaKey) || !e.ctrlKey) + return; + switch (e.keyCode) { + case 67: + onCopy(e); + break; + case 86: + onPaste(e); + break; + case 88: + onCut(e); + break; + } + }, host); + } + var onCompositionStart = function (e) { + if (inComposition || !host.onCompositionStart || host.$readOnly) + return; + inComposition = {}; + if (commandMode) + return; + if (e.data) + inComposition.useTextareaForIME = false; + setTimeout(onCompositionUpdate, 0); + host._signal("compositionStart"); + host.on("mousedown", cancelComposition); + var range = host.getSelectionRange(); + range.end.row = range.start.row; + range.end.column = range.start.column; + inComposition.markerRange = range; + inComposition.selectionStart = lastSelectionStart; + host.onCompositionStart(inComposition); + if (inComposition.useTextareaForIME) { + lastValue = text.value = ""; + lastSelectionStart = 0; + lastSelectionEnd = 0; + } + else { + if (text.msGetInputContext) + inComposition.context = text.msGetInputContext(); + if (text.getInputContext) + inComposition.context = text.getInputContext(); + } + }; + var onCompositionUpdate = function () { + if (!inComposition || !host.onCompositionUpdate || host.$readOnly) + return; + if (commandMode) + return cancelComposition(); + if (inComposition.useTextareaForIME) { + host.onCompositionUpdate(text.value); + } + else { + var data = text.value; + sendText(data); + if (inComposition.markerRange) { + if (inComposition.context) { + inComposition.markerRange.start.column = inComposition.selectionStart + = inComposition.context.compositionStartOffset; + } + inComposition.markerRange.end.column = inComposition.markerRange.start.column + + lastSelectionEnd - inComposition.selectionStart + lastRestoreEnd; + } + } + }; + var onCompositionEnd = function (e) { + if (!host.onCompositionEnd || host.$readOnly) + return; + inComposition = false; + host.onCompositionEnd(); + host.off("mousedown", cancelComposition); + if (e) + onInput(); + }; + function cancelComposition() { + ignoreFocusEvents = true; + text.blur(); + text.focus(); + ignoreFocusEvents = false; + } + var syncComposition = lang.delayedCall(onCompositionUpdate, 50).schedule.bind(null, null); + function onKeyup(e) { + if (e.keyCode == 27 && text.value.length < text.selectionStart) { + if (!inComposition) + lastValue = text.value; + lastSelectionStart = lastSelectionEnd = -1; + resetSelection(); + } + syncComposition(); + } + event.addListener(text, "compositionstart", onCompositionStart, host); + event.addListener(text, "compositionupdate", onCompositionUpdate, host); + event.addListener(text, "keyup", onKeyup, host); + event.addListener(text, "keydown", syncComposition, host); + event.addListener(text, "compositionend", onCompositionEnd, host); + this.getElement = function () { + return text; + }; + this.setCommandMode = function (value) { + commandMode = value; + text.readOnly = false; + }; + this.setReadOnly = function (readOnly) { + if (!commandMode) + text.readOnly = readOnly; + }; + this.setCopyWithEmptySelection = function (value) { + }; + this.onContextMenu = function (e) { + afterContextMenu = true; + resetSelection(); + host._emit("nativecontextmenu", { target: host, domEvent: e }); + this.moveToMouse(e, true); + }; + this.moveToMouse = function (e, bringToFront) { + if (!tempStyle) + tempStyle = text.style.cssText; + text.style.cssText = (bringToFront ? "z-index:100000;" : "") + + (useragent.isIE ? "opacity:0.1;" : "") + + "text-indent: -" + (lastSelectionStart + lastSelectionEnd) * host.renderer.characterWidth * 0.5 + "px;"; + var rect = host.container.getBoundingClientRect(); + var style = dom.computedStyle(host.container); + var top = rect.top + (parseInt(style.borderTopWidth) || 0); + var left = rect.left + (parseInt(rect.borderLeftWidth) || 0); + var maxTop = rect.bottom - top - text.clientHeight - 2; + var move = function (e) { + dom.translate(text, e.clientX - left - 2, Math.min(e.clientY - top - 2, maxTop)); + }; + move(e); + if (e.type != "mousedown") + return; + host.renderer.$isMousePressed = true; + clearTimeout(closeTimeout); + if (useragent.isWin) + event.capture(host.container, move, onContextMenuClose); + }; + this.onContextMenuClose = onContextMenuClose; + var closeTimeout; + function onContextMenuClose() { + clearTimeout(closeTimeout); + closeTimeout = setTimeout(function () { + if (tempStyle) { + text.style.cssText = tempStyle; + tempStyle = ''; + } + host.renderer.$isMousePressed = false; + if (host.renderer.$keepTextAreaAtCursor) + host.renderer.$moveTextAreaToCursor(); + }, 0); + } + var onContextMenu = function (e) { + host.textInput.onContextMenu(e); + onContextMenuClose(); + }; + event.addListener(text, "mouseup", onContextMenu, host); + event.addListener(text, "mousedown", function (e) { + e.preventDefault(); + onContextMenuClose(); + }, host); + event.addListener(host.renderer.scroller, "contextmenu", onContextMenu, host); + event.addListener(text, "contextmenu", onContextMenu, host); + if (isIOS) + addIosSelectionHandler(parentNode, host, text); + function addIosSelectionHandler(parentNode, host, text) { + var typingResetTimeout = null; + var typing = false; + text.addEventListener("keydown", function (e) { + if (typingResetTimeout) + clearTimeout(typingResetTimeout); + typing = true; + }, true); + text.addEventListener("keyup", function (e) { + typingResetTimeout = setTimeout(function () { + typing = false; + }, 100); + }, true); + var detectArrowKeys = function (e) { + if (document.activeElement !== text) + return; + if (typing || inComposition || host.$mouseHandler.isMousePressed) + return; + if (copied) { + return; + } + var selectionStart = text.selectionStart; + var selectionEnd = text.selectionEnd; + var key = null; + var modifier = 0; + if (selectionStart == 0) { + key = KEYS.up; + } + else if (selectionStart == 1) { + key = KEYS.home; + } + else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd] == "\n") { + key = KEYS.end; + } + else if (selectionStart < lastSelectionStart && lastValue[selectionStart - 1] == " ") { + key = KEYS.left; + modifier = MODS.option; + } + else if (selectionStart < lastSelectionStart + || (selectionStart == lastSelectionStart + && lastSelectionEnd != lastSelectionStart + && selectionStart == selectionEnd)) { + key = KEYS.left; + } + else if (selectionEnd > lastSelectionEnd && lastValue.slice(0, selectionEnd).split("\n").length > 2) { + key = KEYS.down; + } + else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd - 1] == " ") { + key = KEYS.right; + modifier = MODS.option; + } + else if (selectionEnd > lastSelectionEnd + || (selectionEnd == lastSelectionEnd + && lastSelectionEnd != lastSelectionStart + && selectionStart == selectionEnd)) { + key = KEYS.right; + } + if (selectionStart !== selectionEnd) + modifier |= MODS.shift; + if (key) { + var result = host.onCommandKey({}, modifier, key); + if (!result && host.commands) { + key = KEYS.keyCodeToString(key); + var command = host.commands.findKeyCommand(modifier, key); + if (command) + host.execCommand(command); + } + lastSelectionStart = selectionStart; + lastSelectionEnd = selectionEnd; + resetSelection(""); + } + }; + document.addEventListener("selectionchange", detectArrowKeys); + host.on("destroy", function () { + document.removeEventListener("selectionchange", detectArrowKeys); + }); + } + this.destroy = function () { + if (text.parentElement) + text.parentElement.removeChild(text); + }; +}; +exports.TextInput = TextInput; +exports.$setUserAgentForTests = function (_isMobile, _isIOS) { + isMobile = _isMobile; + isIOS = _isIOS; +}; + +}); + +ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"], function(require, exports, module){"use strict"; +var useragent = require("../lib/useragent"); +var DRAG_OFFSET = 0; // pixels +var SCROLL_COOLDOWN_T = 550; // milliseconds +var DefaultHandlers = /** @class */ (function () { + function DefaultHandlers(mouseHandler) { + mouseHandler.$clickSelection = null; + var editor = mouseHandler.editor; + editor.setDefaultHandler("mousedown", this.onMouseDown.bind(mouseHandler)); + editor.setDefaultHandler("dblclick", this.onDoubleClick.bind(mouseHandler)); + editor.setDefaultHandler("tripleclick", this.onTripleClick.bind(mouseHandler)); + editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler)); + editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler)); + var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd", + "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"]; + exports.forEach(function (x) { + mouseHandler[x] = this[x]; + }, this); + mouseHandler["selectByLines"] = this.extendSelectionBy.bind(mouseHandler, "getLineRange"); + mouseHandler["selectByWords"] = this.extendSelectionBy.bind(mouseHandler, "getWordRange"); + } + DefaultHandlers.prototype.onMouseDown = function (ev) { + var inSelection = ev.inSelection(); + var pos = ev.getDocumentPosition(); + this.mousedownEvent = ev; + var editor = this.editor; + var button = ev.getButton(); + if (button !== 0) { + var selectionRange = editor.getSelectionRange(); + var selectionEmpty = selectionRange.isEmpty(); + if (selectionEmpty || button == 1) + editor.selection.moveToPosition(pos); + if (button == 2) { + editor.textInput.onContextMenu(ev.domEvent); + if (!useragent.isMozilla) + ev.preventDefault(); + } + return; + } + this.mousedownEvent.time = Date.now(); + if (inSelection && !editor.isFocused()) { + editor.focus(); + if (this.$focusTimeout && !this.$clickSelection && !editor.inMultiSelectMode) { + this.setState("focusWait"); + this.captureMouse(ev); + return; + } + } + this.captureMouse(ev); + this.startSelect(pos, ev.domEvent._clicks > 1); + return ev.preventDefault(); + }; + DefaultHandlers.prototype.startSelect = function (pos, waitForClickSelection) { + pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y); + var editor = this.editor; + if (!this.mousedownEvent) + return; + if (this.mousedownEvent.getShiftKey()) + editor.selection.selectToPosition(pos); + else if (!waitForClickSelection) + editor.selection.moveToPosition(pos); + if (!waitForClickSelection) + this.select(); + editor.setStyle("ace_selecting"); + this.setState("select"); + }; + DefaultHandlers.prototype.select = function () { + var anchor, editor = this.editor; + var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); + if (this.$clickSelection) { + var cmp = this.$clickSelection.comparePoint(cursor); + if (cmp == -1) { + anchor = this.$clickSelection.end; + } + else if (cmp == 1) { + anchor = this.$clickSelection.start; + } + else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; + } + editor.selection.setSelectionAnchor(anchor.row, anchor.column); + } + editor.selection.selectToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + }; + DefaultHandlers.prototype.extendSelectionBy = function (unitName) { + var anchor, editor = this.editor; + var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); + var range = editor.selection[unitName](cursor.row, cursor.column); + if (this.$clickSelection) { + var cmpStart = this.$clickSelection.comparePoint(range.start); + var cmpEnd = this.$clickSelection.comparePoint(range.end); + if (cmpStart == -1 && cmpEnd <= 0) { + anchor = this.$clickSelection.end; + if (range.end.row != cursor.row || range.end.column != cursor.column) + cursor = range.start; + } + else if (cmpEnd == 1 && cmpStart >= 0) { + anchor = this.$clickSelection.start; + if (range.start.row != cursor.row || range.start.column != cursor.column) + cursor = range.end; + } + else if (cmpStart == -1 && cmpEnd == 1) { + cursor = range.end; + anchor = range.start; + } + else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; + } + editor.selection.setSelectionAnchor(anchor.row, anchor.column); + } + editor.selection.selectToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + }; + DefaultHandlers.prototype.selectByLinesEnd = function () { + this.$clickSelection = null; + this.editor.unsetStyle("ace_selecting"); + }; + DefaultHandlers.prototype.focusWait = function () { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + var time = Date.now(); + if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimeout) + this.startSelect(this.mousedownEvent.getDocumentPosition()); + }; + DefaultHandlers.prototype.onDoubleClick = function (ev) { + var pos = ev.getDocumentPosition(); + var editor = this.editor; + var session = editor.session; + var range = session.getBracketRange(pos); + if (range) { + if (range.isEmpty()) { + range.start.column--; + range.end.column++; + } + this.setState("select"); + } + else { + range = editor.selection.getWordRange(pos.row, pos.column); + this.setState("selectByWords"); + } + this.$clickSelection = range; + this.select(); + }; + DefaultHandlers.prototype.onTripleClick = function (ev) { + var pos = ev.getDocumentPosition(); + var editor = this.editor; + this.setState("selectByLines"); + var range = editor.getSelectionRange(); + if (range.isMultiLine() && range.contains(pos.row, pos.column)) { + this.$clickSelection = editor.selection.getLineRange(range.start.row); + this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end; + } + else { + this.$clickSelection = editor.selection.getLineRange(pos.row); + } + this.select(); + }; + DefaultHandlers.prototype.onQuadClick = function (ev) { + var editor = this.editor; + editor.selectAll(); + this.$clickSelection = editor.getSelectionRange(); + this.setState("selectAll"); + }; + DefaultHandlers.prototype.onMouseWheel = function (ev) { + if (ev.getAccelKey()) + return; + if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) { + ev.wheelX = ev.wheelY; + ev.wheelY = 0; + } + var editor = this.editor; + if (!this.$lastScroll) + this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 }; + var prevScroll = this.$lastScroll; + var t = ev.domEvent.timeStamp; + var dt = t - prevScroll.t; + var vx = dt ? ev.wheelX / dt : prevScroll.vx; + var vy = dt ? ev.wheelY / dt : prevScroll.vy; + if (dt < SCROLL_COOLDOWN_T) { + vx = (vx + prevScroll.vx) / 2; + vy = (vy + prevScroll.vy) / 2; + } + var direction = Math.abs(vx / vy); + var canScroll = false; + if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0)) + canScroll = true; + if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed)) + canScroll = true; + if (canScroll) { + prevScroll.allowed = t; + } + else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) { + var isSlower = Math.abs(vx) <= 1.5 * Math.abs(prevScroll.vx) + && Math.abs(vy) <= 1.5 * Math.abs(prevScroll.vy); + if (isSlower) { + canScroll = true; + prevScroll.allowed = t; + } + else { + prevScroll.allowed = 0; + } + } + prevScroll.t = t; + prevScroll.vx = vx; + prevScroll.vy = vy; + if (canScroll) { + editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + return ev.stop(); + } + }; + return DefaultHandlers; +}()); +DefaultHandlers.prototype.selectEnd = DefaultHandlers.prototype.selectByLinesEnd; +DefaultHandlers.prototype.selectAllEnd = DefaultHandlers.prototype.selectByLinesEnd; +DefaultHandlers.prototype.selectByWordsEnd = DefaultHandlers.prototype.selectByLinesEnd; +exports.DefaultHandlers = DefaultHandlers; +function calcDistance(ax, ay, bx, by) { + return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); +} +function calcRangeOrientation(range, cursor) { + if (range.start.row == range.end.row) + var cmp = 2 * cursor.column - range.start.column - range.end.column; + else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column) + var cmp = cursor.column - 4; + else + var cmp = 2 * cursor.row - range.start.row - range.end.row; + if (cmp < 0) + return { cursor: range.start, anchor: range.end }; + else + return { cursor: range.end, anchor: range.start }; +} + +}); + +ace.define("ace/lib/scroll",["require","exports","module"], function(require, exports, module){exports.preventParentScroll = function preventParentScroll(event) { + event.stopPropagation(); + var target = event.currentTarget; + var contentOverflows = target.scrollHeight > target.clientHeight; + if (!contentOverflows) { + event.preventDefault(); + } +}; + +}); + +ace.define("ace/tooltip",["require","exports","module","ace/lib/dom","ace/lib/event","ace/range","ace/lib/scroll"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var Range = require("./range").Range; +var preventParentScroll = require("./lib/scroll").preventParentScroll; +var CLASSNAME = "ace_tooltip"; +var Tooltip = /** @class */ (function () { + function Tooltip(parentNode) { + this.isOpen = false; + this.$element = null; + this.$parentNode = parentNode; + } + Tooltip.prototype.$init = function () { + this.$element = dom.createElement("div"); + this.$element.className = CLASSNAME; + this.$element.style.display = "none"; + this.$parentNode.appendChild(this.$element); + return this.$element; + }; + Tooltip.prototype.getElement = function () { + return this.$element || this.$init(); + }; + Tooltip.prototype.setText = function (text) { + this.getElement().textContent = text; + }; + Tooltip.prototype.setHtml = function (html) { + this.getElement().innerHTML = html; + }; + Tooltip.prototype.setPosition = function (x, y) { + this.getElement().style.left = x + "px"; + this.getElement().style.top = y + "px"; + }; + Tooltip.prototype.setClassName = function (className) { + dom.addCssClass(this.getElement(), className); + }; + Tooltip.prototype.setTheme = function (theme) { + this.$element.className = CLASSNAME + " " + + (theme.isDark ? "ace_dark " : "") + (theme.cssClass || ""); + }; + Tooltip.prototype.show = function (text, x, y) { + if (text != null) + this.setText(text); + if (x != null && y != null) + this.setPosition(x, y); + if (!this.isOpen) { + this.getElement().style.display = "block"; + this.isOpen = true; + } + }; + Tooltip.prototype.hide = function (e) { + if (this.isOpen) { + this.getElement().style.display = "none"; + this.getElement().className = CLASSNAME; + this.isOpen = false; + } + }; + Tooltip.prototype.getHeight = function () { + return this.getElement().offsetHeight; + }; + Tooltip.prototype.getWidth = function () { + return this.getElement().offsetWidth; + }; + Tooltip.prototype.destroy = function () { + this.isOpen = false; + if (this.$element && this.$element.parentNode) { + this.$element.parentNode.removeChild(this.$element); + } + }; + return Tooltip; +}()); +var PopupManager = /** @class */ (function () { + function PopupManager() { + this.popups = []; + } + PopupManager.prototype.addPopup = function (popup) { + this.popups.push(popup); + this.updatePopups(); + }; + PopupManager.prototype.removePopup = function (popup) { + var index = this.popups.indexOf(popup); + if (index !== -1) { + this.popups.splice(index, 1); + this.updatePopups(); + } + }; + PopupManager.prototype.updatePopups = function () { + var e_1, _a, e_2, _b; + this.popups.sort(function (a, b) { return b.priority - a.priority; }); + var visiblepopups = []; + try { + for (var _c = __values(this.popups), _d = _c.next(); !_d.done; _d = _c.next()) { + var popup = _d.value; + var shouldDisplay = true; + try { + for (var visiblepopups_1 = (e_2 = void 0, __values(visiblepopups)), visiblepopups_1_1 = visiblepopups_1.next(); !visiblepopups_1_1.done; visiblepopups_1_1 = visiblepopups_1.next()) { + var visiblePopup = visiblepopups_1_1.value; + if (this.doPopupsOverlap(visiblePopup, popup)) { + shouldDisplay = false; + break; + } + } + } + catch (e_2_1) { e_2 = { error: e_2_1 }; } + finally { + try { + if (visiblepopups_1_1 && !visiblepopups_1_1.done && (_b = visiblepopups_1.return)) _b.call(visiblepopups_1); + } + finally { if (e_2) throw e_2.error; } + } + if (shouldDisplay) { + visiblepopups.push(popup); + } + else { + popup.hide(); + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_d && !_d.done && (_a = _c.return)) _a.call(_c); + } + finally { if (e_1) throw e_1.error; } + } + }; + PopupManager.prototype.doPopupsOverlap = function (popupA, popupB) { + var rectA = popupA.getElement().getBoundingClientRect(); + var rectB = popupB.getElement().getBoundingClientRect(); + return (rectA.left < rectB.right && rectA.right > rectB.left && rectA.top < rectB.bottom && rectA.bottom + > rectB.top); + }; + return PopupManager; +}()); +var popupManager = new PopupManager(); +exports.popupManager = popupManager; +exports.Tooltip = Tooltip; +var HoverTooltip = /** @class */ (function (_super) { + __extends(HoverTooltip, _super); + function HoverTooltip(parentNode) { + if (parentNode === void 0) { parentNode = document.body; } + var _this = _super.call(this, parentNode) || this; + _this.timeout = undefined; + _this.lastT = 0; + _this.idleTime = 350; + _this.lastEvent = undefined; + _this.onMouseOut = _this.onMouseOut.bind(_this); + _this.onMouseMove = _this.onMouseMove.bind(_this); + _this.waitForHover = _this.waitForHover.bind(_this); + _this.hide = _this.hide.bind(_this); + var el = _this.getElement(); + el.style.whiteSpace = "pre-wrap"; + el.style.pointerEvents = "auto"; + el.addEventListener("mouseout", _this.onMouseOut); + el.tabIndex = -1; + el.addEventListener("blur", function () { + if (!el.contains(document.activeElement)) + this.hide(); + }.bind(_this)); + el.addEventListener("wheel", preventParentScroll); + return _this; + } + HoverTooltip.prototype.addToEditor = function (editor) { + editor.on("mousemove", this.onMouseMove); + editor.on("mousedown", this.hide); + editor.renderer.getMouseEventTarget().addEventListener("mouseout", this.onMouseOut, true); + }; + HoverTooltip.prototype.removeFromEditor = function (editor) { + editor.off("mousemove", this.onMouseMove); + editor.off("mousedown", this.hide); + editor.renderer.getMouseEventTarget().removeEventListener("mouseout", this.onMouseOut, true); + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + }; + HoverTooltip.prototype.onMouseMove = function (e, editor) { + this.lastEvent = e; + this.lastT = Date.now(); + var isMousePressed = editor.$mouseHandler.isMousePressed; + if (this.isOpen) { + var pos = this.lastEvent && this.lastEvent.getDocumentPosition(); + if (!this.range + || !this.range.contains(pos.row, pos.column) + || isMousePressed + || this.isOutsideOfText(this.lastEvent)) { + this.hide(); + } + } + if (this.timeout || isMousePressed) + return; + this.lastEvent = e; + this.timeout = setTimeout(this.waitForHover, this.idleTime); + }; + HoverTooltip.prototype.waitForHover = function () { + if (this.timeout) + clearTimeout(this.timeout); + var dt = Date.now() - this.lastT; + if (this.idleTime - dt > 10) { + this.timeout = setTimeout(this.waitForHover, this.idleTime - dt); + return; + } + this.timeout = null; + if (this.lastEvent && !this.isOutsideOfText(this.lastEvent)) { + this.$gatherData(this.lastEvent, this.lastEvent.editor); + } + }; + HoverTooltip.prototype.isOutsideOfText = function (e) { + var editor = e.editor; + var docPos = e.getDocumentPosition(); + var line = editor.session.getLine(docPos.row); + if (docPos.column == line.length) { + var screenPos = editor.renderer.pixelToScreenCoordinates(e.clientX, e.clientY); + var clippedPos = editor.session.documentToScreenPosition(docPos.row, docPos.column); + if (clippedPos.column != screenPos.column + || clippedPos.row != screenPos.row) { + return true; + } + } + return false; + }; + HoverTooltip.prototype.setDataProvider = function (value) { + this.$gatherData = value; + }; + HoverTooltip.prototype.showForRange = function (editor, range, domNode, startingEvent) { + var MARGIN = 10; + if (startingEvent && startingEvent != this.lastEvent) + return; + if (this.isOpen && document.activeElement == this.getElement()) + return; + var renderer = editor.renderer; + if (!this.isOpen) { + popupManager.addPopup(this); + this.$registerCloseEvents(); + this.setTheme(renderer.theme); + } + this.isOpen = true; + this.addMarker(range, editor.session); + this.range = Range.fromPoints(range.start, range.end); + var position = renderer.textToScreenCoordinates(range.start.row, range.start.column); + var rect = renderer.scroller.getBoundingClientRect(); + if (position.pageX < rect.left) + position.pageX = rect.left; + var element = this.getElement(); + element.innerHTML = ""; + element.appendChild(domNode); + element.style.maxHeight = ""; + element.style.display = "block"; + var labelHeight = element.clientHeight; + var labelWidth = element.clientWidth; + var spaceBelow = window.innerHeight - position.pageY - renderer.lineHeight; + var isAbove = true; + if (position.pageY - labelHeight < 0 && position.pageY < spaceBelow) { + isAbove = false; + } + element.style.maxHeight = (isAbove ? position.pageY : spaceBelow) - MARGIN + "px"; + element.style.top = isAbove ? "" : position.pageY + renderer.lineHeight + "px"; + element.style.bottom = isAbove ? window.innerHeight - position.pageY + "px" : ""; + element.style.left = Math.min(position.pageX, window.innerWidth - labelWidth - MARGIN) + "px"; + }; + HoverTooltip.prototype.addMarker = function (range, session) { + if (this.marker) { + this.$markerSession.removeMarker(this.marker); + } + this.$markerSession = session; + this.marker = session && session.addMarker(range, "ace_highlight-marker", "text"); + }; + HoverTooltip.prototype.hide = function (e) { + if (!e && document.activeElement == this.getElement()) + return; + if (e && e.target && (e.type != "keydown" || e.ctrlKey || e.metaKey) && this.$element.contains(e.target)) + return; + this.lastEvent = null; + if (this.timeout) + clearTimeout(this.timeout); + this.timeout = null; + this.addMarker(null); + if (this.isOpen) { + this.$removeCloseEvents(); + this.getElement().style.display = "none"; + this.isOpen = false; + popupManager.removePopup(this); + } + }; + HoverTooltip.prototype.$registerCloseEvents = function () { + window.addEventListener("keydown", this.hide, true); + window.addEventListener("wheel", this.hide, true); + window.addEventListener("mousedown", this.hide, true); + }; + HoverTooltip.prototype.$removeCloseEvents = function () { + window.removeEventListener("keydown", this.hide, true); + window.removeEventListener("wheel", this.hide, true); + window.removeEventListener("mousedown", this.hide, true); + }; + HoverTooltip.prototype.onMouseOut = function (e) { + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + this.lastEvent = null; + if (!this.isOpen) + return; + if (!e.relatedTarget || this.getElement().contains(e.relatedTarget)) + return; + if (e && e.currentTarget.contains(e.relatedTarget)) + return; + if (!e.relatedTarget.classList.contains("ace_content")) + this.hide(); + }; + return HoverTooltip; +}(Tooltip)); +exports.HoverTooltip = HoverTooltip; + +}); + +ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/tooltip","ace/config","ace/lib/lang"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var dom = require("../lib/dom"); +var event = require("../lib/event"); +var Tooltip = require("../tooltip").Tooltip; +var nls = require("../config").nls; +var lang = require("../lib/lang"); +function GutterHandler(mouseHandler) { + var editor = mouseHandler.editor; + var gutter = editor.renderer.$gutterLayer; + var tooltip = new GutterTooltip(editor); + mouseHandler.editor.setDefaultHandler("guttermousedown", function (e) { + if (!editor.isFocused() || e.getButton() != 0) + return; + var gutterRegion = gutter.getRegion(e); + if (gutterRegion == "foldWidgets") + return; + var row = e.getDocumentPosition().row; + var selection = editor.session.selection; + if (e.getShiftKey()) + selection.selectTo(row, 0); + else { + if (e.domEvent.detail == 2) { + editor.selectAll(); + return e.preventDefault(); + } + mouseHandler.$clickSelection = editor.selection.getLineRange(row); + } + mouseHandler.setState("selectByLines"); + mouseHandler.captureMouse(e); + return e.preventDefault(); + }); + var tooltipTimeout, mouseEvent; + function showTooltip() { + var row = mouseEvent.getDocumentPosition().row; + var maxRow = editor.session.getLength(); + if (row == maxRow) { + var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row; + var pos = mouseEvent.$pos; + if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column)) + return hideTooltip(); + } + tooltip.showTooltip(row); + if (!tooltip.isOpen) + return; + editor.on("mousewheel", hideTooltip); + if (mouseHandler.$tooltipFollowsMouse) { + moveTooltip(mouseEvent); + } + else { + var gutterRow = mouseEvent.getGutterRow(); + var gutterCell = gutter.$lines.get(gutterRow); + if (gutterCell) { + var gutterElement = gutterCell.element.querySelector(".ace_gutter_annotation"); + var rect = gutterElement.getBoundingClientRect(); + var style = tooltip.getElement().style; + style.left = rect.right + "px"; + style.top = rect.bottom + "px"; + } + else { + moveTooltip(mouseEvent); + } + } + } + function hideTooltip() { + if (tooltipTimeout) + tooltipTimeout = clearTimeout(tooltipTimeout); + if (tooltip.isOpen) { + tooltip.hideTooltip(); + editor.off("mousewheel", hideTooltip); + } + } + function moveTooltip(e) { + tooltip.setPosition(e.x, e.y); + } + mouseHandler.editor.setDefaultHandler("guttermousemove", function (e) { + var target = e.domEvent.target || e.domEvent.srcElement; + if (dom.hasCssClass(target, "ace_fold-widget")) + return hideTooltip(); + if (tooltip.isOpen && mouseHandler.$tooltipFollowsMouse) + moveTooltip(e); + mouseEvent = e; + if (tooltipTimeout) + return; + tooltipTimeout = setTimeout(function () { + tooltipTimeout = null; + if (mouseEvent && !mouseHandler.isMousePressed) + showTooltip(); + else + hideTooltip(); + }, 50); + }); + event.addListener(editor.renderer.$gutter, "mouseout", function (e) { + mouseEvent = null; + if (!tooltip.isOpen || tooltipTimeout) + return; + tooltipTimeout = setTimeout(function () { + tooltipTimeout = null; + hideTooltip(); + }, 50); + }, editor); + editor.on("changeSession", hideTooltip); + editor.on("input", hideTooltip); +} +exports.GutterHandler = GutterHandler; +var GutterTooltip = /** @class */ (function (_super) { + __extends(GutterTooltip, _super); + function GutterTooltip(editor) { + var _this = _super.call(this, editor.container) || this; + _this.editor = editor; + return _this; + } + GutterTooltip.prototype.setPosition = function (x, y) { + var windowWidth = window.innerWidth || document.documentElement.clientWidth; + var windowHeight = window.innerHeight || document.documentElement.clientHeight; + var width = this.getWidth(); + var height = this.getHeight(); + x += 15; + y += 15; + if (x + width > windowWidth) { + x -= (x + width) - windowWidth; + } + if (y + height > windowHeight) { + y -= 20 + height; + } + Tooltip.prototype.setPosition.call(this, x, y); + }; + Object.defineProperty(GutterTooltip, "annotationLabels", { + get: function () { + return { + error: { + singular: nls("gutter-tooltip.aria-label.error.singular", "error"), + plural: nls("gutter-tooltip.aria-label.error.plural", "errors") + }, + security: { + singular: nls("gutter-tooltip.aria-label.security.singular", "security finding"), + plural: nls("gutter-tooltip.aria-label.security.plural", "security findings") + }, + warning: { + singular: nls("gutter-tooltip.aria-label.warning.singular", "warning"), + plural: nls("gutter-tooltip.aria-label.warning.plural", "warnings") + }, + info: { + singular: nls("gutter-tooltip.aria-label.info.singular", "information message"), + plural: nls("gutter-tooltip.aria-label.info.plural", "information messages") + }, + hint: { + singular: nls("gutter-tooltip.aria-label.hint.singular", "suggestion"), + plural: nls("gutter-tooltip.aria-label.hint.plural", "suggestions") + } + }; + }, + enumerable: false, + configurable: true + }); + GutterTooltip.prototype.showTooltip = function (row) { + var _a; + var gutter = this.editor.renderer.$gutterLayer; + var annotationsInRow = gutter.$annotations[row]; + var annotation; + if (annotationsInRow) + annotation = { + displayText: Array.from(annotationsInRow.displayText), + type: Array.from(annotationsInRow.type) + }; + else + annotation = { displayText: [], type: [] }; + var fold = gutter.session.getFoldLine(row); + if (fold && gutter.$showFoldedAnnotations) { + var annotationsInFold = { error: [], security: [], warning: [], info: [], hint: [] }; + var severityRank = { error: 1, security: 2, warning: 3, info: 4, hint: 5 }; + var mostSevereAnnotationTypeInFold; + for (var i = row + 1; i <= fold.end.row; i++) { + if (!gutter.$annotations[i]) + continue; + for (var j = 0; j < gutter.$annotations[i].text.length; j++) { + var annotationType = gutter.$annotations[i].type[j]; + annotationsInFold[annotationType].push(gutter.$annotations[i].text[j]); + if (!mostSevereAnnotationTypeInFold || + severityRank[annotationType] < severityRank[mostSevereAnnotationTypeInFold]) { + mostSevereAnnotationTypeInFold = annotationType; + } + } + } + if (["error", "security", "warning"].includes(mostSevereAnnotationTypeInFold)) { + var summaryFoldedAnnotations = "".concat(GutterTooltip.annotationsToSummaryString(annotationsInFold), " in folded code."); + annotation.displayText.push(summaryFoldedAnnotations); + annotation.type.push(mostSevereAnnotationTypeInFold + "_fold"); + } + } + if (annotation.displayText.length === 0) + return this.hide(); + var annotationMessages = { error: [], security: [], warning: [], info: [], hint: [] }; + var iconClassName = gutter.$useSvgGutterIcons ? "ace_icon_svg" : "ace_icon"; + for (var i = 0; i < annotation.displayText.length; i++) { + var lineElement = dom.createElement("span"); + var iconElement = dom.createElement("span"); + (_a = iconElement.classList).add.apply(_a, ["ace_".concat(annotation.type[i]), iconClassName]); + iconElement.setAttribute("aria-label", "".concat(GutterTooltip.annotationLabels[annotation.type[i].replace("_fold", "")].singular)); + iconElement.setAttribute("role", "img"); + iconElement.appendChild(dom.createTextNode(" ")); + lineElement.appendChild(iconElement); + lineElement.appendChild(dom.createTextNode(annotation.displayText[i])); + lineElement.appendChild(dom.createElement("br")); + annotationMessages[annotation.type[i].replace("_fold", "")].push(lineElement); + } + var tooltipElement = this.getElement(); + dom.removeChildren(tooltipElement); + annotationMessages.error.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.security.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.warning.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.info.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.hint.forEach(function (el) { return tooltipElement.appendChild(el); }); + tooltipElement.setAttribute("aria-live", "polite"); + if (!this.isOpen) { + this.setTheme(this.editor.renderer.theme); + this.setClassName("ace_gutter-tooltip"); + } + this.show(); + this.editor._signal("showGutterTooltip", this); + }; + GutterTooltip.prototype.hideTooltip = function () { + this.$element.removeAttribute("aria-live"); + this.hide(); + this.editor._signal("hideGutterTooltip", this); + }; + GutterTooltip.annotationsToSummaryString = function (annotations) { + var e_1, _a; + var summary = []; + var annotationTypes = ["error", "security", "warning", "info", "hint"]; + try { + for (var annotationTypes_1 = __values(annotationTypes), annotationTypes_1_1 = annotationTypes_1.next(); !annotationTypes_1_1.done; annotationTypes_1_1 = annotationTypes_1.next()) { + var annotationType = annotationTypes_1_1.value; + if (!annotations[annotationType].length) + continue; + var label = annotations[annotationType].length === 1 ? GutterTooltip.annotationLabels[annotationType].singular : GutterTooltip.annotationLabels[annotationType].plural; + summary.push("".concat(annotations[annotationType].length, " ").concat(label)); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (annotationTypes_1_1 && !annotationTypes_1_1.done && (_a = annotationTypes_1.return)) _a.call(annotationTypes_1); + } + finally { if (e_1) throw e_1.error; } + } + return summary.join(", "); + }; + return GutterTooltip; +}(Tooltip)); +exports.GutterTooltip = GutterTooltip; + +}); + +ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module){"use strict"; +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var MouseEvent = /** @class */ (function () { + function MouseEvent(domEvent, editor) { this.speed; this.wheelX; this.wheelY; + this.domEvent = domEvent; + this.editor = editor; + this.x = this.clientX = domEvent.clientX; + this.y = this.clientY = domEvent.clientY; + this.$pos = null; + this.$inSelection = null; + this.propagationStopped = false; + this.defaultPrevented = false; + } + MouseEvent.prototype.stopPropagation = function () { + event.stopPropagation(this.domEvent); + this.propagationStopped = true; + }; + MouseEvent.prototype.preventDefault = function () { + event.preventDefault(this.domEvent); + this.defaultPrevented = true; + }; + MouseEvent.prototype.stop = function () { + this.stopPropagation(); + this.preventDefault(); + }; + MouseEvent.prototype.getDocumentPosition = function () { + if (this.$pos) + return this.$pos; + this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); + return this.$pos; + }; + MouseEvent.prototype.getGutterRow = function () { + var documentRow = this.getDocumentPosition().row; + var screenRow = this.editor.session.documentToScreenRow(documentRow, 0); + var screenTopRow = this.editor.session.documentToScreenRow(this.editor.renderer.$gutterLayer.$lines.get(0).row, 0); + return screenRow - screenTopRow; + }; + MouseEvent.prototype.inSelection = function () { + if (this.$inSelection !== null) + return this.$inSelection; + var editor = this.editor; + var selectionRange = editor.getSelectionRange(); + if (selectionRange.isEmpty()) + this.$inSelection = false; + else { + var pos = this.getDocumentPosition(); + this.$inSelection = selectionRange.contains(pos.row, pos.column); + } + return this.$inSelection; + }; + MouseEvent.prototype.getButton = function () { + return event.getButton(this.domEvent); + }; + MouseEvent.prototype.getShiftKey = function () { + return this.domEvent.shiftKey; + }; + MouseEvent.prototype.getAccelKey = function () { + return useragent.isMac ? this.domEvent.metaKey : this.domEvent.ctrlKey; + }; + return MouseEvent; +}()); +exports.MouseEvent = MouseEvent; + +}); + +ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module){"use strict"; +var dom = require("../lib/dom"); +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var AUTOSCROLL_DELAY = 200; +var SCROLL_CURSOR_DELAY = 200; +var SCROLL_CURSOR_HYSTERESIS = 5; +function DragdropHandler(mouseHandler) { + var editor = mouseHandler.editor; + var dragImage = dom.createElement("div"); + dragImage.style.cssText = "top:-100px;position:absolute;z-index:2147483647;opacity:0.5"; + dragImage.textContent = "\xa0"; + var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"]; + exports.forEach(function (x) { + mouseHandler[x] = this[x]; + }, this); + editor.on("mousedown", this.onMouseDown.bind(mouseHandler)); + var mouseTarget = editor.container; + var dragSelectionMarker, x, y; + var timerId, range; + var dragCursor, counter = 0; + var dragOperation; + var isInternal; + var autoScrollStartTime; + var cursorMovedTime; + var cursorPointOnCaretMoved; + this.onDragStart = function (e) { + if (this.cancelDrag || !mouseTarget.draggable) { + var self = this; + setTimeout(function () { + self.startSelect(); + self.captureMouse(e); + }, 0); + return e.preventDefault(); + } + range = editor.getSelectionRange(); + var dataTransfer = e.dataTransfer; + dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove"; + editor.container.appendChild(dragImage); + dataTransfer.setDragImage && dataTransfer.setDragImage(dragImage, 0, 0); + setTimeout(function () { + editor.container.removeChild(dragImage); + }); + dataTransfer.clearData(); + dataTransfer.setData("Text", editor.session.getTextRange()); + isInternal = true; + this.setState("drag"); + }; + this.onDragEnd = function (e) { + mouseTarget.draggable = false; + isInternal = false; + this.setState(null); + if (!editor.getReadOnly()) { + var dropEffect = e.dataTransfer.dropEffect; + if (!dragOperation && dropEffect == "move") + editor.session.remove(editor.getSelectionRange()); + editor.$resetCursorStyle(); + } + this.editor.unsetStyle("ace_dragging"); + this.editor.renderer.setCursorStyle(""); + }; + this.onDragEnter = function (e) { + if (editor.getReadOnly() || !canAccept(e.dataTransfer)) + return; + x = e.clientX; + y = e.clientY; + if (!dragSelectionMarker) + addDragMarker(); + counter++; + e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); + return event.preventDefault(e); + }; + this.onDragOver = function (e) { + if (editor.getReadOnly() || !canAccept(e.dataTransfer)) + return; + x = e.clientX; + y = e.clientY; + if (!dragSelectionMarker) { + addDragMarker(); + counter++; + } + if (onMouseMoveTimer !== null) + onMouseMoveTimer = null; + e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); + return event.preventDefault(e); + }; + this.onDragLeave = function (e) { + counter--; + if (counter <= 0 && dragSelectionMarker) { + clearDragMarker(); + dragOperation = null; + return event.preventDefault(e); + } + }; + this.onDrop = function (e) { + if (!dragCursor) + return; + var dataTransfer = e.dataTransfer; + if (isInternal) { + switch (dragOperation) { + case "move": + if (range.contains(dragCursor.row, dragCursor.column)) { + range = { + start: dragCursor, + end: dragCursor + }; + } + else { + range = editor.moveText(range, dragCursor); + } + break; + case "copy": + range = editor.moveText(range, dragCursor, true); + break; + } + } + else { + var dropData = dataTransfer.getData('Text'); + range = { + start: dragCursor, + end: editor.session.insert(dragCursor, dropData) + }; + editor.focus(); + dragOperation = null; + } + clearDragMarker(); + return event.preventDefault(e); + }; + event.addListener(mouseTarget, "dragstart", this.onDragStart.bind(mouseHandler), editor); + event.addListener(mouseTarget, "dragend", this.onDragEnd.bind(mouseHandler), editor); + event.addListener(mouseTarget, "dragenter", this.onDragEnter.bind(mouseHandler), editor); + event.addListener(mouseTarget, "dragover", this.onDragOver.bind(mouseHandler), editor); + event.addListener(mouseTarget, "dragleave", this.onDragLeave.bind(mouseHandler), editor); + event.addListener(mouseTarget, "drop", this.onDrop.bind(mouseHandler), editor); + function scrollCursorIntoView(cursor, prevCursor) { + var now = Date.now(); + var vMovement = !prevCursor || cursor.row != prevCursor.row; + var hMovement = !prevCursor || cursor.column != prevCursor.column; + if (!cursorMovedTime || vMovement || hMovement) { + editor.moveCursorToPosition(cursor); + cursorMovedTime = now; + cursorPointOnCaretMoved = { x: x, y: y }; + } + else { + var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y); + if (distance > SCROLL_CURSOR_HYSTERESIS) { + cursorMovedTime = null; + } + else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) { + editor.renderer.scrollCursorIntoView(); + cursorMovedTime = null; + } + } + } + function autoScroll(cursor, prevCursor) { + var now = Date.now(); + var lineHeight = editor.renderer.layerConfig.lineHeight; + var characterWidth = editor.renderer.layerConfig.characterWidth; + var editorRect = editor.renderer.scroller.getBoundingClientRect(); + var offsets = { + x: { + left: x - editorRect.left, + right: editorRect.right - x + }, + y: { + top: y - editorRect.top, + bottom: editorRect.bottom - y + } + }; + var nearestXOffset = Math.min(offsets.x.left, offsets.x.right); + var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom); + var scrollCursor = { row: cursor.row, column: cursor.column }; + if (nearestXOffset / characterWidth <= 2) { + scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2); + } + if (nearestYOffset / lineHeight <= 1) { + scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1); + } + var vScroll = cursor.row != scrollCursor.row; + var hScroll = cursor.column != scrollCursor.column; + var vMovement = !prevCursor || cursor.row != prevCursor.row; + if (vScroll || (hScroll && !vMovement)) { + if (!autoScrollStartTime) + autoScrollStartTime = now; + else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY) + editor.renderer.scrollCursorIntoView(scrollCursor); + } + else { + autoScrollStartTime = null; + } + } + function onDragInterval() { + var prevCursor = dragCursor; + dragCursor = editor.renderer.screenToTextCoordinates(x, y); + scrollCursorIntoView(dragCursor, prevCursor); + autoScroll(dragCursor, prevCursor); + } + function addDragMarker() { + range = editor.selection.toOrientedRange(); + dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle()); + editor.clearSelection(); + if (editor.isFocused()) + editor.renderer.$cursorLayer.setBlinking(false); + clearInterval(timerId); + onDragInterval(); + timerId = setInterval(onDragInterval, 20); + counter = 0; + event.addListener(document, "mousemove", onMouseMove); + } + function clearDragMarker() { + clearInterval(timerId); + editor.session.removeMarker(dragSelectionMarker); + dragSelectionMarker = null; + editor.selection.fromOrientedRange(range); + if (editor.isFocused() && !isInternal) + editor.$resetCursorStyle(); + range = null; + dragCursor = null; + counter = 0; + autoScrollStartTime = null; + cursorMovedTime = null; + event.removeListener(document, "mousemove", onMouseMove); + } + var onMouseMoveTimer = null; + function onMouseMove() { + if (onMouseMoveTimer == null) { + onMouseMoveTimer = setTimeout(function () { + if (onMouseMoveTimer != null && dragSelectionMarker) + clearDragMarker(); + }, 20); + } + } + function canAccept(dataTransfer) { + var types = dataTransfer.types; + return !types || Array.prototype.some.call(types, function (type) { + return type == 'text/plain' || type == 'Text'; + }); + } + function getDropEffect(e) { + var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized']; + var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized']; + var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey; + var effectAllowed = "uninitialized"; + try { + effectAllowed = e.dataTransfer.effectAllowed.toLowerCase(); + } + catch (e) { } + var dropEffect = "none"; + if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "copy"; + else if (moveAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "move"; + else if (copyAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "copy"; + return dropEffect; + } +} +(function () { + this.dragWait = function () { + var interval = Date.now() - this.mousedownEvent.time; + if (interval > this.editor.getDragDelay()) + this.startDrag(); + }; + this.dragWaitEnd = function () { + var target = this.editor.container; + target.draggable = false; + this.startSelect(this.mousedownEvent.getDocumentPosition()); + this.selectEnd(); + }; + this.dragReadyEnd = function (e) { + this.editor.$resetCursorStyle(); + this.editor.unsetStyle("ace_dragging"); + this.editor.renderer.setCursorStyle(""); + this.dragWaitEnd(); + }; + this.startDrag = function () { + this.cancelDrag = false; + var editor = this.editor; + var target = editor.container; + target.draggable = true; + editor.renderer.$cursorLayer.setBlinking(false); + editor.setStyle("ace_dragging"); + var cursorStyle = useragent.isWin ? "default" : "move"; + editor.renderer.setCursorStyle(cursorStyle); + this.setState("dragReady"); + }; + this.onMouseDrag = function (e) { + var target = this.editor.container; + if (useragent.isIE && this.state == "dragReady") { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + if (distance > 3) + target.dragDrop(); + } + if (this.state === "dragWait") { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + if (distance > 0) { + target.draggable = false; + this.startSelect(this.mousedownEvent.getDocumentPosition()); + } + } + }; + this.onMouseDown = function (e) { + if (!this.$dragEnabled) + return; + this.mousedownEvent = e; + var editor = this.editor; + var inSelection = e.inSelection(); + var button = e.getButton(); + var clickCount = e.domEvent.detail || 1; + if (clickCount === 1 && button === 0 && inSelection) { + if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey())) + return; + this.mousedownEvent.time = Date.now(); + var eventTarget = e.domEvent.target || e.domEvent.srcElement; + if ("unselectable" in eventTarget) + eventTarget.unselectable = "on"; + if (editor.getDragDelay()) { + if (useragent.isWebKit) { + this.cancelDrag = true; + var mouseTarget = editor.container; + mouseTarget.draggable = true; + } + this.setState("dragWait"); + } + else { + this.startDrag(); + } + this.captureMouse(e, this.onMouseDrag.bind(this)); + e.defaultPrevented = true; + } + }; +}).call(DragdropHandler.prototype); +function calcDistance(ax, ay, bx, by) { + return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); +} +exports.DragdropHandler = DragdropHandler; + +}); + +ace.define("ace/mouse/touch_handler",["require","exports","module","ace/mouse/mouse_event","ace/lib/event","ace/lib/dom"], function(require, exports, module){"use strict"; +var MouseEvent = require("./mouse_event").MouseEvent; +var event = require("../lib/event"); +var dom = require("../lib/dom"); +exports.addTouchListeners = function (el, editor) { + var mode = "scroll"; + var startX; + var startY; + var touchStartT; + var lastT; + var longTouchTimer; + var animationTimer; + var animationSteps = 0; + var pos; + var clickCount = 0; + var vX = 0; + var vY = 0; + var pressed; + var contextMenu; + function createContextMenu() { + var clipboard = window.navigator && window.navigator.clipboard; + var isOpen = false; + var updateMenu = function () { + var selected = editor.getCopyText(); + var hasUndo = editor.session.getUndoManager().hasUndo(); + contextMenu.replaceChild(dom.buildDom(isOpen ? ["span", + !selected && canExecuteCommand("selectall") && ["span", { class: "ace_mobile-button", action: "selectall" }, "Select All"], + selected && canExecuteCommand("copy") && ["span", { class: "ace_mobile-button", action: "copy" }, "Copy"], + selected && canExecuteCommand("cut") && ["span", { class: "ace_mobile-button", action: "cut" }, "Cut"], + clipboard && canExecuteCommand("paste") && ["span", { class: "ace_mobile-button", action: "paste" }, "Paste"], + hasUndo && canExecuteCommand("undo") && ["span", { class: "ace_mobile-button", action: "undo" }, "Undo"], + canExecuteCommand("find") && ["span", { class: "ace_mobile-button", action: "find" }, "Find"], + canExecuteCommand("openCommandPalette") && ["span", { class: "ace_mobile-button", action: "openCommandPalette" }, "Palette"] + ] : ["span"]), contextMenu.firstChild); + }; + var canExecuteCommand = function (/** @type {string} */ cmd) { + return editor.commands.canExecute(cmd, editor); + }; + var handleClick = function (e) { + var action = e.target.getAttribute("action"); + if (action == "more" || !isOpen) { + isOpen = !isOpen; + return updateMenu(); + } + if (action == "paste") { + clipboard.readText().then(function (text) { + editor.execCommand(action, text); + }); + } + else if (action) { + if (action == "cut" || action == "copy") { + if (clipboard) + clipboard.writeText(editor.getCopyText()); + else + document.execCommand("copy"); + } + editor.execCommand(action); + } + contextMenu.firstChild.style.display = "none"; + isOpen = false; + if (action != "openCommandPalette") + editor.focus(); + }; + contextMenu = dom.buildDom(["div", + { + class: "ace_mobile-menu", + ontouchstart: function (e) { + mode = "menu"; + e.stopPropagation(); + e.preventDefault(); + editor.textInput.focus(); + }, + ontouchend: function (e) { + e.stopPropagation(); + e.preventDefault(); + handleClick(e); + }, + onclick: handleClick + }, + ["span"], + ["span", { class: "ace_mobile-button", action: "more" }, "..."] + ], editor.container); + } + function showContextMenu() { + if (!editor.getOption("enableMobileMenu")) { + if (contextMenu) { + hideContextMenu(); + } + return; + } + if (!contextMenu) + createContextMenu(); + var cursor = editor.selection.cursor; + var pagePos = editor.renderer.textToScreenCoordinates(cursor.row, cursor.column); + var leftOffset = editor.renderer.textToScreenCoordinates(0, 0).pageX; + var scrollLeft = editor.renderer.scrollLeft; + var rect = editor.container.getBoundingClientRect(); + contextMenu.style.top = pagePos.pageY - rect.top - 3 + "px"; + if (pagePos.pageX - rect.left < rect.width - 70) { + contextMenu.style.left = ""; + contextMenu.style.right = "10px"; + } + else { + contextMenu.style.right = ""; + contextMenu.style.left = leftOffset + scrollLeft - rect.left + "px"; + } + contextMenu.style.display = ""; + contextMenu.firstChild.style.display = "none"; + editor.on("input", hideContextMenu); + } + function hideContextMenu(e) { + if (contextMenu) + contextMenu.style.display = "none"; + editor.off("input", hideContextMenu); + } + function handleLongTap() { + longTouchTimer = null; + clearTimeout(longTouchTimer); + var range = editor.selection.getRange(); + var inSelection = range.contains(pos.row, pos.column); + if (range.isEmpty() || !inSelection) { + editor.selection.moveToPosition(pos); + editor.selection.selectWord(); + } + mode = "wait"; + showContextMenu(); + } + function switchToSelectionMode() { + longTouchTimer = null; + clearTimeout(longTouchTimer); + editor.selection.moveToPosition(pos); + var range = clickCount >= 2 + ? editor.selection.getLineRange(pos.row) + : editor.session.getBracketRange(pos); + if (range && !range.isEmpty()) { + editor.selection.setRange(range); + } + else { + editor.selection.selectWord(); + } + mode = "wait"; + } + event.addListener(el, "contextmenu", function (e) { + if (!pressed) + return; + var textarea = editor.textInput.getElement(); + textarea.focus(); + }, editor); + event.addListener(el, "touchstart", function (e) { + var touches = e.touches; + if (longTouchTimer || touches.length > 1) { + clearTimeout(longTouchTimer); + longTouchTimer = null; + touchStartT = -1; + mode = "zoom"; + return; + } + pressed = editor.$mouseHandler.isMousePressed = true; + var h = editor.renderer.layerConfig.lineHeight; + var w = editor.renderer.layerConfig.lineHeight; + var t = e.timeStamp; + lastT = t; + var touchObj = touches[0]; + var x = touchObj.clientX; + var y = touchObj.clientY; + if (Math.abs(startX - x) + Math.abs(startY - y) > h) + touchStartT = -1; + startX = e.clientX = x; + startY = e.clientY = y; + vX = vY = 0; + var ev = new MouseEvent(e, editor); + pos = ev.getDocumentPosition(); + if (t - touchStartT < 500 && touches.length == 1 && !animationSteps) { + clickCount++; + e.preventDefault(); + e.button = 0; + switchToSelectionMode(); + } + else { + clickCount = 0; + var cursor = editor.selection.cursor; + var anchor = editor.selection.isEmpty() ? cursor : editor.selection.anchor; + var cursorPos = editor.renderer.$cursorLayer.getPixelPosition(cursor, true); + var anchorPos = editor.renderer.$cursorLayer.getPixelPosition(anchor, true); + var rect = editor.renderer.scroller.getBoundingClientRect(); + var offsetTop = editor.renderer.layerConfig.offset; + var offsetLeft = editor.renderer.scrollLeft; + var weightedDistance = function (x, y) { + x = x / w; + y = y / h - 0.75; + return x * x + y * y; + }; + if (e.clientX < rect.left) { + mode = "zoom"; + return; + } + var diff1 = weightedDistance(e.clientX - rect.left - cursorPos.left + offsetLeft, e.clientY - rect.top - cursorPos.top + offsetTop); + var diff2 = weightedDistance(e.clientX - rect.left - anchorPos.left + offsetLeft, e.clientY - rect.top - anchorPos.top + offsetTop); + if (diff1 < 3.5 && diff2 < 3.5) + mode = diff1 > diff2 ? "cursor" : "anchor"; + if (diff2 < 3.5) + mode = "anchor"; + else if (diff1 < 3.5) + mode = "cursor"; + else + mode = "scroll"; + longTouchTimer = setTimeout(handleLongTap, 450); + } + touchStartT = t; + }, editor); + event.addListener(el, "touchend", function (e) { + pressed = editor.$mouseHandler.isMousePressed = false; + if (animationTimer) + clearInterval(animationTimer); + if (mode == "zoom") { + mode = ""; + animationSteps = 0; + } + else if (longTouchTimer) { + editor.selection.moveToPosition(pos); + animationSteps = 0; + showContextMenu(); + } + else if (mode == "scroll") { + animate(); + hideContextMenu(); + } + else { + showContextMenu(); + } + clearTimeout(longTouchTimer); + longTouchTimer = null; + }, editor); + event.addListener(el, "touchmove", function (e) { + if (longTouchTimer) { + clearTimeout(longTouchTimer); + longTouchTimer = null; + } + var touches = e.touches; + if (touches.length > 1 || mode == "zoom") + return; + var touchObj = touches[0]; + var wheelX = startX - touchObj.clientX; + var wheelY = startY - touchObj.clientY; + if (mode == "wait") { + if (wheelX * wheelX + wheelY * wheelY > 4) + mode = "cursor"; + else + return e.preventDefault(); + } + startX = touchObj.clientX; + startY = touchObj.clientY; + e.clientX = touchObj.clientX; + e.clientY = touchObj.clientY; + var t = e.timeStamp; + var dt = t - lastT; + lastT = t; + if (mode == "scroll") { + var mouseEvent = new MouseEvent(e, editor); + mouseEvent.speed = 1; + mouseEvent.wheelX = wheelX; + mouseEvent.wheelY = wheelY; + if (10 * Math.abs(wheelX) < Math.abs(wheelY)) + wheelX = 0; + if (10 * Math.abs(wheelY) < Math.abs(wheelX)) + wheelY = 0; + if (dt != 0) { + vX = wheelX / dt; + vY = wheelY / dt; + } + editor._emit("mousewheel", mouseEvent); + if (!mouseEvent.propagationStopped) { + vX = vY = 0; + } + } + else { + var ev = new MouseEvent(e, editor); + var pos = ev.getDocumentPosition(); + if (mode == "cursor") + editor.selection.moveCursorToPosition(pos); + else if (mode == "anchor") + editor.selection.setSelectionAnchor(pos.row, pos.column); + editor.renderer.scrollCursorIntoView(pos); + e.preventDefault(); + } + }, editor); + function animate() { + animationSteps += 60; + animationTimer = setInterval(function () { + if (animationSteps-- <= 0) { + clearInterval(animationTimer); + animationTimer = null; + } + if (Math.abs(vX) < 0.01) + vX = 0; + if (Math.abs(vY) < 0.01) + vY = 0; + if (animationSteps < 20) + vX = 0.9 * vX; + if (animationSteps < 20) + vY = 0.9 * vY; + var oldScrollTop = editor.session.getScrollTop(); + editor.renderer.scrollBy(10 * vX, 10 * vY); + if (oldScrollTop == editor.session.getScrollTop()) + animationSteps = 0; + }, 10); + } +}; + +}); + +ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/mouse/touch_handler","ace/config"], function(require, exports, module){"use strict"; +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var DefaultHandlers = require("./default_handlers").DefaultHandlers; +var DefaultGutterHandler = require("./default_gutter_handler").GutterHandler; +var MouseEvent = require("./mouse_event").MouseEvent; +var DragdropHandler = require("./dragdrop_handler").DragdropHandler; +var addTouchListeners = require("./touch_handler").addTouchListeners; +var config = require("../config"); +var MouseHandler = /** @class */ (function () { + function MouseHandler(editor) { this.$dragDelay; this.$dragEnabled; this.$mouseMoved; this.mouseEvent; this.$focusTimeout; + var _self = this; + this.editor = editor; + new DefaultHandlers(this); + new DefaultGutterHandler(this); + new DragdropHandler(this); + var focusEditor = function (e) { + var windowBlurred = !document.hasFocus || !document.hasFocus() + || !editor.isFocused() && document.activeElement == (editor.textInput && editor.textInput.getElement()); + if (windowBlurred) + window.focus(); + editor.focus(); + setTimeout(function () { + if (!editor.isFocused()) + editor.focus(); + }); + }; + var mouseTarget = editor.renderer.getMouseEventTarget(); + event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click"), editor); + event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove"), editor); + event.addMultiMouseDownListener([ + mouseTarget, + editor.renderer.scrollBarV && editor.renderer.scrollBarV.inner, + editor.renderer.scrollBarH && editor.renderer.scrollBarH.inner, + editor.textInput && editor.textInput.getElement() + ].filter(Boolean), [400, 300, 250], this, "onMouseEvent", editor); + event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel"), editor); + addTouchListeners(editor.container, editor); + var gutterEl = editor.renderer.$gutter; + event.addListener(gutterEl, "mousedown", this.onMouseEvent.bind(this, "guttermousedown"), editor); + event.addListener(gutterEl, "click", this.onMouseEvent.bind(this, "gutterclick"), editor); + event.addListener(gutterEl, "dblclick", this.onMouseEvent.bind(this, "gutterdblclick"), editor); + event.addListener(gutterEl, "mousemove", this.onMouseEvent.bind(this, "guttermousemove"), editor); + event.addListener(mouseTarget, "mousedown", focusEditor, editor); + event.addListener(gutterEl, "mousedown", focusEditor, editor); + if (useragent.isIE && editor.renderer.scrollBarV) { + event.addListener(editor.renderer.scrollBarV.element, "mousedown", focusEditor, editor); + event.addListener(editor.renderer.scrollBarH.element, "mousedown", focusEditor, editor); + } + editor.on("mousemove", function (e) { + if (_self.state || _self.$dragDelay || !_self.$dragEnabled) + return; + var character = editor.renderer.screenToTextCoordinates(e.x, e.y); + var range = editor.session.selection.getRange(); + var renderer = editor.renderer; + if (!range.isEmpty() && range.insideStart(character.row, character.column)) { + renderer.setCursorStyle("default"); + } + else { + renderer.setCursorStyle(""); + } + }, //@ts-expect-error TODO: seems mistyping - should be boolean + editor); + } + MouseHandler.prototype.onMouseEvent = function (name, e) { + if (!this.editor.session) + return; + this.editor._emit(name, new MouseEvent(e, this.editor)); + }; + MouseHandler.prototype.onMouseMove = function (name, e) { + var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove; + if (!listeners || !listeners.length) + return; + this.editor._emit(name, new MouseEvent(e, this.editor)); + }; + MouseHandler.prototype.onMouseWheel = function (name, e) { + var mouseEvent = new MouseEvent(e, this.editor); + mouseEvent.speed = this.$scrollSpeed * 2; + mouseEvent.wheelX = e.wheelX; + mouseEvent.wheelY = e.wheelY; + this.editor._emit(name, mouseEvent); + }; + MouseHandler.prototype.setState = function (state) { + this.state = state; + }; + MouseHandler.prototype.captureMouse = function (ev, mouseMoveHandler) { + this.x = ev.x; + this.y = ev.y; + this.isMousePressed = true; + var editor = this.editor; + var renderer = this.editor.renderer; + renderer.$isMousePressed = true; + var self = this; + var onMouseMove = function (e) { + if (!e) + return; + if (useragent.isWebKit && !e.which && self.releaseMouse) + return self.releaseMouse(); + self.x = e.clientX; + self.y = e.clientY; + mouseMoveHandler && mouseMoveHandler(e); + self.mouseEvent = new MouseEvent(e, self.editor); + self.$mouseMoved = true; + }; + var onCaptureEnd = function (e) { + editor.off("beforeEndOperation", onOperationEnd); + clearInterval(timerId); + if (editor.session) + onCaptureInterval(); + self[self.state + "End"] && self[self.state + "End"](e); + self.state = ""; + self.isMousePressed = renderer.$isMousePressed = false; + if (renderer.$keepTextAreaAtCursor) + renderer.$moveTextAreaToCursor(); + self.$onCaptureMouseMove = self.releaseMouse = null; + e && self.onMouseEvent("mouseup", e); + editor.endOperation(); + }; + var onCaptureInterval = function () { + self[self.state] && self[self.state](); + self.$mouseMoved = false; + }; + if (useragent.isOldIE && ev.domEvent.type == "dblclick") { + return setTimeout(function () { onCaptureEnd(ev); }); + } + var onOperationEnd = function (e) { + if (!self.releaseMouse) + return; + if (editor.curOp.command.name && editor.curOp.selectionChanged) { + self[self.state + "End"] && self[self.state + "End"](); + self.state = ""; + self.releaseMouse(); + } + }; + editor.on("beforeEndOperation", onOperationEnd); + editor.startOperation({ command: { name: "mouse" } }); + self.$onCaptureMouseMove = onMouseMove; + self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd); + var timerId = setInterval(onCaptureInterval, 20); + }; + MouseHandler.prototype.cancelContextMenu = function () { + var stop = function (e) { + if (e && e.domEvent && e.domEvent.type != "contextmenu") + return; + this.editor.off("nativecontextmenu", stop); + if (e && e.domEvent) + event.stopEvent(e.domEvent); + }.bind(this); + setTimeout(stop, 10); + this.editor.on("nativecontextmenu", stop); + }; + MouseHandler.prototype.destroy = function () { + if (this.releaseMouse) + this.releaseMouse(); + }; + return MouseHandler; +}()); +MouseHandler.prototype.releaseMouse = null; +config.defineOptions(MouseHandler.prototype, "mouseHandler", { + scrollSpeed: { initialValue: 2 }, + dragDelay: { initialValue: (useragent.isMac ? 150 : 0) }, + dragEnabled: { initialValue: true }, + focusTimeout: { initialValue: 0 }, + tooltipFollowsMouse: { initialValue: true } +}); +exports.MouseHandler = MouseHandler; + +}); + +ace.define("ace/mouse/fold_handler",["require","exports","module","ace/lib/dom"], function(require, exports, module){"use strict"; +var dom = require("../lib/dom"); +var FoldHandler = /** @class */ (function () { + function FoldHandler(editor) { + editor.on("click", function (e) { + var position = e.getDocumentPosition(); + var session = editor.session; + var fold = session.getFoldAt(position.row, position.column, 1); + if (fold) { + if (e.getAccelKey()) + session.removeFold(fold); + else + session.expandFold(fold); + e.stop(); + } + var target = e.domEvent && e.domEvent.target; + if (target && dom.hasCssClass(target, "ace_inline_button")) { + if (dom.hasCssClass(target, "ace_toggle_wrap")) { + session.setOption("wrap", !session.getUseWrapMode()); + editor.renderer.scrollCursorIntoView(); + } + } + }); + editor.on("gutterclick", function (e) { + var gutterRegion = editor.renderer.$gutterLayer.getRegion(e); + if (gutterRegion == "foldWidgets") { + var row = e.getDocumentPosition().row; + var session = editor.session; + if (session.foldWidgets && session.foldWidgets[row]) + editor.session.onFoldWidgetClick(row, e); + if (!editor.isFocused()) + editor.focus(); + e.stop(); + } + }); + editor.on("gutterdblclick", function (e) { + var gutterRegion = editor.renderer.$gutterLayer.getRegion(e); + if (gutterRegion == "foldWidgets") { + var row = e.getDocumentPosition().row; + var session = editor.session; + var data = session.getParentFoldRangeData(row, true); + var range = data.range || data.firstRange; + if (range) { + row = range.start.row; + var fold = session.getFoldAt(row, session.getLine(row).length, 1); + if (fold) { + session.removeFold(fold); + } + else { + session.addFold("...", range); + editor.renderer.scrollCursorIntoView({ row: range.start.row, column: 0 }); + } + } + e.stop(); + } + }); + } + return FoldHandler; +}()); +exports.FoldHandler = FoldHandler; + +}); + +ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"], function(require, exports, module){"use strict"; +var keyUtil = require("../lib/keys"); +var event = require("../lib/event"); +var KeyBinding = /** @class */ (function () { + function KeyBinding(editor) { + this.$editor = editor; + this.$data = { editor: editor }; + this.$handlers = []; + this.setDefaultHandler(editor.commands); + } + KeyBinding.prototype.setDefaultHandler = function (kb) { + this.removeKeyboardHandler(this.$defaultHandler); + this.$defaultHandler = kb; + this.addKeyboardHandler(kb, 0); + }; + KeyBinding.prototype.setKeyboardHandler = function (kb) { + var h = this.$handlers; + if (h[h.length - 1] == kb) + return; + while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler) + this.removeKeyboardHandler(h[h.length - 1]); + this.addKeyboardHandler(kb, 1); + }; + KeyBinding.prototype.addKeyboardHandler = function (kb, pos) { + if (!kb) + return; + if (typeof kb == "function" && !kb.handleKeyboard) + kb.handleKeyboard = kb; + var i = this.$handlers.indexOf(kb); + if (i != -1) + this.$handlers.splice(i, 1); + if (pos == undefined) + this.$handlers.push(kb); + else + this.$handlers.splice(pos, 0, kb); + if (i == -1 && kb.attach) + kb.attach(this.$editor); + }; + KeyBinding.prototype.removeKeyboardHandler = function (kb) { + var i = this.$handlers.indexOf(kb); + if (i == -1) + return false; + this.$handlers.splice(i, 1); + kb.detach && kb.detach(this.$editor); + return true; + }; + KeyBinding.prototype.getKeyboardHandler = function () { + return this.$handlers[this.$handlers.length - 1]; + }; + KeyBinding.prototype.getStatusText = function () { + var data = this.$data; + var editor = data.editor; + return this.$handlers.map(function (h) { + return h.getStatusText && h.getStatusText(editor, data) || ""; + }).filter(Boolean).join(" "); + }; + KeyBinding.prototype.$callKeyboardHandlers = function (hashId, keyString, keyCode, e) { + var toExecute; + var success = false; + var commands = this.$editor.commands; + for (var i = this.$handlers.length; i--;) { + toExecute = this.$handlers[i].handleKeyboard( + this.$data, hashId, keyString, keyCode, e); + if (!toExecute || !toExecute.command) + continue; + if (toExecute.command == "null") { + success = true; + } + else { + success = commands.exec(toExecute.command, this.$editor, toExecute.args, e); + } + if (success && e && hashId != -1 && + toExecute["passEvent"] != true && toExecute.command["passEvent"] != true) { + event.stopEvent(e); + } + if (success) + break; + } + if (!success && hashId == -1) { + toExecute = { command: "insertstring" }; + success = commands.exec("insertstring", this.$editor, keyString); + } + if (success && this.$editor._signal) + this.$editor._signal("keyboardActivity", toExecute); + return success; + }; + KeyBinding.prototype.onCommandKey = function (e, hashId, keyCode) { + var keyString = keyUtil.keyCodeToString(keyCode); + return this.$callKeyboardHandlers(hashId, keyString, keyCode, e); + }; + KeyBinding.prototype.onTextInput = function (text) { + return this.$callKeyboardHandlers(-1, text); + }; + return KeyBinding; +}()); +exports.KeyBinding = KeyBinding; + +}); + +ace.define("ace/lib/bidiutil",["require","exports","module"], function(require, exports, module){"use strict"; +var ArabicAlefBetIntervalsBegine = ['\u0621', '\u0641']; +var ArabicAlefBetIntervalsEnd = ['\u063A', '\u064a']; +var dir = 0, hiLevel = 0; +var lastArabic = false, hasUBAT_AL = false, hasUBAT_B = false, hasUBAT_S = false, hasBlockSep = false, hasSegSep = false; +var impTab_LTR = [ [0, 3, 0, 1, 0, 0, 0], [0, 3, 0, 1, 2, 2, 0], [0, 3, 0, 0x11, 2, 0, 1], [0, 3, 5, 5, 4, 1, 0], [0, 3, 0x15, 0x15, 4, 0, 1], [0, 3, 5, 5, 4, 2, 0] +]; +var impTab_RTL = [ [2, 0, 1, 1, 0, 1, 0], [2, 0, 1, 1, 0, 2, 0], [2, 0, 2, 1, 3, 2, 0], [2, 0, 2, 0x21, 3, 1, 1] +]; +var LTR = 0, RTL = 1; +var L = 0; +var R = 1; +var EN = 2; +var AN = 3; +var ON = 4; +var B = 5; +var S = 6; +var AL = 7; +var WS = 8; +var CS = 9; +var ES = 10; +var ET = 11; +var NSM = 12; +var LRE = 13; +var RLE = 14; +var PDF = 15; +var LRO = 16; +var RLO = 17; +var BN = 18; +var UnicodeTBL00 = [ + BN, BN, BN, BN, BN, BN, BN, BN, BN, S, B, S, WS, B, BN, BN, + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, B, B, B, S, + WS, ON, ON, ET, ET, ET, ON, ON, ON, ON, ON, ES, CS, ES, CS, CS, + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, CS, ON, ON, ON, ON, ON, + ON, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, + L, L, L, L, L, L, L, L, L, L, L, ON, ON, ON, ON, ON, + ON, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, + L, L, L, L, L, L, L, L, L, L, L, ON, ON, ON, ON, BN, + BN, BN, BN, BN, BN, B, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, + CS, ON, ET, ET, ET, ET, ON, ON, ON, ON, L, ON, ON, BN, ON, ON, + ET, ET, EN, EN, ON, L, ON, ON, ON, EN, L, ON, ON, ON, ON, ON +]; +var UnicodeTBL20 = [ + WS, WS, WS, WS, WS, WS, WS, WS, WS, WS, WS, BN, BN, BN, L, R, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, WS, B, LRE, RLE, PDF, LRO, RLO, CS, + ET, ET, ET, ET, ET, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, CS, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, WS +]; +function _computeLevels(chars, levels, len, charTypes) { + var impTab = dir ? impTab_RTL : impTab_LTR, prevState = null, newClass = null, newLevel = null, newState = 0, action = null, cond = null, condPos = -1, i = null, ix = null, classes = []; + if (!charTypes) { + for (i = 0, charTypes = []; i < len; i++) { + charTypes[i] = _getCharacterType(chars[i]); + } + } + hiLevel = dir; + lastArabic = false; + hasUBAT_AL = false; + hasUBAT_B = false; + hasUBAT_S = false; + for (ix = 0; ix < len; ix++) { + prevState = newState; + classes[ix] = newClass = _getCharClass(chars, charTypes, classes, ix); + newState = impTab[prevState][newClass]; + action = newState & 0xF0; + newState &= 0x0F; + levels[ix] = newLevel = impTab[newState][5]; + if (action > 0) { + if (action == 0x10) { + for (i = condPos; i < ix; i++) { + levels[i] = 1; + } + condPos = -1; + } + else { + condPos = -1; + } + } + cond = impTab[newState][6]; + if (cond) { + if (condPos == -1) { + condPos = ix; + } + } + else { + if (condPos > -1) { + for (i = condPos; i < ix; i++) { + levels[i] = newLevel; + } + condPos = -1; + } + } + if (charTypes[ix] == B) { + levels[ix] = 0; + } + hiLevel |= newLevel; + } + if (hasUBAT_S) { + for (i = 0; i < len; i++) { + if (charTypes[i] == S) { + levels[i] = dir; + for (var j = i - 1; j >= 0; j--) { + if (charTypes[j] == WS) { + levels[j] = dir; + } + else { + break; + } + } + } + } + } +} +function _invertLevel(lev, levels, _array) { + if (hiLevel < lev) { + return; + } + if (lev == 1 && dir == RTL && !hasUBAT_B) { + _array.reverse(); + return; + } + var len = _array.length, start = 0, end, lo, hi, tmp; + while (start < len) { + if (levels[start] >= lev) { + end = start + 1; + while (end < len && levels[end] >= lev) { + end++; + } + for (lo = start, hi = end - 1; lo < hi; lo++, hi--) { + tmp = _array[lo]; + _array[lo] = _array[hi]; + _array[hi] = tmp; + } + start = end; + } + start++; + } +} +function _getCharClass(chars, types, classes, ix) { + var cType = types[ix], wType, nType, len, i; + switch (cType) { + case L: + case R: + lastArabic = false; + case ON: + case AN: + return cType; + case EN: + return lastArabic ? AN : EN; + case AL: + lastArabic = true; + hasUBAT_AL = true; + return R; + case WS: + return ON; + case CS: + if (ix < 1 || (ix + 1) >= types.length || + ((wType = classes[ix - 1]) != EN && wType != AN) || + ((nType = types[ix + 1]) != EN && nType != AN)) { + return ON; + } + if (lastArabic) { + nType = AN; + } + return nType == wType ? nType : ON; + case ES: + wType = ix > 0 ? classes[ix - 1] : B; + if (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN) { + return EN; + } + return ON; + case ET: + if (ix > 0 && classes[ix - 1] == EN) { + return EN; + } + if (lastArabic) { + return ON; + } + i = ix + 1; + len = types.length; + while (i < len && types[i] == ET) { + i++; + } + if (i < len && types[i] == EN) { + return EN; + } + return ON; + case NSM: + len = types.length; + i = ix + 1; + while (i < len && types[i] == NSM) { + i++; + } + if (i < len) { + var c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E; + wType = types[i]; + if (rtlCandidate && (wType == R || wType == AL)) { + return R; + } + } + if (ix < 1 || (wType = types[ix - 1]) == B) { + return ON; + } + return classes[ix - 1]; + case B: + lastArabic = false; + hasUBAT_B = true; + return dir; + case S: + hasUBAT_S = true; + return ON; + case LRE: + case RLE: + case LRO: + case RLO: + case PDF: + lastArabic = false; + case BN: + return ON; + } +} +function _getCharacterType(ch) { + var uc = ch.charCodeAt(0), hi = uc >> 8; + if (hi == 0) { + return ((uc > 0x00BF) ? L : UnicodeTBL00[uc]); + } + else if (hi == 5) { + return (/[\u0591-\u05f4]/.test(ch) ? R : L); + } + else if (hi == 6) { + if (/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(ch)) + return NSM; + else if (/[\u0660-\u0669\u066b-\u066c]/.test(ch)) + return AN; + else if (uc == 0x066A) + return ET; + else if (/[\u06f0-\u06f9]/.test(ch)) + return EN; + else + return AL; + } + else if (hi == 0x20 && uc <= 0x205F) { + return UnicodeTBL20[uc & 0xFF]; + } + else if (hi == 0xFE) { + return (uc >= 0xFE70 ? AL : ON); + } + return ON; +} +function _isArabicDiacritics(ch) { + return (ch >= '\u064b' && ch <= '\u0655'); +} +exports.L = L; +exports.R = R; +exports.EN = EN; +exports.ON_R = 3; +exports.AN = 4; +exports.R_H = 5; +exports.B = 6; +exports.RLE = 7; +exports.DOT = "\xB7"; +exports.doBidiReorder = function (text, textCharTypes, isRtl) { + if (text.length < 2) + return {}; + var chars = text.split(""), logicalFromVisual = new Array(chars.length), bidiLevels = new Array(chars.length), levels = []; + dir = isRtl ? RTL : LTR; + _computeLevels(chars, levels, chars.length, textCharTypes); + for (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++) + ; + _invertLevel(2, levels, logicalFromVisual); + _invertLevel(1, levels, logicalFromVisual); + for (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width + if (textCharTypes[i] === AN) { + levels[i] = exports.AN; + } + else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE) + || textCharTypes[i] === ON || textCharTypes[i] === BN)) { + levels[i] = exports.ON_R; + } + else if ((i > 0 && chars[i - 1] === '\u0644') && /\u0622|\u0623|\u0625|\u0627/.test(chars[i])) { + levels[i - 1] = levels[i] = exports.R_H; + i++; + } + } + if (chars[chars.length - 1] === exports.DOT) + levels[chars.length - 1] = exports.B; + if (chars[0] === '\u202B') + levels[0] = exports.RLE; + for (var i = 0; i < logicalFromVisual.length; i++) { + bidiLevels[i] = levels[logicalFromVisual[i]]; + } + return { 'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels }; +}; +exports.hasBidiCharacters = function (text, textCharTypes) { + var ret = false; + for (var i = 0; i < text.length; i++) { + textCharTypes[i] = _getCharacterType(text.charAt(i)); + if (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL || textCharTypes[i] == AN)) + ret = true; + } + return ret; +}; +exports.getVisualFromLogicalIdx = function (logIdx, rowMap) { + for (var i = 0; i < rowMap.logicalFromVisual.length; i++) { + if (rowMap.logicalFromVisual[i] == logIdx) + return i; + } + return 0; +}; + +}); + +ace.define("ace/bidihandler",["require","exports","module","ace/lib/bidiutil","ace/lib/lang"], function(require, exports, module){"use strict"; +var bidiUtil = require("./lib/bidiutil"); +var lang = require("./lib/lang"); +var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\u202B]/; +var BidiHandler = /** @class */ (function () { + function BidiHandler(session) { + this.session = session; + this.bidiMap = {}; + this.currentRow = null; + this.bidiUtil = bidiUtil; + this.charWidths = []; + this.EOL = "\xAC"; + this.showInvisibles = true; + this.isRtlDir = false; + this.$isRtl = false; + this.line = ""; + this.wrapIndent = 0; + this.EOF = "\xB6"; + this.RLE = "\u202B"; + this.contentWidth = 0; + this.fontMetrics = null; + this.rtlLineOffset = 0; + this.wrapOffset = 0; + this.isMoveLeftOperation = false; + this.seenBidi = bidiRE.test(session.getValue()); + } + BidiHandler.prototype.isBidiRow = function (screenRow, docRow, splitIndex) { + if (!this.seenBidi) + return false; + if (screenRow !== this.currentRow) { + this.currentRow = screenRow; + this.updateRowLine(docRow, splitIndex); + this.updateBidiMap(); + } + return this.bidiMap.bidiLevels; + }; + BidiHandler.prototype.onChange = function (delta) { + if (!this.seenBidi) { + if (delta.action == "insert" && bidiRE.test(delta.lines.join("\n"))) { + this.seenBidi = true; + this.currentRow = null; + } + } + else { + this.currentRow = null; + } + }; + BidiHandler.prototype.getDocumentRow = function () { + var docRow = 0; + var rowCache = this.session.$screenRowCache; + if (rowCache.length) { + var index = this.session.$getRowCacheIndex(rowCache, this.currentRow); + if (index >= 0) + docRow = this.session.$docRowCache[index]; + } + return docRow; + }; + BidiHandler.prototype.getSplitIndex = function () { + var splitIndex = 0; + var rowCache = this.session.$screenRowCache; + if (rowCache.length) { + var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow); + while (this.currentRow - splitIndex > 0) { + currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1); + if (currentIndex !== prevIndex) + break; + prevIndex = currentIndex; + splitIndex++; + } + } + else { + splitIndex = this.currentRow; + } + return splitIndex; + }; + BidiHandler.prototype.updateRowLine = function (docRow, splitIndex) { + if (docRow === undefined) + docRow = this.getDocumentRow(); + var isLastRow = (docRow === this.session.getLength() - 1), endOfLine = isLastRow ? this.EOF : this.EOL; + this.wrapIndent = 0; + this.line = this.session.getLine(docRow); + this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE; + if (this.session.$useWrapMode) { + var splits = this.session.$wrapData[docRow]; + if (splits) { + if (splitIndex === undefined) + splitIndex = this.getSplitIndex(); + if (splitIndex > 0 && splits.length) { + this.wrapIndent = splits.indent; + this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L]; + this.line = (splitIndex < splits.length) ? + this.line.substring(splits[splitIndex - 1], splits[splitIndex]) : + this.line.substring(splits[splits.length - 1]); + } + else { + this.line = this.line.substring(0, splits[splitIndex]); + } + if (splitIndex == splits.length) { + this.line += (this.showInvisibles) ? endOfLine : bidiUtil.DOT; + } + } + } + else { + this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT; + } + var session = this.session, shift = 0, size; + this.line = this.line.replace(/\t|[\u1100-\u2029, \u202F-\uFFE6]/g, function (ch, i) { + if (ch === '\t' || session.isFullWidth(ch.charCodeAt(0))) { + size = (ch === '\t') ? session.getScreenTabSize(i + shift) : 2; + shift += size - 1; + return lang.stringRepeat(bidiUtil.DOT, size); + } + return ch; + }); + if (this.isRtlDir) { + this.fontMetrics.$main.textContent = (this.line.charAt(this.line.length - 1) == bidiUtil.DOT) ? this.line.substr(0, this.line.length - 1) : this.line; + this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width; + } + }; + BidiHandler.prototype.updateBidiMap = function () { + var textCharTypes = []; + if (bidiUtil.hasBidiCharacters(this.line, textCharTypes) || this.isRtlDir) { + this.bidiMap = bidiUtil.doBidiReorder(this.line, textCharTypes, this.isRtlDir); + } + else { + this.bidiMap = {}; + } + }; + BidiHandler.prototype.markAsDirty = function () { + this.currentRow = null; + }; + BidiHandler.prototype.updateCharacterWidths = function (fontMetrics) { + if (this.characterWidth === fontMetrics.$characterSize.width) + return; + this.fontMetrics = fontMetrics; + var characterWidth = this.characterWidth = fontMetrics.$characterSize.width; + var bidiCharWidth = fontMetrics.$measureCharWidth("\u05d4"); + this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth; + this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth; + this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45; + this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0; + this.currentRow = null; + }; + BidiHandler.prototype.setShowInvisibles = function (showInvisibles) { + this.showInvisibles = showInvisibles; + this.currentRow = null; + }; + BidiHandler.prototype.setEolChar = function (eolChar) { + this.EOL = eolChar; + }; + BidiHandler.prototype.setContentWidth = function (width) { + this.contentWidth = width; + }; + BidiHandler.prototype.isRtlLine = function (row) { + if (this.$isRtl) + return true; + if (row != undefined) + return (this.session.getLine(row).charAt(0) == this.RLE); + else + return this.isRtlDir; + }; + BidiHandler.prototype.setRtlDirection = function (editor, isRtlDir) { + var cursor = editor.getCursorPosition(); + for (var row = editor.selection.getSelectionAnchor().row; row <= cursor.row; row++) { + if (!isRtlDir && editor.session.getLine(row).charAt(0) === editor.session.$bidiHandler.RLE) + editor.session.doc.removeInLine(row, 0, 1); + else if (isRtlDir && editor.session.getLine(row).charAt(0) !== editor.session.$bidiHandler.RLE) + editor.session.doc.insert({ column: 0, row: row }, editor.session.$bidiHandler.RLE); + } + }; + BidiHandler.prototype.getPosLeft = function (col) { + col -= this.wrapIndent; + var leftBoundary = (this.line.charAt(0) === this.RLE) ? 1 : 0; + var logicalIdx = (col > leftBoundary) ? (this.session.getOverwrite() ? col : col - 1) : leftBoundary; + var visualIdx = bidiUtil.getVisualFromLogicalIdx(logicalIdx, this.bidiMap), levels = this.bidiMap.bidiLevels, left = 0; + if (!this.session.getOverwrite() && col <= leftBoundary && levels[visualIdx] % 2 !== 0) + visualIdx++; + for (var i = 0; i < visualIdx; i++) { + left += this.charWidths[levels[i]]; + } + if (!this.session.getOverwrite() && (col > leftBoundary) && (levels[visualIdx] % 2 === 0)) + left += this.charWidths[levels[visualIdx]]; + if (this.wrapIndent) + left += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + if (this.isRtlDir) + left += this.rtlLineOffset; + return left; + }; + BidiHandler.prototype.getSelections = function (startCol, endCol) { + var map = this.bidiMap, levels = map.bidiLevels, level, selections = [], offset = 0, selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent, isSelected = false, isSelectedPrev = false, selectionStart = 0; + if (this.wrapIndent) + offset += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) { + logIdx = map.logicalFromVisual[visIdx]; + level = levels[visIdx]; + isSelected = (logIdx >= selColMin) && (logIdx < selColMax); + if (isSelected && !isSelectedPrev) { + selectionStart = offset; + } + else if (!isSelected && isSelectedPrev) { + selections.push({ left: selectionStart, width: offset - selectionStart }); + } + offset += this.charWidths[level]; + isSelectedPrev = isSelected; + } + if (isSelected && (visIdx === levels.length)) { + selections.push({ left: selectionStart, width: offset - selectionStart }); + } + if (this.isRtlDir) { + for (var i = 0; i < selections.length; i++) { + selections[i].left += this.rtlLineOffset; + } + } + return selections; + }; + BidiHandler.prototype.offsetToCol = function (posX) { + if (this.isRtlDir) + posX -= this.rtlLineOffset; + var logicalIdx = 0, posX = Math.max(posX, 0), offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels, charWidth = this.charWidths[levels[visualIdx]]; + if (this.wrapIndent) + posX -= this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + while (posX > offset + charWidth / 2) { + offset += charWidth; + if (visualIdx === levels.length - 1) { + charWidth = 0; + break; + } + charWidth = this.charWidths[levels[++visualIdx]]; + } + if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)) { + if (posX < offset) + visualIdx--; + logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; + } + else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)) { + logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx] + : this.bidiMap.logicalFromVisual[visualIdx - 1]); + } + else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0)) + || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))) { + logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx]; + } + else { + if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0) + visualIdx--; + logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; + } + if (logicalIdx === 0 && this.isRtlDir) + logicalIdx++; + return (logicalIdx + this.wrapIndent); + }; + return BidiHandler; +}()); +exports.BidiHandler = BidiHandler; + +}); + +ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Selection = /** @class */ (function () { + function Selection(session) { + this.session = session; + this.doc = session.getDocument(); + this.clearSelection(); + this.cursor = this.lead = this.doc.createAnchor(0, 0); + this.anchor = this.doc.createAnchor(0, 0); + this.$silent = false; + var self = this; + this.cursor.on("change", function (e) { + self.$cursorChanged = true; + if (!self.$silent) + self._emit("changeCursor"); + if (!self.$isEmpty && !self.$silent) + self._emit("changeSelection"); + if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) + self.$desiredColumn = null; + }); + this.anchor.on("change", function () { + self.$anchorChanged = true; + if (!self.$isEmpty && !self.$silent) + self._emit("changeSelection"); + }); + } + Selection.prototype.isEmpty = function () { + return this.$isEmpty || (this.anchor.row == this.lead.row && + this.anchor.column == this.lead.column); + }; + Selection.prototype.isMultiLine = function () { + return !this.$isEmpty && this.anchor.row != this.cursor.row; + }; + Selection.prototype.getCursor = function () { + return this.lead.getPosition(); + }; + Selection.prototype.setAnchor = function (row, column) { + this.$isEmpty = false; + this.anchor.setPosition(row, column); + }; + Selection.prototype.getAnchor = function () { + if (this.$isEmpty) + return this.getSelectionLead(); + return this.anchor.getPosition(); + }; + Selection.prototype.getSelectionLead = function () { + return this.lead.getPosition(); + }; + Selection.prototype.isBackwards = function () { + var anchor = this.anchor; + var lead = this.lead; + return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); + }; + Selection.prototype.getRange = function () { + var anchor = this.anchor; + var lead = this.lead; + if (this.$isEmpty) + return Range.fromPoints(lead, lead); + return this.isBackwards() + ? Range.fromPoints(lead, anchor) + : Range.fromPoints(anchor, lead); + }; + Selection.prototype.clearSelection = function () { + if (!this.$isEmpty) { + this.$isEmpty = true; + this._emit("changeSelection"); + } + }; + Selection.prototype.selectAll = function () { + this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE); + }; + Selection.prototype.setRange = function (range, reverse) { + var start = reverse ? range.end : range.start; + var end = reverse ? range.start : range.end; + this.$setSelection(start.row, start.column, end.row, end.column); + }; + Selection.prototype.$setSelection = function (anchorRow, anchorColumn, cursorRow, cursorColumn) { + if (this.$silent) + return; + var wasEmpty = this.$isEmpty; + var wasMultiselect = this.inMultiSelectMode; + this.$silent = true; + this.$cursorChanged = this.$anchorChanged = false; + this.anchor.setPosition(anchorRow, anchorColumn); + this.cursor.setPosition(cursorRow, cursorColumn); + this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor); + this.$silent = false; + if (this.$cursorChanged) + this._emit("changeCursor"); + if (this.$cursorChanged || this.$anchorChanged || wasEmpty != this.$isEmpty || wasMultiselect) + this._emit("changeSelection"); + }; + Selection.prototype.$moveSelection = function (mover) { + var lead = this.lead; + if (this.$isEmpty) + this.setSelectionAnchor(lead.row, lead.column); + mover.call(this); + }; + Selection.prototype.selectTo = function (row, column) { + this.$moveSelection(function () { + this.moveCursorTo(row, column); + }); + }; + Selection.prototype.selectToPosition = function (pos) { + this.$moveSelection(function () { + this.moveCursorToPosition(pos); + }); + }; + Selection.prototype.moveTo = function (row, column) { + this.clearSelection(); + this.moveCursorTo(row, column); + }; + Selection.prototype.moveToPosition = function (pos) { + this.clearSelection(); + this.moveCursorToPosition(pos); + }; + Selection.prototype.selectUp = function () { + this.$moveSelection(this.moveCursorUp); + }; + Selection.prototype.selectDown = function () { + this.$moveSelection(this.moveCursorDown); + }; + Selection.prototype.selectRight = function () { + this.$moveSelection(this.moveCursorRight); + }; + Selection.prototype.selectLeft = function () { + this.$moveSelection(this.moveCursorLeft); + }; + Selection.prototype.selectLineStart = function () { + this.$moveSelection(this.moveCursorLineStart); + }; + Selection.prototype.selectLineEnd = function () { + this.$moveSelection(this.moveCursorLineEnd); + }; + Selection.prototype.selectFileEnd = function () { + this.$moveSelection(this.moveCursorFileEnd); + }; + Selection.prototype.selectFileStart = function () { + this.$moveSelection(this.moveCursorFileStart); + }; + Selection.prototype.selectWordRight = function () { + this.$moveSelection(this.moveCursorWordRight); + }; + Selection.prototype.selectWordLeft = function () { + this.$moveSelection(this.moveCursorWordLeft); + }; + Selection.prototype.getWordRange = function (row, column) { + if (typeof column == "undefined") { + var cursor = row || this.lead; + row = cursor.row; + column = cursor.column; + } + return this.session.getWordRange(row, column); + }; + Selection.prototype.selectWord = function () { + this.setSelectionRange(this.getWordRange()); + }; + Selection.prototype.selectAWord = function () { + var cursor = this.getCursor(); + var range = this.session.getAWordRange(cursor.row, cursor.column); + this.setSelectionRange(range); + }; + Selection.prototype.getLineRange = function (row, excludeLastChar) { + var rowStart = typeof row == "number" ? row : this.lead.row; + var rowEnd; + var foldLine = this.session.getFoldLine(rowStart); + if (foldLine) { + rowStart = foldLine.start.row; + rowEnd = foldLine.end.row; + } + else { + rowEnd = rowStart; + } + if (excludeLastChar === true) + return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length); + else + return new Range(rowStart, 0, rowEnd + 1, 0); + }; + Selection.prototype.selectLine = function () { + this.setSelectionRange(this.getLineRange()); + }; + Selection.prototype.moveCursorUp = function () { + this.moveCursorBy(-1, 0); + }; + Selection.prototype.moveCursorDown = function () { + this.moveCursorBy(1, 0); + }; + Selection.prototype.wouldMoveIntoSoftTab = function (cursor, tabSize, direction) { + var start = cursor.column; + var end = cursor.column + tabSize; + if (direction < 0) { + start = cursor.column - tabSize; + end = cursor.column; + } + return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(" ").length - 1 == tabSize; + }; + Selection.prototype.moveCursorLeft = function () { + var cursor = this.lead.getPosition(), fold; + if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + } + else if (cursor.column === 0) { + if (cursor.row > 0) { + this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length); + } + } + else { + var tabSize = this.session.getTabSize(); + if (this.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) { + this.moveCursorBy(0, -tabSize); + } + else { + this.moveCursorBy(0, -1); + } + } + }; + Selection.prototype.moveCursorRight = function () { + var cursor = this.lead.getPosition(), fold; + if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) { + this.moveCursorTo(fold.end.row, fold.end.column); + } + else if (this.lead.column == this.doc.getLine(this.lead.row).length) { + if (this.lead.row < this.doc.getLength() - 1) { + this.moveCursorTo(this.lead.row + 1, 0); + } + } + else { + var tabSize = this.session.getTabSize(); + var cursor = this.lead; + if (this.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) { + this.moveCursorBy(0, tabSize); + } + else { + this.moveCursorBy(0, 1); + } + } + }; + Selection.prototype.moveCursorLineStart = function () { + var row = this.lead.row; + var column = this.lead.column; + var screenRow = this.session.documentToScreenRow(row, column); + var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0); + var beforeCursor = this.session.getDisplayLine(row, null, firstColumnPosition.row, firstColumnPosition.column); + var leadingSpace = beforeCursor.match(/^\s*/); + if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) + firstColumnPosition.column += leadingSpace[0].length; + this.moveCursorToPosition(firstColumnPosition); + }; + Selection.prototype.moveCursorLineEnd = function () { + var lead = this.lead; + var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column); + if (this.lead.column == lineEnd.column) { + var line = this.session.getLine(lineEnd.row); + if (lineEnd.column == line.length) { + var textEnd = line.search(/\s+$/); + if (textEnd > 0) + lineEnd.column = textEnd; + } + } + this.moveCursorTo(lineEnd.row, lineEnd.column); + }; + Selection.prototype.moveCursorFileEnd = function () { + var row = this.doc.getLength() - 1; + var column = this.doc.getLine(row).length; + this.moveCursorTo(row, column); + }; + Selection.prototype.moveCursorFileStart = function () { + this.moveCursorTo(0, 0); + }; + Selection.prototype.moveCursorLongWordRight = function () { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + this.moveCursorTo(fold.end.row, fold.end.column); + return; + } + if (this.session.nonTokenRe.exec(rightOfCursor)) { + column += this.session.nonTokenRe.lastIndex; + this.session.nonTokenRe.lastIndex = 0; + rightOfCursor = line.substring(column); + } + if (column >= line.length) { + this.moveCursorTo(row, line.length); + this.moveCursorRight(); + if (row < this.doc.getLength() - 1) + this.moveCursorWordRight(); + return; + } + if (this.session.tokenRe.exec(rightOfCursor)) { + column += this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + this.moveCursorTo(row, column); + }; + Selection.prototype.moveCursorLongWordLeft = function () { + var row = this.lead.row; + var column = this.lead.column; + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + return; + } + var str = this.session.getFoldStringAt(row, column, -1); + if (str == null) { + str = this.doc.getLine(row).substring(0, column); + } + var leftOfCursor = lang.stringReverse(str); + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + if (this.session.nonTokenRe.exec(leftOfCursor)) { + column -= this.session.nonTokenRe.lastIndex; + leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex); + this.session.nonTokenRe.lastIndex = 0; + } + if (column <= 0) { + this.moveCursorTo(row, 0); + this.moveCursorLeft(); + if (row > 0) + this.moveCursorWordLeft(); + return; + } + if (this.session.tokenRe.exec(leftOfCursor)) { + column -= this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + this.moveCursorTo(row, column); + }; + Selection.prototype.$shortWordEndIndex = function (rightOfCursor) { + var index = 0, ch; + var whitespaceRe = /\s/; + var tokenRe = this.session.tokenRe; + tokenRe.lastIndex = 0; + if (this.session.tokenRe.exec(rightOfCursor)) { + index = this.session.tokenRe.lastIndex; + } + else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index++; + if (index < 1) { + tokenRe.lastIndex = 0; + while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { + tokenRe.lastIndex = 0; + index++; + if (whitespaceRe.test(ch)) { + if (index > 2) { + index--; + break; + } + else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index++; + if (index > 2) + break; + } + } + } + } + } + tokenRe.lastIndex = 0; + return index; + }; + Selection.prototype.moveCursorShortWordRight = function () { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + var fold = this.session.getFoldAt(row, column, 1); + if (fold) + return this.moveCursorTo(fold.end.row, fold.end.column); + if (column == line.length) { + var l = this.doc.getLength(); + do { + row++; + rightOfCursor = this.doc.getLine(row); + } while (row < l && /^\s*$/.test(rightOfCursor)); + if (!/^\s+/.test(rightOfCursor)) + rightOfCursor = ""; + column = 0; + } + var index = this.$shortWordEndIndex(rightOfCursor); + this.moveCursorTo(row, column + index); + }; + Selection.prototype.moveCursorShortWordLeft = function () { + var row = this.lead.row; + var column = this.lead.column; + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) + return this.moveCursorTo(fold.start.row, fold.start.column); + var line = this.session.getLine(row).substring(0, column); + if (column === 0) { + do { + row--; + line = this.doc.getLine(row); + } while (row > 0 && /^\s*$/.test(line)); + column = line.length; + if (!/\s+$/.test(line)) + line = ""; + } + var leftOfCursor = lang.stringReverse(line); + var index = this.$shortWordEndIndex(leftOfCursor); + return this.moveCursorTo(row, column - index); + }; + Selection.prototype.moveCursorWordRight = function () { + if (this.session.$selectLongWords) + this.moveCursorLongWordRight(); + else + this.moveCursorShortWordRight(); + }; + Selection.prototype.moveCursorWordLeft = function () { + if (this.session.$selectLongWords) + this.moveCursorLongWordLeft(); + else + this.moveCursorShortWordLeft(); + }; + Selection.prototype.moveCursorBy = function (rows, chars) { + var screenPos = this.session.documentToScreenPosition(this.lead.row, this.lead.column); + var offsetX; + if (chars === 0) { + if (rows !== 0) { + if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) { + offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column); + screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]); + } + else { + offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0]; + } + } + if (this.$desiredColumn) + screenPos.column = this.$desiredColumn; + else + this.$desiredColumn = screenPos.column; + } + if (rows != 0 && this.session.lineWidgets && this.session.lineWidgets[this.lead.row]) { + var widget = this.session.lineWidgets[this.lead.row]; + if (rows < 0) + rows -= widget.rowsAbove || 0; + else if (rows > 0) + rows += widget.rowCount - (widget.rowsAbove || 0); + } + var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX); + if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) { + } + this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0); + }; + Selection.prototype.moveCursorToPosition = function (position) { + this.moveCursorTo(position.row, position.column); + }; + Selection.prototype.moveCursorTo = function (row, column, keepDesiredColumn) { + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + row = fold.start.row; + column = fold.start.column; + } + this.$keepDesiredColumnOnChange = true; + var line = this.session.getLine(row); + if (/[\uDC00-\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) { + if (this.lead.row == row && this.lead.column == column + 1) + column = column - 1; + else + column = column + 1; + } + this.lead.setPosition(row, column); + this.$keepDesiredColumnOnChange = false; + if (!keepDesiredColumn) + this.$desiredColumn = null; + }; + Selection.prototype.moveCursorToScreen = function (row, column, keepDesiredColumn) { + var pos = this.session.screenToDocumentPosition(row, column); + this.moveCursorTo(pos.row, pos.column, keepDesiredColumn); + }; + Selection.prototype.detach = function () { + this.lead.detach(); + this.anchor.detach(); + }; + Selection.prototype.fromOrientedRange = function (range) { + this.setSelectionRange(range, range.cursor == range.start); + this.$desiredColumn = range.desiredColumn || this.$desiredColumn; + }; + Selection.prototype.toOrientedRange = function (range) { + var r = this.getRange(); + if (range) { + range.start.column = r.start.column; + range.start.row = r.start.row; + range.end.column = r.end.column; + range.end.row = r.end.row; + } + else { + range = r; + } + range.cursor = this.isBackwards() ? range.start : range.end; + range.desiredColumn = this.$desiredColumn; + return range; + }; + Selection.prototype.getRangeOfMovements = function (func) { + var start = this.getCursor(); + try { + func(this); + var end = this.getCursor(); + return Range.fromPoints(start, end); + } + catch (e) { + return Range.fromPoints(start, start); + } + finally { + this.moveCursorToPosition(start); + } + }; + Selection.prototype.toJSON = function () { + if (this.rangeCount) { var data = this.ranges.map(function (r) { + var r1 = r.clone(); + r1.isBackwards = r.cursor == r.start; + return r1; + }); + } + else { var data = this.getRange(); + data.isBackwards = this.isBackwards(); + } + return data; + }; + Selection.prototype.fromJSON = function (data) { + if (data.start == undefined) { + if (this.rangeList && data.length > 1) { + this.toSingleRange(data[0]); + for (var i = data.length; i--;) { + var r = Range.fromPoints(data[i].start, data[i].end); + if (data[i].isBackwards) + r.cursor = r.start; + this.addRange(r, true); + } + return; + } + else { + data = data[0]; + } + } + if (this.rangeList) + this.toSingleRange(data); + this.setSelectionRange(data, data.isBackwards); + }; + Selection.prototype.isEqual = function (data) { + if ((data.length || this.rangeCount) && data.length != this.rangeCount) + return false; + if (!data.length || !this.ranges) + return this.getRange().isEqual(data); + for (var i = this.ranges.length; i--;) { + if (!this.ranges[i].isEqual(data[i])) + return false; + } + return true; + }; + return Selection; +}()); +Selection.prototype.setSelectionAnchor = Selection.prototype.setAnchor; +Selection.prototype.getSelectionAnchor = Selection.prototype.getAnchor; +Selection.prototype.setSelectionRange = Selection.prototype.setRange; +oop.implement(Selection.prototype, EventEmitter); +exports.Selection = Selection; + +}); + +ace.define("ace/tokenizer",["require","exports","module","ace/lib/report_error"], function(require, exports, module){"use strict"; +var reportError = require("./lib/report_error").reportError; +var MAX_TOKEN_COUNT = 2000; +var Tokenizer = /** @class */ (function () { + function Tokenizer(rules) { + this.splitRegex; + this.states = rules; + this.regExps = {}; + this.matchMappings = {}; + for (var key in this.states) { + var state = this.states[key]; + var ruleRegExps = []; + var matchTotal = 0; + var mapping = this.matchMappings[key] = { defaultToken: "text" }; + var flag = "g"; + var splitterRurles = []; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.defaultToken) + mapping.defaultToken = rule.defaultToken; + if (rule.caseInsensitive && flag.indexOf("i") === -1) + flag += "i"; + if (rule.unicode && flag.indexOf("u") === -1) + flag += "u"; + if (rule.regex == null) + continue; + if (rule.regex instanceof RegExp) + rule.regex = rule.regex.toString().slice(1, -1); + var adjustedregex = rule.regex; + var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; + if (Array.isArray(rule.token)) { + if (rule.token.length == 1 || matchcount == 1) { + rule.token = rule.token[0]; + } + else if (matchcount - 1 != rule.token.length) { + this.reportError("number of classes and regexp groups doesn't match", { + rule: rule, + groupCount: matchcount - 1 + }); + rule.token = rule.token[0]; + } + else { + rule.tokenArray = rule.token; + rule.token = null; + rule.onMatch = this.$arrayTokens; + } + } + else if (typeof rule.token == "function" && !rule.onMatch) { + if (matchcount > 1) + rule.onMatch = this.$applyToken; + else + rule.onMatch = rule.token; + } + if (matchcount > 1) { + if (/\\\d/.test(rule.regex)) { + adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function (match, digit) { + return "\\" + (parseInt(digit, 10) + matchTotal + 1); + }); + } + else { + matchcount = 1; + adjustedregex = this.removeCapturingGroups(rule.regex); + } + if (!rule.splitRegex && typeof rule.token != "string") + splitterRurles.push(rule); // flag will be known only at the very end + } + mapping[matchTotal] = i; + matchTotal += matchcount; + ruleRegExps.push(adjustedregex); + if (!rule.onMatch) + rule.onMatch = null; + } + if (!ruleRegExps.length) { + mapping[0] = 0; + ruleRegExps.push("$"); + } + splitterRurles.forEach(function (rule) { + rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); + }, this); + this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); + } + } + Tokenizer.prototype.$setMaxTokenCount = function (m) { + MAX_TOKEN_COUNT = m | 0; + }; + Tokenizer.prototype.$applyToken = function (str) { + var values = this.splitRegex.exec(str).slice(1); + var types = this.token.apply(this, values); + if (typeof types === "string") + return [{ type: types, value: str }]; + var tokens = []; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i]) + tokens[tokens.length] = { + type: types[i], + value: values[i] + }; + } + return tokens; + }; + Tokenizer.prototype.$arrayTokens = function (str) { + if (!str) + return []; + var values = this.splitRegex.exec(str); + if (!values) + return "text"; + var tokens = []; + var types = this.tokenArray; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i + 1]) + tokens[tokens.length] = { + type: types[i], + value: values[i + 1] + }; + } + return tokens; + }; + Tokenizer.prototype.removeCapturingGroups = function (src) { + var r = src.replace(/\\.|\[(?:\\.|[^\\\]])*|\(\?[:=!<]|(\()/g, function (x, y) { return y ? "(?:" : x; }); + return r; + }; + Tokenizer.prototype.createSplitterRegexp = function (src, flag) { + if (src.indexOf("(?=") != -1) { + var stack = 0; + var inChClass = false; + var lastCapture = {}; + src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function (m, esc, parenOpen, parenClose, square, index) { + if (inChClass) { + inChClass = square != "]"; + } + else if (square) { + inChClass = true; + } + else if (parenClose) { + if (stack == lastCapture.stack) { + lastCapture.end = index + 1; + lastCapture.stack = -1; + } + stack--; + } + else if (parenOpen) { + stack++; + if (parenOpen.length != 1) { + lastCapture.stack = stack; + lastCapture.start = index; + } + } + return m; + }); + if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end))) + src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end); + } + if (src.charAt(0) != "^") + src = "^" + src; + if (src.charAt(src.length - 1) != "$") + src += "$"; + return new RegExp(src, (flag || "").replace("g", "")); + }; + Tokenizer.prototype.getLineTokens = function (line, startState) { + if (startState && typeof startState != "string") { + var stack = startState.slice(0); + startState = stack[0]; + if (startState === "#tmp") { + stack.shift(); + startState = stack.shift(); + } + } + else + var stack = []; + var currentState = /**@type{string}*/ (startState) || "start"; + var state = this.states[currentState]; + if (!state) { + currentState = "start"; + state = this.states[currentState]; + } + var mapping = this.matchMappings[currentState]; + var re = this.regExps[currentState]; + re.lastIndex = 0; + var match, tokens = []; + var lastIndex = 0; + var matchAttempts = 0; + var token = { type: null, value: "" }; + while (match = re.exec(line)) { + var type = mapping.defaultToken; + var rule = null; + var value = match[0]; + var index = re.lastIndex; + if (index - value.length > lastIndex) { + var skipped = line.substring(lastIndex, index - value.length); + if (token.type == type) { + token.value += skipped; + } + else { + if (token.type) + tokens.push(token); + token = { type: type, value: skipped }; + } + } + for (var i = 0; i < match.length - 2; i++) { + if (match[i + 1] === undefined) + continue; + rule = state[mapping[i]]; + if (rule.onMatch) + type = rule.onMatch(value, currentState, stack, line); + else + type = rule.token; + if (rule.next) { + if (typeof rule.next == "string") { + currentState = rule.next; + } + else { + currentState = rule.next(currentState, stack); + } + state = this.states[currentState]; + if (!state) { + this.reportError("state doesn't exist", currentState); + currentState = "start"; + state = this.states[currentState]; + } + mapping = this.matchMappings[currentState]; + lastIndex = index; + re = this.regExps[currentState]; + re.lastIndex = index; + } + if (rule.consumeLineEnd) + lastIndex = index; + break; + } + if (value) { + if (typeof type === "string") { + if ((!rule || rule.merge !== false) && token.type === type) { + token.value += value; + } + else { + if (token.type) + tokens.push(token); + token = { type: type, value: value }; + } + } + else if (type) { + if (token.type) + tokens.push(token); + token = { type: null, value: "" }; + for (var i = 0; i < type.length; i++) + tokens.push(type[i]); + } + } + if (lastIndex == line.length) + break; + lastIndex = index; + if (matchAttempts++ > MAX_TOKEN_COUNT) { + if (matchAttempts > 2 * line.length) { + this.reportError("infinite loop with in ace tokenizer", { + startState: startState, + line: line + }); + } + while (lastIndex < line.length) { + if (token.type) + tokens.push(token); + token = { + value: line.substring(lastIndex, lastIndex += 500), + type: "overflow" + }; + } + currentState = "start"; + stack = []; + break; + } + } + if (token.type) + tokens.push(token); + if (stack.length > 1) { + if (stack[0] !== currentState) + stack.unshift("#tmp", currentState); + } + return { + tokens: tokens, + state: stack.length ? stack : currentState + }; + }; + return Tokenizer; +}()); +Tokenizer.prototype.reportError = reportError; +exports.Tokenizer = Tokenizer; + +}); + +ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/deep_copy"], function(require, exports, module){"use strict"; +var deepCopy = require("../lib/deep_copy").deepCopy; +var TextHighlightRules; +TextHighlightRules = function () { + this.$rules = { + "start": [{ + token: "empty_line", + regex: '^$' + }, { + defaultToken: "text" + }] + }; +}; +(function () { + this.addRules = function (rules, prefix) { + if (!prefix) { + for (var key in rules) + this.$rules[key] = rules[key]; + return; + } + for (var key in rules) { + var state = rules[key]; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.next || rule.onMatch) { + if (typeof rule.next == "string") { + if (rule.next.indexOf(prefix) !== 0) + rule.next = prefix + rule.next; + } + if (rule.nextState && rule.nextState.indexOf(prefix) !== 0) + rule.nextState = prefix + rule.nextState; + } + } + this.$rules[prefix + key] = state; + } + }; + this.getRules = function () { + return this.$rules; + }; + this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) { + var embedRules = typeof HighlightRules == "function" + ? new HighlightRules().getRules() + : HighlightRules; + if (states) { + for (var i = 0; i < states.length; i++) + states[i] = prefix + states[i]; + } + else { + states = []; + for (var key in embedRules) + states.push(prefix + key); + } + this.addRules(embedRules, prefix); + if (escapeRules) { + var addRules = Array.prototype[append ? "push" : "unshift"]; + for (var i = 0; i < states.length; i++) + addRules.apply(this.$rules[states[i]], deepCopy(escapeRules)); + } + if (!this.$embeds) + this.$embeds = []; + this.$embeds.push(prefix); + }; + this.getEmbeds = function () { + return this.$embeds; + }; + var pushState = function (currentState, stack) { + if (currentState != "start" || stack.length) + stack.unshift(this.nextState, currentState); + return this.nextState; + }; + var popState = function (currentState, stack) { + stack.shift(); + return stack.shift() || "start"; + }; + this.normalizeRules = function () { + var id = 0; + var rules = this.$rules; + function processState(key) { + var state = rules[key]; + state["processed"] = true; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + var toInsert = null; + if (Array.isArray(rule)) { + toInsert = rule; + rule = {}; + } + if (!rule.regex && rule.start) { + rule.regex = rule.start; + if (!rule.next) + rule.next = []; + rule.next.push({ + defaultToken: rule.token + }, { + token: rule.token + ".end", + regex: rule.end || rule.start, + next: "pop" + }); + rule.token = rule.token + ".start"; + rule.push = true; + } + var next = rule.next || rule.push; + if (next && Array.isArray(next)) { + var stateName = rule.stateName; + if (!stateName) { + stateName = rule.token; + if (typeof stateName != "string") + stateName = stateName[0] || ""; + if (rules[stateName]) + stateName += id++; + } + rules[stateName] = next; + rule.next = stateName; + processState(stateName); + } + else if (next == "pop") { + rule.next = popState; + } + if (rule.push) { + rule.nextState = rule.next || rule.push; + rule.next = pushState; + delete rule.push; + } + if (rule.rules) { + for (var r in rule.rules) { + if (rules[r]) { + if (rules[r].push) + rules[r].push.apply(rules[r], rule.rules[r]); + } + else { + rules[r] = rule.rules[r]; + } + } + } + var includeName = typeof rule == "string" ? rule : rule.include; + if (includeName) { + if (includeName === "$self") + includeName = "start"; + if (Array.isArray(includeName)) + toInsert = includeName.map(function (x) { return rules[x]; }); + else + toInsert = rules[includeName]; + } + if (toInsert) { + var args = [i, 1].concat(toInsert); + if (rule.noEscape) + args = args.filter(function (x) { return !x.next; }); + state.splice.apply(state, args); + i--; + } + if (rule.keywordMap) { + rule.token = this.createKeywordMapper(rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive); + delete rule.defaultToken; + } + } + } + Object.keys(rules).forEach(processState, this); + }; + this.createKeywordMapper = function (map, defaultToken, ignoreCase, splitChar) { + var keywords = Object.create(null); + this.$keywordList = []; + Object.keys(map).forEach(function (className) { + var a = map[className]; + var list = a.split(splitChar || "|"); + for (var i = list.length; i--;) { + var word = list[i]; + this.$keywordList.push(word); + if (ignoreCase) + word = word.toLowerCase(); + keywords[word] = className; + } + }, this); + map = null; + return ignoreCase + ? function (value) { return keywords[value.toLowerCase()] || defaultToken; } + : function (value) { return keywords[value] || defaultToken; }; + }; + this.getKeywords = function () { + return this.$keywords; + }; +}).call(TextHighlightRules.prototype); +exports.TextHighlightRules = TextHighlightRules; + +}); + +ace.define("ace/mode/behaviour",["require","exports","module"], function(require, exports, module){"use strict"; +var Behaviour; +Behaviour = function () { + this.$behaviours = {}; +}; +(function () { + this.add = function (name, action, callback) { + switch (undefined) { + case this.$behaviours: + this.$behaviours = {}; + case this.$behaviours[name]: + this.$behaviours[name] = {}; + } + this.$behaviours[name][action] = callback; + }; + this.addBehaviours = function (behaviours) { + for (var key in behaviours) { + for (var action in behaviours[key]) { + this.add(key, action, behaviours[key][action]); + } + } + }; + this.remove = function (name) { + if (this.$behaviours && this.$behaviours[name]) { + delete this.$behaviours[name]; + } + }; + this.inherit = function (mode, filter) { + if (typeof mode === "function") { + var behaviours = new mode().getBehaviours(filter); + } + else { + var behaviours = mode.getBehaviours(filter); + } + this.addBehaviours(behaviours); + }; + this.getBehaviours = function (filter) { + if (!filter) { + return this.$behaviours; + } + else { + var ret = {}; + for (var i = 0; i < filter.length; i++) { + if (this.$behaviours[filter[i]]) { + ret[filter[i]] = this.$behaviours[filter[i]]; + } + } + return ret; + } + }; +}).call(Behaviour.prototype); +exports.Behaviour = Behaviour; + +}); + +ace.define("ace/token_iterator",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("./range").Range; +var TokenIterator = /** @class */ (function () { + function TokenIterator(session, initialRow, initialColumn) { + this.$session = session; + this.$row = initialRow; + this.$rowTokens = session.getTokens(initialRow); + var token = session.getTokenAt(initialRow, initialColumn); + this.$tokenIndex = token ? token.index : -1; + } + TokenIterator.prototype.stepBackward = function () { + this.$tokenIndex -= 1; + while (this.$tokenIndex < 0) { + this.$row -= 1; + if (this.$row < 0) { + this.$row = 0; + return null; + } + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = this.$rowTokens.length - 1; + } + return this.$rowTokens[this.$tokenIndex]; + }; + TokenIterator.prototype.stepForward = function () { + this.$tokenIndex += 1; + var rowCount; + while (this.$tokenIndex >= this.$rowTokens.length) { + this.$row += 1; + if (!rowCount) + rowCount = this.$session.getLength(); + if (this.$row >= rowCount) { + this.$row = rowCount - 1; + return null; + } + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = 0; + } + return this.$rowTokens[this.$tokenIndex]; + }; + TokenIterator.prototype.getCurrentToken = function () { + return this.$rowTokens[this.$tokenIndex]; + }; + TokenIterator.prototype.getCurrentTokenRow = function () { + return this.$row; + }; + TokenIterator.prototype.getCurrentTokenColumn = function () { + var rowTokens = this.$rowTokens; + var tokenIndex = this.$tokenIndex; + var column = rowTokens[tokenIndex].start; + if (column !== undefined) + return column; + column = 0; + while (tokenIndex > 0) { + tokenIndex -= 1; + column += rowTokens[tokenIndex].value.length; + } + return column; + }; + TokenIterator.prototype.getCurrentTokenPosition = function () { + return { row: this.$row, column: this.getCurrentTokenColumn() }; + }; + TokenIterator.prototype.getCurrentTokenRange = function () { + var token = this.$rowTokens[this.$tokenIndex]; + var column = this.getCurrentTokenColumn(); + return new Range(this.$row, column, this.$row, column + token.value.length); + }; + return TokenIterator; +}()); +exports.TokenIterator = TokenIterator; + +}); + +ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module){"use strict"; +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); +var SAFE_INSERT_IN_TOKENS = ["text", "paren.rparen", "rparen", "paren", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = ["text", "paren.rparen", "rparen", "paren", "punctuation.operator", "comment"]; +var context; +var contextCache = {}; +var defaultQuotes = { '"': '"', "'": "'" }; +var initContext = function (editor) { + var id = -1; + if (editor.multiSelect) { + id = editor.selection.index; + if (contextCache.rangeCount != editor.multiSelect.rangeCount) + contextCache = { rangeCount: editor.multiSelect.rangeCount }; + } + if (contextCache[id]) + return context = contextCache[id]; + context = contextCache[id] = { + autoInsertedBrackets: 0, + autoInsertedRow: -1, + autoInsertedLineEnd: "", + maybeInsertedBrackets: 0, + maybeInsertedRow: -1, + maybeInsertedLineStart: "", + maybeInsertedLineEnd: "" + }; +}; +var getWrapped = function (selection, selected, opening, closing) { + var rowDiff = selection.end.row - selection.start.row; + return { + text: opening + selected + closing, + selection: [ + 0, + selection.start.column + 1, + rowDiff, + selection.end.column + (rowDiff ? 0 : 1) + ] + }; +}; +var CstyleBehaviour; +CstyleBehaviour = function (options) { + options = options || {}; + this.add("braces", "insertion", function (state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + var token = session.getTokenAt(cursor.row, cursor.column); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '{', '}'); + } + else if (token && /(?:string)\.quasi|\.xml/.test(token.type)) { + var excludeTokens = [ + /tag\-(?:open|name)/, /attribute\-name/ + ]; + if (excludeTokens.some(function (el) { return el.test(token.type); }) || /(string)\.quasi/.test(token.type) + && token.value[cursor.column - token.start - 1] !== '$') + return; + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } + else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options.braces) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } + else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } + else if (text == '}') { + initContext(editor); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', { column: cursor.column + 1, row: cursor.row }); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + else if (text == "\n" || text == "\r\n") { + initContext(editor); + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", context.maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === '}') { + var openBracePos = session.findMatchingBracket({ row: cursor.row, column: cursor.column + 1 }, '}'); + if (!openBracePos) + return null; + var next_indent = this.$getIndent(session.getLine(openBracePos.row)); + } + else if (closing) { + var next_indent = this.$getIndent(line); + } + else { + CstyleBehaviour.clearMaybeInsertedClosing(); + return; + } + var indent = next_indent + session.getTabString(); + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } + else { + CstyleBehaviour.clearMaybeInsertedClosing(); + } + }); + this.add("braces", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } + else { + context.maybeInsertedBrackets--; + } + } + }); + this.add("parens", "insertion", function (state, action, editor, session, text) { + if (text == '(') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '(', ')'); + } + else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } + else if (text == ')') { + initContext(editor); + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', { column: cursor.column + 1, row: cursor.row }); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + this.add("parens", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + this.add("brackets", "insertion", function (state, action, editor, session, text) { + if (text == '[') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '[', ']'); + } + else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } + else if (text == ']') { + initContext(editor); + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', { column: cursor.column + 1, row: cursor.row }); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + this.add("brackets", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + var quotes = session.$mode.$quotes || defaultQuotes; + if (text.length == 1 && quotes[text]) { + if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) + return; + initContext(editor); + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, quote, quote); + } + else if (!selected) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column - 1, cursor.column); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var token = session.getTokenAt(cursor.row, cursor.column); + var rightToken = session.getTokenAt(cursor.row, cursor.column + 1); + if (leftChar == "\\" && token && /escape/.test(token.type)) + return null; + var stringBefore = token && /string|escape/.test(token.type); + var stringAfter = !rightToken || /string|escape/.test(rightToken.type); + var pair; + if (rightChar == quote) { + pair = stringBefore !== stringAfter; + if (pair && /string\.end/.test(rightToken.type)) + pair = false; + } + else { + if (stringBefore && !stringAfter) + return null; // wrap string with different quote + if (stringBefore && stringAfter) + return null; // do not pair quotes inside strings + var wordRe = session.$mode.tokenRe; + wordRe.lastIndex = 0; + var isWordBefore = wordRe.test(leftChar); + wordRe.lastIndex = 0; + var isWordAfter = wordRe.test(rightChar); + var pairQuotesAfter = session.$mode.$pairQuotesAfter; + var shouldPairQuotes = pairQuotesAfter && pairQuotesAfter[quote] && pairQuotesAfter[quote].test(leftChar); + if ((!shouldPairQuotes && isWordBefore) || isWordAfter) + return null; // before or after alphanumeric + if (rightChar && !/[\s;,.})\]\\]/.test(rightChar)) + return null; // there is rightChar and it isn't closing + var charBefore = line[cursor.column - 2]; + if (leftChar == quote && (charBefore == quote || wordRe.test(charBefore))) + return null; + pair = true; + } + return { + text: pair ? quote + quote : "", + selection: [1, 1] + }; + } + } + }); + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { + var quotes = session.$mode.$quotes || defaultQuotes; + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && quotes.hasOwnProperty(selected)) { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + if (options.closeDocComment !== false) { + this.add("doc comment end", "insertion", function (state, action, editor, session, text) { + if (state === "doc-start" && (text === "\n" || text === "\r\n") && editor.selection.isEmpty()) { + var cursor = editor.getCursorPosition(); + if (cursor.column === 0) { + return; + } + var line = session.doc.getLine(cursor.row); + var nextLine = session.doc.getLine(cursor.row + 1); + var tokens = session.getTokens(cursor.row); + var index = 0; + for (var i = 0; i < tokens.length; i++) { + index += tokens[i].value.length; + var currentToken = tokens[i]; + if (index >= cursor.column) { + if (index === cursor.column) { + if (!/\.doc/.test(currentToken.type)) { + return; + } + if (/\*\//.test(currentToken.value)) { + var nextToken = tokens[i + 1]; + if (!nextToken || !/\.doc/.test(nextToken.type)) { + return; + } + } + } + var cursorPosInToken = cursor.column - (index - currentToken.value.length); + var closeDocPos = currentToken.value.indexOf("*/"); + var openDocPos = currentToken.value.indexOf("/**", closeDocPos > -1 ? closeDocPos + 2 : 0); + if (openDocPos !== -1 && cursorPosInToken > openDocPos && cursorPosInToken < openDocPos + 3) { + return; + } + if (closeDocPos !== -1 && openDocPos !== -1 && cursorPosInToken >= closeDocPos + && cursorPosInToken <= openDocPos || !/\.doc/.test(currentToken.type)) { + return; + } + break; + } + } + var indent = this.$getIndent(line); + if (/\s*\*/.test(nextLine)) { + if (/^\s*\*/.test(line)) { + return { + text: text + indent + "* ", + selection: [1, 2 + indent.length, 1, 2 + indent.length] + }; + } + else { + return { + text: text + indent + " * ", + selection: [1, 3 + indent.length, 1, 3 + indent.length] + }; + } + } + if (/\/\*\*/.test(line.substring(0, cursor.column))) { + return { + text: text + indent + " * " + text + " " + indent + "*/", + selection: [1, 4 + indent.length, 1, 4 + indent.length] + }; + } + } + }); + } +}; +CstyleBehaviour.isSaneInsertion = function (editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + if (/[)}\]]/.test(editor.session.getLine(cursor.row)[cursor.column])) + return true; + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); +}; +CstyleBehaviour["$matchTokenType"] = function (token, types) { + return types.indexOf(token.type || token) > -1; +}; +CstyleBehaviour["recordAutoInsert"] = function (editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this["isAutoInsertedClosing"](cursor, line, context.autoInsertedLineEnd[0])) + context.autoInsertedBrackets = 0; + context.autoInsertedRow = cursor.row; + context.autoInsertedLineEnd = bracket + line.substr(cursor.column); + context.autoInsertedBrackets++; +}; +CstyleBehaviour["recordMaybeInsert"] = function (editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this["isMaybeInsertedClosing"](cursor, line)) + context.maybeInsertedBrackets = 0; + context.maybeInsertedRow = cursor.row; + context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + context.maybeInsertedLineEnd = line.substr(cursor.column); + context.maybeInsertedBrackets++; +}; +CstyleBehaviour["isAutoInsertedClosing"] = function (cursor, line, bracket) { + return context.autoInsertedBrackets > 0 && + cursor.row === context.autoInsertedRow && + bracket === context.autoInsertedLineEnd[0] && + line.substr(cursor.column) === context.autoInsertedLineEnd; +}; +CstyleBehaviour["isMaybeInsertedClosing"] = function (cursor, line) { + return context.maybeInsertedBrackets > 0 && + cursor.row === context.maybeInsertedRow && + line.substr(cursor.column) === context.maybeInsertedLineEnd && + line.substr(0, cursor.column) == context.maybeInsertedLineStart; +}; +CstyleBehaviour["popAutoInsertedClosing"] = function () { + context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1); + context.autoInsertedBrackets--; +}; +CstyleBehaviour["clearMaybeInsertedClosing"] = function () { + if (context) { + context.maybeInsertedBrackets = 0; + context.maybeInsertedRow = -1; + } +}; +oop.inherits(CstyleBehaviour, Behaviour); +exports.CstyleBehaviour = CstyleBehaviour; + +}); + +ace.define("ace/unicode",["require","exports","module"], function(require, exports, module){"use strict"; +var wordChars = [48, 9, 8, 25, 5, 0, 2, 25, 48, 0, 11, 0, 5, 0, 6, 22, 2, 30, 2, 457, 5, 11, 15, 4, 8, 0, 2, 0, 18, 116, 2, 1, 3, 3, 9, 0, 2, 2, 2, 0, 2, 19, 2, 82, 2, 138, 2, 4, 3, 155, 12, 37, 3, 0, 8, 38, 10, 44, 2, 0, 2, 1, 2, 1, 2, 0, 9, 26, 6, 2, 30, 10, 7, 61, 2, 9, 5, 101, 2, 7, 3, 9, 2, 18, 3, 0, 17, 58, 3, 100, 15, 53, 5, 0, 6, 45, 211, 57, 3, 18, 2, 5, 3, 11, 3, 9, 2, 1, 7, 6, 2, 2, 2, 7, 3, 1, 3, 21, 2, 6, 2, 0, 4, 3, 3, 8, 3, 1, 3, 3, 9, 0, 5, 1, 2, 4, 3, 11, 16, 2, 2, 5, 5, 1, 3, 21, 2, 6, 2, 1, 2, 1, 2, 1, 3, 0, 2, 4, 5, 1, 3, 2, 4, 0, 8, 3, 2, 0, 8, 15, 12, 2, 2, 8, 2, 2, 2, 21, 2, 6, 2, 1, 2, 4, 3, 9, 2, 2, 2, 2, 3, 0, 16, 3, 3, 9, 18, 2, 2, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 3, 8, 3, 1, 3, 2, 9, 1, 5, 1, 2, 4, 3, 9, 2, 0, 17, 1, 2, 5, 4, 2, 2, 3, 4, 1, 2, 0, 2, 1, 4, 1, 4, 2, 4, 11, 5, 4, 4, 2, 2, 3, 3, 0, 7, 0, 15, 9, 18, 2, 2, 7, 2, 2, 2, 22, 2, 9, 2, 4, 4, 7, 2, 2, 2, 3, 8, 1, 2, 1, 7, 3, 3, 9, 19, 1, 2, 7, 2, 2, 2, 22, 2, 9, 2, 4, 3, 8, 2, 2, 2, 3, 8, 1, 8, 0, 2, 3, 3, 9, 19, 1, 2, 7, 2, 2, 2, 22, 2, 15, 4, 7, 2, 2, 2, 3, 10, 0, 9, 3, 3, 9, 11, 5, 3, 1, 2, 17, 4, 23, 2, 8, 2, 0, 3, 6, 4, 0, 5, 5, 2, 0, 2, 7, 19, 1, 14, 57, 6, 14, 2, 9, 40, 1, 2, 0, 3, 1, 2, 0, 3, 0, 7, 3, 2, 6, 2, 2, 2, 0, 2, 0, 3, 1, 2, 12, 2, 2, 3, 4, 2, 0, 2, 5, 3, 9, 3, 1, 35, 0, 24, 1, 7, 9, 12, 0, 2, 0, 2, 0, 5, 9, 2, 35, 5, 19, 2, 5, 5, 7, 2, 35, 10, 0, 58, 73, 7, 77, 3, 37, 11, 42, 2, 0, 4, 328, 2, 3, 3, 6, 2, 0, 2, 3, 3, 40, 2, 3, 3, 32, 2, 3, 3, 6, 2, 0, 2, 3, 3, 14, 2, 56, 2, 3, 3, 66, 5, 0, 33, 15, 17, 84, 13, 619, 3, 16, 2, 25, 6, 74, 22, 12, 2, 6, 12, 20, 12, 19, 13, 12, 2, 2, 2, 1, 13, 51, 3, 29, 4, 0, 5, 1, 3, 9, 34, 2, 3, 9, 7, 87, 9, 42, 6, 69, 11, 28, 4, 11, 5, 11, 11, 39, 3, 4, 12, 43, 5, 25, 7, 10, 38, 27, 5, 62, 2, 28, 3, 10, 7, 9, 14, 0, 89, 75, 5, 9, 18, 8, 13, 42, 4, 11, 71, 55, 9, 9, 4, 48, 83, 2, 2, 30, 14, 230, 23, 280, 3, 5, 3, 37, 3, 5, 3, 7, 2, 0, 2, 0, 2, 0, 2, 30, 3, 52, 2, 6, 2, 0, 4, 2, 2, 6, 4, 3, 3, 5, 5, 12, 6, 2, 2, 6, 67, 1, 20, 0, 29, 0, 14, 0, 17, 4, 60, 12, 5, 0, 4, 11, 18, 0, 5, 0, 3, 9, 2, 0, 4, 4, 7, 0, 2, 0, 2, 0, 2, 3, 2, 10, 3, 3, 6, 4, 5, 0, 53, 1, 2684, 46, 2, 46, 2, 132, 7, 6, 15, 37, 11, 53, 10, 0, 17, 22, 10, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 31, 48, 0, 470, 1, 36, 5, 2, 4, 6, 1, 5, 85, 3, 1, 3, 2, 2, 89, 2, 3, 6, 40, 4, 93, 18, 23, 57, 15, 513, 6581, 75, 20939, 53, 1164, 68, 45, 3, 268, 4, 27, 21, 31, 3, 13, 13, 1, 2, 24, 9, 69, 11, 1, 38, 8, 3, 102, 3, 1, 111, 44, 25, 51, 13, 68, 12, 9, 7, 23, 4, 0, 5, 45, 3, 35, 13, 28, 4, 64, 15, 10, 39, 54, 10, 13, 3, 9, 7, 22, 4, 1, 5, 66, 25, 2, 227, 42, 2, 1, 3, 9, 7, 11171, 13, 22, 5, 48, 8453, 301, 3, 61, 3, 105, 39, 6, 13, 4, 6, 11, 2, 12, 2, 4, 2, 0, 2, 1, 2, 1, 2, 107, 34, 362, 19, 63, 3, 53, 41, 11, 5, 15, 17, 6, 13, 1, 25, 2, 33, 4, 2, 134, 20, 9, 8, 25, 5, 0, 2, 25, 12, 88, 4, 5, 3, 5, 3, 5, 3, 2]; +var code = 0; +var str = []; +for (var i = 0; i < wordChars.length; i += 2) { + str.push(code += wordChars[i]); + if (wordChars[i + 1]) + str.push(45, code += wordChars[i + 1]); +} +exports.wordChars = String.fromCharCode.apply(null, str); + +}); + +ace.define("ace/mode/text",["require","exports","module","ace/config","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(require, exports, module){"use strict"; +var config = require("../config"); +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var unicode = require("../unicode"); +var lang = require("../lib/lang"); +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; +var Mode; +Mode = function () { + this.HighlightRules = TextHighlightRules; +}; +(function () { + this.$defaultBehaviour = new CstyleBehaviour(); + this.tokenRe = new RegExp("^[" + unicode.wordChars + "\\$_]+", "g"); + this.nonTokenRe = new RegExp("^(?:[^" + unicode.wordChars + "\\$_]|\\s])+", "g"); + this.getTokenizer = function () { + if (!this.$tokenizer) { + this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig); + this.$tokenizer = new Tokenizer(this.$highlightRules.getRules()); + } + return this.$tokenizer; + }; + this.lineCommentStart = ""; + this.blockComment = ""; + this.toggleCommentLines = function (state, session, startRow, endRow) { + var doc = session.doc; + var ignoreBlankLines = true; + var shouldRemove = true; + var minIndent = Infinity; + var tabSize = session.getTabSize(); + var insertAtTabStop = false; + if (!this.lineCommentStart) { + if (!this.blockComment) + return false; + var lineCommentStart = this.blockComment.start; + var lineCommentEnd = this.blockComment.end; + var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")"); + var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$"); + var comment = function (line, i) { + if (testRemove(line, i)) + return; + if (!ignoreBlankLines || /\S/.test(line)) { + doc.insertInLine({ row: i, column: line.length }, lineCommentEnd); + doc.insertInLine({ row: i, column: minIndent }, lineCommentStart); + } + }; + var uncomment = function (line, i) { + var m; + if (m = line.match(regexpEnd)) + doc.removeInLine(i, line.length - m[0].length, line.length); + if (m = line.match(regexpStart)) + doc.removeInLine(i, m[1].length, m[0].length); + }; + var testRemove = function (line, row) { + if (regexpStart.test(line)) + return true; + var tokens = session.getTokens(row); + for (var i = 0; i < tokens.length; i++) { + if (tokens[i].type === "comment") + return true; + } + }; + } + else { + if (Array.isArray(this.lineCommentStart)) { + var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); + var lineCommentStart = this.lineCommentStart[0]; + } + else { + var regexpStart = lang.escapeRegExp(this.lineCommentStart); + var lineCommentStart = this.lineCommentStart; + } + regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?"); + insertAtTabStop = session.getUseSoftTabs(); + var uncomment = function (line, i) { + var m = line.match(regexpStart); + if (!m) + return; + var start = m[1].length, end = m[0].length; + if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ") + end--; + doc.removeInLine(i, start, end); + }; + var commentWithSpace = lineCommentStart + " "; + var comment = function (line, i) { + if (!ignoreBlankLines || /\S/.test(line)) { + if (shouldInsertSpace(line, minIndent, minIndent)) + doc.insertInLine({ row: i, column: minIndent }, commentWithSpace); + else + doc.insertInLine({ row: i, column: minIndent }, lineCommentStart); + } + }; + var testRemove = function (line, i) { + return regexpStart.test(line); + }; + var shouldInsertSpace = function (line, before, after) { + var spaces = 0; + while (before-- && line.charAt(before) == " ") + spaces++; + if (spaces % tabSize != 0) + return false; + var spaces = 0; + while (line.charAt(after++) == " ") + spaces++; + if (tabSize > 2) + return spaces % tabSize != tabSize - 1; + else + return spaces % tabSize == 0; + }; + } + function iter(fun) { + for (var i = startRow; i <= endRow; i++) + fun(doc.getLine(i), i); + } + var minEmptyLength = Infinity; + iter(function (line, i) { + var indent = line.search(/\S/); + if (indent !== -1) { + if (indent < minIndent) + minIndent = indent; + if (shouldRemove && !testRemove(line, i)) + shouldRemove = false; + } + else if (minEmptyLength > line.length) { + minEmptyLength = line.length; + } + }); + if (minIndent == Infinity) { + minIndent = minEmptyLength; + ignoreBlankLines = false; + shouldRemove = false; + } + if (insertAtTabStop && minIndent % tabSize != 0) + minIndent = Math.floor(minIndent / tabSize) * tabSize; + iter(shouldRemove ? uncomment : comment); + }; + this.toggleBlockComment = function (state, session, range, cursor) { + var comment = this.blockComment; + if (!comment) + return; + if (!comment.start && comment[0]) + comment = comment[0]; + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + var sel = session.selection; + var initialRange = session.selection.toOrientedRange(); + var startRow, colDiff; + if (token && /comment/.test(token.type)) { + var startRange, endRange; + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.start); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + startRange = new Range(row, column, row, column + comment.start.length); + break; + } + token = iterator.stepBackward(); + } + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.end); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + endRange = new Range(row, column, row, column + comment.end.length); + break; + } + token = iterator.stepForward(); + } + if (endRange) + session.remove(endRange); + if (startRange) { + session.remove(startRange); + startRow = startRange.start.row; + colDiff = -comment.start.length; + } + } + else { + colDiff = comment.start.length; + startRow = range.start.row; + session.insert(range.end, comment.end); + session.insert(range.start, comment.start); + } + if (initialRange.start.row == startRow) + initialRange.start.column += colDiff; + if (initialRange.end.row == startRow) + initialRange.end.column += colDiff; + session.selection.fromOrientedRange(initialRange); + }; + this.getNextLineIndent = function (state, line, tab) { + return this.$getIndent(line); + }; + this.checkOutdent = function (state, line, input) { + return false; + }; + this.autoOutdent = function (state, doc, row) { + }; + this.$getIndent = function (line) { + return line.match(/^\s*/)[0]; + }; + this.createWorker = function (session) { + return null; + }; + this.createModeDelegates = function (mapping) { + this.$embeds = []; + this.$modes = {}; + for (var i in mapping) { + if (mapping[i]) { + var Mode = mapping[i]; + var id = Mode.prototype.$id; + var mode = config.$modes[id]; + if (!mode) + config.$modes[id] = mode = new Mode(); + if (!config.$modes[i]) + config.$modes[i] = mode; + this.$embeds.push(i); + this.$modes[i] = mode; + } + } + var delegations = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent", + "checkOutdent", "autoOutdent", "transformAction", "getCompletions"]; + var _loop_1 = function (i) { + (function (scope) { + var functionName = delegations[i]; + var defaultHandler = scope[functionName]; + scope[delegations[i]] = + function () { + return this.$delegator(functionName, arguments, defaultHandler); + }; + }(this_1)); + }; + var this_1 = this; + for (var i = 0; i < delegations.length; i++) { + _loop_1(i); + } + }; + this.$delegator = function (method, args, defaultHandler) { + var state = args[0] || "start"; + if (typeof state != "string") { + if (Array.isArray(state[2])) { + var language = state[2][state[2].length - 1]; + var mode = this.$modes[language]; + if (mode) + return mode[method].apply(mode, [state[1]].concat([].slice.call(args, 1))); + } + state = state[0] || "start"; + } + for (var i = 0; i < this.$embeds.length; i++) { + if (!this.$modes[this.$embeds[i]]) + continue; + var split = state.split(this.$embeds[i]); + if (!split[0] && split[1]) { + args[0] = split[1]; + var mode = this.$modes[this.$embeds[i]]; + return mode[method].apply(mode, args); + } + } + var ret = defaultHandler.apply(this, args); + return defaultHandler ? ret : undefined; + }; + this.transformAction = function (state, action, editor, session, param) { + if (this.$behaviour) { + var behaviours = this.$behaviour.getBehaviours(); + for (var key in behaviours) { + if (behaviours[key][action]) { + var ret = behaviours[key][action].apply(this, arguments); + if (ret) { + return ret; + } + } + } + } + }; + this.getKeywords = function (append) { + if (!this.completionKeywords) { + var rules = this.$tokenizer["rules"]; + var completionKeywords = []; + for (var rule in rules) { + var ruleItr = rules[rule]; + for (var r = 0, l = ruleItr.length; r < l; r++) { + if (typeof ruleItr[r].token === "string") { + if (/keyword|support|storage/.test(ruleItr[r].token)) + completionKeywords.push(ruleItr[r].regex); + } + else if (typeof ruleItr[r].token === "object") { + for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { + if (/keyword|support|storage/.test(ruleItr[r].token[a])) { + var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a]; + completionKeywords.push(rule.substr(1, rule.length - 2)); + } + } + } + } + } + this.completionKeywords = completionKeywords; + } + if (!append) + return this.$keywordList; + return completionKeywords.concat(this.$keywordList || []); + }; + this.$createKeywordList = function () { + if (!this.$highlightRules) + this.getTokenizer(); + return this.$keywordList = this.$highlightRules.$keywordList || []; + }; + this.getCompletions = function (state, session, pos, prefix) { + var keywords = this.$keywordList || this.$createKeywordList(); + return keywords.map(function (word) { + return { + name: word, + value: word, + score: 0, + meta: "keyword" + }; + }); + }; + this.$id = "ace/mode/text"; +}).call(Mode.prototype); +exports.Mode = Mode; + +}); + +ace.define("ace/apply_delta",["require","exports","module"], function(require, exports, module){"use strict"; +function throwDeltaError(delta, errorText) { + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} +exports.applyDelta = function (docLines, delta, doNotValidate) { + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } + else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } + else { + docLines.splice(row, endRow - row + 1, line.substring(0, startColumn) + docLines[endRow].substring(endColumn)); + } + break; + } +}; + +}); + +ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Anchor = /** @class */ (function () { + function Anchor(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + if (typeof row != "number") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); + } + Anchor.prototype.getPosition = function () { + return this.$clipPositionToDocument(this.row, this.column); + }; + Anchor.prototype.getDocument = function () { + return this.document; + }; + Anchor.prototype.onChange = function (delta) { + if (delta.start.row == delta.end.row && delta.start.row != this.row) + return; + if (delta.start.row > this.row) + return; + var point = $getTransformedPoint(delta, { row: this.row, column: this.column }, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + Anchor.prototype.setPosition = function (row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } + else { + pos = this.$clipPositionToDocument(row, column); + } + if (this.row == pos.row && this.column == pos.column) + return; + var old = { + row: this.row, + column: this.column + }; + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + Anchor.prototype.detach = function () { + this.document.off("change", this.$onChange); + }; + Anchor.prototype.attach = function (doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + Anchor.prototype.$clipPositionToDocument = function (row, column) { + var pos = {}; + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + if (column < 0) + pos.column = 0; + return pos; + }; + return Anchor; +}()); +Anchor.prototype.$insertRight = false; +oop.implement(Anchor.prototype, EventEmitter); +function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); +} +function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + return { + row: deltaStart.row, + column: deltaStart.column + }; +} +exports.Anchor = Anchor; + +}); + +ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; +var Document = /** @class */ (function () { + function Document(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } + else if (Array.isArray(textOrLines)) { + this.insertMergedLines({ row: 0, column: 0 }, textOrLines); + } + else { + this.insert({ row: 0, column: 0 }, textOrLines); + } + } + Document.prototype.setValue = function (text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({ row: 0, column: 0 }, text || ""); + }; + Document.prototype.getValue = function () { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + Document.prototype.createAnchor = function (row, column) { + return new Anchor(this, row, column); + }; + Document.prototype.$detectNewLine = function (text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + Document.prototype.getNewLineCharacter = function () { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + Document.prototype.setNewLineMode = function (newLineMode) { + if (this.$newLineMode === newLineMode) + return; + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + Document.prototype.getNewLineMode = function () { + return this.$newLineMode; + }; + Document.prototype.isNewLine = function (text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + Document.prototype.getLine = function (row) { + return this.$lines[row] || ""; + }; + Document.prototype.getLines = function (firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + Document.prototype.getAllLines = function () { + return this.getLines(0, this.getLength()); + }; + Document.prototype.getLength = function () { + return this.$lines.length; + }; + Document.prototype.getTextRange = function (range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + Document.prototype.getLinesForRange = function (range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } + else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + Document.prototype.insertLines = function (row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + Document.prototype.removeLines = function (firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + Document.prototype.insertNewLine = function (position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + Document.prototype.insert = function (position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + return this.insertMergedLines(position, this.$split(text)); + }; + Document.prototype.insertInLine = function (position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + return this.clonePos(end); + }; + Document.prototype.clippedPos = function (row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } + else if (row < 0) { + row = 0; + } + else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return { row: row, column: column }; + }; + Document.prototype.clonePos = function (pos) { + return { row: pos.row, column: pos.column }; + }; + Document.prototype.pos = function (row, column) { + return { row: row, column: column }; + }; + Document.prototype.$clipPosition = function (position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } + else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + Document.prototype.insertFullLines = function (row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } + else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({ row: row, column: column }, lines); + }; + Document.prototype.insertMergedLines = function (position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + return this.clonePos(end); + }; + Document.prototype.remove = function (range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({ start: start, end: end }) + }); + return this.clonePos(start); + }; + Document.prototype.removeInLine = function (row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({ start: start, end: end }) + }, true); + return this.clonePos(start); + }; + Document.prototype.removeFullLines = function (firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = (deleteFirstNewLine ? firstRow - 1 : firstRow); + var startCol = (deleteFirstNewLine ? this.getLine(startRow).length : 0); + var endRow = (deleteLastNewLine ? lastRow + 1 : lastRow); + var endCol = (deleteLastNewLine ? 0 : this.getLine(endRow).length); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + Document.prototype.removeNewLine = function (row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + Document.prototype.replace = function (range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + return end; + }; + Document.prototype.applyDeltas = function (deltas) { + for (var i = 0; i < deltas.length; i++) { + this.applyDelta(deltas[i]); + } + }; + Document.prototype.revertDeltas = function (deltas) { + for (var i = deltas.length - 1; i >= 0; i--) { + this.revertDelta(deltas[i]); + } + }; + Document.prototype.applyDelta = function (delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + if (isInsert && delta.lines.length > 20000) { + this.$splitAndapplyLargeDelta(delta, 20000); + } + else { + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + } + }; + Document.prototype.$safeApplyDelta = function (delta) { + var docLength = this.$lines.length; + if (delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength + || delta.action == "insert" && delta.start.row <= docLength) { + this.applyDelta(delta); + } + }; + Document.prototype.$splitAndapplyLargeDelta = function (delta, MAX) { + var lines = delta.lines; + var l = lines.length - MAX + 1; + var row = delta.start.row; + var column = delta.start.column; + for (var from = 0, to = 0; from < l; from = to) { + to += MAX - 1; + var chunk = lines.slice(from, to); + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } + delta.lines = lines.slice(from); + delta.start.row = row + from; + delta.start.column = column; + this.applyDelta(delta, true); + }; + Document.prototype.revertDelta = function (delta) { + this.$safeApplyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + Document.prototype.indexToPosition = function (index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return { row: i, column: index + lines[i].length + newlineLength }; + } + return { row: l - 1, column: index + lines[l - 1].length + newlineLength }; + }; + Document.prototype.positionToIndex = function (pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + return index + pos.column; + }; + Document.prototype.$split = function (text) { + return text.split(/\r\n|\r|\n/); + }; + return Document; +}()); +Document.prototype.$autoNewLine = ""; +Document.prototype.$newLineMode = "auto"; +oop.implement(Document.prototype, EventEmitter); +exports.Document = Document; + +}); + +ace.define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var BackgroundTokenizer = /** @class */ (function () { + function BackgroundTokenizer(tokenizer, session) { + this.running = false; + this.lines = []; + this.states = []; + this.currentLine = 0; + this.tokenizer = tokenizer; + var self = this; + this.$worker = function () { + if (!self.running) { + return; + } + var workerStart = new Date(); + var currentLine = self.currentLine; + var endLine = -1; + var doc = self.doc; + var startLine = currentLine; + while (self.lines[currentLine]) + currentLine++; + var len = doc.getLength(); + var processedLines = 0; + self.running = false; + while (currentLine < len) { + self.$tokenizeRow(currentLine); + endLine = currentLine; + do { + currentLine++; + } while (self.lines[currentLine]); + processedLines++; + if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { + self.running = setTimeout(self.$worker, 20); + break; + } + } + self.currentLine = currentLine; + if (endLine == -1) + endLine = currentLine; + if (startLine <= endLine) + self.fireUpdateEvent(startLine, endLine); + }; + } + BackgroundTokenizer.prototype.setTokenizer = function (tokenizer) { + this.tokenizer = tokenizer; + this.lines = []; + this.states = []; + this.start(0); + }; + BackgroundTokenizer.prototype.setDocument = function (doc) { + this.doc = doc; + this.lines = []; + this.states = []; + this.stop(); + }; + BackgroundTokenizer.prototype.fireUpdateEvent = function (firstRow, lastRow) { + var data = { + first: firstRow, + last: lastRow + }; + this._signal("update", { data: data }); + }; + BackgroundTokenizer.prototype.start = function (startRow) { + this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength()); + this.lines.splice(this.currentLine, this.lines.length); + this.states.splice(this.currentLine, this.states.length); + this.stop(); + this.running = setTimeout(this.$worker, 700); + }; + BackgroundTokenizer.prototype.scheduleStart = function () { + if (!this.running) + this.running = setTimeout(this.$worker, 700); + }; + BackgroundTokenizer.prototype.$updateOnChange = function (delta) { + var startRow = delta.start.row; + var len = delta.end.row - startRow; + if (len === 0) { + this.lines[startRow] = null; + } + else if (delta.action == "remove") { + this.lines.splice(startRow, len + 1, null); + this.states.splice(startRow, len + 1, null); + } + else { + var args = Array(len + 1); + args.unshift(startRow, 1); + this.lines.splice.apply(this.lines, args); + this.states.splice.apply(this.states, args); + } + this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength()); + this.stop(); + }; + BackgroundTokenizer.prototype.stop = function () { + if (this.running) + clearTimeout(this.running); + this.running = false; + }; + BackgroundTokenizer.prototype.getTokens = function (row) { + return this.lines[row] || this.$tokenizeRow(row); + }; + BackgroundTokenizer.prototype.getState = function (row) { + if (this.currentLine == row) + this.$tokenizeRow(row); + return this.states[row] || "start"; + }; + BackgroundTokenizer.prototype.$tokenizeRow = function (row) { + var line = this.doc.getLine(row); + var state = this.states[row - 1]; + var data = this.tokenizer.getLineTokens(line, state, row); + if (this.states[row] + "" !== data.state + "") { + this.states[row] = data.state; + this.lines[row + 1] = null; + if (this.currentLine > row + 1) + this.currentLine = row + 1; + } + else if (this.currentLine == row) { + this.currentLine = row + 1; + } + return this.lines[row] = data.tokens; + }; + BackgroundTokenizer.prototype.cleanup = function () { + this.running = false; + this.lines = []; + this.states = []; + this.currentLine = 0; + this.removeAllListeners(); + }; + return BackgroundTokenizer; +}()); +oop.implement(BackgroundTokenizer.prototype, EventEmitter); +exports.BackgroundTokenizer = BackgroundTokenizer; + +}); + +ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/range"], function(require, exports, module){"use strict"; +var lang = require("./lib/lang"); +var Range = require("./range").Range; +var SearchHighlight = /** @class */ (function () { + function SearchHighlight(regExp, clazz, type) { + if (type === void 0) { type = "text"; } + this.setRegexp(regExp); + this.clazz = clazz; + this.type = type; + } + SearchHighlight.prototype.setRegexp = function (regExp) { + if (this.regExp + "" == regExp + "") + return; + this.regExp = regExp; + this.cache = []; + }; + SearchHighlight.prototype.update = function (html, markerLayer, session, config) { + if (!this.regExp) + return; + var start = config.firstRow, end = config.lastRow; + var renderedMarkerRanges = {}; + for (var i = start; i <= end; i++) { + var ranges = this.cache[i]; + if (ranges == null) { + ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); + if (ranges.length > this.MAX_RANGES) + ranges = ranges.slice(0, this.MAX_RANGES); + ranges = ranges.map(function (match) { + return new Range(i, match.offset, i, match.offset + match.length); + }); + this.cache[i] = ranges.length ? ranges : ""; + } + for (var j = ranges.length; j--;) { + var rangeToAddMarkerTo = ranges[j].toScreenRange(session); + var rangeAsString = rangeToAddMarkerTo.toString(); + if (renderedMarkerRanges[rangeAsString]) + continue; + renderedMarkerRanges[rangeAsString] = true; + markerLayer.drawSingleLineMarker(html, rangeToAddMarkerTo, this.clazz, config); + } + } + }; + return SearchHighlight; +}()); +SearchHighlight.prototype.MAX_RANGES = 500; +exports.SearchHighlight = SearchHighlight; + +}); + +ace.define("ace/undomanager",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var UndoManager = /** @class */ (function () { + function UndoManager() { + this.$keepRedoStack; + this.$maxRev = 0; + this.$fromUndo = false; + this.$undoDepth = Infinity; + this.reset(); + } + UndoManager.prototype.addSession = function (session) { + this.$session = session; + }; + UndoManager.prototype.add = function (delta, allowMerge, session) { + if (this.$fromUndo) + return; + if (delta == this.$lastDelta) + return; + if (!this.$keepRedoStack) + this.$redoStack.length = 0; + if (allowMerge === false || !this.lastDeltas) { + this.lastDeltas = []; + var undoStackLength = this.$undoStack.length; + if (undoStackLength > this.$undoDepth - 1) { + this.$undoStack.splice(0, undoStackLength - this.$undoDepth + 1); + } + this.$undoStack.push(this.lastDeltas); + delta.id = this.$rev = ++this.$maxRev; + } + if (delta.action == "remove" || delta.action == "insert") + this.$lastDelta = delta; + this.lastDeltas.push(delta); + }; + UndoManager.prototype.addSelection = function (selection, rev) { + this.selections.push({ + value: selection, + rev: rev || this.$rev + }); + }; + UndoManager.prototype.startNewGroup = function () { + this.lastDeltas = null; + return this.$rev; + }; + UndoManager.prototype.markIgnored = function (from, to) { + if (to == null) + to = this.$rev + 1; + var stack = this.$undoStack; + for (var i = stack.length; i--;) { + var delta = stack[i][0]; + if (delta.id <= from) + break; + if (delta.id < to) + delta.ignore = true; + } + this.lastDeltas = null; + }; + UndoManager.prototype.getSelection = function (rev, after) { + var stack = this.selections; + for (var i = stack.length; i--;) { + var selection = stack[i]; + if (selection.rev < rev) { + if (after) + selection = stack[i + 1]; + return selection; + } + } + }; + UndoManager.prototype.getRevision = function () { + return this.$rev; + }; + UndoManager.prototype.getDeltas = function (from, to) { + if (to == null) + to = this.$rev + 1; + var stack = this.$undoStack; + var end = null, start = 0; + for (var i = stack.length; i--;) { + var delta = stack[i][0]; + if (delta.id < to && !end) + end = i + 1; + if (delta.id <= from) { + start = i + 1; + break; + } + } + return stack.slice(start, end); + }; + UndoManager.prototype.getChangedRanges = function (from, to) { + if (to == null) + to = this.$rev + 1; + }; + UndoManager.prototype.getChangedLines = function (from, to) { + if (to == null) + to = this.$rev + 1; + }; + UndoManager.prototype.undo = function (session, dontSelect) { + this.lastDeltas = null; + var stack = this.$undoStack; + if (!rearrangeUndoStack(stack, stack.length)) + return; + if (!session) + session = this.$session; + if (this.$redoStackBaseRev !== this.$rev && this.$redoStack.length) + this.$redoStack = []; + this.$fromUndo = true; + var deltaSet = stack.pop(); + var undoSelectionRange = null; + if (deltaSet) { + undoSelectionRange = session.undoChanges(deltaSet, dontSelect); + this.$redoStack.push(deltaSet); + this.$syncRev(); + } + this.$fromUndo = false; + return undoSelectionRange; + }; + UndoManager.prototype.redo = function (session, dontSelect) { + this.lastDeltas = null; + if (!session) + session = this.$session; + this.$fromUndo = true; + if (this.$redoStackBaseRev != this.$rev) { + var diff = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1); + rebaseRedoStack(this.$redoStack, diff); + this.$redoStackBaseRev = this.$rev; + this.$redoStack.forEach(function (x) { + x[0].id = ++this.$maxRev; + }, this); + } + var deltaSet = this.$redoStack.pop(); + var redoSelectionRange = null; + if (deltaSet) { + redoSelectionRange = session.redoChanges(deltaSet, dontSelect); + this.$undoStack.push(deltaSet); + this.$syncRev(); + } + this.$fromUndo = false; + return redoSelectionRange; + }; + UndoManager.prototype.$syncRev = function () { + var stack = this.$undoStack; + var nextDelta = stack[stack.length - 1]; + var id = nextDelta && nextDelta[0].id || 0; + this.$redoStackBaseRev = id; + this.$rev = id; + }; + UndoManager.prototype.reset = function () { + this.lastDeltas = null; + this.$lastDelta = null; + this.$undoStack = []; + this.$redoStack = []; + this.$rev = 0; + this.mark = 0; + this.$redoStackBaseRev = this.$rev; + this.selections = []; + }; + UndoManager.prototype.canUndo = function () { + return this.$undoStack.length > 0; + }; + UndoManager.prototype.canRedo = function () { + return this.$redoStack.length > 0; + }; + UndoManager.prototype.bookmark = function (rev) { + if (rev == undefined) + rev = this.$rev; + this.mark = rev; + }; + UndoManager.prototype.isAtBookmark = function () { + return this.$rev === this.mark; + }; + UndoManager.prototype.toJSON = function () { + return { + $redoStack: this.$redoStack, + $undoStack: this.$undoStack + }; + }; + UndoManager.prototype.fromJSON = function (json) { + this.reset(); + this.$undoStack = json.$undoStack; + this.$redoStack = json.$redoStack; + }; + UndoManager.prototype.$prettyPrint = function (delta) { + if (delta) + return stringifyDelta(delta); + return stringifyDelta(this.$undoStack) + "\n---\n" + stringifyDelta(this.$redoStack); + }; + return UndoManager; +}()); +UndoManager.prototype.hasUndo = UndoManager.prototype.canUndo; +UndoManager.prototype.hasRedo = UndoManager.prototype.canRedo; +UndoManager.prototype.isClean = UndoManager.prototype.isAtBookmark; +UndoManager.prototype.markClean = UndoManager.prototype.bookmark; +function rearrangeUndoStack(stack, pos) { + for (var i = pos; i--;) { + var deltaSet = stack[i]; + if (deltaSet && !deltaSet[0].ignore) { + while (i < pos - 1) { + var swapped = swapGroups(stack[i], stack[i + 1]); + stack[i] = swapped[0]; + stack[i + 1] = swapped[1]; + i++; + } + return true; + } + } +} +var Range = require("./range").Range; +var cmp = Range.comparePoints; +var comparePoints = Range.comparePoints; +function $updateMarkers(delta) { + var isInsert = delta.action == "insert"; + var start = delta.start; + var end = delta.end; + var rowShift = (end.row - start.row) * (isInsert ? 1 : -1); + var colShift = (end.column - start.column) * (isInsert ? 1 : -1); + if (isInsert) + end = start; + for (var i in this.marks) { + var point = this.marks[i]; + var cmp = comparePoints(point, start); + if (cmp < 0) { + continue; // delta starts after the range + } + if (cmp === 0) { + if (isInsert) { + if (point.bias == 1) { + cmp = 1; + } + else { + point.bias == -1; + continue; + } + } + } + var cmp2 = isInsert ? cmp : comparePoints(point, end); + if (cmp2 > 0) { + point.row += rowShift; + point.column += point.row == end.row ? colShift : 0; + continue; + } + if (!isInsert && cmp2 <= 0) { + point.row = start.row; + point.column = start.column; + if (cmp2 === 0) + point.bias = 1; + } + } +} +function clonePos(pos) { + return { row: pos.row, column: pos.column }; +} +function cloneDelta(d) { + return { + start: clonePos(d.start), + end: clonePos(d.end), + action: d.action, + lines: d.lines.slice() + }; +} +function stringifyDelta(d) { + d = d || this; + if (Array.isArray(d)) { + return d.map(stringifyDelta).join("\n"); + } + var type = ""; + if (d.action) { + type = d.action == "insert" ? "+" : "-"; + type += "[" + d.lines + "]"; + } + else if (d.value) { + if (Array.isArray(d.value)) { + type = d.value.map(stringifyRange).join("\n"); + } + else { + type = stringifyRange(d.value); + } + } + if (d.start) { + type += stringifyRange(d); + } + if (d.id || d.rev) { + type += "\t(" + (d.id || d.rev) + ")"; + } + return type; +} +function stringifyRange(r) { + return r.start.row + ":" + r.start.column + + "=>" + r.end.row + ":" + r.end.column; +} +function swap(d1, d2) { + var i1 = d1.action == "insert"; + var i2 = d2.action == "insert"; + if (i1 && i2) { + if (cmp(d2.start, d1.end) >= 0) { + shift(d2, d1, -1); + } + else if (cmp(d2.start, d1.start) <= 0) { + shift(d1, d2, +1); + } + else { + return null; + } + } + else if (i1 && !i2) { + if (cmp(d2.start, d1.end) >= 0) { + shift(d2, d1, -1); + } + else if (cmp(d2.end, d1.start) <= 0) { + shift(d1, d2, -1); + } + else { + return null; + } + } + else if (!i1 && i2) { + if (cmp(d2.start, d1.start) >= 0) { + shift(d2, d1, +1); + } + else if (cmp(d2.start, d1.start) <= 0) { + shift(d1, d2, +1); + } + else { + return null; + } + } + else if (!i1 && !i2) { + if (cmp(d2.start, d1.start) >= 0) { + shift(d2, d1, +1); + } + else if (cmp(d2.end, d1.start) <= 0) { + shift(d1, d2, -1); + } + else { + return null; + } + } + return [d2, d1]; +} +function swapGroups(ds1, ds2) { + for (var i = ds1.length; i--;) { + for (var j = 0; j < ds2.length; j++) { + if (!swap(ds1[i], ds2[j])) { + while (i < ds1.length) { + while (j--) { + swap(ds2[j], ds1[i]); + } + j = ds2.length; + i++; + } + return [ds1, ds2]; + } + } + } + ds1.selectionBefore = ds2.selectionBefore = + ds1.selectionAfter = ds2.selectionAfter = null; + return [ds2, ds1]; +} +function xform(d1, c1) { + var i1 = d1.action == "insert"; + var i2 = c1.action == "insert"; + if (i1 && i2) { + if (cmp(d1.start, c1.start) < 0) { + shift(c1, d1, 1); + } + else { + shift(d1, c1, 1); + } + } + else if (i1 && !i2) { + if (cmp(d1.start, c1.end) >= 0) { + shift(d1, c1, -1); + } + else if (cmp(d1.start, c1.start) <= 0) { + shift(c1, d1, +1); + } + else { + shift(d1, Range.fromPoints(c1.start, d1.start), -1); + shift(c1, d1, +1); + } + } + else if (!i1 && i2) { + if (cmp(c1.start, d1.end) >= 0) { + shift(c1, d1, -1); + } + else if (cmp(c1.start, d1.start) <= 0) { + shift(d1, c1, +1); + } + else { + shift(c1, Range.fromPoints(d1.start, c1.start), -1); + shift(d1, c1, +1); + } + } + else if (!i1 && !i2) { + if (cmp(c1.start, d1.end) >= 0) { + shift(c1, d1, -1); + } + else if (cmp(c1.end, d1.start) <= 0) { + shift(d1, c1, -1); + } + else { + var before, after; + if (cmp(d1.start, c1.start) < 0) { + before = d1; + d1 = splitDelta(d1, c1.start); + } + if (cmp(d1.end, c1.end) > 0) { + after = splitDelta(d1, c1.end); + } + shiftPos(c1.end, d1.start, d1.end, -1); + if (after && !before) { + d1.lines = after.lines; + d1.start = after.start; + d1.end = after.end; + after = d1; + } + return [c1, before, after].filter(Boolean); + } + } + return [c1, d1]; +} +function shift(d1, d2, dir) { + shiftPos(d1.start, d2.start, d2.end, dir); + shiftPos(d1.end, d2.start, d2.end, dir); +} +function shiftPos(pos, start, end, dir) { + if (pos.row == (dir == 1 ? start : end).row) { + pos.column += dir * (end.column - start.column); + } + pos.row += dir * (end.row - start.row); +} +function splitDelta(c, pos) { + var lines = c.lines; + var end = c.end; + c.end = clonePos(pos); + var rowsBefore = c.end.row - c.start.row; + var otherLines = lines.splice(rowsBefore, lines.length); + var col = rowsBefore ? pos.column : pos.column - c.start.column; + lines.push(otherLines[0].substring(0, col)); + otherLines[0] = otherLines[0].substr(col); + var rest = { + start: clonePos(pos), + end: end, + lines: otherLines, + action: c.action + }; + return rest; +} +function moveDeltasByOne(redoStack, d) { + d = cloneDelta(d); + for (var j = redoStack.length; j--;) { + var deltaSet = redoStack[j]; + for (var i = 0; i < deltaSet.length; i++) { + var x = deltaSet[i]; + var xformed = xform(x, d); + d = xformed[0]; + if (xformed.length != 2) { + if (xformed[2]) { + deltaSet.splice(i + 1, 1, xformed[1], xformed[2]); + i++; + } + else if (!xformed[1]) { + deltaSet.splice(i, 1); + i--; + } + } + } + if (!deltaSet.length) { + redoStack.splice(j, 1); + } + } + return redoStack; +} +function rebaseRedoStack(redoStack, deltaSets) { + for (var i = 0; i < deltaSets.length; i++) { + var deltas = deltaSets[i]; + for (var j = 0; j < deltas.length; j++) { + moveDeltasByOne(redoStack, deltas[j]); + } + } +} +exports.UndoManager = UndoManager; + +}); + +ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("../range").Range; +var FoldLine = /** @class */ (function () { + function FoldLine(foldData, folds) { + this.foldData = foldData; + if (Array.isArray(folds)) { + this.folds = folds; + } + else { + folds = this.folds = [folds]; + } + var last = folds[folds.length - 1]; + this.range = new Range(folds[0].start.row, folds[0].start.column, last.end.row, last.end.column); + this.start = this.range.start; + this.end = this.range.end; + this.folds.forEach(function (fold) { + fold.setFoldLine(this); + }, this); + } + FoldLine.prototype.shiftRow = function (shift) { + this.start.row += shift; + this.end.row += shift; + this.folds.forEach(function (fold) { + fold.start.row += shift; + fold.end.row += shift; + }); + }; + FoldLine.prototype.addFold = function (fold) { + if (fold.sameRow) { + if (fold.start.row < this.startRow || fold.endRow > this.endRow) { + throw new Error("Can't add a fold to this FoldLine as it has no connection"); + } + this.folds.push(fold); + this.folds.sort(function (a, b) { + return -a.range.compareEnd(b.start.row, b.start.column); + }); + if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } + else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } + } + else if (fold.start.row == this.end.row) { + this.folds.push(fold); + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } + else if (fold.end.row == this.start.row) { + this.folds.unshift(fold); + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } + else { + throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); + } + fold.foldLine = this; + }; + FoldLine.prototype.containsRow = function (row) { + return row >= this.start.row && row <= this.end.row; + }; + FoldLine.prototype.walk = function (callback, endRow, endColumn) { + var lastEnd = 0, folds = this.folds, fold, cmp, stop, isNewRow = true; + if (endRow == null) { + endRow = this.end.row; + endColumn = this.end.column; + } + for (var i = 0; i < folds.length; i++) { + fold = folds[i]; + cmp = fold.range.compareStart(endRow, endColumn); + if (cmp == -1) { + callback(null, endRow, endColumn, lastEnd, isNewRow); + return; + } + stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); + stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); + if (stop || cmp === 0) { + return; + } + isNewRow = !fold.sameRow; + lastEnd = fold.end.column; + } + callback(null, endRow, endColumn, lastEnd, isNewRow); + }; + FoldLine.prototype.getNextFoldTo = function (row, column) { + var fold, cmp; + for (var i = 0; i < this.folds.length; i++) { + fold = this.folds[i]; + cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + return { + fold: fold, + kind: "after" + }; + } + else if (cmp === 0) { + return { + fold: fold, + kind: "inside" + }; + } + } + return null; + }; + FoldLine.prototype.addRemoveChars = function (row, column, len) { + var ret = this.getNextFoldTo(row, column), fold, folds; + if (ret) { + fold = ret.fold; + if (ret.kind == "inside" + && fold.start.column != column + && fold.start.row != row) { + window.console && window.console.log(row, column, fold); + } + else if (fold.start.row == row) { + folds = this.folds; + var i = folds.indexOf(fold); + if (i === 0) { + this.start.column += len; + } + for (i; i < folds.length; i++) { + fold = folds[i]; + fold.start.column += len; + if (!fold.sameRow) { + return; + } + fold.end.column += len; + } + this.end.column += len; + } + } + }; + FoldLine.prototype.split = function (row, column) { + var pos = this.getNextFoldTo(row, column); + if (!pos || pos.kind == "inside") + return null; + var fold = pos.fold; + var folds = this.folds; + var foldData = this.foldData; + var i = folds.indexOf(fold); + var foldBefore = folds[i - 1]; + this.end.row = foldBefore.end.row; + this.end.column = foldBefore.end.column; + folds = folds.splice(i, folds.length - i); + var newFoldLine = new FoldLine(foldData, folds); + foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); + return newFoldLine; + }; + FoldLine.prototype.merge = function (foldLineNext) { + var folds = foldLineNext.folds; + for (var i = 0; i < folds.length; i++) { + this.addFold(folds[i]); + } + var foldData = this.foldData; + foldData.splice(foldData.indexOf(foldLineNext), 1); + }; + FoldLine.prototype.toString = function () { + var ret = [this.range.toString() + ": ["]; + this.folds.forEach(function (fold) { + ret.push(" " + fold.toString()); + }); + ret.push("]"); + return ret.join("\n"); + }; + FoldLine.prototype.idxToPosition = function (idx) { + var lastFoldEndColumn = 0; + for (var i = 0; i < this.folds.length; i++) { + var fold = this.folds[i]; + idx -= fold.start.column - lastFoldEndColumn; + if (idx < 0) { + return { + row: fold.start.row, + column: fold.start.column + idx + }; + } + idx -= fold.placeholder.length; + if (idx < 0) { + return fold.start; + } + lastFoldEndColumn = fold.end.column; + } + return { + row: this.end.row, + column: this.end.column + idx + }; + }; + return FoldLine; +}()); +exports.FoldLine = FoldLine; + +}); + +ace.define("ace/range_list",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("./range").Range; +var comparePoints = Range.comparePoints; +var RangeList = /** @class */ (function () { + function RangeList() { + this.ranges = []; + this.$bias = 1; + } + RangeList.prototype.pointIndex = function (pos, excludeEdges, startIndex) { + var list = this.ranges; + for (var i = startIndex || 0; i < list.length; i++) { + var range = list[i]; + var cmpEnd = comparePoints(pos, range.end); + if (cmpEnd > 0) + continue; + var cmpStart = comparePoints(pos, range.start); + if (cmpEnd === 0) + return excludeEdges && cmpStart !== 0 ? -i - 2 : i; + if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) + return i; + return -i - 1; + } + return -i - 1; + }; + RangeList.prototype.add = function (range) { + var excludeEdges = !range.isEmpty(); + var startIndex = this.pointIndex(range.start, excludeEdges); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + else + endIndex++; + return this.ranges.splice(startIndex, endIndex - startIndex, range); + }; + RangeList.prototype.addList = function (list) { + var removed = []; + for (var i = list.length; i--;) { + removed.push.apply(removed, this.add(list[i])); + } + return removed; + }; + RangeList.prototype.substractPoint = function (pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges.splice(i, 1); + }; + RangeList.prototype.merge = function () { + var removed = []; + var list = this.ranges; + list = list.sort(function (a, b) { + return comparePoints(a.start, b.start); + }); + var next = list[0], range; + for (var i = 1; i < list.length; i++) { + range = next; + next = list[i]; + var cmp = comparePoints(range.end, next.start); + if (cmp < 0) + continue; + if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) + continue; + if (comparePoints(range.end, next.end) < 0) { + range.end.row = next.end.row; + range.end.column = next.end.column; + } + list.splice(i, 1); + removed.push(next); + next = range; + i--; + } + this.ranges = list; + return removed; + }; + RangeList.prototype.contains = function (row, column) { + return this.pointIndex({ row: row, column: column }) >= 0; + }; + RangeList.prototype.containsPoint = function (pos) { + return this.pointIndex(pos) >= 0; + }; + RangeList.prototype.rangeAtPoint = function (pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges[i]; + }; + RangeList.prototype.clipRows = function (startRow, endRow) { + var list = this.ranges; + if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) + return []; + var startIndex = this.pointIndex({ row: startRow, column: 0 }); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex({ row: endRow, column: 0 }, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + var clipped = []; + for (var i = startIndex; i < endIndex; i++) { + clipped.push(list[i]); + } + return clipped; + }; + RangeList.prototype.removeAll = function () { + return this.ranges.splice(0, this.ranges.length); + }; + RangeList.prototype.attach = function (session) { + if (this.session) + this.detach(); + this.session = session; + this.onChange = this.$onChange.bind(this); + this.session.on('change', this.onChange); + }; + RangeList.prototype.detach = function () { + if (!this.session) + return; + this.session.removeListener('change', this.onChange); + this.session = null; + }; + RangeList.prototype.$onChange = function (delta) { + var start = delta.start; + var end = delta.end; + var startRow = start.row; + var endRow = end.row; + var ranges = this.ranges; + for (var i = 0, n = ranges.length; i < n; i++) { + var r = ranges[i]; + if (r.end.row >= startRow) + break; + } + if (delta.action == "insert") { + var lineDif = endRow - startRow; + var colDiff = -start.column + end.column; + for (; i < n; i++) { + var r = ranges[i]; + if (r.start.row > startRow) + break; + if (r.start.row == startRow && r.start.column >= start.column) { + if (r.start.column == start.column && this.$bias <= 0) { + } + else { + r.start.column += colDiff; + r.start.row += lineDif; + } + } + if (r.end.row == startRow && r.end.column >= start.column) { + if (r.end.column == start.column && this.$bias < 0) { + continue; + } + if (r.end.column == start.column && colDiff > 0 && i < n - 1) { + if (r.end.column > r.start.column && r.end.column == ranges[i + 1].start.column) + r.end.column -= colDiff; + } + r.end.column += colDiff; + r.end.row += lineDif; + } + } + } + else { + var lineDif = startRow - endRow; + var colDiff = start.column - end.column; + for (; i < n; i++) { + var r = ranges[i]; + if (r.start.row > endRow) + break; + if (r.end.row < endRow + && (startRow < r.end.row + || startRow == r.end.row && start.column < r.end.column)) { + r.end.row = startRow; + r.end.column = start.column; + } + else if (r.end.row == endRow) { + if (r.end.column <= end.column) { + if (lineDif || r.end.column > start.column) { + r.end.column = start.column; + r.end.row = start.row; + } + } + else { + r.end.column += colDiff; + r.end.row += lineDif; + } + } + else if (r.end.row > endRow) { + r.end.row += lineDif; + } + if (r.start.row < endRow + && (startRow < r.start.row + || startRow == r.start.row && start.column < r.start.column)) { + r.start.row = startRow; + r.start.column = start.column; + } + else if (r.start.row == endRow) { + if (r.start.column <= end.column) { + if (lineDif || r.start.column > start.column) { + r.start.column = start.column; + r.start.row = start.row; + } + } + else { + r.start.column += colDiff; + r.start.row += lineDif; + } + } + else if (r.start.row > endRow) { + r.start.row += lineDif; + } + } + } + if (lineDif != 0 && i < n) { + for (; i < n; i++) { + var r = ranges[i]; + r.start.row += lineDif; + r.end.row += lineDif; + } + } + }; + return RangeList; +}()); +RangeList.prototype.comparePoints = comparePoints; +exports.RangeList = RangeList; + +}); + +ace.define("ace/edit_session/fold",["require","exports","module","ace/range_list"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var RangeList = require("../range_list").RangeList; +var Fold = /** @class */ (function (_super) { + __extends(Fold, _super); + function Fold(range, placeholder) { + var _this = _super.call(this) || this; + _this.foldLine = null; + _this.placeholder = placeholder; + _this.range = range; + _this.start = range.start; + _this.end = range.end; + _this.sameRow = range.start.row == range.end.row; + _this.subFolds = _this.ranges = []; + return _this; + } + Fold.prototype.toString = function () { + return '"' + this.placeholder + '" ' + this.range.toString(); + }; + Fold.prototype.setFoldLine = function (foldLine) { + this.foldLine = foldLine; + this.subFolds.forEach(function (fold) { + fold.setFoldLine(foldLine); + }); + }; + Fold.prototype.clone = function () { + var range = this.range.clone(); + var fold = new Fold(range, this.placeholder); + this.subFolds.forEach(function (subFold) { + fold.subFolds.push(subFold.clone()); + }); + fold.collapseChildren = this.collapseChildren; + return fold; + }; + Fold.prototype.addSubFold = function (fold) { + if (this.range.isEqual(fold)) + return; + consumeRange(fold, this.start); + var row = fold.start.row, column = fold.start.column; + for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { + cmp = this.subFolds[i].range.compare(row, column); + if (cmp != 1) + break; + } + var afterStart = this.subFolds[i]; + var firstConsumed = 0; + if (cmp == 0) { + if (afterStart.range.containsRange(fold)) + return afterStart.addSubFold(fold); + else + firstConsumed = 1; + } + var row = fold.range.end.row, column = fold.range.end.column; + for (var j = i, cmp = -1; j < this.subFolds.length; j++) { + cmp = this.subFolds[j].range.compare(row, column); + if (cmp != 1) + break; + } + if (cmp == 0) + j++; + var consumedFolds = this.subFolds.splice(i, j - i, fold); + var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length; + for (var k = firstConsumed; k < last; k++) { + fold.addSubFold(consumedFolds[k]); + } + fold.setFoldLine(this.foldLine); + return fold; + }; + Fold.prototype.restoreRange = function (range) { + return restoreRange(range, this.start); + }; + return Fold; +}(RangeList)); +function consumePoint(point, anchor) { + point.row -= anchor.row; + if (point.row == 0) + point.column -= anchor.column; +} +function consumeRange(range, anchor) { + consumePoint(range.start, anchor); + consumePoint(range.end, anchor); +} +function restorePoint(point, anchor) { + if (point.row == 0) + point.column += anchor.column; + point.row += anchor.row; +} +function restoreRange(range, anchor) { + restorePoint(range.start, anchor); + restorePoint(range.end, anchor); +} +exports.Fold = Fold; + +}); + +ace.define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator","ace/mouse/mouse_event"], function(require, exports, module){// @ts-nocheck +"use strict"; +var Range = require("../range").Range; +var FoldLine = require("./fold_line").FoldLine; +var Fold = require("./fold").Fold; +var TokenIterator = require("../token_iterator").TokenIterator; +var MouseEvent = require("../mouse/mouse_event").MouseEvent; +function Folding() { + this.getFoldAt = function (row, column, side) { + var foldLine = this.getFoldLine(row); + if (!foldLine) + return null; + var folds = foldLine.folds; + for (var i = 0; i < folds.length; i++) { + var range = folds[i].range; + if (range.contains(row, column)) { + if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) { + continue; + } + else if (side == -1 && range.isStart(row, column) && !range.isEmpty()) { + continue; + } + return folds[i]; + } + } + }; + this.getFoldsInRange = function (range) { + var start = range.start; + var end = range.end; + var foldLines = this.$foldData; + var foundFolds = []; + start.column += 1; + end.column -= 1; + for (var i = 0; i < foldLines.length; i++) { + var cmp = foldLines[i].range.compareRange(range); + if (cmp == 2) { + continue; + } + else if (cmp == -2) { + break; + } + var folds = foldLines[i].folds; + for (var j = 0; j < folds.length; j++) { + var fold = folds[j]; + cmp = fold.range.compareRange(range); + if (cmp == -2) { + break; + } + else if (cmp == 2) { + continue; + } + else + if (cmp == 42) { + break; + } + foundFolds.push(fold); + } + } + start.column -= 1; + end.column += 1; + return foundFolds; + }; + this.getFoldsInRangeList = function (ranges) { + if (Array.isArray(ranges)) { + var folds = []; + ranges.forEach(function (range) { + folds = folds.concat(this.getFoldsInRange(range)); + }, this); + } + else { + var folds = this.getFoldsInRange(ranges); + } + return folds; + }; + this.getAllFolds = function () { + var folds = []; + var foldLines = this.$foldData; + for (var i = 0; i < foldLines.length; i++) + for (var j = 0; j < foldLines[i].folds.length; j++) + folds.push(foldLines[i].folds[j]); + return folds; + }; + this.getFoldStringAt = function (row, column, trim, foldLine) { + foldLine = foldLine || this.getFoldLine(row); + if (!foldLine) + return null; + var lastFold = { + end: { column: 0 } + }; + var str, fold; + for (var i = 0; i < foldLine.folds.length; i++) { + fold = foldLine.folds[i]; + var cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + str = this + .getLine(fold.start.row) + .substring(lastFold.end.column, fold.start.column); + break; + } + else if (cmp === 0) { + return null; + } + lastFold = fold; + } + if (!str) + str = this.getLine(fold.start.row).substring(lastFold.end.column); + if (trim == -1) + return str.substring(0, column - lastFold.end.column); + else if (trim == 1) + return str.substring(column - lastFold.end.column); + else + return str; + }; + this.getFoldLine = function (docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { + return foldLine; + } + else if (foldLine.end.row > docRow) { + return null; + } + } + return null; + }; + this.getNextFoldLine = function (docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.end.row >= docRow) { + return foldLine; + } + } + return null; + }; + this.getFoldedRowCount = function (first, last) { + var foldData = this.$foldData, rowCount = last - first + 1; + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i], end = foldLine.end.row, start = foldLine.start.row; + if (end >= last) { + if (start < last) { + if (start >= first) + rowCount -= last - start; + else + rowCount = 0; // in one fold + } + break; + } + else if (end >= first) { + if (start >= first) // fold inside range + rowCount -= end - start; + else + rowCount -= end - first + 1; + } + } + return rowCount; + }; + this.$addFoldLine = function (foldLine) { + this.$foldData.push(foldLine); + this.$foldData.sort(function (a, b) { + return a.start.row - b.start.row; + }); + return foldLine; + }; + this.addFold = function (placeholder, range) { + var foldData = this.$foldData; + var added = false; + var fold; + if (placeholder instanceof Fold) + fold = placeholder; + else { + fold = new Fold(range, placeholder); + fold.collapseChildren = range.collapseChildren; + } + this.$clipRangeToDocument(fold.range); + var startRow = fold.start.row; + var startColumn = fold.start.column; + var endRow = fold.end.row; + var endColumn = fold.end.column; + var startFold = this.getFoldAt(startRow, startColumn, 1); + var endFold = this.getFoldAt(endRow, endColumn, -1); + if (startFold && endFold == startFold) + return startFold.addSubFold(fold); + if (startFold && !startFold.range.isStart(startRow, startColumn)) + this.removeFold(startFold); + if (endFold && !endFold.range.isEnd(endRow, endColumn)) + this.removeFold(endFold); + var folds = this.getFoldsInRange(fold.range); + if (folds.length > 0) { + this.removeFolds(folds); + if (!fold.collapseChildren) { + folds.forEach(function (subFold) { + fold.addSubFold(subFold); + }); + } + } + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (endRow == foldLine.start.row) { + foldLine.addFold(fold); + added = true; + break; + } + else if (startRow == foldLine.end.row) { + foldLine.addFold(fold); + added = true; + if (!fold.sameRow) { + var foldLineNext = foldData[i + 1]; + if (foldLineNext && foldLineNext.start.row == endRow) { + foldLine.merge(foldLineNext); + break; + } + } + break; + } + else if (endRow <= foldLine.start.row) { + break; + } + } + if (!added) + foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); + if (this.$useWrapMode) + this.$updateWrapData(foldLine.start.row, foldLine.start.row); + else + this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); + this.$modified = true; + this._signal("changeFold", { data: fold, action: "add" }); + return fold; + }; + this.addFolds = function (folds) { + folds.forEach(function (fold) { + this.addFold(fold); + }, this); + }; + this.removeFold = function (fold) { + var foldLine = fold.foldLine; + var startRow = foldLine.start.row; + var endRow = foldLine.end.row; + var foldLines = this.$foldData; + var folds = foldLine.folds; + if (folds.length == 1) { + foldLines.splice(foldLines.indexOf(foldLine), 1); + } + else + if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { + folds.pop(); + foldLine.end.row = folds[folds.length - 1].end.row; + foldLine.end.column = folds[folds.length - 1].end.column; + } + else + if (foldLine.range.isStart(fold.start.row, fold.start.column)) { + folds.shift(); + foldLine.start.row = folds[0].start.row; + foldLine.start.column = folds[0].start.column; + } + else + if (fold.sameRow) { + folds.splice(folds.indexOf(fold), 1); + } + else + { + var newFoldLine = foldLine.split(fold.start.row, fold.start.column); + folds = newFoldLine.folds; + folds.shift(); + newFoldLine.start.row = folds[0].start.row; + newFoldLine.start.column = folds[0].start.column; + } + if (!this.$updating) { + if (this.$useWrapMode) + this.$updateWrapData(startRow, endRow); + else + this.$updateRowLengthCache(startRow, endRow); + } + this.$modified = true; + this._signal("changeFold", { data: fold, action: "remove" }); + }; + this.removeFolds = function (folds) { + var cloneFolds = []; + for (var i = 0; i < folds.length; i++) { + cloneFolds.push(folds[i]); + } + cloneFolds.forEach(function (fold) { + this.removeFold(fold); + }, this); + this.$modified = true; + }; + this.expandFold = function (fold) { + this.removeFold(fold); + fold.subFolds.forEach(function (subFold) { + fold.restoreRange(subFold); + this.addFold(subFold); + }, this); + if (fold.collapseChildren > 0) { + this.foldAll(fold.start.row + 1, fold.end.row, fold.collapseChildren - 1); + } + fold.subFolds = []; + }; + this.expandFolds = function (folds) { + folds.forEach(function (fold) { + this.expandFold(fold); + }, this); + }; + this.unfold = function (location, expandInner) { + var range, folds; + if (location == null) { + range = new Range(0, 0, this.getLength(), 0); + if (expandInner == null) + expandInner = true; + } + else if (typeof location == "number") { + range = new Range(location, 0, location, this.getLine(location).length); + } + else if ("row" in location) { + range = Range.fromPoints(location, location); + } + else if (Array.isArray(location)) { + folds = []; + location.forEach(function (range) { + folds = folds.concat(this.unfold(range)); + }, this); + return folds; + } + else { + range = location; + } + folds = this.getFoldsInRangeList(range); + var outermostFolds = folds; + while (folds.length == 1 + && Range.comparePoints(folds[0].start, range.start) < 0 + && Range.comparePoints(folds[0].end, range.end) > 0) { + this.expandFolds(folds); + folds = this.getFoldsInRangeList(range); + } + if (expandInner != false) { + this.removeFolds(folds); + } + else { + this.expandFolds(folds); + } + if (outermostFolds.length) + return outermostFolds; + }; + this.isRowFolded = function (docRow, startFoldRow) { + return !!this.getFoldLine(docRow, startFoldRow); + }; + this.getRowFoldEnd = function (docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.end.row : docRow; + }; + this.getRowFoldStart = function (docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.start.row : docRow; + }; + this.getFoldDisplayLine = function (foldLine, endRow, endColumn, startRow, startColumn) { + if (startRow == null) + startRow = foldLine.start.row; + if (startColumn == null) + startColumn = 0; + if (endRow == null) + endRow = foldLine.end.row; + if (endColumn == null) + endColumn = this.getLine(endRow).length; + var doc = this.doc; + var textLine = ""; + foldLine.walk(function (placeholder, row, column, lastColumn) { + if (row < startRow) + return; + if (row == startRow) { + if (column < startColumn) + return; + lastColumn = Math.max(startColumn, lastColumn); + } + if (placeholder != null) { + textLine += placeholder; + } + else { + textLine += doc.getLine(row).substring(lastColumn, column); + } + }, endRow, endColumn); + return textLine; + }; + this.getDisplayLine = function (row, endColumn, startRow, startColumn) { + var foldLine = this.getFoldLine(row); + if (!foldLine) { + var line; + line = this.doc.getLine(row); + return line.substring(startColumn || 0, endColumn || line.length); + } + else { + return this.getFoldDisplayLine(foldLine, row, endColumn, startRow, startColumn); + } + }; + this.$cloneFoldData = function () { + var fd = []; + fd = this.$foldData.map(function (foldLine) { + var folds = foldLine.folds.map(function (fold) { + return fold.clone(); + }); + return new FoldLine(fd, folds); + }); + return fd; + }; + this.toggleFold = function (tryToUnfold) { + var selection = this.selection; + var range = selection.getRange(); + var fold; + var bracketPos; + if (range.isEmpty()) { + var cursor = range.start; + fold = this.getFoldAt(cursor.row, cursor.column); + if (fold) { + this.expandFold(fold); + return; + } + else if (bracketPos = this.findMatchingBracket(cursor)) { + if (range.comparePoint(bracketPos) == 1) { + range.end = bracketPos; + } + else { + range.start = bracketPos; + range.start.column++; + range.end.column--; + } + } + else if (bracketPos = this.findMatchingBracket({ row: cursor.row, column: cursor.column + 1 })) { + if (range.comparePoint(bracketPos) == 1) + range.end = bracketPos; + else + range.start = bracketPos; + range.start.column++; + } + else { + range = this.getCommentFoldRange(cursor.row, cursor.column) || range; + } + } + else { + var folds = this.getFoldsInRange(range); + if (tryToUnfold && folds.length) { + this.expandFolds(folds); + return; + } + else if (folds.length == 1) { + fold = folds[0]; + } + } + if (!fold) + fold = this.getFoldAt(range.start.row, range.start.column); + if (fold && fold.range.toString() == range.toString()) { + this.expandFold(fold); + return; + } + var placeholder = "..."; + if (!range.isMultiLine()) { + placeholder = this.getTextRange(range); + if (placeholder.length < 4) + return; + placeholder = placeholder.trim().substring(0, 2) + ".."; + } + this.addFold(placeholder, range); + }; + this.getCommentFoldRange = function (row, column, dir) { + var iterator = new TokenIterator(this, row, column); + var token = iterator.getCurrentToken(); + var type = token && token.type; + if (token && /^comment|string/.test(type)) { + type = type.match(/comment|string/)[0]; + if (type == "comment") + type += "|doc-start|\\.doc"; + var re = new RegExp(type); + var range = new Range(); + if (dir != 1) { + do { + token = iterator.stepBackward(); + } while (token && re.test(token.type)); + token = iterator.stepForward(); + } + range.start.row = iterator.getCurrentTokenRow(); + range.start.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator = new TokenIterator(this, row, column); + var initState = this.getState(iterator.$row); + if (dir != -1) { + var lastRow = -1; + do { + token = iterator.stepForward(); + if (lastRow == -1) { + var state = this.getState(iterator.$row); + if (initState.toString() !== state.toString()) + lastRow = iterator.$row; + } + else if (iterator.$row > lastRow) { + break; + } + } while (token && re.test(token.type)); + token = iterator.stepBackward(); + } + else + token = iterator.getCurrentToken(); + range.end.row = iterator.getCurrentTokenRow(); + range.end.column = iterator.getCurrentTokenColumn(); + return range; + } + }; + this.foldAll = function (startRow, endRow, depth, test) { + if (depth == undefined) + depth = 100000; // JSON.stringify doesn't hanle Infinity + var foldWidgets = this.foldWidgets; + if (!foldWidgets) + return; // mode doesn't support folding + endRow = endRow || this.getLength(); + startRow = startRow || 0; + for (var row = startRow; row < endRow; row++) { + if (foldWidgets[row] == null) + foldWidgets[row] = this.getFoldWidget(row); + if (foldWidgets[row] != "start") + continue; + if (test && !test(row)) + continue; + var range = this.getFoldWidgetRange(row); + if (range && range.isMultiLine() + && range.end.row <= endRow + && range.start.row >= startRow) { + row = range.end.row; + range.collapseChildren = depth; + this.addFold("...", range); + } + } + }; + this.foldToLevel = function (level) { + this.foldAll(); + while (level-- > 0) + this.unfold(null, false); + }; + this.foldAllComments = function () { + var session = this; + this.foldAll(null, null, null, function (row) { + var tokens = session.getTokens(row); + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type == "text" && /^\s+$/.test(token.value)) + continue; + if (/comment/.test(token.type)) + return true; + return false; + } + }); + }; + this.$foldStyles = { + "manual": 1, + "markbegin": 1, + "markbeginend": 1 + }; + this.$foldStyle = "markbegin"; + this.setFoldStyle = function (style) { + if (!this.$foldStyles[style]) + throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); + if (this.$foldStyle == style) + return; + this.$foldStyle = style; + if (style == "manual") + this.unfold(); + var mode = this.$foldMode; + this.$setFolding(null); + this.$setFolding(mode); + }; + this.$setFolding = function (foldMode) { + if (this.$foldMode == foldMode) + return; + this.$foldMode = foldMode; + this.off('change', this.$updateFoldWidgets); + this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + this._signal("changeAnnotation"); + if (!foldMode || this.$foldStyle == "manual") { + this.foldWidgets = null; + return; + } + this.foldWidgets = []; + this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); + this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); + this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); + this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); + this.on('change', this.$updateFoldWidgets); + this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + }; + this.getParentFoldRangeData = function (row, ignoreCurrent) { + var fw = this.foldWidgets; + if (!fw || (ignoreCurrent && fw[row])) + return {}; + var i = row - 1, firstRange; + while (i >= 0) { + var c = fw[i]; + if (c == null) + c = fw[i] = this.getFoldWidget(i); + if (c == "start") { + var range = this.getFoldWidgetRange(i); + if (!firstRange) + firstRange = range; + if (range && range.end.row >= row) + break; + } + i--; + } + return { + range: i !== -1 && range, + firstRange: firstRange + }; + }; + this.onFoldWidgetClick = function (row, e) { + if (e instanceof MouseEvent) + e = e.domEvent; + var options = { + children: e.shiftKey, + all: e.ctrlKey || e.metaKey, + siblings: e.altKey + }; + var range = this.$toggleFoldWidget(row, options); + if (!range) { + var el = (e.target || e.srcElement); + if (el && /ace_fold-widget/.test(el.className)) + el.className += " ace_invalid"; + } + }; + this.$toggleFoldWidget = function (row, options) { + if (!this.getFoldWidget) + return; + var type = this.getFoldWidget(row); + var line = this.getLine(row); + var dir = type === "end" ? -1 : 1; + var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); + if (fold) { + if (options.children || options.all) + this.removeFold(fold); + else + this.expandFold(fold); + return fold; + } + var range = this.getFoldWidgetRange(row, true); + if (range && !range.isMultiLine()) { + fold = this.getFoldAt(range.start.row, range.start.column, 1); + if (fold && range.isEqual(fold.range)) { + this.removeFold(fold); + return fold; + } + } + if (options.siblings) { + var data = this.getParentFoldRangeData(row); + if (data.range) { + var startRow = data.range.start.row + 1; + var endRow = data.range.end.row; + } + this.foldAll(startRow, endRow, options.all ? 10000 : 0); + } + else if (options.children) { + endRow = range ? range.end.row : this.getLength(); + this.foldAll(row + 1, endRow, options.all ? 10000 : 0); + } + else if (range) { + if (options.all) + range.collapseChildren = 10000; + this.addFold("...", range); + } + return range; + }; + this.toggleFoldWidget = function (toggleParent) { + var row = this.selection.getCursor().row; + row = this.getRowFoldStart(row); + var range = this.$toggleFoldWidget(row, {}); + if (range) + return; + var data = this.getParentFoldRangeData(row, true); + range = data.range || data.firstRange; + if (range) { + row = range.start.row; + var fold = this.getFoldAt(row, this.getLine(row).length, 1); + if (fold) { + this.removeFold(fold); + } + else { + this.addFold("...", range); + } + } + }; + this.updateFoldWidgets = function (delta) { + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; + if (len === 0) { + this.foldWidgets[firstRow] = null; + } + else if (delta.action == 'remove') { + this.foldWidgets.splice(firstRow, len + 1, null); + } + else { + var args = Array(len + 1); + args.unshift(firstRow, 1); + this.foldWidgets.splice.apply(this.foldWidgets, args); + } + }; + this.tokenizerUpdateFoldWidgets = function (e) { + var rows = e.data; + if (rows.first != rows.last) { + if (this.foldWidgets.length > rows.first) + this.foldWidgets.splice(rows.first, this.foldWidgets.length); + } + }; +} +exports.Folding = Folding; + +}); + +ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(require, exports, module){"use strict"; +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; +function BracketMatch() { + this.findMatchingBracket = function (position, chr) { + if (position.column == 0) + return null; + var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column - 1); + if (charBeforeCursor == "") + return null; + var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); + if (!match) + return null; + if (match[1]) + return this.$findClosingBracket(match[1], position); + else + return this.$findOpeningBracket(match[2], position); + }; + this.getBracketRange = function (pos) { + var line = this.getLine(pos.row); + var before = true, range; + var chr = line.charAt(pos.column - 1); + var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + chr = line.charAt(pos.column); + pos = { row: pos.row, column: pos.column + 1 }; + match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + before = false; + } + if (!match) + return null; + if (match[1]) { + var bracketPos = this.$findClosingBracket(match[1], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(pos, bracketPos); + if (!before) { + range.end.column++; + range.start.column--; + } + range.cursor = range.end; + } + else { + var bracketPos = this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(bracketPos, pos); + if (!before) { + range.start.column++; + range.end.column--; + } + range.cursor = range.start; + } + return range; + }; + this.getMatchingBracketRanges = function (pos, isBackwards) { + var line = this.getLine(pos.row); + var bracketsRegExp = /([\(\[\{])|([\)\]\}])/; + var chr = !isBackwards && line.charAt(pos.column - 1); + var match = chr && chr.match(bracketsRegExp); + if (!match) { + chr = (isBackwards === undefined || isBackwards) && line.charAt(pos.column); + pos = { + row: pos.row, + column: pos.column + 1 + }; + match = chr && chr.match(bracketsRegExp); + } + if (!match) + return null; + var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column); + var bracketPos = match[1] ? this.$findClosingBracket(match[1], pos) + : this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return [startRange]; + var endRange = new Range(bracketPos.row, bracketPos.column, bracketPos.row, bracketPos.column + 1); + return [startRange, endRange]; + }; + this.$brackets = { + ")": "(", + "(": ")", + "]": "[", + "[": "]", + "{": "}", + "}": "{", + "<": ">", + ">": "<" + }; + this.$findOpeningBracket = function (bracket, position, typeRe) { + var openBracket = this.$brackets[bracket]; + var depth = 1; + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + if (!typeRe) { + typeRe = new RegExp("(\\.?" + + token.type.replace(".", "\\.").replace("rparen", ".paren") + .replace(/\b(?:end)\b/, "(?:start|begin|end)") + .replace(/-close\b/, "-(close|open)") + + ")+"); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; + var value = token.value; + while (true) { + while (valueIndex >= 0) { + var chr = value.charAt(valueIndex); + if (chr == openBracket) { + depth -= 1; + if (depth == 0) { + return { row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn() }; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex -= 1; + } + do { + token = iterator.stepBackward(); + } while (token && !typeRe.test(token.type)); + if (token == null) + break; + value = token.value; + valueIndex = value.length - 1; + } + return null; + }; + this.$findClosingBracket = function (bracket, position, typeRe) { + var closingBracket = this.$brackets[bracket]; + var depth = 1; + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + if (!typeRe) { + typeRe = new RegExp("(\\.?" + + token.type.replace(".", "\\.").replace("lparen", ".paren") + .replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") + .replace(/-open\b/, "-(close|open)") + + ")+"); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn(); + while (true) { + var value = token.value; + var valueLength = value.length; + while (valueIndex < valueLength) { + var chr = value.charAt(valueIndex); + if (chr == closingBracket) { + depth -= 1; + if (depth == 0) { + return { row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn() }; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex += 1; + } + do { + token = iterator.stepForward(); + } while (token && !typeRe.test(token.type)); + if (token == null) + break; + valueIndex = 0; + } + return null; + }; + this.getMatchingTags = function (pos) { + var iterator = new TokenIterator(this, pos.row, pos.column); + var token = this.$findTagName(iterator); + if (!token) + return; + var prevToken = iterator.stepBackward(); + if (prevToken.value === '<') { + return this.$findClosingTag(iterator, token); + } + else { + return this.$findOpeningTag(iterator, token); + } + }; + this.$findTagName = function (iterator) { + var token = iterator.getCurrentToken(); + var found = false; + var backward = false; + if (token && token.type.indexOf('tag-name') === -1) { + do { + if (backward) + token = iterator.stepBackward(); + else + token = iterator.stepForward(); + if (token) { + if (token.value === "/>") { + backward = true; + } + else if (token.type.indexOf('tag-name') !== -1) { + found = true; + } + } + } while (token && !found); + } + return token; + }; + this.$findClosingTag = function (iterator, token) { + var prevToken; + var currentTag = token.value; + var tag = token.value; + var depth = 0; + var openTagStart = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); + token = iterator.stepForward(); + var openTagName = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + token.value.length); + var foundOpenTagEnd = false; + do { + prevToken = token; + if (prevToken.type.indexOf('tag-close') !== -1 && !foundOpenTagEnd) { + var openTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for `>` + foundOpenTagEnd = true; + } + token = iterator.stepForward(); + if (token) { + if (token.value === '>' && !foundOpenTagEnd) { + var openTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for `>` + foundOpenTagEnd = true; + } + if (token.type.indexOf('tag-name') !== -1) { + currentTag = token.value; + if (tag === currentTag) { + if (prevToken.value === '<') { + depth++; + } + else if (prevToken.value === '') { + var closeTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for > + } + else { + return; + } + } + } + } + } + else if (tag === currentTag && token.value === '/>') { // self-closing tag + depth--; + if (depth < 0) { //found self-closing tag end + var closeTagStart = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 2); + var closeTagName = closeTagStart; + var closeTagEnd = closeTagName; + var openTagEnd = new Range(openTagName.end.row, openTagName.end.column, openTagName.end.row, openTagName.end.column + 1); + } + } + } + } while (token && depth >= 0); + if (openTagStart && openTagEnd && closeTagStart && closeTagEnd && openTagName && closeTagName) { + return { + openTag: new Range(openTagStart.start.row, openTagStart.start.column, openTagEnd.end.row, openTagEnd.end.column), + closeTag: new Range(closeTagStart.start.row, closeTagStart.start.column, closeTagEnd.end.row, closeTagEnd.end.column), + openTagName: openTagName, + closeTagName: closeTagName + }; + } + }; + this.$findOpeningTag = function (iterator, token) { + var prevToken = iterator.getCurrentToken(); + var tag = token.value; + var depth = 0; + var startRow = iterator.getCurrentTokenRow(); + var startColumn = iterator.getCurrentTokenColumn(); + var endColumn = startColumn + 2; + var closeTagStart = new Range(startRow, startColumn, startRow, endColumn); //Range for ") + return; + var closeTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for > + iterator.stepBackward(); + iterator.stepBackward(); + do { + token = prevToken; + startRow = iterator.getCurrentTokenRow(); + startColumn = iterator.getCurrentTokenColumn(); + endColumn = startColumn + token.value.length; + prevToken = iterator.stepBackward(); + if (token) { + if (token.type.indexOf('tag-name') !== -1) { + if (tag === token.value) { + if (prevToken.value === '<') { + depth++; + if (depth > 0) { //found opening tag + var openTagName = new Range(startRow, startColumn, startRow, endColumn); + var openTagStart = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for < + do { + token = iterator.stepForward(); + } while (token && token.value !== '>'); + var openTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for > + } + } + else if (prevToken.value === '') { // self-closing tag + var stepCount = 0; + var tmpToken = prevToken; + while (tmpToken) { + if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) { + depth--; + break; + } + else if (tmpToken.value === '<') { + break; + } + tmpToken = iterator.stepBackward(); + stepCount++; + } + for (var i = 0; i < stepCount; i++) { + iterator.stepForward(); + } + } + } + } while (prevToken && depth <= 0); + if (openTagStart && openTagEnd && closeTagStart && closeTagEnd && openTagName && closeTagName) { + return { + openTag: new Range(openTagStart.start.row, openTagStart.start.column, openTagEnd.end.row, openTagEnd.end.column), + closeTag: new Range(closeTagStart.start.row, closeTagStart.start.column, closeTagEnd.end.row, closeTagEnd.end.column), + openTagName: openTagName, + closeTagName: closeTagName + }; + } + }; +} +exports.BracketMatch = BracketMatch; + +}); + +ace.define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/bidihandler","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/undomanager","ace/edit_session/folding","ace/edit_session/bracket_match"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var BidiHandler = require("./bidihandler").BidiHandler; +var config = require("./config"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Selection = require("./selection").Selection; +var TextMode = require("./mode/text").Mode; +var Range = require("./range").Range; +var Document = require("./document").Document; +var BackgroundTokenizer = require("./background_tokenizer").BackgroundTokenizer; +var SearchHighlight = require("./search_highlight").SearchHighlight; +var UndoManager = require("./undomanager").UndoManager; +var EditSession = /** @class */ (function () { + function EditSession(text, mode) { this.doc; + this.$breakpoints = []; + this.$decorations = []; + this.$frontMarkers = {}; + this.$backMarkers = {}; + this.$markerId = 1; + this.$undoSelect = true; + this.$foldData = []; + this.id = "session" + (++EditSession.$uid); + this.$foldData.toString = function () { + return this.join("\n"); + }; + this.bgTokenizer = new BackgroundTokenizer((new TextMode()).getTokenizer(), this); + var _self = this; + this.bgTokenizer.on("update", function (e) { + _self._signal("tokenizerUpdate", e); + }); + this.on("changeFold", this.onChangeFold.bind(this)); + this.$onChange = this.onChange.bind(this); + if (typeof text != "object" || !text.getLine) + text = new Document(/**@type{string}*/ (text)); + this.setDocument(text); + this.selection = new Selection(this); + this.$bidiHandler = new BidiHandler(this); + config.resetOptions(this); + this.setMode(mode); + config._signal("session", this); + this.destroyed = false; + } + EditSession.prototype.setDocument = function (doc) { + if (this.doc) + this.doc.off("change", this.$onChange); + this.doc = doc; + doc.on("change", this.$onChange, true); + this.bgTokenizer.setDocument(this.getDocument()); + this.resetCaches(); + }; + EditSession.prototype.getDocument = function () { + return this.doc; + }; + EditSession.prototype.$resetRowCache = function (docRow) { + if (!docRow) { + this.$docRowCache = []; + this.$screenRowCache = []; + return; + } + var l = this.$docRowCache.length; + var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1; + if (l > i) { + this.$docRowCache.splice(i, l); + this.$screenRowCache.splice(i, l); + } + }; + EditSession.prototype.$getRowCacheIndex = function (cacheArray, val) { + var low = 0; + var hi = cacheArray.length - 1; + while (low <= hi) { + var mid = (low + hi) >> 1; + var c = cacheArray[mid]; + if (val > c) + low = mid + 1; + else if (val < c) + hi = mid - 1; + else + return mid; + } + return low - 1; + }; + EditSession.prototype.resetCaches = function () { + this.$modified = true; + this.$wrapData = []; + this.$rowLengthCache = []; + this.$resetRowCache(0); + if (!this.destroyed) + this.bgTokenizer.start(0); + }; + EditSession.prototype.onChangeFold = function (e) { + var fold = e.data; + this.$resetRowCache(fold.start.row); + }; + EditSession.prototype.onChange = function (delta) { + this.$modified = true; + this.$bidiHandler.onChange(delta); + this.$resetRowCache(delta.start.row); + var removedFolds = this.$updateInternalDataOnChange(delta); + if (!this.$fromUndo && this.$undoManager) { + if (removedFolds && removedFolds.length) { + this.$undoManager.add({ + action: "removeFolds", + folds: removedFolds + }, this.mergeUndoDeltas); + this.mergeUndoDeltas = true; + } + this.$undoManager.add(delta, this.mergeUndoDeltas); + this.mergeUndoDeltas = true; + this.$informUndoManager.schedule(); + } + this.bgTokenizer.$updateOnChange(delta); + this._signal("change", delta); + }; + EditSession.prototype.setValue = function (text) { + this.doc.setValue(text); + this.selection.moveTo(0, 0); + this.$resetRowCache(0); + this.setUndoManager(this.$undoManager); + this.getUndoManager().reset(); + }; + EditSession.fromJSON = function (session) { + if (typeof session == "string") + session = JSON.parse(session); + var undoManager = new UndoManager(); + undoManager.$undoStack = session.history.undo; + undoManager.$redoStack = session.history.redo; + undoManager.mark = session.history.mark; + undoManager.$rev = session.history.rev; + var editSession = new EditSession(session.value); + session.folds.forEach(function (fold) { + editSession.addFold("...", Range.fromPoints(fold.start, fold.end)); + }); + editSession.setAnnotations(session.annotations); + editSession.setBreakpoints(session.breakpoints); + editSession.setMode(session.mode); + editSession.setScrollLeft(session.scrollLeft); + editSession.setScrollTop(session.scrollTop); + editSession.setUndoManager(undoManager); + editSession.selection.fromJSON(session.selection); + return editSession; + }; + EditSession.prototype.toJSON = function () { + return { + annotations: this.$annotations, + breakpoints: this.$breakpoints, + folds: this.getAllFolds().map(function (fold) { + return fold.range; + }), + history: this.getUndoManager(), + mode: this.$mode.$id, + scrollLeft: this.$scrollLeft, + scrollTop: this.$scrollTop, + selection: this.selection.toJSON(), + value: this.doc.getValue() + }; + }; + EditSession.prototype.toString = function () { + return this.doc.getValue(); + }; + EditSession.prototype.getSelection = function () { + return this.selection; + }; + EditSession.prototype.getState = function (row) { + return this.bgTokenizer.getState(row); + }; + EditSession.prototype.getTokens = function (row) { + return this.bgTokenizer.getTokens(row); + }; + EditSession.prototype.getTokenAt = function (row, column) { + var tokens = this.bgTokenizer.getTokens(row); + var token, c = 0; + if (column == null) { + var i = tokens.length - 1; + c = this.getLine(row).length; + } + else { + for (var i = 0; i < tokens.length; i++) { + c += tokens[i].value.length; + if (c >= column) + break; + } + } + token = tokens[i]; + if (!token) + return null; + token.index = i; + token.start = c - token.value.length; + return token; + }; + EditSession.prototype.setUndoManager = function (undoManager) { + this.$undoManager = undoManager; + if (this.$informUndoManager) + this.$informUndoManager.cancel(); + if (undoManager) { + var self = this; + undoManager.addSession(this); + this.$syncInformUndoManager = function () { + self.$informUndoManager.cancel(); + self.mergeUndoDeltas = false; + }; + this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager); + } + else { + this.$syncInformUndoManager = function () { }; + } + }; + EditSession.prototype.markUndoGroup = function () { + if (this.$syncInformUndoManager) + this.$syncInformUndoManager(); + }; + EditSession.prototype.getUndoManager = function () { + return this.$undoManager || this.$defaultUndoManager; + }; + EditSession.prototype.getTabString = function () { + if (this.getUseSoftTabs()) { + return lang.stringRepeat(" ", this.getTabSize()); + } + else { + return "\t"; + } + }; + EditSession.prototype.setUseSoftTabs = function (val) { + this.setOption("useSoftTabs", val); + }; + EditSession.prototype.getUseSoftTabs = function () { + return this.$useSoftTabs && !this.$mode.$indentWithTabs; + }; + EditSession.prototype.setTabSize = function (tabSize) { + this.setOption("tabSize", tabSize); + }; + EditSession.prototype.getTabSize = function () { + return this.$tabSize; + }; + EditSession.prototype.isTabStop = function (position) { + return this.$useSoftTabs && (position.column % this.$tabSize === 0); + }; + EditSession.prototype.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) { + this.setOption("navigateWithinSoftTabs", navigateWithinSoftTabs); + }; + EditSession.prototype.getNavigateWithinSoftTabs = function () { + return this.$navigateWithinSoftTabs; + }; + EditSession.prototype.setOverwrite = function (overwrite) { + this.setOption("overwrite", overwrite); + }; + EditSession.prototype.getOverwrite = function () { + return this.$overwrite; + }; + EditSession.prototype.toggleOverwrite = function () { + this.setOverwrite(!this.$overwrite); + }; + EditSession.prototype.addGutterDecoration = function (row, className) { + if (!this.$decorations[row]) + this.$decorations[row] = ""; + this.$decorations[row] += " " + className; + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.removeGutterDecoration = function (row, className) { + this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, ""); + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.getBreakpoints = function () { + return this.$breakpoints; + }; + EditSession.prototype.setBreakpoints = function (rows) { + this.$breakpoints = []; + for (var i = 0; i < rows.length; i++) { + this.$breakpoints[rows[i]] = "ace_breakpoint"; + } + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.clearBreakpoints = function () { + this.$breakpoints = []; + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.setBreakpoint = function (row, className) { + if (className === undefined) + className = "ace_breakpoint"; + if (className) + this.$breakpoints[row] = className; + else + delete this.$breakpoints[row]; + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.clearBreakpoint = function (row) { + delete this.$breakpoints[row]; + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.addMarker = function (range, clazz, type, inFront) { + var id = this.$markerId++; + var marker = { + range: range, + type: type || "line", + renderer: typeof type == "function" ? type : null, + clazz: clazz, + inFront: !!inFront, + id: id + }; + if (inFront) { + this.$frontMarkers[id] = marker; + this._signal("changeFrontMarker"); + } + else { + this.$backMarkers[id] = marker; + this._signal("changeBackMarker"); + } + return id; + }; + EditSession.prototype.addDynamicMarker = function (marker, inFront) { + if (!marker.update) + return; + var id = this.$markerId++; + marker.id = id; + marker.inFront = !!inFront; + if (inFront) { + this.$frontMarkers[id] = marker; + this._signal("changeFrontMarker"); + } + else { + this.$backMarkers[id] = marker; + this._signal("changeBackMarker"); + } + return marker; + }; + EditSession.prototype.removeMarker = function (markerId) { + var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId]; + if (!marker) + return; + var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers; + delete (markers[markerId]); + this._signal(marker.inFront ? "changeFrontMarker" : "changeBackMarker"); + }; + EditSession.prototype.getMarkers = function (inFront) { + return inFront ? this.$frontMarkers : this.$backMarkers; + }; + EditSession.prototype.highlight = function (re) { + if (!this.$searchHighlight) { + var highlight = new SearchHighlight(null, "ace_selected-word", "text"); + this.$searchHighlight = this.addDynamicMarker(highlight); + } + this.$searchHighlight.setRegexp(re); + }; + EditSession.prototype.highlightLines = function (startRow, endRow, clazz, inFront) { + if (typeof endRow != "number") { + clazz = endRow; + endRow = startRow; + } + if (!clazz) + clazz = "ace_step"; + var range = new Range(startRow, 0, endRow, Infinity); + range.id = this.addMarker(range, clazz, "fullLine", inFront); + return range; + }; + EditSession.prototype.setAnnotations = function (annotations) { + this.$annotations = annotations; + this._signal("changeAnnotation", {}); + }; + EditSession.prototype.getAnnotations = function () { + return this.$annotations || []; + }; + EditSession.prototype.clearAnnotations = function () { + this.setAnnotations([]); + }; + EditSession.prototype.$detectNewLine = function (text) { + var match = text.match(/^.*?(\r?\n)/m); + if (match) { + this.$autoNewLine = match[1]; + } + else { + this.$autoNewLine = "\n"; + } + }; + EditSession.prototype.getWordRange = function (row, column) { + var line = this.getLine(row); + var inToken = false; + if (column > 0) + inToken = !!line.charAt(column - 1).match(this.tokenRe); + if (!inToken) + inToken = !!line.charAt(column).match(this.tokenRe); + if (inToken) + var re = this.tokenRe; + else if (/^\s+$/.test(line.slice(column - 1, column + 1))) + var re = /\s/; + else + var re = this.nonTokenRe; + var start = column; + if (start > 0) { + do { + start--; + } while (start >= 0 && line.charAt(start).match(re)); + start++; + } + var end = column; + while (end < line.length && line.charAt(end).match(re)) { + end++; + } + return new Range(row, start, row, end); + }; + EditSession.prototype.getAWordRange = function (row, column) { + var wordRange = this.getWordRange(row, column); + var line = this.getLine(wordRange.end.row); + while (line.charAt(wordRange.end.column).match(/[ \t]/)) { + wordRange.end.column += 1; + } + return wordRange; + }; + EditSession.prototype.setNewLineMode = function (newLineMode) { + this.doc.setNewLineMode(newLineMode); + }; + EditSession.prototype.getNewLineMode = function () { + return this.doc.getNewLineMode(); + }; + EditSession.prototype.setUseWorker = function (useWorker) { this.setOption("useWorker", useWorker); }; + EditSession.prototype.getUseWorker = function () { return this.$useWorker; }; + EditSession.prototype.onReloadTokenizer = function (e) { + var rows = e.data; + this.bgTokenizer.start(rows.first); + this._signal("tokenizerUpdate", e); + }; + EditSession.prototype.setMode = function (mode, cb) { + if (mode && typeof mode === "object") { + if (mode.getTokenizer) + return this.$onChangeMode(mode); + var options = mode; + var path = options.path; + } + else { + path = /**@type{string}*/ (mode) || "ace/mode/text"; + } + if (!this.$modes["ace/mode/text"]) + this.$modes["ace/mode/text"] = new TextMode(); + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + cb && cb(); + return; + } + this.$modeId = path; + config.loadModule(["mode", path], function (m) { + if (this.$modeId !== path) + return cb && cb(); + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + } + else if (m && m.Mode) { + m = new m.Mode(options); + if (!options) { + this.$modes[path] = m; + m.$id = path; + } + this.$onChangeMode(m); + } + cb && cb(); + }.bind(this)); + if (!this.$mode) + this.$onChangeMode(this.$modes["ace/mode/text"], true); + }; + EditSession.prototype.$onChangeMode = function (mode, $isPlaceholder) { + if (!$isPlaceholder) + this.$modeId = mode.$id; + if (this.$mode === mode) + return; + var oldMode = this.$mode; + this.$mode = mode; + this.$stopWorker(); + if (this.$useWorker) + this.$startWorker(); + var tokenizer = mode.getTokenizer(); + if (tokenizer.on !== undefined) { + var onReloadTokenizer = this.onReloadTokenizer.bind(this); + tokenizer.on("update", onReloadTokenizer); + } + this.bgTokenizer.setTokenizer(tokenizer); + this.bgTokenizer.setDocument(this.getDocument()); + this.tokenRe = mode.tokenRe; + this.nonTokenRe = mode.nonTokenRe; + if (!$isPlaceholder) { + if (mode.attachToSession) + mode.attachToSession(this); + this.$options.wrapMethod.set.call(this, this.$wrapMethod); + this.$setFolding(mode.foldingRules); + this.bgTokenizer.start(0); + this._emit("changeMode", { oldMode: oldMode, mode: mode }); + } + }; + EditSession.prototype.$stopWorker = function () { + if (this.$worker) { + this.$worker.terminate(); + this.$worker = null; + } + }; + EditSession.prototype.$startWorker = function () { + try { + this.$worker = this.$mode.createWorker(this); + } + catch (e) { + config.warn("Could not load worker", e); + this.$worker = null; + } + }; + EditSession.prototype.getMode = function () { + return this.$mode; + }; + EditSession.prototype.setScrollTop = function (scrollTop) { + if (this.$scrollTop === scrollTop || isNaN(scrollTop)) + return; + this.$scrollTop = scrollTop; + this._signal("changeScrollTop", scrollTop); + }; + EditSession.prototype.getScrollTop = function () { + return this.$scrollTop; + }; + EditSession.prototype.setScrollLeft = function (scrollLeft) { + if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) + return; + this.$scrollLeft = scrollLeft; + this._signal("changeScrollLeft", scrollLeft); + }; + EditSession.prototype.getScrollLeft = function () { + return this.$scrollLeft; + }; + EditSession.prototype.getScreenWidth = function () { + this.$computeWidth(); + if (this.lineWidgets) + return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth); + return this.screenWidth; + }; + EditSession.prototype.getLineWidgetMaxWidth = function () { + if (this.lineWidgetsWidth != null) + return this.lineWidgetsWidth; + var width = 0; + this.lineWidgets.forEach(function (w) { + if (w && w.screenWidth > width) + width = w.screenWidth; + }); + return this.lineWidgetWidth = width; + }; + EditSession.prototype.$computeWidth = function (force) { + if (this.$modified || force) { + this.$modified = false; + if (this.$useWrapMode) + return this.screenWidth = this.$wrapLimit; + var lines = this.doc.getAllLines(); + var cache = this.$rowLengthCache; + var longestScreenLine = 0; + var foldIndex = 0; + var foldLine = this.$foldData[foldIndex]; + var foldStart = foldLine ? foldLine.start.row : Infinity; + var len = lines.length; + for (var i = 0; i < len; i++) { + if (i > foldStart) { + i = foldLine.end.row + 1; + if (i >= len) + break; + foldLine = this.$foldData[foldIndex++]; + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (cache[i] == null) + cache[i] = this.$getStringScreenWidth(lines[i])[0]; + if (cache[i] > longestScreenLine) + longestScreenLine = cache[i]; + } + this.screenWidth = longestScreenLine; + } + }; + EditSession.prototype.getLine = function (row) { + return this.doc.getLine(row); + }; + EditSession.prototype.getLines = function (firstRow, lastRow) { + return this.doc.getLines(firstRow, lastRow); + }; + EditSession.prototype.getLength = function () { + return this.doc.getLength(); + }; + EditSession.prototype.getTextRange = function (range) { + return this.doc.getTextRange(range || this.selection.getRange()); + }; + EditSession.prototype.insert = function (position, text) { + return this.doc.insert(position, text); + }; + EditSession.prototype.remove = function (range) { + return this.doc.remove(range); + }; + EditSession.prototype.removeFullLines = function (firstRow, lastRow) { + return this.doc.removeFullLines(firstRow, lastRow); + }; + EditSession.prototype.undoChanges = function (deltas, dontSelect) { + if (!deltas.length) + return; + this.$fromUndo = true; + for (var i = deltas.length - 1; i != -1; i--) { + var delta = deltas[i]; + if (delta.action == "insert" || delta.action == "remove") { + this.doc.revertDelta(delta); + } + else if (delta.folds) { + this.addFolds(delta.folds); + } + } + if (!dontSelect && this.$undoSelect) { + if (deltas.selectionBefore) + this.selection.fromJSON(deltas.selectionBefore); + else + this.selection.setRange(this.$getUndoSelection(deltas, true)); + } + this.$fromUndo = false; + }; + EditSession.prototype.redoChanges = function (deltas, dontSelect) { + if (!deltas.length) + return; + this.$fromUndo = true; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (delta.action == "insert" || delta.action == "remove") { + this.doc.$safeApplyDelta(delta); + } + } + if (!dontSelect && this.$undoSelect) { + if (deltas.selectionAfter) + this.selection.fromJSON(deltas.selectionAfter); + else + this.selection.setRange(this.$getUndoSelection(deltas, false)); + } + this.$fromUndo = false; + }; + EditSession.prototype.setUndoSelect = function (enable) { + this.$undoSelect = enable; + }; + EditSession.prototype.$getUndoSelection = function (deltas, isUndo) { + function isInsert(delta) { + return isUndo ? delta.action !== "insert" : delta.action === "insert"; + } + var range, point; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (!delta.start) + continue; // skip folds + if (!range) { + if (isInsert(delta)) { + range = Range.fromPoints(delta.start, delta.end); + } + else { + range = Range.fromPoints(delta.start, delta.start); + } + continue; + } + if (isInsert(delta)) { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range.setStart(point); + } + point = delta.end; + if (range.compare(point.row, point.column) == 1) { + range.setEnd(point); + } + } + else { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range = Range.fromPoints(delta.start, delta.start); + } + } + } + return range; + }; + EditSession.prototype.replace = function (range, text) { + return this.doc.replace(range, text); + }; + EditSession.prototype.moveText = function (fromRange, toPosition, copy) { + var text = this.getTextRange(fromRange); + var folds = this.getFoldsInRange(fromRange); + var toRange = Range.fromPoints(toPosition, toPosition); + if (!copy) { + this.remove(fromRange); + var rowDiff = fromRange.start.row - fromRange.end.row; + var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column; + if (collDiff) { + if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column) + toRange.start.column += collDiff; + if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column) + toRange.end.column += collDiff; + } + if (rowDiff && toRange.start.row >= fromRange.end.row) { + toRange.start.row += rowDiff; + toRange.end.row += rowDiff; + } + } + toRange.end = this.insert(toRange.start, text); + if (folds.length) { + var oldStart = fromRange.start; + var newStart = toRange.start; + var rowDiff = newStart.row - oldStart.row; + var collDiff = newStart.column - oldStart.column; + this.addFolds(folds.map(function (x) { + x = x.clone(); + if (x.start.row == oldStart.row) + x.start.column += collDiff; + if (x.end.row == oldStart.row) + x.end.column += collDiff; + x.start.row += rowDiff; + x.end.row += rowDiff; + return x; + })); + } + return toRange; + }; + EditSession.prototype.indentRows = function (startRow, endRow, indentString) { + indentString = indentString.replace(/\t/g, this.getTabString()); + for (var row = startRow; row <= endRow; row++) + this.doc.insertInLine({ row: row, column: 0 }, indentString); + }; + EditSession.prototype.outdentRows = function (range) { + var rowRange = range.collapseRows(); + var deleteRange = new Range(0, 0, 0, 0); + var size = this.getTabSize(); + for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) { + var line = this.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + for (var j = 0; j < size; ++j) + if (line.charAt(j) != ' ') + break; + if (j < size && line.charAt(j) == '\t') { + deleteRange.start.column = j; + deleteRange.end.column = j + 1; + } + else { + deleteRange.start.column = 0; + deleteRange.end.column = j; + } + this.remove(deleteRange); + } + }; + EditSession.prototype.$moveLines = function (firstRow, lastRow, dir) { + firstRow = this.getRowFoldStart(firstRow); + lastRow = this.getRowFoldEnd(lastRow); + if (dir < 0) { + var row = this.getRowFoldStart(firstRow + dir); + if (row < 0) + return 0; + var diff = row - firstRow; + } + else if (dir > 0) { + var row = this.getRowFoldEnd(lastRow + dir); + if (row > this.doc.getLength() - 1) + return 0; + var diff = row - lastRow; + } + else { + firstRow = this.$clipRowToDocument(firstRow); + lastRow = this.$clipRowToDocument(lastRow); + var diff = lastRow - firstRow + 1; + } + var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE); + var folds = this.getFoldsInRange(range).map(function (x) { + x = x.clone(); + x.start.row += diff; + x.end.row += diff; + return x; + }); + var lines = dir == 0 + ? this.doc.getLines(firstRow, lastRow) + : this.doc.removeFullLines(firstRow, lastRow); + this.doc.insertFullLines(firstRow + diff, lines); + folds.length && this.addFolds(folds); + return diff; + }; + EditSession.prototype.moveLinesUp = function (firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, -1); + }; + EditSession.prototype.moveLinesDown = function (firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 1); + }; + EditSession.prototype.duplicateLines = function (firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 0); + }; + EditSession.prototype.$clipRowToDocument = function (row) { + return Math.max(0, Math.min(row, this.doc.getLength() - 1)); + }; + EditSession.prototype.$clipColumnToRow = function (row, column) { + if (column < 0) + return 0; + return Math.min(this.doc.getLine(row).length, column); + }; + EditSession.prototype.$clipPositionToDocument = function (row, column) { + column = Math.max(0, column); + if (row < 0) { + row = 0; + column = 0; + } + else { + var len = this.doc.getLength(); + if (row >= len) { + row = len - 1; + column = this.doc.getLine(len - 1).length; + } + else { + column = Math.min(this.doc.getLine(row).length, column); + } + } + return { + row: row, + column: column + }; + }; + EditSession.prototype.$clipRangeToDocument = function (range) { + if (range.start.row < 0) { + range.start.row = 0; + range.start.column = 0; + } + else { + range.start.column = this.$clipColumnToRow(range.start.row, range.start.column); + } + var len = this.doc.getLength() - 1; + if (range.end.row > len) { + range.end.row = len; + range.end.column = this.doc.getLine(len).length; + } + else { + range.end.column = this.$clipColumnToRow(range.end.row, range.end.column); + } + return range; + }; + EditSession.prototype.setUseWrapMode = function (useWrapMode) { + if (useWrapMode != this.$useWrapMode) { + this.$useWrapMode = useWrapMode; + this.$modified = true; + this.$resetRowCache(0); + if (useWrapMode) { + var len = this.getLength(); + this.$wrapData = Array(len); + this.$updateWrapData(0, len - 1); + } + this._signal("changeWrapMode"); + } + }; + EditSession.prototype.getUseWrapMode = function () { + return this.$useWrapMode; + }; + EditSession.prototype.setWrapLimitRange = function (min, max) { + if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { + this.$wrapLimitRange = { min: min, max: max }; + this.$modified = true; + this.$bidiHandler.markAsDirty(); + if (this.$useWrapMode) + this._signal("changeWrapMode"); + } + }; + EditSession.prototype.adjustWrapLimit = function (desiredLimit, $printMargin) { + var limits = this.$wrapLimitRange; + if (limits.max < 0) + limits = { min: $printMargin, max: $printMargin }; + var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); + if (wrapLimit != this.$wrapLimit && wrapLimit > 1) { + this.$wrapLimit = wrapLimit; + this.$modified = true; + if (this.$useWrapMode) { + this.$updateWrapData(0, this.getLength() - 1); + this.$resetRowCache(0); + this._signal("changeWrapLimit"); + } + return true; + } + return false; + }; + EditSession.prototype.$constrainWrapLimit = function (wrapLimit, min, max) { + if (min) + wrapLimit = Math.max(min, wrapLimit); + if (max) + wrapLimit = Math.min(max, wrapLimit); + return wrapLimit; + }; + EditSession.prototype.getWrapLimit = function () { + return this.$wrapLimit; + }; + EditSession.prototype.setWrapLimit = function (limit) { + this.setWrapLimitRange(limit, limit); + }; + EditSession.prototype.getWrapLimitRange = function () { + return { + min: this.$wrapLimitRange.min, + max: this.$wrapLimitRange.max + }; + }; + EditSession.prototype.$updateInternalDataOnChange = function (delta) { + var useWrapMode = this.$useWrapMode; + var action = delta.action; + var start = delta.start; + var end = delta.end; + var firstRow = start.row; + var lastRow = end.row; + var len = lastRow - firstRow; + var removedFolds = null; + this.$updating = true; + if (len != 0) { + if (action === "remove") { + this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); + var foldLines = this.$foldData; + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + var foldLine = this.getFoldLine(end.row); + var idx = 0; + if (foldLine) { + foldLine.addRemoveChars(end.row, end.column, start.column - end.column); + foldLine.shiftRow(-len); + var foldLineBefore = this.getFoldLine(firstRow); + if (foldLineBefore && foldLineBefore !== foldLine) { + foldLineBefore.merge(foldLine); + foldLine = foldLineBefore; + } + idx = foldLines.indexOf(foldLine) + 1; + } + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= end.row) { + foldLine.shiftRow(-len); + } + } + lastRow = firstRow; + } + else { + var args = Array(len); + args.unshift(firstRow, 0); + var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache; + arr.splice.apply(arr, args); + var foldLines = this.$foldData; + var foldLine = this.getFoldLine(firstRow); + var idx = 0; + if (foldLine) { + var cmp = foldLine.range.compareInside(start.row, start.column); + if (cmp == 0) { + foldLine = foldLine.split(start.row, start.column); + if (foldLine) { + foldLine.shiftRow(len); + foldLine.addRemoveChars(lastRow, 0, end.column - start.column); + } + } + else + if (cmp == -1) { + foldLine.addRemoveChars(firstRow, 0, end.column - start.column); + foldLine.shiftRow(len); + } + idx = foldLines.indexOf(foldLine) + 1; + } + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= firstRow) { + foldLine.shiftRow(len); + } + } + } + } + else { + len = Math.abs(delta.start.column - delta.end.column); + if (action === "remove") { + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + len = -len; + } + var foldLine = this.getFoldLine(firstRow); + if (foldLine) { + foldLine.addRemoveChars(firstRow, start.column, len); + } + } + if (useWrapMode && this.$wrapData.length != this.doc.getLength()) { + console.error("doc.getLength() and $wrapData.length have to be the same!"); + } + this.$updating = false; + if (useWrapMode) + this.$updateWrapData(firstRow, lastRow); + else + this.$updateRowLengthCache(firstRow, lastRow); + return removedFolds; + }; + EditSession.prototype.$updateRowLengthCache = function (firstRow, lastRow) { + this.$rowLengthCache[firstRow] = null; + this.$rowLengthCache[lastRow] = null; + }; + EditSession.prototype.$updateWrapData = function (firstRow, lastRow) { + var lines = this.doc.getAllLines(); + var tabSize = this.getTabSize(); + var wrapData = this.$wrapData; + var wrapLimit = this.$wrapLimit; + var tokens; + var foldLine; + var row = firstRow; + lastRow = Math.min(lastRow, lines.length - 1); + while (row <= lastRow) { + foldLine = this.getFoldLine(row, foldLine); + if (!foldLine) { + tokens = this.$getDisplayTokens(lines[row]); + wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row++; + } + else { + tokens = []; + foldLine.walk(function (placeholder, row, column, lastColumn) { + var walkTokens; + if (placeholder != null) { + walkTokens = this.$getDisplayTokens(placeholder, tokens.length); + walkTokens[0] = PLACEHOLDER_START; + for (var i = 1; i < walkTokens.length; i++) { + walkTokens[i] = PLACEHOLDER_BODY; + } + } + else { + walkTokens = this.$getDisplayTokens(lines[row].substring(lastColumn, column), tokens.length); + } + tokens = tokens.concat(walkTokens); + }.bind(this), foldLine.end.row, lines[foldLine.end.row].length + 1); + wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row = foldLine.end.row + 1; + } + } + }; + EditSession.prototype.$computeWrapSplits = function (tokens, wrapLimit, tabSize) { + if (tokens.length == 0) { + return []; + } + var splits = []; + var displayLength = tokens.length; + var lastSplit = 0, lastDocSplit = 0; + var isCode = this.$wrapAsCode; + var indentedSoftWrap = this.$indentedSoftWrap; + var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8) + || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2); + function getWrapIndent() { + var indentation = 0; + if (maxIndent === 0) + return indentation; + if (indentedSoftWrap) { + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token == SPACE) + indentation += 1; + else if (token == TAB) + indentation += tabSize; + else if (token == TAB_SPACE) + continue; + else + break; + } + } + if (isCode && indentedSoftWrap !== false) + indentation += tabSize; + return Math.min(indentation, maxIndent); + } + function addSplit(screenPos) { + var len = screenPos - lastSplit; + for (var i = lastSplit; i < screenPos; i++) { + var ch = tokens[i]; + if (ch === 12 || ch === 2) + len -= 1; + } + if (!splits.length) { + indent = getWrapIndent(); + splits.indent = indent; + } + lastDocSplit += len; + splits.push(lastDocSplit); + lastSplit = screenPos; + } + var indent = 0; + while (displayLength - lastSplit > wrapLimit - indent) { + var split = lastSplit + wrapLimit - indent; + if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) { + addSplit(split); + continue; + } + if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) { + for (split; split != lastSplit - 1; split--) { + if (tokens[split] == PLACEHOLDER_START) { + break; + } + } + if (split > lastSplit) { + addSplit(split); + continue; + } + split = lastSplit + wrapLimit; + for (split; split < tokens.length; split++) { + if (tokens[split] != PLACEHOLDER_BODY) { + break; + } + } + if (split == tokens.length) { + break; // Breaks the while-loop. + } + addSplit(split); + continue; + } + var minSplit = Math.max(split - (wrapLimit - (wrapLimit >> 2)), lastSplit - 1); + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split--; + } + if (isCode) { + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split--; + } + while (split > minSplit && tokens[split] == PUNCTUATION) { + split--; + } + } + else { + while (split > minSplit && tokens[split] < SPACE) { + split--; + } + } + if (split > minSplit) { + addSplit(++split); + continue; + } + split = lastSplit + wrapLimit; + if (tokens[split] == CHAR_EXT) + split--; + addSplit(split - indent); + } + return splits; + }; + EditSession.prototype.$getDisplayTokens = function (str, offset) { + var arr = []; + var tabSize; + offset = offset || 0; + for (var i = 0; i < str.length; i++) { + var c = str.charCodeAt(i); + if (c == 9) { + tabSize = this.getScreenTabSize(arr.length + offset); + arr.push(TAB); + for (var n = 1; n < tabSize; n++) { + arr.push(TAB_SPACE); + } + } + else if (c == 32) { + arr.push(SPACE); + } + else if ((c > 39 && c < 48) || (c > 57 && c < 64)) { + arr.push(PUNCTUATION); + } + else if (c >= 0x1100 && isFullWidth(c)) { + arr.push(CHAR, CHAR_EXT); + } + else { + arr.push(CHAR); + } + } + return arr; + }; + EditSession.prototype.$getStringScreenWidth = function (str, maxScreenColumn, screenColumn) { + if (maxScreenColumn == 0) + return [0, 0]; + if (maxScreenColumn == null) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charCodeAt(column); + if (c == 9) { + screenColumn += this.getScreenTabSize(screenColumn); + } + else if (c >= 0x1100 && isFullWidth(c)) { + screenColumn += 2; + } + else { + screenColumn += 1; + } + if (screenColumn > maxScreenColumn) { + break; + } + } + return [screenColumn, column]; + }; + EditSession.prototype.getRowLength = function (row) { + var h = 1; + if (this.lineWidgets) + h += this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + if (!this.$useWrapMode || !this.$wrapData[row]) + return h; + else + return this.$wrapData[row].length + h; + }; + EditSession.prototype.getRowLineCount = function (row) { + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1; + } + else { + return this.$wrapData[row].length + 1; + } + }; + EditSession.prototype.getRowWrapIndent = function (screenRow) { + if (this.$useWrapMode) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + var splits = this.$wrapData[pos.row]; + return splits.length && splits[0] < pos.column ? splits.indent : 0; + } + else { + return 0; + } + }; + EditSession.prototype.getScreenLastRowColumn = function (screenRow) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + return this.documentToScreenColumn(pos.row, pos.column); + }; + EditSession.prototype.getDocumentLastRowColumn = function (docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.getScreenLastRowColumn(screenRow); + }; + EditSession.prototype.getDocumentLastRowColumnPosition = function (docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10); + }; + EditSession.prototype.getRowSplitData = function (row) { + if (!this.$useWrapMode) { + return undefined; + } + else { + return this.$wrapData[row]; + } + }; + EditSession.prototype.getScreenTabSize = function (screenColumn) { + return this.$tabSize - (screenColumn % this.$tabSize | 0); + }; + EditSession.prototype.screenToDocumentRow = function (screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).row; + }; + EditSession.prototype.screenToDocumentColumn = function (screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).column; + }; + EditSession.prototype.screenToDocumentPosition = function (screenRow, screenColumn, offsetX) { + if (screenRow < 0) + return { row: 0, column: 0 }; + var line; + var docRow = 0; + var docColumn = 0; + var column; + var row = 0; + var rowLength = 0; + var rowCache = this.$screenRowCache; + var i = this.$getRowCacheIndex(rowCache, screenRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var docRow = this.$docRowCache[i]; + var doCache = screenRow > rowCache[l - 1]; + } + else { + var doCache = !l; + } + var maxRow = this.getLength() - 1; + var foldLine = this.getNextFoldLine(docRow); + var foldStart = foldLine ? foldLine.start.row : Infinity; + while (row <= screenRow) { + rowLength = this.getRowLength(docRow); + if (row + rowLength > screenRow || docRow >= maxRow) { + break; + } + else { + row += rowLength; + docRow++; + if (docRow > foldStart) { + docRow = foldLine.end.row + 1; + foldLine = this.getNextFoldLine(docRow, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + } + if (doCache) { + this.$docRowCache.push(docRow); + this.$screenRowCache.push(row); + } + } + if (foldLine && foldLine.start.row <= docRow) { + line = this.getFoldDisplayLine(foldLine); + docRow = foldLine.start.row; + } + else if (row + rowLength <= screenRow || docRow > maxRow) { + return { + row: maxRow, + column: this.getLine(maxRow).length + }; + } + else { + line = this.getLine(docRow); + foldLine = null; + } + var wrapIndent = 0, splitIndex = Math.floor(screenRow - row); + if (this.$useWrapMode) { + var splits = this.$wrapData[docRow]; + if (splits) { + column = splits[splitIndex]; + if (splitIndex > 0 && splits.length) { + wrapIndent = splits.indent; + docColumn = splits[splitIndex - 1] || splits[splits.length - 1]; + line = line.substring(docColumn); + } + } + } + if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex)) + screenColumn = this.$bidiHandler.offsetToCol(offsetX); + docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1]; + if (this.$useWrapMode && docColumn >= column) + docColumn = column - 1; + if (foldLine) + return foldLine.idxToPosition(docColumn); + return { row: docRow, column: docColumn }; + }; + EditSession.prototype.documentToScreenPosition = function (docRow, docColumn) { + if (typeof docColumn === "undefined") + var pos = this.$clipPositionToDocument(/**@type{Point}*/ (docRow).row, /**@type{Point}*/ (docRow).column); + else + pos = this.$clipPositionToDocument(/**@type{number}*/ (docRow), docColumn); + docRow = pos.row; + docColumn = pos.column; + var screenRow = 0; + var foldStartRow = null; + var fold = null; + fold = this.getFoldAt(docRow, docColumn, 1); + if (fold) { + docRow = fold.start.row; + docColumn = fold.start.column; + } + var rowEnd, row = 0; + var rowCache = this.$docRowCache; + var i = this.$getRowCacheIndex(rowCache, docRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var screenRow = this.$screenRowCache[i]; + var doCache = docRow > rowCache[l - 1]; + } + else { + var doCache = !l; + } + var foldLine = this.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + while (row < docRow) { + if (row >= foldStart) { + rowEnd = foldLine.end.row + 1; + if (rowEnd > docRow) + break; + foldLine = this.getNextFoldLine(rowEnd, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + else { + rowEnd = row + 1; + } + screenRow += this.getRowLength(row); + row = rowEnd; + if (doCache) { + this.$docRowCache.push(row); + this.$screenRowCache.push(screenRow); + } + } + var textLine = ""; + if (foldLine && row >= foldStart) { + textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn); + foldStartRow = foldLine.start.row; + } + else { + textLine = this.getLine(docRow).substring(0, docColumn); + foldStartRow = docRow; + } + var wrapIndent = 0; + if (this.$useWrapMode) { + var wrapRow = this.$wrapData[foldStartRow]; + if (wrapRow) { + var screenRowOffset = 0; + while (textLine.length >= wrapRow[screenRowOffset]) { + screenRow++; + screenRowOffset++; + } + textLine = textLine.substring(wrapRow[screenRowOffset - 1] || 0, textLine.length); + wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0; + } + } + if (this.lineWidgets && this.lineWidgets[row] && this.lineWidgets[row].rowsAbove) + screenRow += this.lineWidgets[row].rowsAbove; + return { + row: screenRow, + column: wrapIndent + this.$getStringScreenWidth(textLine)[0] + }; + }; + EditSession.prototype.documentToScreenColumn = function (row, docColumn) { + return this.documentToScreenPosition(row, docColumn).column; + }; + EditSession.prototype.documentToScreenRow = function (docRow, docColumn) { + return this.documentToScreenPosition(docRow, docColumn).row; + }; + EditSession.prototype.getScreenLength = function () { + var screenRows = 0; + var fold = null; + if (!this.$useWrapMode) { + screenRows = this.getLength(); + var foldData = this.$foldData; + for (var i = 0; i < foldData.length; i++) { + fold = foldData[i]; + screenRows -= fold.end.row - fold.start.row; + } + } + else { + var lastRow = this.$wrapData.length; + var row = 0, i = 0; + var fold = this.$foldData[i++]; + var foldStart = fold ? fold.start.row : Infinity; + while (row < lastRow) { + var splits = this.$wrapData[row]; + screenRows += splits ? splits.length + 1 : 1; + row++; + if (row > foldStart) { + row = fold.end.row + 1; + fold = this.$foldData[i++]; + foldStart = fold ? fold.start.row : Infinity; + } + } + } + if (this.lineWidgets) + screenRows += this.$getWidgetScreenLength(); + return screenRows; + }; + EditSession.prototype.$setFontMetrics = function (fm) { + if (!this.$enableVarChar) + return; + this.$getStringScreenWidth = function (str, maxScreenColumn, screenColumn) { + if (maxScreenColumn === 0) + return [0, 0]; + if (!maxScreenColumn) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charAt(column); + if (c === "\t") { + screenColumn += this.getScreenTabSize(screenColumn); + } + else { + screenColumn += fm.getCharacterWidth(c); + } + if (screenColumn > maxScreenColumn) { + break; + } + } + return [screenColumn, column]; + }; + }; + EditSession.prototype.getPrecedingCharacter = function () { + var pos = this.selection.getCursor(); + if (pos.column === 0) { + return pos.row === 0 ? "" : this.doc.getNewLineCharacter(); + } + var currentLine = this.getLine(pos.row); + return currentLine[pos.column - 1]; + }; + EditSession.prototype.destroy = function () { + if (!this.destroyed) { + this.bgTokenizer.setDocument(null); + this.bgTokenizer.cleanup(); + this.destroyed = true; + } + this.$stopWorker(); + this.removeAllListeners(); + if (this.doc) { + this.doc.off("change", this.$onChange); + } + this.selection.detach(); + }; + return EditSession; +}()); +EditSession.$uid = 0; +EditSession.prototype.$modes = config.$modes; +EditSession.prototype.getValue = EditSession.prototype.toString; +EditSession.prototype.$defaultUndoManager = { + undo: function () { }, + redo: function () { }, + hasUndo: function () { }, + hasRedo: function () { }, + reset: function () { }, + add: function () { }, + addSelection: function () { }, + startNewGroup: function () { }, + addSession: function () { } +}; +EditSession.prototype.$overwrite = false; +EditSession.prototype.$mode = null; +EditSession.prototype.$modeId = null; +EditSession.prototype.$scrollTop = 0; +EditSession.prototype.$scrollLeft = 0; +EditSession.prototype.$wrapLimit = 80; +EditSession.prototype.$useWrapMode = false; +EditSession.prototype.$wrapLimitRange = { + min: null, + max: null +}; +EditSession.prototype.lineWidgets = null; +EditSession.prototype.isFullWidth = isFullWidth; +oop.implement(EditSession.prototype, EventEmitter); +var CHAR = 1, CHAR_EXT = 2, PLACEHOLDER_START = 3, PLACEHOLDER_BODY = 4, PUNCTUATION = 9, SPACE = 10, TAB = 11, TAB_SPACE = 12; +function isFullWidth(c) { + if (c < 0x1100) + return false; + return c >= 0x1100 && c <= 0x115F || + c >= 0x11A3 && c <= 0x11A7 || + c >= 0x11FA && c <= 0x11FF || + c >= 0x2329 && c <= 0x232A || + c >= 0x2E80 && c <= 0x2E99 || + c >= 0x2E9B && c <= 0x2EF3 || + c >= 0x2F00 && c <= 0x2FD5 || + c >= 0x2FF0 && c <= 0x2FFB || + c >= 0x3000 && c <= 0x303E || + c >= 0x3041 && c <= 0x3096 || + c >= 0x3099 && c <= 0x30FF || + c >= 0x3105 && c <= 0x312D || + c >= 0x3131 && c <= 0x318E || + c >= 0x3190 && c <= 0x31BA || + c >= 0x31C0 && c <= 0x31E3 || + c >= 0x31F0 && c <= 0x321E || + c >= 0x3220 && c <= 0x3247 || + c >= 0x3250 && c <= 0x32FE || + c >= 0x3300 && c <= 0x4DBF || + c >= 0x4E00 && c <= 0xA48C || + c >= 0xA490 && c <= 0xA4C6 || + c >= 0xA960 && c <= 0xA97C || + c >= 0xAC00 && c <= 0xD7A3 || + c >= 0xD7B0 && c <= 0xD7C6 || + c >= 0xD7CB && c <= 0xD7FB || + c >= 0xF900 && c <= 0xFAFF || + c >= 0xFE10 && c <= 0xFE19 || + c >= 0xFE30 && c <= 0xFE52 || + c >= 0xFE54 && c <= 0xFE66 || + c >= 0xFE68 && c <= 0xFE6B || + c >= 0xFF01 && c <= 0xFF60 || + c >= 0xFFE0 && c <= 0xFFE6; +} +require("./edit_session/folding").Folding.call(EditSession.prototype); +require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype); +config.defineOptions(EditSession.prototype, "session", { + wrap: { + set: function (value) { + if (!value || value == "off") + value = false; + else if (value == "free") + value = true; + else if (value == "printMargin") + value = -1; + else if (typeof value == "string") + value = parseInt(value, 10) || false; + if (this.$wrap == value) + return; + this.$wrap = value; + if (!value) { + this.setUseWrapMode(false); + } + else { + var col = typeof value == "number" ? value : null; + this.setWrapLimitRange(col, col); + this.setUseWrapMode(true); + } + }, + get: function () { + if (this.getUseWrapMode()) { + if (this.$wrap == -1) + return "printMargin"; + if (!this.getWrapLimitRange().min) + return "free"; + return this.$wrap; + } + return "off"; + }, + handlesSet: true + }, + wrapMethod: { + set: function (val) { + val = val == "auto" + ? this.$mode.type != "text" + : val != "text"; + if (val != this.$wrapAsCode) { + this.$wrapAsCode = val; + if (this.$useWrapMode) { + this.$useWrapMode = false; + this.setUseWrapMode(true); + } + } + }, + initialValue: "auto" + }, + indentedSoftWrap: { + set: function () { + if (this.$useWrapMode) { + this.$useWrapMode = false; + this.setUseWrapMode(true); + } + }, + initialValue: true + }, + firstLineNumber: { + set: function () { this._signal("changeBreakpoint"); }, + initialValue: 1 + }, + useWorker: { + set: function (useWorker) { + this.$useWorker = useWorker; + this.$stopWorker(); + if (useWorker) + this.$startWorker(); + }, + initialValue: true + }, + useSoftTabs: { initialValue: true }, + tabSize: { + set: function (tabSize) { + tabSize = parseInt(tabSize); + if (tabSize > 0 && this.$tabSize !== tabSize) { + this.$modified = true; + this.$rowLengthCache = []; + this.$tabSize = tabSize; + this._signal("changeTabSize"); + } + }, + initialValue: 4, + handlesSet: true + }, + navigateWithinSoftTabs: { initialValue: false }, + foldStyle: { + set: function (val) { this.setFoldStyle(val); }, + handlesSet: true + }, + overwrite: { + set: function (val) { this._signal("changeOverwrite"); }, + initialValue: false + }, + newLineMode: { + set: function (val) { this.doc.setNewLineMode(val); }, + get: function () { return this.doc.getNewLineMode(); }, + handlesSet: true + }, + mode: { + set: function (val) { this.setMode(val); }, + get: function () { return this.$modeId; }, + handlesSet: true + } +}); +exports.EditSession = EditSession; + +}); + +ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module){"use strict"; +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; +var Search = /** @class */ (function () { + function Search() { + this.$options = {}; + } + Search.prototype.set = function (options) { + oop.mixin(this.$options, options); + return this; + }; + Search.prototype.getOptions = function () { + return lang.copyObject(this.$options); + }; + Search.prototype.setOptions = function (options) { + this.$options = options; + }; + Search.prototype.find = function (session) { + var options = this.$options; + var iterator = this.$matchIterator(session, options); + if (!iterator) + return false; + var firstRange = null; + iterator.forEach(function (sr, sc, er, ec) { + firstRange = new Range(sr, sc, er, ec); + if (sc == ec && options.start && /**@type{Range}*/ (options.start).start + && options.skipCurrent != false && firstRange.isEqual(/**@type{Range}*/ (options.start))) { + firstRange = null; + return false; + } + return true; + }); + return firstRange; + }; + Search.prototype.findAll = function (session) { + var options = this.$options; + if (!options.needle) + return []; + this.$assembleRegExp(options); + var range = options.range; + var lines = range + ? session.getLines(range.start.row, range.end.row) + : session.doc.getAllLines(); + var ranges = []; + var re = options.re; + if (options.$isMultiLine) { + var len = re.length; + var maxRow = lines.length - len; + var prevRange; + outer: for (var row = re.offset || 0; row <= maxRow; row++) { + for (var j = 0; j < len; j++) + if (lines[row + j].search(re[j]) == -1) + continue outer; + var startLine = lines[row]; + var line = lines[row + len - 1]; + var startIndex = startLine.length - startLine.match(re[0])[0].length; + var endIndex = line.match(re[len - 1])[0].length; + if (prevRange && prevRange.end.row === row && + prevRange.end.column > startIndex) { + continue; + } + ranges.push(prevRange = new Range(row, startIndex, row + len - 1, endIndex)); + if (len > 2) + row = row + len - 2; + } + } + else { + for (var i = 0; i < lines.length; i++) { + var matches = lang.getMatchOffsets(lines[i], re); + for (var j = 0; j < matches.length; j++) { + var match = matches[j]; + ranges.push(new Range(i, match.offset, i, match.offset + match.length)); + } + } + } + if (range) { + var startColumn = range.start.column; + var endColumn = range.end.column; + var i = 0, j = ranges.length - 1; + while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == 0) + i++; + var endRow = range.end.row - range.start.row; + while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == endRow) + j--; + ranges = ranges.slice(i, j + 1); + for (i = 0, j = ranges.length; i < j; i++) { + ranges[i].start.row += range.start.row; + ranges[i].end.row += range.start.row; + } + } + return ranges; + }; + Search.prototype.replace = function (input, replacement) { + var options = this.$options; + var re = this.$assembleRegExp(options); + if (options.$isMultiLine) + return replacement; + if (!re) + return; + var match = re.exec(input); + if (!match || match[0].length != input.length) + return null; + if (!options.regExp) { + replacement = replacement.replace(/\$/g, "$$$$"); + } + replacement = input.replace(re, replacement); + if (options.preserveCase) { + replacement = replacement.split(""); + for (var i = Math.min(input.length, input.length); i--;) { + var ch = input[i]; + if (ch && ch.toLowerCase() != ch) + replacement[i] = replacement[i].toUpperCase(); + else + replacement[i] = replacement[i].toLowerCase(); + } + replacement = replacement.join(""); + } + return replacement; + }; + Search.prototype.$assembleRegExp = function (options, $disableFakeMultiline) { + if (options.needle instanceof RegExp) + return options.re = options.needle; + var needle = options.needle; + if (!options.needle) + return options.re = false; + if (!options.regExp) + needle = lang.escapeRegExp(needle); + var modifier = options.caseSensitive ? "gm" : "gmi"; + try { + new RegExp(needle, "u"); + options.$supportsUnicodeFlag = true; + modifier += "u"; + } + catch (e) { + options.$supportsUnicodeFlag = false; //left for backward compatibility with previous versions for cases like /ab\{2}/gu + } + if (options.wholeWord) + needle = addWordBoundary(needle, options); + options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); + if (options.$isMultiLine) + return options.re = this.$assembleMultilineRegExp(needle, modifier); + try { + var re = new RegExp(needle, modifier); + } + catch (e) { + re = false; + } + return options.re = re; + }; + Search.prototype.$assembleMultilineRegExp = function (needle, modifier) { + var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n"); + var re = []; + for (var i = 0; i < parts.length; i++) + try { + re.push(new RegExp(parts[i], modifier)); + } + catch (e) { + return false; + } + return re; + }; + Search.prototype.$matchIterator = function (session, options) { + var re = this.$assembleRegExp(options); + if (!re) + return false; + var backwards = options.backwards == true; + var skipCurrent = options.skipCurrent != false; + var supportsUnicodeFlag = re.unicode; + var range = options.range; + var start = options.start; + if (!start) + start = range ? range[backwards ? "end" : "start"] : session.selection.getRange(); + if (start.start) + start = start[skipCurrent != backwards ? "end" : "start"]; + var firstRow = range ? range.start.row : 0; + var lastRow = range ? range.end.row : session.getLength() - 1; + if (backwards) { + var forEach = function (callback) { + var row = start.row; + if (forEachInLine(row, start.column, callback)) + return; + for (row--; row >= firstRow; row--) + if (forEachInLine(row, Number.MAX_VALUE, callback)) + return; + if (options.wrap == false) + return; + for (row = lastRow, firstRow = start.row; row >= firstRow; row--) + if (forEachInLine(row, Number.MAX_VALUE, callback)) + return; + }; + } + else { + var forEach = function (callback) { + var row = start.row; + if (forEachInLine(row, start.column, callback)) + return; + for (row = row + 1; row <= lastRow; row++) + if (forEachInLine(row, 0, callback)) + return; + if (options.wrap == false) + return; + for (row = firstRow, lastRow = start.row; row <= lastRow; row++) + if (forEachInLine(row, 0, callback)) + return; + }; + } + if (options.$isMultiLine) { + var len = re.length; + var forEachInLine = function (row, offset, callback) { + var startRow = backwards ? row - len + 1 : row; + if (startRow < 0 || startRow + len > session.getLength()) + return; + var line = session.getLine(startRow); + var startIndex = line.search(re[0]); + if (!backwards && startIndex < offset || startIndex === -1) + return; + for (var i = 1; i < len; i++) { + line = session.getLine(startRow + i); + if (line.search(re[i]) == -1) + return; + } + var endIndex = line.match(re[len - 1])[0].length; + if (backwards && endIndex > offset) + return; + if (callback(startRow, startIndex, startRow + len - 1, endIndex)) + return true; + }; + } + else if (backwards) { + var forEachInLine = function (row, endIndex, callback) { + var line = session.getLine(row); + var matches = []; + var m, last = 0; + re.lastIndex = 0; + while ((m = re.exec(line))) { + var length = m[0].length; + last = m.index; + if (!length) { + if (last >= line.length) + break; + re.lastIndex = last += lang.skipEmptyMatch(line, last, supportsUnicodeFlag); + } + if (m.index + length > endIndex) + break; + matches.push(m.index, length); + } + for (var i = matches.length - 1; i >= 0; i -= 2) { + var column = matches[i - 1]; + var length = matches[i]; + if (callback(row, column, row, column + length)) + return true; + } + }; + } + else { + var forEachInLine = function (row, startIndex, callback) { + var line = session.getLine(row); + var last; + var m; + re.lastIndex = startIndex; + while ((m = re.exec(line))) { + var length = m[0].length; + last = m.index; + if (callback(row, last, row, last + length)) + return true; + if (!length) { + re.lastIndex = last += lang.skipEmptyMatch(line, last, supportsUnicodeFlag); + if (last >= line.length) + return false; + } + } + }; + } + return { forEach: forEach }; + }; + return Search; +}()); +function addWordBoundary(needle, options) { + var supportsLookbehind = lang.supportsLookbehind(); + function wordBoundary(c, firstChar) { + if (firstChar === void 0) { firstChar = true; } + var wordRegExp = supportsLookbehind && options.$supportsUnicodeFlag ? new RegExp("[\\p{L}\\p{N}_]", "u") : new RegExp("\\w"); + if (wordRegExp.test(c) || options.regExp) { + if (supportsLookbehind && options.$supportsUnicodeFlag) { + if (firstChar) + return "(?<=^|[^\\p{L}\\p{N}_])"; + return "(?=[^\\p{L}\\p{N}_]|$)"; + } + return "\\b"; + } + return ""; + } + var needleArray = Array.from(needle); + var firstChar = needleArray[0]; + var lastChar = needleArray[needleArray.length - 1]; + return wordBoundary(firstChar) + needle + wordBoundary(lastChar, false); +} +exports.Search = Search; + +}); + +ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); var keyUtil = require("../lib/keys"); +var useragent = require("../lib/useragent"); +var KEY_MODS = keyUtil.KEY_MODS; +var MultiHashHandler = /** @class */ (function () { + function MultiHashHandler(config, platform) { + this.$init(config, platform, false); + } + MultiHashHandler.prototype.$init = function (config, platform, $singleCommand) { + this.platform = platform || (useragent.isMac ? "mac" : "win"); + this.commands = {}; + this.commandKeyBinding = {}; + this.addCommands(config); + this.$singleCommand = $singleCommand; + }; + MultiHashHandler.prototype.addCommand = function (command) { + if (this.commands[command.name]) + this.removeCommand(command); + this.commands[command.name] = command; + if (command.bindKey) + this._buildKeyHash(command); + }; + MultiHashHandler.prototype.removeCommand = function (command, keepCommand) { + var name = command && (typeof command === 'string' ? command : command.name); + command = this.commands[name]; + if (!keepCommand) + delete this.commands[name]; + var ckb = this.commandKeyBinding; + for (var keyId in ckb) { + var cmdGroup = ckb[keyId]; + if (cmdGroup == command) { + delete ckb[keyId]; + } + else if (Array.isArray(cmdGroup)) { + var i = cmdGroup.indexOf(command); + if (i != -1) { + cmdGroup.splice(i, 1); + if (cmdGroup.length == 1) + ckb[keyId] = cmdGroup[0]; + } + } + } + }; + MultiHashHandler.prototype.bindKey = function (key, command, position) { + if (typeof key == "object" && key) { + if (position == undefined) + position = key.position; + key = key[this.platform]; + } + if (!key) + return; + if (typeof command == "function") + return this.addCommand({ exec: command, bindKey: key, name: command.name || /**@type{string}*/ (key) }); (key).split("|").forEach(function (keyPart) { + var chain = ""; + if (keyPart.indexOf(" ") != -1) { + var parts = keyPart.split(/\s+/); + keyPart = parts.pop(); + parts.forEach(function (keyPart) { + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + chain += (chain ? " " : "") + id; + this._addCommandToBinding(chain, "chainKeys"); + }, this); + chain += " "; + } + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + this._addCommandToBinding(chain + id, command, position); + }, this); + }; + MultiHashHandler.prototype._addCommandToBinding = function (keyId, command, position) { + var ckb = this.commandKeyBinding, i; + if (!command) { + delete ckb[keyId]; + } + else if (!ckb[keyId] || this.$singleCommand) { + ckb[keyId] = command; + } + else { + if (!Array.isArray(ckb[keyId])) { + ckb[keyId] = [ckb[keyId]]; + } + else if ((i = ckb[keyId].indexOf(command)) != -1) { + ckb[keyId].splice(i, 1); + } + if (typeof position != "number") { + position = getPosition(command); + } + var commands = ckb[keyId]; + for (i = 0; i < commands.length; i++) { + var other = commands[i]; + var otherPos = getPosition(other); + if (otherPos > position) + break; + } + commands.splice(i, 0, command); + } + }; + MultiHashHandler.prototype.addCommands = function (commands) { + commands && Object.keys(commands).forEach(function (name) { + var command = commands[name]; + if (!command) + return; + if (typeof command === "string") + return this.bindKey(command, name); + if (typeof command === "function") + command = { exec: command }; + if (typeof command !== "object") + return; + if (!command.name) + command.name = name; + this.addCommand(command); + }, this); + }; + MultiHashHandler.prototype.removeCommands = function (commands) { + Object.keys(commands).forEach(function (name) { + this.removeCommand(commands[name]); + }, this); + }; + MultiHashHandler.prototype.bindKeys = function (keyList) { + Object.keys(keyList).forEach(function (key) { + this.bindKey(key, keyList[key]); + }, this); + }; + MultiHashHandler.prototype._buildKeyHash = function (command) { + this.bindKey(command.bindKey, command); + }; + MultiHashHandler.prototype.parseKeys = function (keys) { + var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function (x) { return x; }); + var key = parts.pop(); + var keyCode = keyUtil[key]; + if (keyUtil.FUNCTION_KEYS[keyCode]) + key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); + else if (!parts.length) + return { key: key, hashId: -1 }; + else if (parts.length == 1 && parts[0] == "shift") + return { key: key.toUpperCase(), hashId: -1 }; + var hashId = 0; + for (var i = parts.length; i--;) { + var modifier = keyUtil.KEY_MODS[parts[i]]; + if (modifier == null) { + if (typeof console != "undefined") + console.error("invalid modifier " + parts[i] + " in " + keys); + return false; + } + hashId |= modifier; + } + return { key: key, hashId: hashId }; + }; + MultiHashHandler.prototype.findKeyCommand = function (hashId, keyString) { + var key = KEY_MODS[hashId] + keyString; + return this.commandKeyBinding[key]; + }; + MultiHashHandler.prototype.handleKeyboard = function (data, hashId, keyString, keyCode) { + if (keyCode < 0) + return; + var key = KEY_MODS[hashId] + keyString; + var command = this.commandKeyBinding[key]; + if (data.$keyChain) { + data.$keyChain += " " + key; + command = this.commandKeyBinding[data.$keyChain] || command; + } + if (command) { + if (command == "chainKeys" || command[command.length - 1] == "chainKeys") { + data.$keyChain = data.$keyChain || key; + return { command: "null" }; + } + } + if (data.$keyChain) { + if ((!hashId || hashId == 4) && keyString.length == 1) + data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input + else if (hashId == -1 || keyCode > 0) + data.$keyChain = ""; // reset keyChain + } + return { command: command }; + }; + MultiHashHandler.prototype.getStatusText = function (editor, data) { + return data.$keyChain || ""; + }; + return MultiHashHandler; +}()); +function getPosition(command) { + return typeof command == "object" && command.bindKey + && command.bindKey.position + || (command.isDefault ? -100 : 0); +} +var HashHandler = /** @class */ (function (_super) { + __extends(HashHandler, _super); + function HashHandler(config, platform) { + var _this = _super.call(this, config, platform) || this; + _this.$singleCommand = true; + return _this; + } + return HashHandler; +}(MultiHashHandler)); +HashHandler.call = function (thisArg, config, platform) { + MultiHashHandler.prototype.$init.call(thisArg, config, platform, true); +}; +MultiHashHandler.call = function (thisArg, config, platform) { + MultiHashHandler.prototype.$init.call(thisArg, config, platform, false); +}; +exports.HashHandler = HashHandler; +exports.MultiHashHandler = MultiHashHandler; + +}); + +ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var oop = require("../lib/oop"); +var MultiHashHandler = require("../keyboard/hash_handler").MultiHashHandler; +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var CommandManager = /** @class */ (function (_super) { + __extends(CommandManager, _super); + function CommandManager(platform, commands) { + var _this = _super.call(this, commands, platform) || this; + _this.byName = _this.commands; + _this.setDefaultHandler("exec", function (e) { + if (!e.args) { + return e.command.exec(e.editor, {}, e.event, true); + } + return e.command.exec(e.editor, e.args, e.event, false); + }); + return _this; + } + CommandManager.prototype.exec = function (command, editor, args) { + if (Array.isArray(command)) { + for (var i = command.length; i--;) { + if (this.exec(command[i], editor, args)) + return true; + } + return false; + } + if (typeof command === "string") + command = this.commands[command]; + if (!this.canExecute(command, editor)) { + return false; + } + var e = { editor: editor, command: command, args: args }; + e.returnValue = this._emit("exec", e); + this._signal("afterExec", e); + return e.returnValue === false ? false : true; + }; + CommandManager.prototype.canExecute = function (command, editor) { + if (typeof command === "string") + command = this.commands[command]; + if (!command) + return false; + if (editor && editor.$readOnly && !command.readOnly) + return false; + if (this.$checkCommandState != false && command.isAvailable && !command.isAvailable(editor)) + return false; + return true; + }; + CommandManager.prototype.toggleRecording = function (editor) { + if (this.$inReplay) + return; + editor && editor._emit("changeStatus"); + if (this.recording) { + this.macro.pop(); + this.off("exec", this.$addCommandToMacro); + if (!this.macro.length) + this.macro = this.oldMacro; + return this.recording = false; + } + if (!this.$addCommandToMacro) { + this.$addCommandToMacro = function (e) { + this.macro.push([e.command, e.args]); + }.bind(this); + } + this.oldMacro = this.macro; + this.macro = []; + this.on("exec", this.$addCommandToMacro); + return this.recording = true; + }; + CommandManager.prototype.replay = function (editor) { + if (this.$inReplay || !this.macro) + return; + if (this.recording) + return this.toggleRecording(editor); + try { + this.$inReplay = true; + this.macro.forEach(function (x) { + if (typeof x == "string") + this.exec(x, editor); + else + this.exec(x[0], editor, x[1]); + }, this); + } + finally { + this.$inReplay = false; + } + }; + CommandManager.prototype.trimMacro = function (m) { + return m.map(function (x) { + if (typeof x[0] != "string") + x[0] = x[0].name; + if (!x[1]) + x = x[0]; + return x; + }); + }; + return CommandManager; +}(MultiHashHandler)); +oop.implement(CommandManager.prototype, EventEmitter); +exports.CommandManager = CommandManager; + +}); + +ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(require, exports, module){"use strict"; +var lang = require("../lib/lang"); +var config = require("../config"); +var Range = require("../range").Range; +function bindKey(win, mac) { + return { win: win, mac: mac }; +} +exports.commands = [{ + name: "showSettingsMenu", + description: "Show settings menu", + bindKey: bindKey("Ctrl-,", "Command-,"), + exec: function (editor) { + config.loadModule("ace/ext/settings_menu", function (module) { + module.init(editor); + editor.showSettingsMenu(); + }); + }, + readOnly: true + }, { + name: "goToNextError", + description: "Go to next error", + bindKey: bindKey("Alt-E", "F4"), + exec: function (editor) { + config.loadModule("ace/ext/error_marker", function (module) { + module.showErrorMarker(editor, 1); + }); + }, + scrollIntoView: "animate", + readOnly: true + }, { + name: "goToPreviousError", + description: "Go to previous error", + bindKey: bindKey("Alt-Shift-E", "Shift-F4"), + exec: function (editor) { + config.loadModule("ace/ext/error_marker", function (module) { + module.showErrorMarker(editor, -1); + }); + }, + scrollIntoView: "animate", + readOnly: true + }, { + name: "selectall", + description: "Select all", + bindKey: bindKey("Ctrl-A", "Command-A"), + exec: function (editor) { editor.selectAll(); }, + readOnly: true + }, { + name: "centerselection", + description: "Center selection", + bindKey: bindKey(null, "Ctrl-L"), + exec: function (editor) { editor.centerSelection(); }, + readOnly: true + }, { + name: "gotoline", + description: "Go to line...", + bindKey: bindKey("Ctrl-L", "Command-L"), + exec: function (editor, line) { + if (typeof line === "number" && !isNaN(line)) + editor.gotoLine(line); + editor.prompt({ $type: "gotoLine" }); + }, + readOnly: true + }, { + name: "fold", + bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), + exec: function (editor) { editor.session.toggleFold(false); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "unfold", + bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), + exec: function (editor) { editor.session.toggleFold(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "toggleFoldWidget", + description: "Toggle fold widget", + bindKey: bindKey("F2", "F2"), + exec: function (editor) { editor.session.toggleFoldWidget(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "toggleParentFoldWidget", + description: "Toggle parent fold widget", + bindKey: bindKey("Alt-F2", "Alt-F2"), + exec: function (editor) { editor.session.toggleFoldWidget(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "foldall", + description: "Fold all", + bindKey: bindKey(null, "Ctrl-Command-Option-0"), + exec: function (editor) { editor.session.foldAll(); }, + scrollIntoView: "center", + readOnly: true + }, { + name: "foldAllComments", + description: "Fold all comments", + bindKey: bindKey(null, "Ctrl-Command-Option-0"), + exec: function (editor) { editor.session.foldAllComments(); }, + scrollIntoView: "center", + readOnly: true + }, { + name: "foldOther", + description: "Fold other", + bindKey: bindKey("Alt-0", "Command-Option-0"), + exec: function (editor) { + editor.session.foldAll(); + editor.session.unfold(editor.selection.getAllRanges()); + }, + scrollIntoView: "center", + readOnly: true + }, { + name: "unfoldall", + description: "Unfold all", + bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"), + exec: function (editor) { editor.session.unfold(); }, + scrollIntoView: "center", + readOnly: true + }, { + name: "findnext", + description: "Find next", + bindKey: bindKey("Ctrl-K", "Command-G"), + exec: function (editor) { editor.findNext(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "findprevious", + description: "Find previous", + bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), + exec: function (editor) { editor.findPrevious(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "selectOrFindNext", + description: "Select or find next", + bindKey: bindKey("Alt-K", "Ctrl-G"), + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + else + editor.findNext(); + }, + readOnly: true + }, { + name: "selectOrFindPrevious", + description: "Select or find previous", + bindKey: bindKey("Alt-Shift-K", "Ctrl-Shift-G"), + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + else + editor.findPrevious(); + }, + readOnly: true + }, { + name: "find", + description: "Find", + bindKey: bindKey("Ctrl-F", "Command-F"), + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { e.Search(editor); }); + }, + readOnly: true + }, { + name: "overwrite", + description: "Overwrite", + bindKey: "Insert", + exec: function (editor) { editor.toggleOverwrite(); }, + readOnly: true + }, { + name: "selecttostart", + description: "Select to start", + bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Home|Command-Shift-Up"), + exec: function (editor) { editor.getSelection().selectFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "gotostart", + description: "Go to start", + bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), + exec: function (editor) { editor.navigateFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "selectup", + description: "Select up", + bindKey: bindKey("Shift-Up", "Shift-Up|Ctrl-Shift-P"), + exec: function (editor) { editor.getSelection().selectUp(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "golineup", + description: "Go line up", + bindKey: bindKey("Up", "Up|Ctrl-P"), + exec: function (editor, args) { editor.navigateUp(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selecttoend", + description: "Select to end", + bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-End|Command-Shift-Down"), + exec: function (editor) { editor.getSelection().selectFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "gotoend", + description: "Go to end", + bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"), + exec: function (editor) { editor.navigateFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "selectdown", + description: "Select down", + bindKey: bindKey("Shift-Down", "Shift-Down|Ctrl-Shift-N"), + exec: function (editor) { editor.getSelection().selectDown(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "golinedown", + description: "Go line down", + bindKey: bindKey("Down", "Down|Ctrl-N"), + exec: function (editor, args) { editor.navigateDown(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectwordleft", + description: "Select word left", + bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"), + exec: function (editor) { editor.getSelection().selectWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotowordleft", + description: "Go to word left", + bindKey: bindKey("Ctrl-Left", "Option-Left"), + exec: function (editor) { editor.navigateWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selecttolinestart", + description: "Select to line start", + bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left|Ctrl-Shift-A"), + exec: function (editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotolinestart", + description: "Go to line start", + bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"), + exec: function (editor) { editor.navigateLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectleft", + description: "Select left", + bindKey: bindKey("Shift-Left", "Shift-Left|Ctrl-Shift-B"), + exec: function (editor) { editor.getSelection().selectLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotoleft", + description: "Go to left", + bindKey: bindKey("Left", "Left|Ctrl-B"), + exec: function (editor, args) { editor.navigateLeft(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectwordright", + description: "Select word right", + bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"), + exec: function (editor) { editor.getSelection().selectWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotowordright", + description: "Go to word right", + bindKey: bindKey("Ctrl-Right", "Option-Right"), + exec: function (editor) { editor.navigateWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selecttolineend", + description: "Select to line end", + bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right|Shift-End|Ctrl-Shift-E"), + exec: function (editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotolineend", + description: "Go to line end", + bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"), + exec: function (editor) { editor.navigateLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectright", + description: "Select right", + bindKey: bindKey("Shift-Right", "Shift-Right"), + exec: function (editor) { editor.getSelection().selectRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotoright", + description: "Go to right", + bindKey: bindKey("Right", "Right|Ctrl-F"), + exec: function (editor, args) { editor.navigateRight(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectpagedown", + description: "Select page down", + bindKey: "Shift-PageDown", + exec: function (editor) { editor.selectPageDown(); }, + readOnly: true + }, { + name: "pagedown", + description: "Page down", + bindKey: bindKey(null, "Option-PageDown"), + exec: function (editor) { editor.scrollPageDown(); }, + readOnly: true + }, { + name: "gotopagedown", + description: "Go to page down", + bindKey: bindKey("PageDown", "PageDown|Ctrl-V"), + exec: function (editor) { editor.gotoPageDown(); }, + readOnly: true + }, { + name: "selectpageup", + description: "Select page up", + bindKey: "Shift-PageUp", + exec: function (editor) { editor.selectPageUp(); }, + readOnly: true + }, { + name: "pageup", + description: "Page up", + bindKey: bindKey(null, "Option-PageUp"), + exec: function (editor) { editor.scrollPageUp(); }, + readOnly: true + }, { + name: "gotopageup", + description: "Go to page up", + bindKey: "PageUp", + exec: function (editor) { editor.gotoPageUp(); }, + readOnly: true + }, { + name: "scrollup", + description: "Scroll up", + bindKey: bindKey("Ctrl-Up", null), + exec: function (e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true + }, { + name: "scrolldown", + description: "Scroll down", + bindKey: bindKey("Ctrl-Down", null), + exec: function (e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true + }, { + name: "selectlinestart", + description: "Select line start", + bindKey: "Shift-Home", + exec: function (editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectlineend", + description: "Select line end", + bindKey: "Shift-End", + exec: function (editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "togglerecording", + description: "Toggle recording", + bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"), + exec: function (editor) { editor.commands.toggleRecording(editor); }, + readOnly: true + }, { + name: "replaymacro", + description: "Replay macro", + bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"), + exec: function (editor) { editor.commands.replay(editor); }, + readOnly: true + }, { + name: "jumptomatching", + description: "Jump to matching", + bindKey: bindKey("Ctrl-\\|Ctrl-P", "Command-\\"), + exec: function (editor) { editor.jumpToMatching(); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true + }, { + name: "selecttomatching", + description: "Select to matching", + bindKey: bindKey("Ctrl-Shift-\\|Ctrl-Shift-P", "Command-Shift-\\"), + exec: function (editor) { editor.jumpToMatching(true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true + }, { + name: "expandToMatching", + description: "Expand to matching", + bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"), + exec: function (editor) { editor.jumpToMatching(true, true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true + }, { + name: "passKeysToBrowser", + description: "Pass keys to browser", + bindKey: bindKey(null, null), + exec: function () { }, + passEvent: true, + readOnly: true + }, { + name: "copy", + description: "Copy", + exec: function (editor) { + }, + readOnly: true + }, + { + name: "cut", + description: "Cut", + exec: function (editor) { + var cutLine = editor.$copyWithEmptySelection && editor.selection.isEmpty(); + var range = cutLine ? editor.selection.getLineRange() : editor.selection.getRange(); + editor._emit("cut", range); + if (!range.isEmpty()) + editor.session.remove(range); + editor.clearSelection(); + }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "paste", + description: "Paste", + exec: function (editor, args) { + editor.$handlePaste(args); + }, + scrollIntoView: "cursor" + }, { + name: "removeline", + description: "Remove line", + bindKey: bindKey("Ctrl-D", "Command-D"), + exec: function (editor) { editor.removeLines(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEachLine" + }, { + name: "duplicateSelection", + description: "Duplicate selection", + bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), + exec: function (editor) { editor.duplicateSelection(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "sortlines", + description: "Sort lines", + bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"), + exec: function (editor) { editor.sortLines(); }, + scrollIntoView: "selection", + multiSelectAction: "forEachLine" + }, { + name: "togglecomment", + description: "Toggle comment", + bindKey: bindKey("Ctrl-/", "Command-/"), + exec: function (editor) { editor.toggleCommentLines(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" + }, { + name: "toggleBlockComment", + description: "Toggle block comment", + bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"), + exec: function (editor) { editor.toggleBlockComment(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" + }, { + name: "modifyNumberUp", + description: "Modify number up", + bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), + exec: function (editor) { editor.modifyNumber(1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "modifyNumberDown", + description: "Modify number down", + bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), + exec: function (editor) { editor.modifyNumber(-1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "replace", + description: "Replace", + bindKey: bindKey("Ctrl-H", "Command-Option-F"), + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { e.Search(editor, true); }); + } + }, { + name: "undo", + description: "Undo", + bindKey: bindKey("Ctrl-Z", "Command-Z"), + exec: function (editor) { editor.undo(); } + }, { + name: "redo", + description: "Redo", + bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"), + exec: function (editor) { editor.redo(); } + }, { + name: "copylinesup", + description: "Copy lines up", + bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), + exec: function (editor) { editor.copyLinesUp(); }, + scrollIntoView: "cursor" + }, { + name: "movelinesup", + description: "Move lines up", + bindKey: bindKey("Alt-Up", "Option-Up"), + exec: function (editor) { editor.moveLinesUp(); }, + scrollIntoView: "cursor" + }, { + name: "copylinesdown", + description: "Copy lines down", + bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), + exec: function (editor) { editor.copyLinesDown(); }, + scrollIntoView: "cursor" + }, { + name: "movelinesdown", + description: "Move lines down", + bindKey: bindKey("Alt-Down", "Option-Down"), + exec: function (editor) { editor.moveLinesDown(); }, + scrollIntoView: "cursor" + }, { + name: "del", + description: "Delete", + bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"), + exec: function (editor) { editor.remove("right"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "backspace", + description: "Backspace", + bindKey: bindKey("Shift-Backspace|Backspace", "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"), + exec: function (editor) { editor.remove("left"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "cut_or_delete", + description: "Cut or delete", + bindKey: bindKey("Shift-Delete", null), + exec: function (editor) { + if (editor.selection.isEmpty()) { + editor.remove("left"); + } + else { + return false; + } + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolinestart", + description: "Remove to line start", + bindKey: bindKey("Alt-Backspace", "Command-Backspace"), + exec: function (editor) { editor.removeToLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolineend", + description: "Remove to line end", + bindKey: bindKey("Alt-Delete", "Ctrl-K|Command-Delete"), + exec: function (editor) { editor.removeToLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolinestarthard", + description: "Remove to line start hard", + bindKey: bindKey("Ctrl-Shift-Backspace", null), + exec: function (editor) { + var range = editor.selection.getRange(); + range.start.column = 0; + editor.session.remove(range); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolineendhard", + description: "Remove to line end hard", + bindKey: bindKey("Ctrl-Shift-Delete", null), + exec: function (editor) { + var range = editor.selection.getRange(); + range.end.column = Number.MAX_VALUE; + editor.session.remove(range); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removewordleft", + description: "Remove word left", + bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"), + exec: function (editor) { editor.removeWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removewordright", + description: "Remove word right", + bindKey: bindKey("Ctrl-Delete", "Alt-Delete"), + exec: function (editor) { editor.removeWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "outdent", + description: "Outdent", + bindKey: bindKey("Shift-Tab", "Shift-Tab"), + exec: function (editor) { editor.blockOutdent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" + }, { + name: "indent", + description: "Indent", + bindKey: bindKey("Tab", "Tab"), + exec: function (editor) { editor.indent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" + }, { + name: "blockoutdent", + description: "Block outdent", + bindKey: bindKey("Ctrl-[", "Ctrl-["), + exec: function (editor) { editor.blockOutdent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" + }, { + name: "blockindent", + description: "Block indent", + bindKey: bindKey("Ctrl-]", "Ctrl-]"), + exec: function (editor) { editor.blockIndent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" + }, { + name: "insertstring", + description: "Insert string", + exec: function (editor, str) { editor.insert(str); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "inserttext", + description: "Insert text", + exec: function (editor, args) { + editor.insert(lang.stringRepeat(args.text || "", args.times || 1)); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "splitline", + description: "Split line", + bindKey: bindKey(null, "Ctrl-O"), + exec: function (editor) { editor.splitLine(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "transposeletters", + description: "Transpose letters", + bindKey: bindKey("Alt-Shift-X", "Ctrl-T"), + exec: function (editor) { editor.transposeLetters(); }, + multiSelectAction: function (editor) { editor.transposeSelections(1); }, + scrollIntoView: "cursor" + }, { + name: "touppercase", + description: "To uppercase", + bindKey: bindKey("Ctrl-U", "Ctrl-U"), + exec: function (editor) { editor.toUpperCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "tolowercase", + description: "To lowercase", + bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"), + exec: function (editor) { editor.toLowerCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "autoindent", + description: "Auto Indent", + bindKey: bindKey(null, null), + exec: function (editor) { editor.autoIndent(); }, + scrollIntoView: "animate" + }, { + name: "expandtoline", + description: "Expand to line", + bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"), + exec: function (editor) { + var range = editor.selection.getRange(); + range.start.column = range.end.column = 0; + range.end.row++; + editor.selection.setRange(range, false); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "openlink", + bindKey: bindKey("Ctrl+F3", "F3"), + exec: function (editor) { editor.openLink(); } + }, { + name: "joinlines", + description: "Join lines", + bindKey: bindKey(null, null), + exec: function (editor) { + var isBackwards = editor.selection.isBackwards(); + var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor(); + var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead(); + var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length; + var selectedText = editor.session.doc.getTextRange(editor.selection.getRange()); + var selectedCount = selectedText.replace(/\n\s*/, " ").length; + var insertLine = editor.session.doc.getLine(selectionStart.row); + for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) { + var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i))); + if (curLine.length !== 0) { + curLine = " " + curLine; + } + insertLine += curLine; + } + if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) { + insertLine += editor.session.doc.getNewLineCharacter(); + } + editor.clearSelection(); + editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine); + if (selectedCount > 0) { + editor.selection.moveCursorTo(selectionStart.row, selectionStart.column); + editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount); + } + else { + firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol; + editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol); + } + }, + multiSelectAction: "forEach", + readOnly: true + }, { + name: "invertSelection", + description: "Invert selection", + bindKey: bindKey(null, null), + exec: function (editor) { + var endRow = editor.session.doc.getLength() - 1; + var endCol = editor.session.doc.getLine(endRow).length; + var ranges = editor.selection.rangeList.ranges; + var newRanges = []; + if (ranges.length < 1) { + ranges = [editor.selection.getRange()]; + } + for (var i = 0; i < ranges.length; i++) { + if (i == (ranges.length - 1)) { + if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) { + newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol)); + } + } + if (i === 0) { + if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) { + newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column)); + } + } + else { + newRanges.push(new Range(ranges[i - 1].end.row, ranges[i - 1].end.column, ranges[i].start.row, ranges[i].start.column)); + } + } + editor.exitMultiSelectMode(); + editor.clearSelection(); + for (var i = 0; i < newRanges.length; i++) { + editor.selection.addRange(newRanges[i], false); + } + }, + readOnly: true, + scrollIntoView: "none" + }, { + name: "addLineAfter", + description: "Add new line after the current line", + exec: function (editor) { + editor.selection.clearSelection(); + editor.navigateLineEnd(); + editor.insert("\n"); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "addLineBefore", + description: "Add new line before the current line", + exec: function (editor) { + editor.selection.clearSelection(); + var cursor = editor.getCursorPosition(); + editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE); + editor.insert("\n"); + if (cursor.row === 0) + editor.navigateUp(); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "openCommandPallete", + exec: function (editor) { + console.warn("This is an obsolete command. Please use `openCommandPalette` instead."); + editor.prompt({ $type: "commands" }); + }, + readOnly: true + }, { + name: "openCommandPalette", + description: "Open command palette", + bindKey: bindKey("F1", "F1"), + exec: function (editor) { + editor.prompt({ $type: "commands" }); + }, + readOnly: true + }, { + name: "modeSelect", + description: "Change language mode...", + bindKey: bindKey(null, null), + exec: function (editor) { + editor.prompt({ $type: "modes" }); + }, + readOnly: true + }]; +for (var i = 1; i < 9; i++) { + exports.commands.push({ + name: "foldToLevel" + i, + description: "Fold To Level " + i, + level: i, + exec: function (editor) { editor.session.foldToLevel(this.level); }, + scrollIntoView: "center", + readOnly: true + }); +} + +}); + +ace.define("ace/line_widgets",["require","exports","module","ace/lib/dom"], function(require, exports, module){"use strict"; +var dom = require("./lib/dom"); +var LineWidgets = /** @class */ (function () { + function LineWidgets(session) { + this.session = session; + this.session.widgetManager = this; + this.session.getRowLength = this.getRowLength; + this.session.$getWidgetScreenLength = this.$getWidgetScreenLength; + this.updateOnChange = this.updateOnChange.bind(this); + this.renderWidgets = this.renderWidgets.bind(this); + this.measureWidgets = this.measureWidgets.bind(this); + this.session._changedWidgets = []; + this.$onChangeEditor = this.$onChangeEditor.bind(this); + this.session.on("change", this.updateOnChange); + this.session.on("changeFold", this.updateOnFold); + this.session.on("changeEditor", this.$onChangeEditor); + } + LineWidgets.prototype.getRowLength = function (row) { + var h; + if (this.lineWidgets) + h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + else + h = 0; + if (!this["$useWrapMode"] || !this["$wrapData"][row]) { + return 1 + h; + } + else { + return this["$wrapData"][row].length + 1 + h; + } + }; + LineWidgets.prototype.$getWidgetScreenLength = function () { + var screenRows = 0; + this.lineWidgets.forEach(function (w) { + if (w && w.rowCount && !w.hidden) + screenRows += w.rowCount; + }); + return screenRows; + }; + LineWidgets.prototype.$onChangeEditor = function (e) { + this.attach(e.editor); + }; + LineWidgets.prototype.attach = function (editor) { + if (editor && editor.widgetManager && editor.widgetManager != this) + editor.widgetManager.detach(); + if (this.editor == editor) + return; + this.detach(); + this.editor = editor; + if (editor) { + editor.widgetManager = this; + editor.renderer.on("beforeRender", this.measureWidgets); + editor.renderer.on("afterRender", this.renderWidgets); + } + }; + LineWidgets.prototype.detach = function (e) { + var editor = this.editor; + if (!editor) + return; + this.editor = null; + editor.widgetManager = null; + editor.renderer.off("beforeRender", this.measureWidgets); + editor.renderer.off("afterRender", this.renderWidgets); + var lineWidgets = this.session.lineWidgets; + lineWidgets && lineWidgets.forEach(function (w) { + if (w && w.el && w.el.parentNode) { + w._inDocument = false; + w.el.parentNode.removeChild(w.el); + } + }); + }; + LineWidgets.prototype.updateOnFold = function (e, session) { + var lineWidgets = session.lineWidgets; + if (!lineWidgets || !e.action) + return; + var fold = e.data; + var start = fold.start.row; + var end = fold.end.row; + var hide = e.action == "add"; + for (var i = start + 1; i < end; i++) { + if (lineWidgets[i]) + lineWidgets[i].hidden = hide; + } + if (lineWidgets[end]) { + if (hide) { + if (!lineWidgets[start]) + lineWidgets[start] = lineWidgets[end]; + else + lineWidgets[end].hidden = hide; + } + else { + if (lineWidgets[start] == lineWidgets[end]) + lineWidgets[start] = undefined; + lineWidgets[end].hidden = hide; + } + } + }; + LineWidgets.prototype.updateOnChange = function (delta) { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var startRow = delta.start.row; + var len = delta.end.row - startRow; + if (len === 0) { + } + else if (delta.action == "remove") { + var removed = lineWidgets.splice(startRow + 1, len); + if (!lineWidgets[startRow] && removed[removed.length - 1]) { + lineWidgets[startRow] = removed.pop(); + } + removed.forEach(function (w) { + w && this.removeLineWidget(w); + }, this); + this.$updateRows(); + } + else { + var args = new Array(len); + if (lineWidgets[startRow] && lineWidgets[startRow].column != null) { + if (delta.start.column > lineWidgets[startRow].column) + startRow++; + } + args.unshift(startRow, 0); + lineWidgets.splice.apply(lineWidgets, args); + this.$updateRows(); + } + }; + LineWidgets.prototype.$updateRows = function () { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var noWidgets = true; + lineWidgets.forEach(function (w, i) { + if (w) { + noWidgets = false; + w.row = i; + while (w.$oldWidget) { + w.$oldWidget.row = i; + w = w.$oldWidget; + } + } + }); + if (noWidgets) + this.session.lineWidgets = null; + }; + LineWidgets.prototype.$registerLineWidget = function (w) { + if (!this.session.lineWidgets) + this.session.lineWidgets = new Array(this.session.getLength()); + var old = this.session.lineWidgets[w.row]; + if (old) { + w.$oldWidget = old; + if (old.el && old.el.parentNode) { + old.el.parentNode.removeChild(old.el); + old._inDocument = false; + } + } + this.session.lineWidgets[w.row] = w; + return w; + }; + LineWidgets.prototype.addLineWidget = function (w) { + this.$registerLineWidget(w); + w.session = this.session; + if (!this.editor) + return w; + var renderer = this.editor.renderer; + if (w.html && !w.el) { + w.el = dom.createElement("div"); + w.el.innerHTML = w.html; + } + if (w.text && !w.el) { + w.el = dom.createElement("div"); + w.el.textContent = w.text; + } + if (w.el) { + dom.addCssClass(w.el, "ace_lineWidgetContainer"); + if (w.className) { + dom.addCssClass(w.el, w.className); + } + w.el.style.position = "absolute"; + w.el.style.zIndex = "5"; + renderer.container.appendChild(w.el); + w._inDocument = true; + if (!w.coverGutter) { + w.el.style.zIndex = "3"; + } + if (w.pixelHeight == null) { + w.pixelHeight = w.el.offsetHeight; + } + } + if (w.rowCount == null) { + w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight; + } + var fold = this.session.getFoldAt(w.row, 0); + w.$fold = fold; + if (fold) { + var lineWidgets = this.session.lineWidgets; + if (w.row == fold.end.row && !lineWidgets[fold.start.row]) + lineWidgets[fold.start.row] = w; + else + w.hidden = true; + } + this.session._emit("changeFold", { data: { start: { row: w.row } } }); + this.$updateRows(); + this.renderWidgets(null, renderer); + this.onWidgetChanged(w); + return w; + }; + LineWidgets.prototype.removeLineWidget = function (w) { + w._inDocument = false; + w.session = null; + if (w.el && w.el.parentNode) + w.el.parentNode.removeChild(w.el); + if (w.editor && w.editor.destroy) + try { + w.editor.destroy(); + } + catch (e) { } + if (this.session.lineWidgets) { + var w1 = this.session.lineWidgets[w.row]; + if (w1 == w) { + this.session.lineWidgets[w.row] = w.$oldWidget; + if (w.$oldWidget) + this.onWidgetChanged(w.$oldWidget); + } + else { + while (w1) { + if (w1.$oldWidget == w) { + w1.$oldWidget = w.$oldWidget; + break; + } + w1 = w1.$oldWidget; + } + } + } + this.session._emit("changeFold", { data: { start: { row: w.row } } }); + this.$updateRows(); + }; + LineWidgets.prototype.getWidgetsAtRow = function (row) { + var lineWidgets = this.session.lineWidgets; + var w = lineWidgets && lineWidgets[row]; + var list = []; + while (w) { + list.push(w); + w = w.$oldWidget; + } + return list; + }; + LineWidgets.prototype.onWidgetChanged = function (w) { + this.session._changedWidgets.push(w); + this.editor && this.editor.renderer.updateFull(); + }; + LineWidgets.prototype.measureWidgets = function (e, renderer) { + var changedWidgets = this.session._changedWidgets; + var config = renderer.layerConfig; + if (!changedWidgets || !changedWidgets.length) + return; + var min = Infinity; + for (var i = 0; i < changedWidgets.length; i++) { + var w = changedWidgets[i]; + if (!w || !w.el) + continue; + if (w.session != this.session) + continue; + if (!w._inDocument) { + if (this.session.lineWidgets[w.row] != w) + continue; + w._inDocument = true; + renderer.container.appendChild(w.el); + } + w.h = w.el.offsetHeight; + if (!w.fixedWidth) { + w.w = w.el.offsetWidth; + w.screenWidth = Math.ceil(w.w / config.characterWidth); + } + var rowCount = w.h / config.lineHeight; + if (w.coverLine) { + rowCount -= this.session.getRowLineCount(w.row); + if (rowCount < 0) + rowCount = 0; + } + if (w.rowCount != rowCount) { + w.rowCount = rowCount; + if (w.row < min) + min = w.row; + } + } + if (min != Infinity) { + this.session._emit("changeFold", { data: { start: { row: min } } }); + this.session.lineWidgetWidth = null; + } + this.session._changedWidgets = []; + }; + LineWidgets.prototype.renderWidgets = function (e, renderer) { + var config = renderer.layerConfig; + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var first = Math.min(this.firstRow, config.firstRow); + var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length); + while (first > 0 && !lineWidgets[first]) + first--; + this.firstRow = config.firstRow; + this.lastRow = config.lastRow; + renderer.$cursorLayer.config = config; + for (var i = first; i <= last; i++) { + var w = lineWidgets[i]; + if (!w || !w.el) + continue; + if (w.hidden) { + w.el.style.top = -100 - (w.pixelHeight || 0) + "px"; + continue; + } + if (!w._inDocument) { + w._inDocument = true; + renderer.container.appendChild(w.el); + } + var top = renderer.$cursorLayer.getPixelPosition({ row: i, column: 0 }, true).top; + if (!w.coverLine) + top += config.lineHeight * this.session.getRowLineCount(w.row); + w.el.style.top = top - config.offset + "px"; + var left = w.coverGutter ? 0 : renderer.gutterWidth; + if (!w.fixedWidth) + left -= renderer.scrollLeft; + w.el.style.left = left + "px"; + if (w.fullWidth && w.screenWidth) { + w.el.style.minWidth = config.width + 2 * config.padding + "px"; + } + if (w.fixedWidth) { + w.el.style.right = renderer.scrollBar.getWidth() + "px"; + } + else { + w.el.style.right = ""; + } + } + }; + return LineWidgets; +}()); +exports.LineWidgets = LineWidgets; + +}); + +ace.define("ace/keyboard/gutter_handler",["require","exports","module","ace/lib/keys","ace/mouse/default_gutter_handler"], function(require, exports, module){"use strict"; +var keys = require('../lib/keys'); +var GutterTooltip = require("../mouse/default_gutter_handler").GutterTooltip; +var GutterKeyboardHandler = /** @class */ (function () { + function GutterKeyboardHandler(editor) { + this.editor = editor; + this.gutterLayer = editor.renderer.$gutterLayer; + this.element = editor.renderer.$gutter; + this.lines = editor.renderer.$gutterLayer.$lines; + this.activeRowIndex = null; + this.activeLane = null; + this.annotationTooltip = new GutterTooltip(this.editor); + } + GutterKeyboardHandler.prototype.addListener = function () { + this.element.addEventListener("keydown", this.$onGutterKeyDown.bind(this)); + this.element.addEventListener("focusout", this.$blurGutter.bind(this)); + this.editor.on("mousewheel", this.$blurGutter.bind(this)); + }; + GutterKeyboardHandler.prototype.removeListener = function () { + this.element.removeEventListener("keydown", this.$onGutterKeyDown.bind(this)); + this.element.removeEventListener("focusout", this.$blurGutter.bind(this)); + this.editor.off("mousewheel", this.$blurGutter.bind(this)); + }; + GutterKeyboardHandler.prototype.$onGutterKeyDown = function (e) { + if (this.annotationTooltip.isOpen) { + e.preventDefault(); + if (e.keyCode === keys["escape"]) + this.annotationTooltip.hideTooltip(); + return; + } + if (e.target === this.element) { + if (e.keyCode != keys["enter"]) { + return; + } + e.preventDefault(); + var row = this.editor.getCursorPosition().row; + if (!this.editor.isRowVisible(row)) + this.editor.scrollToLine(row, true, true); + setTimeout( + function () { + var index = this.$rowToRowIndex(this.gutterLayer.$cursorCell.row); + var nearestFoldIndex = this.$findNearestFoldWidget(index); + var nearestAnnotationIndex = this.$findNearestAnnotation(index); + if (nearestFoldIndex === null && nearestAnnotationIndex === null) + return; + if (nearestFoldIndex === null && nearestAnnotationIndex !== null) { + this.activeRowIndex = nearestAnnotationIndex; + this.activeLane = "annotation"; + this.$focusAnnotation(this.activeRowIndex); + return; + } + if (nearestFoldIndex !== null && nearestAnnotationIndex === null) { + this.activeRowIndex = nearestFoldIndex; + this.activeLane = "fold"; + this.$focusFoldWidget(this.activeRowIndex); + return; + } + if (Math.abs(nearestAnnotationIndex - index) < Math.abs(nearestFoldIndex - index)) { + this.activeRowIndex = nearestAnnotationIndex; + this.activeLane = "annotation"; + this.$focusAnnotation(this.activeRowIndex); + return; + } + else { + this.activeRowIndex = nearestFoldIndex; + this.activeLane = "fold"; + this.$focusFoldWidget(this.activeRowIndex); + return; + } + }.bind(this), 10); + return; + } + this.$handleGutterKeyboardInteraction(e); + setTimeout(function () { + this.editor._signal("gutterkeydown", new GutterKeyboardEvent(e, this)); + }.bind(this), 10); + }; + GutterKeyboardHandler.prototype.$handleGutterKeyboardInteraction = function (e) { + if (e.keyCode === keys["tab"]) { + e.preventDefault(); + return; + } + if (e.keyCode === keys["escape"]) { + e.preventDefault(); + this.$blurGutter(); + this.element.focus(); + this.lane = null; + return; + } + if (e.keyCode === keys["up"]) { + e.preventDefault(); + switch (this.activeLane) { + case "fold": + this.$moveFoldWidgetUp(); + break; + case "annotation": + this.$moveAnnotationUp(); + break; + } + return; + } + if (e.keyCode === keys["down"]) { + e.preventDefault(); + switch (this.activeLane) { + case "fold": + this.$moveFoldWidgetDown(); + break; + case "annotation": + this.$moveAnnotationDown(); + break; + } + return; + } + if (e.keyCode === keys["left"]) { + e.preventDefault(); + this.$switchLane("annotation"); + return; + } + if (e.keyCode === keys["right"]) { + e.preventDefault(); + this.$switchLane("fold"); + return; + } + if (e.keyCode === keys["enter"] || e.keyCode === keys["space"]) { + e.preventDefault(); + switch (this.activeLane) { + case "fold": + if (this.gutterLayer.session.foldWidgets[this.$rowIndexToRow(this.activeRowIndex)] === 'start') { + var rowFoldingWidget = this.$rowIndexToRow(this.activeRowIndex); + this.editor.session.onFoldWidgetClick(this.$rowIndexToRow(this.activeRowIndex), e); + setTimeout( + function () { + if (this.$rowIndexToRow(this.activeRowIndex) !== rowFoldingWidget) { + this.$blurFoldWidget(this.activeRowIndex); + this.activeRowIndex = this.$rowToRowIndex(rowFoldingWidget); + this.$focusFoldWidget(this.activeRowIndex); + } + }.bind(this), 10); + break; + } + else if (this.gutterLayer.session.foldWidgets[this.$rowIndexToRow(this.activeRowIndex)] === 'end') { + break; + } + return; + case "annotation": + var gutterElement = this.lines.cells[this.activeRowIndex].element.childNodes[2]; + var rect = gutterElement.getBoundingClientRect(); + var style = this.annotationTooltip.getElement().style; + style.left = rect.right + "px"; + style.top = rect.bottom + "px"; + this.annotationTooltip.showTooltip(this.$rowIndexToRow(this.activeRowIndex)); + break; + } + return; + } + }; + GutterKeyboardHandler.prototype.$blurGutter = function () { + if (this.activeRowIndex !== null) { + switch (this.activeLane) { + case "fold": + this.$blurFoldWidget(this.activeRowIndex); + break; + case "annotation": + this.$blurAnnotation(this.activeRowIndex); + break; + } + } + if (this.annotationTooltip.isOpen) + this.annotationTooltip.hideTooltip(); + return; + }; + GutterKeyboardHandler.prototype.$isFoldWidgetVisible = function (index) { + var isRowFullyVisible = this.editor.isRowFullyVisible(this.$rowIndexToRow(index)); + var isIconVisible = this.$getFoldWidget(index).style.display !== "none"; + return isRowFullyVisible && isIconVisible; + }; + GutterKeyboardHandler.prototype.$isAnnotationVisible = function (index) { + var isRowFullyVisible = this.editor.isRowFullyVisible(this.$rowIndexToRow(index)); + var isIconVisible = this.$getAnnotation(index).style.display !== "none"; + return isRowFullyVisible && isIconVisible; + }; + GutterKeyboardHandler.prototype.$getFoldWidget = function (index) { + var cell = this.lines.get(index); + var element = cell.element; + return element.childNodes[1]; + }; + GutterKeyboardHandler.prototype.$getAnnotation = function (index) { + var cell = this.lines.get(index); + var element = cell.element; + return element.childNodes[2]; + }; + GutterKeyboardHandler.prototype.$findNearestFoldWidget = function (index) { + if (this.$isFoldWidgetVisible(index)) + return index; + var i = 0; + while (index - i > 0 || index + i < this.lines.getLength() - 1) { + i++; + if (index - i >= 0 && this.$isFoldWidgetVisible(index - i)) + return index - i; + if (index + i <= this.lines.getLength() - 1 && this.$isFoldWidgetVisible(index + i)) + return index + i; + } + return null; + }; + GutterKeyboardHandler.prototype.$findNearestAnnotation = function (index) { + if (this.$isAnnotationVisible(index)) + return index; + var i = 0; + while (index - i > 0 || index + i < this.lines.getLength() - 1) { + i++; + if (index - i >= 0 && this.$isAnnotationVisible(index - i)) + return index - i; + if (index + i <= this.lines.getLength() - 1 && this.$isAnnotationVisible(index + i)) + return index + i; + } + return null; + }; + GutterKeyboardHandler.prototype.$focusFoldWidget = function (index) { + if (index == null) + return; + var foldWidget = this.$getFoldWidget(index); + foldWidget.classList.add(this.editor.renderer.keyboardFocusClassName); + foldWidget.focus(); + }; + GutterKeyboardHandler.prototype.$focusAnnotation = function (index) { + if (index == null) + return; + var annotation = this.$getAnnotation(index); + annotation.classList.add(this.editor.renderer.keyboardFocusClassName); + annotation.focus(); + }; + GutterKeyboardHandler.prototype.$blurFoldWidget = function (index) { + var foldWidget = this.$getFoldWidget(index); + foldWidget.classList.remove(this.editor.renderer.keyboardFocusClassName); + foldWidget.blur(); + }; + GutterKeyboardHandler.prototype.$blurAnnotation = function (index) { + var annotation = this.$getAnnotation(index); + annotation.classList.remove(this.editor.renderer.keyboardFocusClassName); + annotation.blur(); + }; + GutterKeyboardHandler.prototype.$moveFoldWidgetUp = function () { + var index = this.activeRowIndex; + while (index > 0) { + index--; + if (this.$isFoldWidgetVisible(index)) { + this.$blurFoldWidget(this.activeRowIndex); + this.activeRowIndex = index; + this.$focusFoldWidget(this.activeRowIndex); + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$moveFoldWidgetDown = function () { + var index = this.activeRowIndex; + while (index < this.lines.getLength() - 1) { + index++; + if (this.$isFoldWidgetVisible(index)) { + this.$blurFoldWidget(this.activeRowIndex); + this.activeRowIndex = index; + this.$focusFoldWidget(this.activeRowIndex); + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$moveAnnotationUp = function () { + var index = this.activeRowIndex; + while (index > 0) { + index--; + if (this.$isAnnotationVisible(index)) { + this.$blurAnnotation(this.activeRowIndex); + this.activeRowIndex = index; + this.$focusAnnotation(this.activeRowIndex); + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$moveAnnotationDown = function () { + var index = this.activeRowIndex; + while (index < this.lines.getLength() - 1) { + index++; + if (this.$isAnnotationVisible(index)) { + this.$blurAnnotation(this.activeRowIndex); + this.activeRowIndex = index; + this.$focusAnnotation(this.activeRowIndex); + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$switchLane = function (desinationLane) { + switch (desinationLane) { + case "annotation": + if (this.activeLane === "annotation") { + break; + } + var annotationIndex = this.$findNearestAnnotation(this.activeRowIndex); + if (annotationIndex == null) { + break; + } + this.activeLane = "annotation"; + this.$blurFoldWidget(this.activeRowIndex); + this.activeRowIndex = annotationIndex; + this.$focusAnnotation(this.activeRowIndex); + break; + case "fold": + if (this.activeLane === "fold") { + break; + } + var foldWidgetIndex = this.$findNearestFoldWidget(this.activeRowIndex); + if (foldWidgetIndex == null) { + break; + } + this.activeLane = "fold"; + this.$blurAnnotation(this.activeRowIndex); + this.activeRowIndex = foldWidgetIndex; + this.$focusFoldWidget(this.activeRowIndex); + break; + } + return; + }; + GutterKeyboardHandler.prototype.$rowIndexToRow = function (index) { + var cell = this.lines.get(index); + if (cell) + return cell.row; + return null; + }; + GutterKeyboardHandler.prototype.$rowToRowIndex = function (row) { + for (var i = 0; i < this.lines.getLength(); i++) { + var cell = this.lines.get(i); + if (cell.row == row) + return i; + } + return null; + }; + return GutterKeyboardHandler; +}()); +exports.GutterKeyboardHandler = GutterKeyboardHandler; +var GutterKeyboardEvent = /** @class */ (function () { + function GutterKeyboardEvent(domEvent, gutterKeyboardHandler) { + this.gutterKeyboardHandler = gutterKeyboardHandler; + this.domEvent = domEvent; + } + GutterKeyboardEvent.prototype.getKey = function () { + return keys.keyCodeToString(this.domEvent.keyCode); + }; + GutterKeyboardEvent.prototype.getRow = function () { + return this.gutterKeyboardHandler.$rowIndexToRow(this.gutterKeyboardHandler.activeRowIndex); + }; + GutterKeyboardEvent.prototype.isInAnnotationLane = function () { + return this.gutterKeyboardHandler.activeLane === "annotation"; + }; + GutterKeyboardEvent.prototype.isInFoldLane = function () { + return this.gutterKeyboardHandler.activeLane === "fold"; + }; + return GutterKeyboardEvent; +}()); +exports.GutterKeyboardEvent = GutterKeyboardEvent; + +}); + +ace.define("ace/editor",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator","ace/line_widgets","ace/keyboard/gutter_handler","ace/config","ace/clipboard","ace/lib/keys"], function(require, exports, module){"use strict"; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var lang = require("./lib/lang"); +var useragent = require("./lib/useragent"); +var TextInput = require("./keyboard/textinput").TextInput; +var MouseHandler = require("./mouse/mouse_handler").MouseHandler; +var FoldHandler = require("./mouse/fold_handler").FoldHandler; +var KeyBinding = require("./keyboard/keybinding").KeyBinding; +var EditSession = require("./edit_session").EditSession; +var Search = require("./search").Search; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var CommandManager = require("./commands/command_manager").CommandManager; +var defaultCommands = require("./commands/default_commands").commands; +var config = require("./config"); +var TokenIterator = require("./token_iterator").TokenIterator; +var LineWidgets = require("./line_widgets").LineWidgets; +var GutterKeyboardHandler = require("./keyboard/gutter_handler").GutterKeyboardHandler; +var nls = require("./config").nls; +var clipboard = require("./clipboard"); +var keys = require('./lib/keys'); +var Editor = /** @class */ (function () { + function Editor(renderer, session, options) { this.session; + this.$toDestroy = []; + var container = renderer.getContainerElement(); + this.container = container; + this.renderer = renderer; + this.id = "editor" + (++Editor.$uid); + this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); + if (typeof document == "object") { + this.textInput = new TextInput(renderer.getTextAreaContainer(), this); + this.renderer.textarea = this.textInput.getElement(); + this.$mouseHandler = new MouseHandler(this); + new FoldHandler(this); + } + this.keyBinding = new KeyBinding(this); + this.$search = new Search().set({ + wrap: true + }); + this.$historyTracker = this.$historyTracker.bind(this); + this.commands.on("exec", this.$historyTracker); + this.$initOperationListeners(); + this._$emitInputEvent = lang.delayedCall(function () { + this._signal("input", {}); + if (this.session && !this.session.destroyed) + this.session.bgTokenizer.scheduleStart(); + }.bind(this)); + this.on("change", function (_, _self) { + _self._$emitInputEvent.schedule(31); + }); + this.setSession(session || options && options.session || new EditSession("")); + config.resetOptions(this); + if (options) + this.setOptions(options); + config._signal("editor", this); + } + Editor.prototype.$initOperationListeners = function () { + this.commands.on("exec", this.startOperation.bind(this), true); + this.commands.on("afterExec", this.endOperation.bind(this), true); + this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this, true)); + this.on("change", function () { + if (!this.curOp) { + this.startOperation(); + this.curOp.selectionBefore = this.$lastSel; + } + this.curOp.docChanged = true; + }.bind(this), true); + this.on("changeSelection", function () { + if (!this.curOp) { + this.startOperation(); + this.curOp.selectionBefore = this.$lastSel; + } + this.curOp.selectionChanged = true; + }.bind(this), true); + }; + Editor.prototype.startOperation = function (commandEvent) { + if (this.curOp) { + if (!commandEvent || this.curOp.command) + return; + this.prevOp = this.curOp; + } + if (!commandEvent) { + this.previousCommand = null; + commandEvent = {}; + } + this.$opResetTimer.schedule(); + this.curOp = this.session.curOp = { + command: commandEvent.command || {}, + args: commandEvent.args, + scrollTop: this.renderer.scrollTop + }; + this.curOp.selectionBefore = this.selection.toJSON(); + }; + Editor.prototype.endOperation = function (e) { + if (this.curOp && this.session) { + if (e && e.returnValue === false || !this.session) + return (this.curOp = null); + if (e == true && this.curOp.command && this.curOp.command.name == "mouse") + return; + this._signal("beforeEndOperation"); + if (!this.curOp) + return; + var command = this.curOp.command; + var scrollIntoView = command && command.scrollIntoView; + if (scrollIntoView) { + switch (scrollIntoView) { + case "center-animate": + scrollIntoView = "animate"; + case "center": + this.renderer.scrollCursorIntoView(null, 0.5); + break; + case "animate": + case "cursor": + this.renderer.scrollCursorIntoView(); + break; + case "selectionPart": + var range = this.selection.getRange(); + var config = this.renderer.layerConfig; + if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) { + this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead); + } + break; + default: + break; + } + if (scrollIntoView == "animate") + this.renderer.animateScrolling(this.curOp.scrollTop); + } + var sel = this.selection.toJSON(); + this.curOp.selectionAfter = sel; + this.$lastSel = this.selection.toJSON(); + this.session.getUndoManager().addSelection(sel); + this.prevOp = this.curOp; + this.curOp = null; + } + }; + Editor.prototype.$historyTracker = function (e) { + if (!this.$mergeUndoDeltas) + return; + var prev = this.prevOp; + var mergeableCommands = this.$mergeableCommands; + var shouldMerge = prev.command && (e.command.name == prev.command.name); + if (e.command.name == "insertstring") { + var text = e.args; + if (this.mergeNextCommand === undefined) + this.mergeNextCommand = true; + shouldMerge = shouldMerge + && this.mergeNextCommand // previous command allows to coalesce with + && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type + this.mergeNextCommand = true; + } + else { + shouldMerge = shouldMerge + && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable + } + if (this.$mergeUndoDeltas != "always" + && Date.now() - this.sequenceStartTime > 2000) { + shouldMerge = false; // the sequence is too long + } + if (shouldMerge) + this.session.mergeUndoDeltas = true; + else if (mergeableCommands.indexOf(e.command.name) !== -1) + this.sequenceStartTime = Date.now(); + }; + Editor.prototype.setKeyboardHandler = function (keyboardHandler, cb) { + if (keyboardHandler && typeof keyboardHandler === "string" && keyboardHandler != "ace") { + this.$keybindingId = keyboardHandler; + var _self = this; + config.loadModule(["keybinding", keyboardHandler], function (module) { + if (_self.$keybindingId == keyboardHandler) + _self.keyBinding.setKeyboardHandler(module && module.handler); + cb && cb(); + }); + } + else { + this.$keybindingId = null; + this.keyBinding.setKeyboardHandler(keyboardHandler); + cb && cb(); + } + }; + Editor.prototype.getKeyboardHandler = function () { + return this.keyBinding.getKeyboardHandler(); + }; + Editor.prototype.setSession = function (session) { + if (this.session == session) + return; + if (this.curOp) + this.endOperation(); + this.curOp = {}; + var oldSession = this.session; + if (oldSession) { + this.session.off("change", this.$onDocumentChange); + this.session.off("changeMode", this.$onChangeMode); + this.session.off("tokenizerUpdate", this.$onTokenizerUpdate); + this.session.off("changeTabSize", this.$onChangeTabSize); + this.session.off("changeWrapLimit", this.$onChangeWrapLimit); + this.session.off("changeWrapMode", this.$onChangeWrapMode); + this.session.off("changeFold", this.$onChangeFold); + this.session.off("changeFrontMarker", this.$onChangeFrontMarker); + this.session.off("changeBackMarker", this.$onChangeBackMarker); + this.session.off("changeBreakpoint", this.$onChangeBreakpoint); + this.session.off("changeAnnotation", this.$onChangeAnnotation); + this.session.off("changeOverwrite", this.$onCursorChange); + this.session.off("changeScrollTop", this.$onScrollTopChange); + this.session.off("changeScrollLeft", this.$onScrollLeftChange); + var selection = this.session.getSelection(); + selection.off("changeCursor", this.$onCursorChange); + selection.off("changeSelection", this.$onSelectionChange); + } + this.session = session; + if (session) { + this.$onDocumentChange = this.onDocumentChange.bind(this); + session.on("change", this.$onDocumentChange); + this.renderer.setSession(session); + this.$onChangeMode = this.onChangeMode.bind(this); + session.on("changeMode", this.$onChangeMode); + this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); + session.on("tokenizerUpdate", this.$onTokenizerUpdate); + this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); + session.on("changeTabSize", this.$onChangeTabSize); + this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); + session.on("changeWrapLimit", this.$onChangeWrapLimit); + this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); + session.on("changeWrapMode", this.$onChangeWrapMode); + this.$onChangeFold = this.onChangeFold.bind(this); + session.on("changeFold", this.$onChangeFold); + this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); + this.session.on("changeFrontMarker", this.$onChangeFrontMarker); + this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); + this.session.on("changeBackMarker", this.$onChangeBackMarker); + this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); + this.session.on("changeBreakpoint", this.$onChangeBreakpoint); + this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); + this.session.on("changeAnnotation", this.$onChangeAnnotation); + this.$onCursorChange = this.onCursorChange.bind(this); + this.session.on("changeOverwrite", this.$onCursorChange); + this.$onScrollTopChange = this.onScrollTopChange.bind(this); + this.session.on("changeScrollTop", this.$onScrollTopChange); + this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); + this.session.on("changeScrollLeft", this.$onScrollLeftChange); + this.selection = session.getSelection(); + this.selection.on("changeCursor", this.$onCursorChange); + this.$onSelectionChange = this.onSelectionChange.bind(this); + this.selection.on("changeSelection", this.$onSelectionChange); + this.onChangeMode(); + this.onCursorChange(); + this.onScrollTopChange(); + this.onScrollLeftChange(); + this.onSelectionChange(); + this.onChangeFrontMarker(); + this.onChangeBackMarker(); + this.onChangeBreakpoint(); + this.onChangeAnnotation(); + this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); + this.renderer.updateFull(); + } + else { + this.selection = null; + this.renderer.setSession(session); + } + this._signal("changeSession", { + session: session, + oldSession: oldSession + }); + this.curOp = null; + oldSession && oldSession._signal("changeEditor", { oldEditor: this }); + session && session._signal("changeEditor", { editor: this }); + if (session && !session.destroyed) + session.bgTokenizer.scheduleStart(); + }; + Editor.prototype.getSession = function () { + return this.session; + }; + Editor.prototype.setValue = function (val, cursorPos) { + this.session.doc.setValue(val); + if (!cursorPos) + this.selectAll(); + else if (cursorPos == 1) + this.navigateFileEnd(); + else if (cursorPos == -1) + this.navigateFileStart(); + return val; + }; + Editor.prototype.getValue = function () { + return this.session.getValue(); + }; + Editor.prototype.getSelection = function () { + return this.selection; + }; + Editor.prototype.resize = function (force) { + this.renderer.onResize(force); + }; + Editor.prototype.setTheme = function (theme, cb) { + this.renderer.setTheme(theme, cb); + }; + Editor.prototype.getTheme = function () { + return this.renderer.getTheme(); + }; + Editor.prototype.setStyle = function (style) { + this.renderer.setStyle(style); + }; + Editor.prototype.unsetStyle = function (style) { + this.renderer.unsetStyle(style); + }; + Editor.prototype.getFontSize = function () { + return this.getOption("fontSize") || + dom.computedStyle(this.container).fontSize; + }; + Editor.prototype.setFontSize = function (size) { + this.setOption("fontSize", size); + }; + Editor.prototype.$highlightBrackets = function () { + if (this.$highlightPending) { + return; + } + var self = this; + this.$highlightPending = true; + setTimeout(function () { + self.$highlightPending = false; + var session = self.session; + if (!session || session.destroyed) + return; + if (session.$bracketHighlight) { + session.$bracketHighlight.markerIds.forEach(function (id) { + session.removeMarker(id); + }); + session.$bracketHighlight = null; + } + var pos = self.getCursorPosition(); + var handler = self.getKeyboardHandler(); + var isBackwards = handler && handler.$getDirectionForHighlight && handler.$getDirectionForHighlight(self); + var ranges = session.getMatchingBracketRanges(pos, isBackwards); + if (!ranges) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + if (token && /\b(?:tag-open|tag-name)/.test(token.type)) { + var tagNamesRanges = session.getMatchingTags(pos); + if (tagNamesRanges) { + ranges = [ + tagNamesRanges.openTagName.isEmpty() ? tagNamesRanges.openTag : tagNamesRanges.openTagName, + tagNamesRanges.closeTagName.isEmpty() ? tagNamesRanges.closeTag : tagNamesRanges.closeTagName + ]; + } + } + } + if (!ranges && session.$mode.getMatching) + ranges = session.$mode.getMatching(self.session); + if (!ranges) { + if (self.getHighlightIndentGuides()) + self.renderer.$textLayer.$highlightIndentGuide(); + return; + } + var markerType = "ace_bracket"; + if (!Array.isArray(ranges)) { + ranges = [ranges]; + } + else if (ranges.length == 1) { + markerType = "ace_error_bracket"; + } + if (ranges.length == 2) { + if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0) + ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)]; + else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0) + ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)]; + } + session.$bracketHighlight = { + ranges: ranges, + markerIds: ranges.map(function (range) { + return session.addMarker(range, markerType, "text"); + }) + }; + if (self.getHighlightIndentGuides()) + self.renderer.$textLayer.$highlightIndentGuide(); + }, 50); + }; + Editor.prototype.focus = function () { + this.textInput.focus(); + }; + Editor.prototype.isFocused = function () { + return this.textInput.isFocused(); + }; + Editor.prototype.blur = function () { + this.textInput.blur(); + }; + Editor.prototype.onFocus = function (e) { + if (this.$isFocused) + return; + this.$isFocused = true; + this.renderer.showCursor(); + this.renderer.visualizeFocus(); + this._emit("focus", e); + }; + Editor.prototype.onBlur = function (e) { + if (!this.$isFocused) + return; + this.$isFocused = false; + this.renderer.hideCursor(); + this.renderer.visualizeBlur(); + this._emit("blur", e); + }; + Editor.prototype.$cursorChange = function () { + this.renderer.updateCursor(); + this.$highlightBrackets(); + this.$updateHighlightActiveLine(); + }; + Editor.prototype.onDocumentChange = function (delta) { + var wrap = this.session.$useWrapMode; + var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity); + this.renderer.updateLines(delta.start.row, lastRow, wrap); + this._signal("change", delta); + this.$cursorChange(); + }; + Editor.prototype.onTokenizerUpdate = function (e) { + var rows = e.data; + this.renderer.updateLines(rows.first, rows.last); + }; + Editor.prototype.onScrollTopChange = function () { + this.renderer.scrollToY(this.session.getScrollTop()); + }; + Editor.prototype.onScrollLeftChange = function () { + this.renderer.scrollToX(this.session.getScrollLeft()); + }; + Editor.prototype.onCursorChange = function () { + this.$cursorChange(); + this._signal("changeSelection"); + }; + Editor.prototype.$updateHighlightActiveLine = function () { + var session = this.getSession(); + var highlight; + if (this.$highlightActiveLine) { + if (this.$selectionStyle != "line" || !this.selection.isMultiLine()) + highlight = this.getCursorPosition(); + if (this.renderer.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty()) + highlight = false; + if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1)) + highlight = false; + } + if (session.$highlightLineMarker && !highlight) { + session.removeMarker(session.$highlightLineMarker.id); + session.$highlightLineMarker = null; + } + else if (!session.$highlightLineMarker && highlight) { + var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); + range.id = session.addMarker(range, "ace_active-line", "screenLine"); + session.$highlightLineMarker = range; + } + else if (highlight) { + session.$highlightLineMarker.start.row = highlight.row; + session.$highlightLineMarker.end.row = highlight.row; + session.$highlightLineMarker.start.column = highlight.column; + session._signal("changeBackMarker"); + } + }; + Editor.prototype.onSelectionChange = function (e) { + var session = this.session; + if (session.$selectionMarker) { + session.removeMarker(session.$selectionMarker); + } + session.$selectionMarker = null; + if (!this.selection.isEmpty()) { + var range = this.selection.getRange(); + var style = this.getSelectionStyle(); + session.$selectionMarker = session.addMarker(range, "ace_selection", style); + } + else { + this.$updateHighlightActiveLine(); + } + var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); + this.session.highlight(re); + this._signal("changeSelection"); + }; + Editor.prototype.$getSelectionHighLightRegexp = function () { + var session = this.session; + var selection = this.getSelectionRange(); + if (selection.isEmpty() || selection.isMultiLine()) + return; + var startColumn = selection.start.column; + var endColumn = selection.end.column; + var line = session.getLine(selection.start.row); + var needle = line.substring(startColumn, endColumn); + if (needle.length > 5000 || !/[\w\d]/.test(needle)) + return; + var re = this.$search.$assembleRegExp({ + wholeWord: true, + caseSensitive: true, + needle: needle + }); + var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1); + if (!re.test(wordWithBoundary)) + return; + return re; + }; + Editor.prototype.onChangeFrontMarker = function () { + this.renderer.updateFrontMarkers(); + }; + Editor.prototype.onChangeBackMarker = function () { + this.renderer.updateBackMarkers(); + }; + Editor.prototype.onChangeBreakpoint = function () { + this.renderer.updateBreakpoints(); + }; + Editor.prototype.onChangeAnnotation = function () { + this.renderer.setAnnotations(this.session.getAnnotations()); + }; + Editor.prototype.onChangeMode = function (e) { + this.renderer.updateText(); + this._emit("changeMode", e); + }; + Editor.prototype.onChangeWrapLimit = function () { + this.renderer.updateFull(); + }; + Editor.prototype.onChangeWrapMode = function () { + this.renderer.onResize(true); + }; + Editor.prototype.onChangeFold = function () { + this.$updateHighlightActiveLine(); + this.renderer.updateFull(); + }; + Editor.prototype.getSelectedText = function () { + return this.session.getTextRange(this.getSelectionRange()); + }; + Editor.prototype.getCopyText = function () { + var text = this.getSelectedText(); + var nl = this.session.doc.getNewLineCharacter(); + var copyLine = false; + if (!text && this.$copyWithEmptySelection) { + copyLine = true; + var ranges = this.selection.getAllRanges(); + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (i && ranges[i - 1].start.row == range.start.row) + continue; + text += this.session.getLine(range.start.row) + nl; + } + } + var e = { text: text }; + this._signal("copy", e); + clipboard.lineMode = copyLine ? e.text : false; + return e.text; + }; + Editor.prototype.onCopy = function () { + this.commands.exec("copy", this); + }; + Editor.prototype.onCut = function () { + this.commands.exec("cut", this); + }; + Editor.prototype.onPaste = function (text, event) { + var e = { text: text, event: event }; + this.commands.exec("paste", this, e); + }; + Editor.prototype.$handlePaste = function (e) { + if (typeof e == "string") + e = { text: e }; + this._signal("paste", e); + var text = e.text; + var lineMode = text === clipboard.lineMode; + var session = this.session; + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { + if (lineMode) + session.insert({ row: this.selection.lead.row, column: 0 }, text); + else + this.insert(text); + } + else if (lineMode) { + this.selection.rangeList.ranges.forEach(function (range) { + session.insert({ row: range.start.row, column: 0 }, text); + }); + } + else { + var lines = text.split(/\r\n|\r|\n/); + var ranges = this.selection.rangeList.ranges; + var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]); + if (lines.length != ranges.length || isFullLine) + return this.commands.exec("insertstring", this, text); + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.isEmpty()) + session.remove(range); + session.insert(range.start, lines[i]); + } + } + }; + Editor.prototype.execCommand = function (command, args) { + return this.commands.exec(command, this, args); + }; + Editor.prototype.insert = function (text, pasted) { + var session = this.session; + var mode = session.getMode(); + var cursor = this.getCursorPosition(); + if (this.getBehavioursEnabled() && !pasted) { + var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); + if (transform) { + if (text !== transform.text) { + if (!this.inVirtualSelectionMode) { + this.session.mergeUndoDeltas = false; + this.mergeNextCommand = false; + } + } + text = transform.text; + } + } + if (text == "\t") + text = this.session.getTabString(); + if (!this.selection.isEmpty()) { + var range = this.getSelectionRange(); + cursor = this.session.remove(range); + this.clearSelection(); + } + else if (this.session.getOverwrite() && text.indexOf("\n") == -1) { + var range = Range.fromPoints(cursor, cursor); + range.end.column += text.length; + this.session.remove(range); + } + if (text == "\n" || text == "\r\n") { + var line = session.getLine(cursor.row); + if (cursor.column > line.search(/\S|$/)) { + var d = line.substr(cursor.column).search(/\S|$/); + session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); + } + } + this.clearSelection(); + var start = cursor.column; + var lineState = session.getState(cursor.row); + var line = session.getLine(cursor.row); + var shouldOutdent = mode.checkOutdent(lineState, line, text); + session.insert(cursor, text); + if (transform && transform.selection) { + if (transform.selection.length == 2) { // Transform relative to the current column + this.selection.setSelectionRange(new Range(cursor.row, start + transform.selection[0], cursor.row, start + transform.selection[1])); + } + else { // Transform relative to the current row. + this.selection.setSelectionRange(new Range(cursor.row + transform.selection[0], transform.selection[1], cursor.row + transform.selection[2], transform.selection[3])); + } + } + if (this.$enableAutoIndent) { + if (session.getDocument().isNewLine(text)) { + var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); + session.insert({ row: cursor.row + 1, column: 0 }, lineIndent); + } + if (shouldOutdent) + mode.autoOutdent(lineState, session, cursor.row); + } + }; + Editor.prototype.autoIndent = function () { + var session = this.session; + var mode = session.getMode(); + var ranges = this.selection.isEmpty() + ? [new Range(0, 0, session.doc.getLength() - 1, 0)] + : this.selection.getAllRanges(); + var prevLineState = ""; + var prevLine = ""; + var lineIndent = ""; + var tab = session.getTabString(); + for (var i = 0; i < ranges.length; i++) { + var startRow = ranges[i].start.row; + var endRow = ranges[i].end.row; + for (var row = startRow; row <= endRow; row++) { + if (row > 0) { + prevLineState = session.getState(row - 1); + prevLine = session.getLine(row - 1); + lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab); + } + var line = session.getLine(row); + var currIndent = mode.$getIndent(line); + if (lineIndent !== currIndent) { + if (currIndent.length > 0) { + var range = new Range(row, 0, row, currIndent.length); + session.remove(range); + } + if (lineIndent.length > 0) { + session.insert({ row: row, column: 0 }, lineIndent); + } + } + mode.autoOutdent(prevLineState, session, row); + } + } + }; + Editor.prototype.onTextInput = function (text, composition) { + if (!composition) + return this.keyBinding.onTextInput(text); + this.startOperation({ command: { name: "insertstring" } }); + var applyComposition = this.applyComposition.bind(this, text, composition); + if (this.selection.rangeCount) + this.forEachSelection(applyComposition); + else + applyComposition(); + this.endOperation(); + }; + Editor.prototype.applyComposition = function (text, composition) { + if (composition.extendLeft || composition.extendRight) { + var r = this.selection.getRange(); + r.start.column -= composition.extendLeft; + r.end.column += composition.extendRight; + if (r.start.column < 0) { + r.start.row--; + r.start.column += this.session.getLine(r.start.row).length + 1; + } + this.selection.setRange(r); + if (!text && !r.isEmpty()) + this.remove(); + } + if (text || !this.selection.isEmpty()) + this.insert(text, true); + if (composition.restoreStart || composition.restoreEnd) { + var r = this.selection.getRange(); + r.start.column -= composition.restoreStart; + r.end.column -= composition.restoreEnd; + this.selection.setRange(r); + } + }; + Editor.prototype.onCommandKey = function (e, hashId, keyCode) { + return this.keyBinding.onCommandKey(e, hashId, keyCode); + }; + Editor.prototype.setOverwrite = function (overwrite) { + this.session.setOverwrite(overwrite); + }; + Editor.prototype.getOverwrite = function () { + return this.session.getOverwrite(); + }; + Editor.prototype.toggleOverwrite = function () { + this.session.toggleOverwrite(); + }; + Editor.prototype.setScrollSpeed = function (speed) { + this.setOption("scrollSpeed", speed); + }; + Editor.prototype.getScrollSpeed = function () { + return this.getOption("scrollSpeed"); + }; + Editor.prototype.setDragDelay = function (dragDelay) { + this.setOption("dragDelay", dragDelay); + }; + Editor.prototype.getDragDelay = function () { + return this.getOption("dragDelay"); + }; + Editor.prototype.setSelectionStyle = function (val) { + this.setOption("selectionStyle", val); + }; + Editor.prototype.getSelectionStyle = function () { + return this.getOption("selectionStyle"); + }; + Editor.prototype.setHighlightActiveLine = function (shouldHighlight) { + this.setOption("highlightActiveLine", shouldHighlight); + }; + Editor.prototype.getHighlightActiveLine = function () { + return this.getOption("highlightActiveLine"); + }; + Editor.prototype.setHighlightGutterLine = function (shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + Editor.prototype.getHighlightGutterLine = function () { + return this.getOption("highlightGutterLine"); + }; + Editor.prototype.setHighlightSelectedWord = function (shouldHighlight) { + this.setOption("highlightSelectedWord", shouldHighlight); + }; + Editor.prototype.getHighlightSelectedWord = function () { + return this.$highlightSelectedWord; + }; + Editor.prototype.setAnimatedScroll = function (shouldAnimate) { + this.renderer.setAnimatedScroll(shouldAnimate); + }; + Editor.prototype.getAnimatedScroll = function () { + return this.renderer.getAnimatedScroll(); + }; + Editor.prototype.setShowInvisibles = function (showInvisibles) { + this.renderer.setShowInvisibles(showInvisibles); + }; + Editor.prototype.getShowInvisibles = function () { + return this.renderer.getShowInvisibles(); + }; + Editor.prototype.setDisplayIndentGuides = function (display) { + this.renderer.setDisplayIndentGuides(display); + }; + Editor.prototype.getDisplayIndentGuides = function () { + return this.renderer.getDisplayIndentGuides(); + }; + Editor.prototype.setHighlightIndentGuides = function (highlight) { + this.renderer.setHighlightIndentGuides(highlight); + }; + Editor.prototype.getHighlightIndentGuides = function () { + return this.renderer.getHighlightIndentGuides(); + }; + Editor.prototype.setShowPrintMargin = function (showPrintMargin) { + this.renderer.setShowPrintMargin(showPrintMargin); + }; + Editor.prototype.getShowPrintMargin = function () { + return this.renderer.getShowPrintMargin(); + }; + Editor.prototype.setPrintMarginColumn = function (showPrintMargin) { + this.renderer.setPrintMarginColumn(showPrintMargin); + }; + Editor.prototype.getPrintMarginColumn = function () { + return this.renderer.getPrintMarginColumn(); + }; + Editor.prototype.setReadOnly = function (readOnly) { + this.setOption("readOnly", readOnly); + }; + Editor.prototype.getReadOnly = function () { + return this.getOption("readOnly"); + }; + Editor.prototype.setBehavioursEnabled = function (enabled) { + this.setOption("behavioursEnabled", enabled); + }; + Editor.prototype.getBehavioursEnabled = function () { + return this.getOption("behavioursEnabled"); + }; + Editor.prototype.setWrapBehavioursEnabled = function (enabled) { + this.setOption("wrapBehavioursEnabled", enabled); + }; + Editor.prototype.getWrapBehavioursEnabled = function () { + return this.getOption("wrapBehavioursEnabled"); + }; + Editor.prototype.setShowFoldWidgets = function (show) { + this.setOption("showFoldWidgets", show); + }; + Editor.prototype.getShowFoldWidgets = function () { + return this.getOption("showFoldWidgets"); + }; + Editor.prototype.setFadeFoldWidgets = function (fade) { + this.setOption("fadeFoldWidgets", fade); + }; + Editor.prototype.getFadeFoldWidgets = function () { + return this.getOption("fadeFoldWidgets"); + }; + Editor.prototype.remove = function (dir) { + if (this.selection.isEmpty()) { + if (dir == "left") + this.selection.selectLeft(); + else + this.selection.selectRight(); + } + var range = this.getSelectionRange(); + if (this.getBehavioursEnabled()) { + var session = this.session; + var state = session.getState(range.start.row); + var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); + if (range.end.column === 0) { + var text = session.getTextRange(range); + if (text[text.length - 1] == "\n") { + var line = session.getLine(range.end.row); + if (/^\s+$/.test(line)) { + range.end.column = line.length; + } + } + } + if (new_range) + range = new_range; + } + this.session.remove(range); + this.clearSelection(); + }; + Editor.prototype.removeWordRight = function () { + if (this.selection.isEmpty()) + this.selection.selectWordRight(); + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + Editor.prototype.removeWordLeft = function () { + if (this.selection.isEmpty()) + this.selection.selectWordLeft(); + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + Editor.prototype.removeToLineStart = function () { + if (this.selection.isEmpty()) + this.selection.selectLineStart(); + if (this.selection.isEmpty()) + this.selection.selectLeft(); + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + Editor.prototype.removeToLineEnd = function () { + if (this.selection.isEmpty()) + this.selection.selectLineEnd(); + var range = this.getSelectionRange(); + if (range.start.column == range.end.column && range.start.row == range.end.row) { + range.end.column = 0; + range.end.row++; + } + this.session.remove(range); + this.clearSelection(); + }; + Editor.prototype.splitLine = function () { + if (!this.selection.isEmpty()) { + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + } + var cursor = this.getCursorPosition(); + this.insert("\n"); + this.moveCursorToPosition(cursor); + }; + Editor.prototype.setGhostText = function (text, position) { + if (!this.session.widgetManager) { + this.session.widgetManager = new LineWidgets(this.session); + this.session.widgetManager.attach(this); + } + this.renderer.setGhostText(text, position); + }; + Editor.prototype.removeGhostText = function () { + if (!this.session.widgetManager) + return; + this.renderer.removeGhostText(); + }; + Editor.prototype.transposeLetters = function () { + if (!this.selection.isEmpty()) { + return; + } + var cursor = this.getCursorPosition(); + var column = cursor.column; + if (column === 0) + return; + var line = this.session.getLine(cursor.row); + var swap, range; + if (column < line.length) { + swap = line.charAt(column) + line.charAt(column - 1); + range = new Range(cursor.row, column - 1, cursor.row, column + 1); + } + else { + swap = line.charAt(column - 1) + line.charAt(column - 2); + range = new Range(cursor.row, column - 2, cursor.row, column); + } + this.session.replace(range, swap); + this.session.selection.moveToPosition(range.end); + }; + Editor.prototype.toLowerCase = function () { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toLowerCase()); + this.selection.setSelectionRange(originalRange); + }; + Editor.prototype.toUpperCase = function () { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toUpperCase()); + this.selection.setSelectionRange(originalRange); + }; + Editor.prototype.indent = function () { + var session = this.session; + var range = this.getSelectionRange(); + if (range.start.row < range.end.row) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } + else if (range.start.column < range.end.column) { + var text = session.getTextRange(range); + if (!/^\s+$/.test(text)) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } + } + var line = session.getLine(range.start.row); + var position = range.start; + var size = session.getTabSize(); + var column = session.documentToScreenColumn(position.row, position.column); + if (this.session.getUseSoftTabs()) { + var count = (size - column % size); + var indentString = lang.stringRepeat(" ", count); + } + else { + var count = column % size; + while (line[range.start.column - 1] == " " && count) { + range.start.column--; + count--; + } + this.selection.setSelectionRange(range); + indentString = "\t"; + } + return this.insert(indentString); + }; + Editor.prototype.blockIndent = function () { + var rows = this.$getSelectedRows(); + this.session.indentRows(rows.first, rows.last, "\t"); + }; + Editor.prototype.blockOutdent = function () { + var selection = this.session.getSelection(); + this.session.outdentRows(selection.getRange()); + }; + Editor.prototype.sortLines = function () { + var rows = this.$getSelectedRows(); + var session = this.session; + var lines = []; + for (var i = rows.first; i <= rows.last; i++) + lines.push(session.getLine(i)); + lines.sort(function (a, b) { + if (a.toLowerCase() < b.toLowerCase()) + return -1; + if (a.toLowerCase() > b.toLowerCase()) + return 1; + return 0; + }); + var deleteRange = new Range(0, 0, 0, 0); + for (var i = rows.first; i <= rows.last; i++) { + var line = session.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = line.length; + session.replace(deleteRange, lines[i - rows.first]); + } + }; + Editor.prototype.toggleCommentLines = function () { + var state = this.session.getState(this.getCursorPosition().row); + var rows = this.$getSelectedRows(); + this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); + }; + Editor.prototype.toggleBlockComment = function () { + var cursor = this.getCursorPosition(); + var state = this.session.getState(cursor.row); + var range = this.getSelectionRange(); + this.session.getMode().toggleBlockComment(state, this.session, range, cursor); + }; + Editor.prototype.getNumberAt = function (row, column) { + var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g; + _numberRx.lastIndex = 0; + var s = this.session.getLine(row); + while (_numberRx.lastIndex < column) { + var m = _numberRx.exec(s); + if (m.index <= column && m.index + m[0].length >= column) { + var number = { + value: m[0], + start: m.index, + end: m.index + m[0].length + }; + return number; + } + } + return null; + }; + Editor.prototype.modifyNumber = function (amount) { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + var charRange = new Range(row, column - 1, row, column); + var c = this.session.getTextRange(charRange); + if (!isNaN(parseFloat(c)) && isFinite(c)) { + var nr = this.getNumberAt(row, column); + if (nr) { + var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; + var decimals = nr.start + nr.value.length - fp; + var t = parseFloat(nr.value); + t *= Math.pow(10, decimals); + if (fp !== nr.end && column < fp) { + amount *= Math.pow(10, nr.end - column - 1); + } + else { + amount *= Math.pow(10, nr.end - column); + } + t += amount; + t /= Math.pow(10, decimals); + var nnr = t.toFixed(decimals); + var replaceRange = new Range(row, nr.start, row, nr.end); + this.session.replace(replaceRange, nnr); + this.moveCursorTo(row, Math.max(nr.start + 1, column + nnr.length - nr.value.length)); + } + } + else { + this.toggleWord(); + } + }; + Editor.prototype.toggleWord = function () { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + this.selection.selectWord(); + var currentState = this.getSelectedText(); + var currWordStart = this.selection.getWordRange().start.column; + var wordParts = currentState.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, '$1 ').split(/\s/); + var delta = column - currWordStart - 1; + if (delta < 0) + delta = 0; + var curLength = 0, itLength = 0; + var that = this; + if (currentState.match(/[A-Za-z0-9_]+/)) { + wordParts.forEach(function (item, i) { + itLength = curLength + item.length; + if (delta >= curLength && delta <= itLength) { + currentState = item; + that.selection.clearSelection(); + that.moveCursorTo(row, curLength + currWordStart); + that.selection.selectTo(row, itLength + currWordStart); + } + curLength = itLength; + }); + } + var wordPairs = this.$toggleWordPairs; + var reg; + for (var i = 0; i < wordPairs.length; i++) { + var item = wordPairs[i]; + for (var j = 0; j <= 1; j++) { + var negate = +!j; + var firstCondition = currentState.match(new RegExp('^\\s?_?(' + lang.escapeRegExp(item[j]) + ')\\s?$', 'i')); + if (firstCondition) { + var secondCondition = currentState.match(new RegExp('([_]|^|\\s)(' + lang.escapeRegExp(firstCondition[1]) + ')($|\\s)', 'g')); + if (secondCondition) { + reg = currentState.replace(new RegExp(lang.escapeRegExp(item[j]), 'i'), function (result) { + var res = item[negate]; + if (result.toUpperCase() == result) { + res = res.toUpperCase(); + } + else if (result.charAt(0).toUpperCase() == result.charAt(0)) { + res = res.substr(0, 0) + item[negate].charAt(0).toUpperCase() + res.substr(1); + } + return res; + }); + this.insert(reg); + reg = ""; + } + } + } + } + }; + Editor.prototype.findLinkAt = function (row, column) { + var e_1, _a; + var line = this.session.getLine(row); + var wordParts = line.split(/((?:https?|ftp):\/\/[\S]+)/); + var columnPosition = column; + if (columnPosition < 0) + columnPosition = 0; + var previousPosition = 0, currentPosition = 0, match; + try { + for (var wordParts_1 = __values(wordParts), wordParts_1_1 = wordParts_1.next(); !wordParts_1_1.done; wordParts_1_1 = wordParts_1.next()) { + var item = wordParts_1_1.value; + currentPosition = previousPosition + item.length; + if (columnPosition >= previousPosition && columnPosition <= currentPosition) { + if (item.match(/((?:https?|ftp):\/\/[\S]+)/)) { + match = item.replace(/[\s:.,'";}\]]+$/, ""); + break; + } + } + previousPosition = currentPosition; + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (wordParts_1_1 && !wordParts_1_1.done && (_a = wordParts_1.return)) _a.call(wordParts_1); + } + finally { if (e_1) throw e_1.error; } + } + return match; + }; + Editor.prototype.openLink = function () { + var cursor = this.selection.getCursor(); + var url = this.findLinkAt(cursor.row, cursor.column); + if (url) + window.open(url, '_blank'); + return url != null; + }; + Editor.prototype.removeLines = function () { + var rows = this.$getSelectedRows(); + this.session.removeFullLines(rows.first, rows.last); + this.clearSelection(); + }; + Editor.prototype.duplicateSelection = function () { + var sel = this.selection; + var doc = this.session; + var range = sel.getRange(); + var reverse = sel.isBackwards(); + if (range.isEmpty()) { + var row = range.start.row; + doc.duplicateLines(row, row); + } + else { + var point = reverse ? range.start : range.end; + var endPoint = doc.insert(point, doc.getTextRange(range)); + range.start = point; + range.end = endPoint; + sel.setSelectionRange(range, reverse); + } + }; + Editor.prototype.moveLinesDown = function () { + this.$moveLines(1, false); + }; + Editor.prototype.moveLinesUp = function () { + this.$moveLines(-1, false); + }; + Editor.prototype.moveText = function (range, toPosition, copy) { + return this.session.moveText(range, toPosition, copy); + }; + Editor.prototype.copyLinesUp = function () { + this.$moveLines(-1, true); + }; + Editor.prototype.copyLinesDown = function () { + this.$moveLines(1, true); + }; + Editor.prototype.$moveLines = function (dir, copy) { + var rows, moved; + var selection = this.selection; + if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { + var range = selection.toOrientedRange(); + rows = this.$getSelectedRows(range); + moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir); + if (copy && dir == -1) + moved = 0; + range.moveBy(moved, 0); + selection.fromOrientedRange(range); + } + else { + var ranges = selection.rangeList.ranges; + selection.rangeList.detach(this.session); + this.inVirtualSelectionMode = true; + var diff = 0; + var totalDiff = 0; + var l = ranges.length; + for (var i = 0; i < l; i++) { + var rangeIndex = i; + ranges[i].moveBy(diff, 0); + rows = this.$getSelectedRows(ranges[i]); + var first = rows.first; + var last = rows.last; + while (++i < l) { + if (totalDiff) + ranges[i].moveBy(totalDiff, 0); + var subRows = this.$getSelectedRows(ranges[i]); + if (copy && subRows.first != last) + break; + else if (!copy && subRows.first > last + 1) + break; + last = subRows.last; + } + i--; + diff = this.session.$moveLines(first, last, copy ? 0 : dir); + if (copy && dir == -1) + rangeIndex = i + 1; + while (rangeIndex <= i) { + ranges[rangeIndex].moveBy(diff, 0); + rangeIndex++; + } + if (!copy) + diff = 0; + totalDiff += diff; + } + selection.fromOrientedRange(selection.ranges[0]); + selection.rangeList.attach(this.session); + this.inVirtualSelectionMode = false; + } + }; + Editor.prototype.$getSelectedRows = function (range) { + range = (range || this.getSelectionRange()).collapseRows(); + return { + first: this.session.getRowFoldStart(range.start.row), + last: this.session.getRowFoldEnd(range.end.row) + }; + }; + Editor.prototype.onCompositionStart = function (compositionState) { + this.renderer.showComposition(compositionState); + }; + Editor.prototype.onCompositionUpdate = function (text) { + this.renderer.setCompositionText(text); + }; + Editor.prototype.onCompositionEnd = function () { + this.renderer.hideComposition(); + }; + Editor.prototype.getFirstVisibleRow = function () { + return this.renderer.getFirstVisibleRow(); + }; + Editor.prototype.getLastVisibleRow = function () { + return this.renderer.getLastVisibleRow(); + }; + Editor.prototype.isRowVisible = function (row) { + return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); + }; + Editor.prototype.isRowFullyVisible = function (row) { + return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); + }; + Editor.prototype.$getVisibleRowCount = function () { + return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; + }; + Editor.prototype.$moveByPage = function (dir, select) { + var renderer = this.renderer; + var config = this.renderer.layerConfig; + var rows = dir * Math.floor(config.height / config.lineHeight); + if (select === true) { + this.selection.$moveSelection(function () { + this.moveCursorBy(rows, 0); + }); + } + else if (select === false) { + this.selection.moveCursorBy(rows, 0); + this.selection.clearSelection(); + } + var scrollTop = renderer.scrollTop; + renderer.scrollBy(0, rows * config.lineHeight); + if (select != null) + renderer.scrollCursorIntoView(null, 0.5); + renderer.animateScrolling(scrollTop); + }; + Editor.prototype.selectPageDown = function () { + this.$moveByPage(1, true); + }; + Editor.prototype.selectPageUp = function () { + this.$moveByPage(-1, true); + }; + Editor.prototype.gotoPageDown = function () { + this.$moveByPage(1, false); + }; + Editor.prototype.gotoPageUp = function () { + this.$moveByPage(-1, false); + }; + Editor.prototype.scrollPageDown = function () { + this.$moveByPage(1); + }; + Editor.prototype.scrollPageUp = function () { + this.$moveByPage(-1); + }; + Editor.prototype.scrollToRow = function (row) { + this.renderer.scrollToRow(row); + }; + Editor.prototype.scrollToLine = function (line, center, animate, callback) { + this.renderer.scrollToLine(line, center, animate, callback); + }; + Editor.prototype.centerSelection = function () { + var range = this.getSelectionRange(); + var pos = { + row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), + column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) + }; + this.renderer.alignCursor(pos, 0.5); + }; + Editor.prototype.getCursorPosition = function () { + return this.selection.getCursor(); + }; + Editor.prototype.getCursorPositionScreen = function () { + return this.session.documentToScreenPosition(this.getCursorPosition()); + }; + Editor.prototype.getSelectionRange = function () { + return this.selection.getRange(); + }; + Editor.prototype.selectAll = function () { + this.selection.selectAll(); + }; + Editor.prototype.clearSelection = function () { + this.selection.clearSelection(); + }; + Editor.prototype.moveCursorTo = function (row, column) { + this.selection.moveCursorTo(row, column); + }; + Editor.prototype.moveCursorToPosition = function (pos) { + this.selection.moveCursorToPosition(pos); + }; + Editor.prototype.jumpToMatching = function (select, expand) { + var cursor = this.getCursorPosition(); + var iterator = new TokenIterator(this.session, cursor.row, cursor.column); + var prevToken = iterator.getCurrentToken(); + var tokenCount = 0; + if (prevToken && prevToken.type.indexOf('tag-name') !== -1) { + prevToken = iterator.stepBackward(); + } + var token = prevToken || iterator.stepForward(); + if (!token) + return; + var matchType; + var found = false; + var depth = {}; + var i = cursor.column - token.start; + var bracketType; + var brackets = { + ")": "(", + "(": "(", + "]": "[", + "[": "[", + "{": "{", + "}": "{" + }; + do { + if (token.value.match(/[{}()\[\]]/g)) { + for (; i < token.value.length && !found; i++) { + if (!brackets[token.value[i]]) { + continue; + } + bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen"); + if (isNaN(depth[bracketType])) { + depth[bracketType] = 0; + } + switch (token.value[i]) { + case '(': + case '[': + case '{': + depth[bracketType]++; + break; + case ')': + case ']': + case '}': + depth[bracketType]--; + if (depth[bracketType] === -1) { + matchType = 'bracket'; + found = true; + } + break; + } + } + } + else if (token.type.indexOf('tag-name') !== -1) { + if (isNaN(depth[token.value])) { + depth[token.value] = 0; + } + if (prevToken.value === '<' && tokenCount > 1) { + depth[token.value]++; + } + else if (prevToken.value === '= 0; --i) { + if (this.$tryReplace(ranges[i], replacement)) { + replaced++; + } + } + this.selection.setSelectionRange(selection); + return replaced; + }; + Editor.prototype.$tryReplace = function (range, replacement) { + var input = this.session.getTextRange(range); + replacement = this.$search.replace(input, replacement); + if (replacement !== null) { + range.end = this.session.replace(range, replacement); + return range; + } + else { + return null; + } + }; + Editor.prototype.getLastSearchOptions = function () { + return this.$search.getOptions(); + }; + Editor.prototype.find = function (needle, options, animate) { + if (!options) + options = {}; + if (typeof needle == "string" || needle instanceof RegExp) + options.needle = needle; + else if (typeof needle == "object") + oop.mixin(options, needle); + var range = this.selection.getRange(); + if (options.needle == null) { + needle = this.session.getTextRange(range) + || this.$search.$options.needle; + if (!needle) { + range = this.session.getWordRange(range.start.row, range.start.column); + needle = this.session.getTextRange(range); + } + this.$search.set({ needle: needle }); + } + this.$search.set(options); + if (!options.start) + this.$search.set({ start: range }); + var newRange = this.$search.find(this.session); + if (options.preventScroll) + return newRange; + if (newRange) { + this.revealRange(newRange, animate); + return newRange; + } + if (options.backwards) + range.start = range.end; + else + range.end = range.start; + this.selection.setRange(range); + }; + Editor.prototype.findNext = function (options, animate) { + this.find({ skipCurrent: true, backwards: false }, options, animate); + }; + Editor.prototype.findPrevious = function (options, animate) { + this.find(options, { skipCurrent: true, backwards: true }, animate); + }; + Editor.prototype.revealRange = function (range, animate) { + this.session.unfold(range); + this.selection.setSelectionRange(range); + var scrollTop = this.renderer.scrollTop; + this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); + if (animate !== false) + this.renderer.animateScrolling(scrollTop); + }; + Editor.prototype.undo = function () { + this.session.getUndoManager().undo(this.session); + this.renderer.scrollCursorIntoView(null, 0.5); + }; + Editor.prototype.redo = function () { + this.session.getUndoManager().redo(this.session); + this.renderer.scrollCursorIntoView(null, 0.5); + }; + Editor.prototype.destroy = function () { + if (this.$toDestroy) { + this.$toDestroy.forEach(function (el) { + el.destroy(); + }); + this.$toDestroy = null; + } + if (this.$mouseHandler) + this.$mouseHandler.destroy(); + this.renderer.destroy(); + this._signal("destroy", this); + if (this.session) + this.session.destroy(); + if (this._$emitInputEvent) + this._$emitInputEvent.cancel(); + this.removeAllListeners(); + }; + Editor.prototype.setAutoScrollEditorIntoView = function (enable) { + if (!enable) + return; + var rect; + var self = this; + var shouldScroll = false; + if (!this.$scrollAnchor) + this.$scrollAnchor = document.createElement("div"); + var scrollAnchor = this.$scrollAnchor; + scrollAnchor.style.cssText = "position:absolute"; + this.container.insertBefore(scrollAnchor, this.container.firstChild); + var onChangeSelection = this.on("changeSelection", function () { + shouldScroll = true; + }); + var onBeforeRender = this.renderer.on("beforeRender", function () { + if (shouldScroll) + rect = self.renderer.container.getBoundingClientRect(); + }); + var onAfterRender = this.renderer.on("afterRender", function () { + if (shouldScroll && rect && (self.isFocused() + || self.searchBox && self.searchBox.isFocused())) { + var renderer = self.renderer; + var pos = renderer.$cursorLayer.$pixelPos; + var config = renderer.layerConfig; + var top = pos.top - config.offset; + if (pos.top >= 0 && top + rect.top < 0) { + shouldScroll = true; + } + else if (pos.top < config.height && + pos.top + rect.top + config.lineHeight > window.innerHeight) { + shouldScroll = false; + } + else { + shouldScroll = null; + } + if (shouldScroll != null) { + scrollAnchor.style.top = top + "px"; + scrollAnchor.style.left = pos.left + "px"; + scrollAnchor.style.height = config.lineHeight + "px"; + scrollAnchor.scrollIntoView(shouldScroll); + } + shouldScroll = rect = null; + } + }); + this.setAutoScrollEditorIntoView = function (enable) { + if (enable) + return; + delete this.setAutoScrollEditorIntoView; + this.off("changeSelection", onChangeSelection); + this.renderer.off("afterRender", onAfterRender); + this.renderer.off("beforeRender", onBeforeRender); + }; + }; + Editor.prototype.$resetCursorStyle = function () { + var style = this.$cursorStyle || "ace"; + var cursorLayer = this.renderer.$cursorLayer; + if (!cursorLayer) + return; + cursorLayer.setSmoothBlinking(/smooth/.test(style)); + cursorLayer.isBlinking = !this.$readOnly && style != "wide"; + dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style)); + }; + Editor.prototype.prompt = function (message, options, callback) { + var editor = this; + config.loadModule("ace/ext/prompt", function (module) { + module.prompt(editor, message, options, callback); + }); + }; + return Editor; +}()); +Editor.$uid = 0; +Editor.prototype.curOp = null; +Editor.prototype.prevOp = {}; +Editor.prototype.$mergeableCommands = ["backspace", "del", "insertstring"]; +Editor.prototype.$toggleWordPairs = [ + ["first", "last"], + ["true", "false"], + ["yes", "no"], + ["width", "height"], + ["top", "bottom"], + ["right", "left"], + ["on", "off"], + ["x", "y"], + ["get", "set"], + ["max", "min"], + ["horizontal", "vertical"], + ["show", "hide"], + ["add", "remove"], + ["up", "down"], + ["before", "after"], + ["even", "odd"], + ["in", "out"], + ["inside", "outside"], + ["next", "previous"], + ["increase", "decrease"], + ["attach", "detach"], + ["&&", "||"], + ["==", "!="] +]; +oop.implement(Editor.prototype, EventEmitter); +config.defineOptions(Editor.prototype, "editor", { + selectionStyle: { + set: function (style) { + this.onSelectionChange(); + this._signal("changeSelectionStyle", { data: style }); + }, + initialValue: "line" + }, + highlightActiveLine: { + set: function () { this.$updateHighlightActiveLine(); }, + initialValue: true + }, + highlightSelectedWord: { + set: function (shouldHighlight) { this.$onSelectionChange(); }, + initialValue: true + }, + readOnly: { + set: function (readOnly) { + this.textInput.setReadOnly(readOnly); + this.$resetCursorStyle(); + }, + initialValue: false + }, + copyWithEmptySelection: { + set: function (value) { + this.textInput.setCopyWithEmptySelection(value); + }, + initialValue: false + }, + cursorStyle: { + set: function (val) { this.$resetCursorStyle(); }, + values: ["ace", "slim", "smooth", "wide"], + initialValue: "ace" + }, + mergeUndoDeltas: { + values: [false, true, "always"], + initialValue: true + }, + behavioursEnabled: { initialValue: true }, + wrapBehavioursEnabled: { initialValue: true }, + enableAutoIndent: { initialValue: true }, + autoScrollEditorIntoView: { + set: function (val) { this.setAutoScrollEditorIntoView(val); } + }, + keyboardHandler: { + set: function (val) { this.setKeyboardHandler(val); }, + get: function () { return this.$keybindingId; }, + handlesSet: true + }, + value: { + set: function (val) { this.session.setValue(val); }, + get: function () { return this.getValue(); }, + handlesSet: true, + hidden: true + }, + session: { + set: function (val) { this.setSession(val); }, + get: function () { return this.session; }, + handlesSet: true, + hidden: true + }, + showLineNumbers: { + set: function (show) { + this.renderer.$gutterLayer.setShowLineNumbers(show); + this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER); + if (show && this.$relativeLineNumbers) + relativeNumberRenderer.attach(this); + else + relativeNumberRenderer.detach(this); + }, + initialValue: true + }, + relativeLineNumbers: { + set: function (value) { + if (this.$showLineNumbers && value) + relativeNumberRenderer.attach(this); + else + relativeNumberRenderer.detach(this); + } + }, + placeholder: { + set: function (message) { + if (!this.$updatePlaceholder) { + this.$updatePlaceholder = function () { + var hasValue = this.session && (this.renderer.$composition || + this.session.getLength() > 1 || this.session.getLine(0).length > 0); + if (hasValue && this.renderer.placeholderNode) { + this.renderer.off("afterRender", this.$updatePlaceholder); + dom.removeCssClass(this.container, "ace_hasPlaceholder"); + this.renderer.placeholderNode.remove(); + this.renderer.placeholderNode = null; + } + else if (!hasValue && !this.renderer.placeholderNode) { + this.renderer.on("afterRender", this.$updatePlaceholder); + dom.addCssClass(this.container, "ace_hasPlaceholder"); + var el = dom.createElement("div"); + el.className = "ace_placeholder"; + el.textContent = this.$placeholder || ""; + this.renderer.placeholderNode = el; + this.renderer.content.appendChild(this.renderer.placeholderNode); + } + else if (!hasValue && this.renderer.placeholderNode) { + this.renderer.placeholderNode.textContent = this.$placeholder || ""; + } + }.bind(this); + this.on("input", this.$updatePlaceholder); + } + this.$updatePlaceholder(); + } + }, + enableKeyboardAccessibility: { + set: function (value) { + var blurCommand = { + name: "blurTextInput", + description: "Set focus to the editor content div to allow tabbing through the page", + bindKey: "Esc", + exec: function (editor) { + editor.blur(); + editor.renderer.scroller.focus(); + }, + readOnly: true + }; + var focusOnEnterKeyup = function (e) { + if (e.target == this.renderer.scroller && e.keyCode === keys['enter']) { + e.preventDefault(); + var row = this.getCursorPosition().row; + if (!this.isRowVisible(row)) + this.scrollToLine(row, true, true); + this.focus(); + } + }; + var gutterKeyboardHandler; + if (value) { + this.renderer.enableKeyboardAccessibility = true; + this.renderer.keyboardFocusClassName = "ace_keyboard-focus"; + this.textInput.getElement().setAttribute("tabindex", -1); + this.textInput.setNumberOfExtraLines(useragent.isWin ? 3 : 0); + this.renderer.scroller.setAttribute("tabindex", 0); + this.renderer.scroller.setAttribute("role", "group"); + this.renderer.scroller.setAttribute("aria-roledescription", nls("editor.scroller.aria-roledescription", "editor")); + this.renderer.scroller.classList.add(this.renderer.keyboardFocusClassName); + this.renderer.scroller.setAttribute("aria-label", nls("editor.scroller.aria-label", "Editor content, press Enter to start editing, press Escape to exit")); + this.renderer.scroller.addEventListener("keyup", focusOnEnterKeyup.bind(this)); + this.commands.addCommand(blurCommand); + this.renderer.$gutter.setAttribute("tabindex", 0); + this.renderer.$gutter.setAttribute("aria-hidden", false); + this.renderer.$gutter.setAttribute("role", "group"); + this.renderer.$gutter.setAttribute("aria-roledescription", nls("editor.gutter.aria-roledescription", "editor")); + this.renderer.$gutter.setAttribute("aria-label", nls("editor.gutter.aria-label", "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit")); + this.renderer.$gutter.classList.add(this.renderer.keyboardFocusClassName); + this.renderer.content.setAttribute("aria-hidden", true); + if (!gutterKeyboardHandler) + gutterKeyboardHandler = new GutterKeyboardHandler(this); + gutterKeyboardHandler.addListener(); + this.textInput.setAriaOptions({ + setLabel: true + }); + } + else { + this.renderer.enableKeyboardAccessibility = false; + this.textInput.getElement().setAttribute("tabindex", 0); + this.textInput.setNumberOfExtraLines(0); + this.renderer.scroller.setAttribute("tabindex", -1); + this.renderer.scroller.removeAttribute("role"); + this.renderer.scroller.removeAttribute("aria-roledescription"); + this.renderer.scroller.classList.remove(this.renderer.keyboardFocusClassName); + this.renderer.scroller.removeAttribute("aria-label"); + this.renderer.scroller.removeEventListener("keyup", focusOnEnterKeyup.bind(this)); + this.commands.removeCommand(blurCommand); + this.renderer.content.removeAttribute("aria-hidden"); + this.renderer.$gutter.setAttribute("tabindex", -1); + this.renderer.$gutter.setAttribute("aria-hidden", true); + this.renderer.$gutter.removeAttribute("role"); + this.renderer.$gutter.removeAttribute("aria-roledescription"); + this.renderer.$gutter.removeAttribute("aria-label"); + this.renderer.$gutter.classList.remove(this.renderer.keyboardFocusClassName); + if (gutterKeyboardHandler) + gutterKeyboardHandler.removeListener(); + } + }, + initialValue: false + }, + textInputAriaLabel: { + set: function (val) { this.$textInputAriaLabel = val; }, + initialValue: "" + }, + enableMobileMenu: { + set: function (val) { this.$enableMobileMenu = val; }, + initialValue: true + }, + customScrollbar: "renderer", + hScrollBarAlwaysVisible: "renderer", + vScrollBarAlwaysVisible: "renderer", + highlightGutterLine: "renderer", + animatedScroll: "renderer", + showInvisibles: "renderer", + showPrintMargin: "renderer", + printMarginColumn: "renderer", + printMargin: "renderer", + fadeFoldWidgets: "renderer", + showFoldWidgets: "renderer", + displayIndentGuides: "renderer", + highlightIndentGuides: "renderer", + showGutter: "renderer", + fontSize: "renderer", + fontFamily: "renderer", + maxLines: "renderer", + minLines: "renderer", + scrollPastEnd: "renderer", + fixedWidthGutter: "renderer", + theme: "renderer", + hasCssTransforms: "renderer", + maxPixelHeight: "renderer", + useTextareaForIME: "renderer", + useResizeObserver: "renderer", + useSvgGutterIcons: "renderer", + showFoldedAnnotations: "renderer", + scrollSpeed: "$mouseHandler", + dragDelay: "$mouseHandler", + dragEnabled: "$mouseHandler", + focusTimeout: "$mouseHandler", + tooltipFollowsMouse: "$mouseHandler", + firstLineNumber: "session", + overwrite: "session", + newLineMode: "session", + useWorker: "session", + useSoftTabs: "session", + navigateWithinSoftTabs: "session", + tabSize: "session", + wrap: "session", + indentedSoftWrap: "session", + foldStyle: "session", + mode: "session" +}); +var relativeNumberRenderer = { + getText: function (/**@type{EditSession}*/ session, /**@type{number}*/ row) { + return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9 ? "\xb7" : ""))) + ""; + }, + getWidth: function (session, /**@type{number}*/ lastLineNumber, config) { + return Math.max(lastLineNumber.toString().length, (config.lastRow + 1).toString().length, 2) * config.characterWidth; + }, + update: function (e, /**@type{Editor}*/ editor) { + editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER); + }, + attach: function (/**@type{Editor}*/ editor) { + editor.renderer.$gutterLayer.$renderer = this; + editor.on("changeSelection", this.update); + this.update(null, editor); + }, + detach: function (/**@type{Editor}*/ editor) { + if (editor.renderer.$gutterLayer.$renderer == this) + editor.renderer.$gutterLayer.$renderer = null; + editor.off("changeSelection", this.update); + this.update(null, editor); + } +}; +exports.Editor = Editor; + +}); + +ace.define("ace/layer/lines",["require","exports","module","ace/lib/dom"], function(require, exports, module){"use strict"; +var dom = require("../lib/dom"); +var Lines = /** @class */ (function () { + function Lines(element, canvasHeight) { + this.element = element; + this.canvasHeight = canvasHeight || 500000; + this.element.style.height = (this.canvasHeight * 2) + "px"; + this.cells = []; + this.cellCache = []; + this.$offsetCoefficient = 0; + } + Lines.prototype.moveContainer = function (config) { + dom.translate(this.element, 0, -((config.firstRowScreen * config.lineHeight) % this.canvasHeight) - config.offset * this.$offsetCoefficient); + }; + Lines.prototype.pageChanged = function (oldConfig, newConfig) { + return (Math.floor((oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight) !== + Math.floor((newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight)); + }; + Lines.prototype.computeLineTop = function (row, config, session) { + var screenTop = config.firstRowScreen * config.lineHeight; + var screenPage = Math.floor(screenTop / this.canvasHeight); + var lineTop = session.documentToScreenRow(row, 0) * config.lineHeight; + return lineTop - (screenPage * this.canvasHeight); + }; + Lines.prototype.computeLineHeight = function (row, config, session) { + return config.lineHeight * session.getRowLineCount(row); + }; + Lines.prototype.getLength = function () { + return this.cells.length; + }; + Lines.prototype.get = function (index) { + return this.cells[index]; + }; + Lines.prototype.shift = function () { + this.$cacheCell(this.cells.shift()); + }; + Lines.prototype.pop = function () { + this.$cacheCell(this.cells.pop()); + }; + Lines.prototype.push = function (cell) { + if (Array.isArray(cell)) { + this.cells.push.apply(this.cells, cell); + var fragment = dom.createFragment(this.element); + for (var i = 0; i < cell.length; i++) { + fragment.appendChild(cell[i].element); + } + this.element.appendChild(fragment); + } + else { + this.cells.push(cell); + this.element.appendChild(cell.element); + } + }; + Lines.prototype.unshift = function (cell) { + if (Array.isArray(cell)) { + this.cells.unshift.apply(this.cells, cell); + var fragment = dom.createFragment(this.element); + for (var i = 0; i < cell.length; i++) { + fragment.appendChild(cell[i].element); + } + if (this.element.firstChild) + this.element.insertBefore(fragment, this.element.firstChild); + else + this.element.appendChild(fragment); + } + else { + this.cells.unshift(cell); + this.element.insertAdjacentElement("afterbegin", cell.element); + } + }; + Lines.prototype.last = function () { + if (this.cells.length) + return this.cells[this.cells.length - 1]; + else + return null; + }; + Lines.prototype.$cacheCell = function (cell) { + if (!cell) + return; + cell.element.remove(); + this.cellCache.push(cell); + }; + Lines.prototype.createCell = function (row, config, session, initElement) { + var cell = this.cellCache.pop(); + if (!cell) { + var element = dom.createElement("div"); + if (initElement) + initElement(element); + this.element.appendChild(element); + cell = { + element: element, + text: "", + row: row + }; + } + cell.row = row; + return cell; + }; + return Lines; +}()); +exports.Lines = Lines; + +}); + +ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/layer/lines","ace/config"], function(require, exports, module){"use strict"; +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var Lines = require("./lines").Lines; +var nls = require("../config").nls; +var Gutter = /** @class */ (function () { + function Gutter(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_gutter-layer"; + parentEl.appendChild(this.element); + this.setShowFoldWidgets(this.$showFoldWidgets); + this.gutterWidth = 0; + this.$annotations = []; + this.$updateAnnotations = this.$updateAnnotations.bind(this); + this.$lines = new Lines(this.element); + this.$lines.$offsetCoefficient = 1; + } + Gutter.prototype.setSession = function (session) { + if (this.session) + this.session.off("change", this.$updateAnnotations); + this.session = session; + if (session) + session.on("change", this.$updateAnnotations); + }; + Gutter.prototype.addGutterDecoration = function (row, className) { + if (window.console) + console.warn && console.warn("deprecated use session.addGutterDecoration"); + this.session.addGutterDecoration(row, className); + }; + Gutter.prototype.removeGutterDecoration = function (row, className) { + if (window.console) + console.warn && console.warn("deprecated use session.removeGutterDecoration"); + this.session.removeGutterDecoration(row, className); + }; + Gutter.prototype.setAnnotations = function (annotations) { + this.$annotations = []; + for (var i = 0; i < annotations.length; i++) { + var annotation = annotations[i]; + var row = annotation.row; + var rowInfo = this.$annotations[row]; + if (!rowInfo) + rowInfo = this.$annotations[row] = { text: [], type: [], displayText: [] }; + var annoText = annotation.text; + var displayAnnoText = annotation.text; + var annoType = annotation.type; + annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || ""; + displayAnnoText = displayAnnoText ? displayAnnoText : annotation.html || ""; + if (rowInfo.text.indexOf(annoText) === -1) { + rowInfo.text.push(annoText); + rowInfo.type.push(annoType); + rowInfo.displayText.push(displayAnnoText); + } + var className = annotation.className; + if (className) { + rowInfo.className = className; + } + else if (annoType === "error") { + rowInfo.className = " ace_error"; + } + else if (annoType === "security" && !/\bace_error\b/.test(rowInfo.className)) { + rowInfo.className = " ace_security"; + } + else if (annoType === "warning" && !/\bace_(error|security)\b/.test(rowInfo.className)) { + rowInfo.className = " ace_warning"; + } + else if (annoType === "info" && !rowInfo.className) { + rowInfo.className = " ace_info"; + } + else if (annoType === "hint" && !rowInfo.className) { + rowInfo.className = " ace_hint"; + } + } + }; + Gutter.prototype.$updateAnnotations = function (delta) { + if (!this.$annotations.length) + return; + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; + if (len === 0) { + } + else if (delta.action == 'remove') { + this.$annotations.splice(firstRow, len + 1, null); + } + else { + var args = new Array(len + 1); + args.unshift(firstRow, 1); + this.$annotations.splice.apply(this.$annotations, args); + } + }; + Gutter.prototype.update = function (config) { + this.config = config; + var session = this.session; + var firstRow = config.firstRow; + var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar + session.getLength() - 1); + this.oldLastRow = lastRow; + this.config = config; + this.$lines.moveContainer(config); + this.$updateCursorRow(); + var fold = session.getNextFoldLine(firstRow); + var foldStart = fold ? fold.start.row : Infinity; + var cell = null; + var index = -1; + var row = firstRow; + while (true) { + if (row > foldStart) { + row = fold.end.row + 1; + fold = session.getNextFoldLine(row, fold); + foldStart = fold ? fold.start.row : Infinity; + } + if (row > lastRow) { + while (this.$lines.getLength() > index + 1) + this.$lines.pop(); + break; + } + cell = this.$lines.get(++index); + if (cell) { + cell.row = row; + } + else { + cell = this.$lines.createCell(row, config, this.session, onCreateCell); + this.$lines.push(cell); + } + this.$renderCell(cell, config, fold, row); + row++; + } + this._signal("afterRender"); + this.$updateGutterWidth(config); + }; + Gutter.prototype.$updateGutterWidth = function (config) { + var session = this.session; + var gutterRenderer = session.gutterRenderer || this.$renderer; + var firstLineNumber = session.$firstLineNumber; + var lastLineText = this.$lines.last() ? this.$lines.last().text : ""; + if (this.$fixedWidth || session.$useWrapMode) + lastLineText = session.getLength() + firstLineNumber - 1; + var gutterWidth = gutterRenderer + ? gutterRenderer.getWidth(session, lastLineText, config) + : lastLineText.toString().length * config.characterWidth; + var padding = this.$padding || this.$computePadding(); + gutterWidth += padding.left + padding.right; + if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) { + this.gutterWidth = gutterWidth; (this.element.parentNode).style.width = + this.element.style.width = Math.ceil(this.gutterWidth) + "px"; + this._signal("changeGutterWidth", gutterWidth); + } + }; + Gutter.prototype.$updateCursorRow = function () { + if (!this.$highlightGutterLine) + return; + var position = this.session.selection.getCursor(); + if (this.$cursorRow === position.row) + return; + this.$cursorRow = position.row; + }; + Gutter.prototype.updateLineHighlight = function () { + if (!this.$highlightGutterLine) + return; + var row = this.session.selection.cursor.row; + this.$cursorRow = row; + if (this.$cursorCell && this.$cursorCell.row == row) + return; + if (this.$cursorCell) + this.$cursorCell.element.className = this.$cursorCell.element.className.replace("ace_gutter-active-line ", ""); + var cells = this.$lines.cells; + this.$cursorCell = null; + for (var i = 0; i < cells.length; i++) { + var cell = cells[i]; + if (cell.row >= this.$cursorRow) { + if (cell.row > this.$cursorRow) { + var fold = this.session.getFoldLine(this.$cursorRow); + if (i > 0 && fold && fold.start.row == cells[i - 1].row) + cell = cells[i - 1]; + else + break; + } + cell.element.className = "ace_gutter-active-line " + cell.element.className; + this.$cursorCell = cell; + break; + } + } + }; + Gutter.prototype.scrollLines = function (config) { + var oldConfig = this.config; + this.config = config; + this.$updateCursorRow(); + if (this.$lines.pageChanged(oldConfig, config)) + return this.update(config); + this.$lines.moveContainer(config); + var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar + this.session.getLength() - 1); + var oldLastRow = this.oldLastRow; + this.oldLastRow = lastRow; + if (!oldConfig || oldLastRow < config.firstRow) + return this.update(config); + if (lastRow < oldConfig.firstRow) + return this.update(config); + if (oldConfig.firstRow < config.firstRow) + for (var row = this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row > 0; row--) + this.$lines.shift(); + if (oldLastRow > lastRow) + for (var row = this.session.getFoldedRowCount(lastRow + 1, oldLastRow); row > 0; row--) + this.$lines.pop(); + if (config.firstRow < oldConfig.firstRow) { + this.$lines.unshift(this.$renderLines(config, config.firstRow, oldConfig.firstRow - 1)); + } + if (lastRow > oldLastRow) { + this.$lines.push(this.$renderLines(config, oldLastRow + 1, lastRow)); + } + this.updateLineHighlight(); + this._signal("afterRender"); + this.$updateGutterWidth(config); + }; + Gutter.prototype.$renderLines = function (config, firstRow, lastRow) { + var fragment = []; + var row = firstRow; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + while (true) { + if (row > foldStart) { + row = foldLine.end.row + 1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (row > lastRow) + break; + var cell = this.$lines.createCell(row, config, this.session, onCreateCell); + this.$renderCell(cell, config, foldLine, row); + fragment.push(cell); + row++; + } + return fragment; + }; + Gutter.prototype.$renderCell = function (cell, config, fold, row) { + var element = cell.element; + var session = this.session; + var textNode = element.childNodes[0]; + var foldWidget = element.childNodes[1]; + var annotationNode = element.childNodes[2]; + var annotationIconNode = annotationNode.firstChild; + var firstLineNumber = session.$firstLineNumber; + var breakpoints = session.$breakpoints; + var decorations = session.$decorations; + var gutterRenderer = session.gutterRenderer || this.$renderer; + var foldWidgets = this.$showFoldWidgets && session.foldWidgets; + var foldStart = fold ? fold.start.row : Number.MAX_VALUE; + var lineHeight = config.lineHeight + "px"; + var className = this.$useSvgGutterIcons ? "ace_gutter-cell_svg-icons " : "ace_gutter-cell "; + var iconClassName = this.$useSvgGutterIcons ? "ace_icon_svg" : "ace_icon"; + var rowText = (gutterRenderer + ? gutterRenderer.getText(session, row) + : row + firstLineNumber).toString(); + if (this.$highlightGutterLine) { + if (row == this.$cursorRow || (fold && row < this.$cursorRow && row >= foldStart && this.$cursorRow <= fold.end.row)) { + className += "ace_gutter-active-line "; + if (this.$cursorCell != cell) { + if (this.$cursorCell) + this.$cursorCell.element.className = this.$cursorCell.element.className.replace("ace_gutter-active-line ", ""); + this.$cursorCell = cell; + } + } + } + if (breakpoints[row]) + className += breakpoints[row]; + if (decorations[row]) + className += decorations[row]; + if (this.$annotations[row] && row !== foldStart) + className += this.$annotations[row].className; + if (foldWidgets) { + var c = foldWidgets[row]; + if (c == null) + c = foldWidgets[row] = session.getFoldWidget(row); + } + if (c) { + var foldClass = "ace_fold-widget ace_" + c; + var isClosedFold = c == "start" && row == foldStart && row < fold.end.row; + if (isClosedFold) { + foldClass += " ace_closed"; + var foldAnnotationClass = ""; + var annotationInFold = false; + for (var i = row + 1; i <= fold.end.row; i++) { + if (!this.$annotations[i]) + continue; + if (this.$annotations[i].className === " ace_error") { + annotationInFold = true; + foldAnnotationClass = " ace_error_fold"; + break; + } + if (this.$annotations[i].className === " ace_security") { + annotationInFold = true; + foldAnnotationClass = " ace_security_fold"; + } + else if (this.$annotations[i].className === " ace_warning" && + foldAnnotationClass !== " ace_security_fold") { + annotationInFold = true; + foldAnnotationClass = " ace_warning_fold"; + } + } + className += foldAnnotationClass; + } + else + foldClass += " ace_open"; + if (foldWidget.className != foldClass) + foldWidget.className = foldClass; + dom.setStyle(foldWidget.style, "height", lineHeight); + dom.setStyle(foldWidget.style, "display", "inline-block"); + foldWidget.setAttribute("role", "button"); + foldWidget.setAttribute("tabindex", "-1"); + var foldRange = session.getFoldWidgetRange(row); + if (foldRange) + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.range.aria-label", "Toggle code folding, rows $0 through $1", [ + foldRange.start.row + 1, + foldRange.end.row + 1 + ])); + else { + if (fold) + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.closed.aria-label", "Toggle code folding, rows $0 through $1", [ + fold.start.row + 1, + fold.end.row + 1 + ])); + else + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.open.aria-label", "Toggle code folding, row $0", [row + 1])); + } + if (isClosedFold) { + foldWidget.setAttribute("aria-expanded", "false"); + foldWidget.setAttribute("title", nls("gutter.code-folding.closed.title", "Unfold code")); + } + else { + foldWidget.setAttribute("aria-expanded", "true"); + foldWidget.setAttribute("title", nls("gutter.code-folding.open.title", "Fold code")); + } + } + else { + if (foldWidget) { + dom.setStyle(foldWidget.style, "display", "none"); + foldWidget.setAttribute("tabindex", "0"); + foldWidget.removeAttribute("role"); + foldWidget.removeAttribute("aria-label"); + } + } + if (annotationInFold && this.$showFoldedAnnotations) { + annotationNode.className = "ace_gutter_annotation"; + annotationIconNode.className = iconClassName; + annotationIconNode.className += foldAnnotationClass; + dom.setStyle(annotationIconNode.style, "height", lineHeight); + dom.setStyle(annotationNode.style, "display", "block"); + dom.setStyle(annotationNode.style, "height", lineHeight); + var ariaLabel; + switch (foldAnnotationClass) { + case " ace_error_fold": + ariaLabel = nls("gutter.annotation.aria-label.error", "Error, read annotations row $0", [rowText]); + break; + case " ace_security_fold": + ariaLabel = nls("gutter.annotation.aria-label.security", "Security finding, read annotations row $0", [rowText]); + break; + case " ace_warning_fold": + ariaLabel = nls("gutter.annotation.aria-label.warning", "Warning, read annotations row $0", [rowText]); + break; + } + annotationNode.setAttribute("aria-label", ariaLabel); + annotationNode.setAttribute("tabindex", "-1"); + annotationNode.setAttribute("role", "button"); + } + else if (this.$annotations[row]) { + annotationNode.className = "ace_gutter_annotation"; + annotationIconNode.className = iconClassName; + if (this.$useSvgGutterIcons) + annotationIconNode.className += this.$annotations[row].className; + else + element.classList.add(this.$annotations[row].className.replace(" ", "")); + dom.setStyle(annotationIconNode.style, "height", lineHeight); + dom.setStyle(annotationNode.style, "display", "block"); + dom.setStyle(annotationNode.style, "height", lineHeight); + var ariaLabel; + switch (this.$annotations[row].className) { + case " ace_error": + ariaLabel = nls("gutter.annotation.aria-label.error", "Error, read annotations row $0", [rowText]); + break; + case " ace_security": + ariaLabel = nls("gutter.annotation.aria-label.security", "Security finding, read annotations row $0", [rowText]); + break; + case " ace_warning": + ariaLabel = nls("gutter.annotation.aria-label.warning", "Warning, read annotations row $0", [rowText]); + break; + case " ace_info": + ariaLabel = nls("gutter.annotation.aria-label.info", "Info, read annotations row $0", [rowText]); + break; + case " ace_hint": + ariaLabel = nls("gutter.annotation.aria-label.hint", "Suggestion, read annotations row $0", [rowText]); + break; + } + annotationNode.setAttribute("aria-label", ariaLabel); + annotationNode.setAttribute("tabindex", "-1"); + annotationNode.setAttribute("role", "button"); + } + else { + dom.setStyle(annotationNode.style, "display", "none"); + annotationNode.removeAttribute("aria-label"); + annotationNode.removeAttribute("role"); + annotationNode.setAttribute("tabindex", "0"); + } + if (rowText !== textNode.data) { + textNode.data = rowText; + } + if (element.className != className) + element.className = className; + dom.setStyle(cell.element.style, "height", this.$lines.computeLineHeight(row, config, session) + "px"); + dom.setStyle(cell.element.style, "top", this.$lines.computeLineTop(row, config, session) + "px"); + cell.text = rowText; + if (annotationNode.style.display === "none" && foldWidget.style.display === "none") + cell.element.setAttribute("aria-hidden", true); + else + cell.element.setAttribute("aria-hidden", false); + return cell; + }; + Gutter.prototype.setHighlightGutterLine = function (highlightGutterLine) { + this.$highlightGutterLine = highlightGutterLine; + }; + Gutter.prototype.setShowLineNumbers = function (show) { + this.$renderer = !show && { + getWidth: function () { return 0; }, + getText: function () { return ""; } + }; + }; + Gutter.prototype.getShowLineNumbers = function () { + return this.$showLineNumbers; + }; + Gutter.prototype.setShowFoldWidgets = function (show) { + if (show) + dom.addCssClass(this.element, "ace_folding-enabled"); + else + dom.removeCssClass(this.element, "ace_folding-enabled"); + this.$showFoldWidgets = show; + this.$padding = null; + }; + Gutter.prototype.getShowFoldWidgets = function () { + return this.$showFoldWidgets; + }; + Gutter.prototype.$computePadding = function () { + if (!this.element.firstChild) + return { left: 0, right: 0 }; + var style = dom.computedStyle(/**@type{Element}*/ (this.element.firstChild)); + this.$padding = {}; + this.$padding.left = (parseInt(style.borderLeftWidth) || 0) + + (parseInt(style.paddingLeft) || 0) + 1; + this.$padding.right = (parseInt(style.borderRightWidth) || 0) + + (parseInt(style.paddingRight) || 0); + return this.$padding; + }; + Gutter.prototype.getRegion = function (point) { + var padding = this.$padding || this.$computePadding(); + var rect = this.element.getBoundingClientRect(); + if (point.x < padding.left + rect.left) + return "markers"; + if (this.$showFoldWidgets && point.x > rect.right - padding.right) + return "foldWidgets"; + }; + return Gutter; +}()); +Gutter.prototype.$fixedWidth = false; +Gutter.prototype.$highlightGutterLine = true; +Gutter.prototype.$renderer = ""; +Gutter.prototype.$showLineNumbers = true; +Gutter.prototype.$showFoldWidgets = true; +oop.implement(Gutter.prototype, EventEmitter); +function onCreateCell(element) { + var textNode = document.createTextNode(''); + element.appendChild(textNode); + var foldWidget = dom.createElement("span"); + element.appendChild(foldWidget); + var annotationNode = dom.createElement("span"); + element.appendChild(annotationNode); + var annotationIconNode = dom.createElement("span"); + annotationNode.appendChild(annotationIconNode); + return element; +} +exports.Gutter = Gutter; + +}); + +ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(require, exports, module){"use strict"; +var Range = require("../range").Range; +var dom = require("../lib/dom"); +var Marker = /** @class */ (function () { + function Marker(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_marker-layer"; + parentEl.appendChild(this.element); + } + Marker.prototype.setPadding = function (padding) { + this.$padding = padding; + }; + Marker.prototype.setSession = function (session) { + this.session = session; + }; + Marker.prototype.setMarkers = function (markers) { + this.markers = markers; + }; + Marker.prototype.elt = function (className, css) { + var x = this.i != -1 && this.element.childNodes[this.i]; + if (!x) { + x = document.createElement("div"); + this.element.appendChild(x); + this.i = -1; + } + else { + this.i++; + } + x.style.cssText = css; + x.className = className; + }; + Marker.prototype.update = function (config) { + if (!config) + return; + this.config = config; + this.i = 0; + var html; + for (var key in this.markers) { + var marker = this.markers[key]; + if (!marker.range) { + marker.update(html, this, this.session, config); + continue; + } + var range = marker.range.clipRows(config.firstRow, config.lastRow); + if (range.isEmpty()) + continue; + range = range.toScreenRange(this.session); + if (marker.renderer) { + var top = this.$getTop(range.start.row, config); + var left = this.$padding + range.start.column * config.characterWidth; + marker.renderer(html, range, left, top, config); + } + else if (marker.type == "fullLine") { + this.drawFullLineMarker(html, range, marker.clazz, config); + } + else if (marker.type == "screenLine") { + this.drawScreenLineMarker(html, range, marker.clazz, config); + } + else if (range.isMultiLine()) { + if (marker.type == "text") + this.drawTextMarker(html, range, marker.clazz, config); + else + this.drawMultiLineMarker(html, range, marker.clazz, config); + } + else { + this.drawSingleLineMarker(html, range, marker.clazz + " ace_start" + " ace_br15", config); + } + } + if (this.i != -1) { + while (this.i < this.element.childElementCount) + this.element.removeChild(this.element.lastChild); + } + }; + Marker.prototype.$getTop = function (row, layerConfig) { + return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight; + }; + Marker.prototype.drawTextMarker = function (stringBuilder, range, clazz, layerConfig, extraStyle) { + var session = this.session; + var start = range.start.row; + var end = range.end.row; + var row = start; + var prev = 0; + var curr = 0; + var next = session.getScreenLastRowColumn(row); + var lineRange = new Range(row, range.start.column, row, curr); + for (; row <= end; row++) { + lineRange.start.row = lineRange.end.row = row; + lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row); + lineRange.end.column = next; + prev = curr; + curr = next; + next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column; + this.drawSingleLineMarker(stringBuilder, lineRange, clazz + (row == start ? " ace_start" : "") + " ace_br" + + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end), layerConfig, row == end ? 0 : 1, extraStyle); + } + }; + Marker.prototype.drawMultiLineMarker = function (stringBuilder, range, clazz, config, extraStyle) { + var padding = this.$padding; + var height = config.lineHeight; + var top = this.$getTop(range.start.row, config); + var left = padding + range.start.column * config.characterWidth; + extraStyle = extraStyle || ""; + if (this.session.$bidiHandler.isBidiRow(range.start.row)) { + var range1 = range.clone(); + range1.end.row = range1.start.row; + range1.end.column = this.session.getLine(range1.start.row).length; + this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br1 ace_start", config, null, extraStyle); + } + else { + this.elt(clazz + " ace_br1 ace_start", "height:" + height + "px;" + "right:" + padding + "px;" + "top:" + top + "px;left:" + left + "px;" + (extraStyle || "")); + } + if (this.session.$bidiHandler.isBidiRow(range.end.row)) { + var range1 = range.clone(); + range1.start.row = range1.end.row; + range1.start.column = 0; + this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br12", config, null, extraStyle); + } + else { + top = this.$getTop(range.end.row, config); + var width = range.end.column * config.characterWidth; + this.elt(clazz + " ace_br12", "height:" + height + "px;" + + "width:" + width + "px;" + + "top:" + top + "px;" + + "left:" + padding + "px;" + (extraStyle || "")); + } + height = (range.end.row - range.start.row - 1) * config.lineHeight; + if (height <= 0) + return; + top = this.$getTop(range.start.row + 1, config); + var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8); + this.elt(clazz + (radiusClass ? " ace_br" + radiusClass : ""), "height:" + height + "px;" + + "right:" + padding + "px;" + + "top:" + top + "px;" + + "left:" + padding + "px;" + (extraStyle || "")); + }; + Marker.prototype.drawSingleLineMarker = function (stringBuilder, range, clazz, config, extraLength, extraStyle) { + if (this.session.$bidiHandler.isBidiRow(range.start.row)) + return this.drawBidiSingleLineMarker(stringBuilder, range, clazz, config, extraLength, extraStyle); + var height = config.lineHeight; + var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth; + var top = this.$getTop(range.start.row, config); + var left = this.$padding + range.start.column * config.characterWidth; + this.elt(clazz, "height:" + height + "px;" + + "width:" + width + "px;" + + "top:" + top + "px;" + + "left:" + left + "px;" + (extraStyle || "")); + }; + Marker.prototype.drawBidiSingleLineMarker = function (stringBuilder, range, clazz, config, extraLength, extraStyle) { + var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding; + var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column); + selections.forEach(function (selection) { + this.elt(clazz, "height:" + height + "px;" + + "width:" + (selection.width + (extraLength || 0)) + "px;" + + "top:" + top + "px;" + + "left:" + (padding + selection.left) + "px;" + (extraStyle || "")); + }, this); + }; + Marker.prototype.drawFullLineMarker = function (stringBuilder, range, clazz, config, extraStyle) { + var top = this.$getTop(range.start.row, config); + var height = config.lineHeight; + if (range.start.row != range.end.row) + height += this.$getTop(range.end.row, config) - top; + this.elt(clazz, "height:" + height + "px;" + + "top:" + top + "px;" + + "left:0;right:0;" + (extraStyle || "")); + }; + Marker.prototype.drawScreenLineMarker = function (stringBuilder, range, clazz, config, extraStyle) { + var top = this.$getTop(range.start.row, config); + var height = config.lineHeight; + this.elt(clazz, "height:" + height + "px;" + + "top:" + top + "px;" + + "left:0;right:0;" + (extraStyle || "")); + }; + return Marker; +}()); +Marker.prototype.$padding = 0; +function getBorderClass(tl, tr, br, bl) { + return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0); +} +exports.Marker = Marker; + +}); + +ace.define("ace/layer/text_util",["require","exports","module"], function(require, exports, module){// Tokens for which Ace just uses a simple TextNode and does not add any special className. +var textTokens = new Set(["text", "rparen", "lparen"]); +exports.isTextToken = function (tokenType) { + return textTokens.has(tokenType); +}; + +}); + +ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter","ace/config","ace/layer/text_util"], function(require, exports, module){"use strict"; +var oop = require("../lib/oop"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var Lines = require("./lines").Lines; +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var nls = require("../config").nls; +var isTextToken = require("./text_util").isTextToken; +var Text = /** @class */ (function () { + function Text(parentEl) { + this.dom = dom; + this.element = this.dom.createElement("div"); + this.element.className = "ace_layer ace_text-layer"; + parentEl.appendChild(this.element); + this.$updateEolChar = this.$updateEolChar.bind(this); + this.$lines = new Lines(this.element); + } + Text.prototype.$updateEolChar = function () { + var doc = this.session.doc; + var unixMode = doc.getNewLineCharacter() == "\n" && doc.getNewLineMode() != "windows"; + var EOL_CHAR = unixMode ? this.EOL_CHAR_LF : this.EOL_CHAR_CRLF; + if (this.EOL_CHAR != EOL_CHAR) { + this.EOL_CHAR = EOL_CHAR; + return true; + } + }; + Text.prototype.setPadding = function (padding) { + this.$padding = padding; + this.element.style.margin = "0 " + padding + "px"; + }; + Text.prototype.getLineHeight = function () { + return this.$fontMetrics.$characterSize.height || 0; + }; + Text.prototype.getCharacterWidth = function () { + return this.$fontMetrics.$characterSize.width || 0; + }; + Text.prototype.$setFontMetrics = function (measure) { + this.$fontMetrics = measure; + this.$fontMetrics.on("changeCharacterSize", + function (e) { + this._signal("changeCharacterSize", e); + }.bind(this)); + this.$pollSizeChanges(); + }; + Text.prototype.checkForSizeChanges = function () { + this.$fontMetrics.checkForSizeChanges(); + }; + Text.prototype.$pollSizeChanges = function () { + return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges(); + }; + Text.prototype.setSession = function (session) { + this.session = session; + if (session) + this.$computeTabString(); + }; + Text.prototype.setShowInvisibles = function (showInvisibles) { + if (this.showInvisibles == showInvisibles) + return false; + this.showInvisibles = showInvisibles; + if (typeof showInvisibles == "string") { + this.showSpaces = /tab/i.test(showInvisibles); + this.showTabs = /space/i.test(showInvisibles); + this.showEOL = /eol/i.test(showInvisibles); + } + else { + this.showSpaces = this.showTabs = this.showEOL = showInvisibles; + } + this.$computeTabString(); + return true; + }; + Text.prototype.setDisplayIndentGuides = function (display) { + if (this.displayIndentGuides == display) + return false; + this.displayIndentGuides = display; + this.$computeTabString(); + return true; + }; + Text.prototype.setHighlightIndentGuides = function (highlight) { + if (this.$highlightIndentGuides === highlight) + return false; + this.$highlightIndentGuides = highlight; + return highlight; + }; + Text.prototype.$computeTabString = function () { + var tabSize = this.session.getTabSize(); + this.tabSize = tabSize; var tabStr = this.$tabStrings = [0]; + for (var i = 1; i < tabSize + 1; i++) { + if (this.showTabs) { + var span = this.dom.createElement("span"); + span.className = "ace_invisible ace_invisible_tab"; + span.textContent = lang.stringRepeat(this.TAB_CHAR, i); + tabStr.push(span); + } + else { + tabStr.push(this.dom.createTextNode(lang.stringRepeat(" ", i), this.element)); + } + } + if (this.displayIndentGuides) { + this.$indentGuideRe = /\s\S| \t|\t |\s$/; + var className = "ace_indent-guide"; + var spaceClass = this.showSpaces ? " ace_invisible ace_invisible_space" : ""; + var spaceContent = this.showSpaces + ? lang.stringRepeat(this.SPACE_CHAR, this.tabSize) + : lang.stringRepeat(" ", this.tabSize); + var tabClass = this.showTabs ? " ace_invisible ace_invisible_tab" : ""; + var tabContent = this.showTabs + ? lang.stringRepeat(this.TAB_CHAR, this.tabSize) + : spaceContent; + var span = this.dom.createElement("span"); + span.className = className + spaceClass; + span.textContent = spaceContent; + this.$tabStrings[" "] = span; + var span = this.dom.createElement("span"); + span.className = className + tabClass; + span.textContent = tabContent; + this.$tabStrings["\t"] = span; + } + }; + Text.prototype.updateLines = function (config, firstRow, lastRow) { + if (this.config.lastRow != config.lastRow || + this.config.firstRow != config.firstRow) { + return this.update(config); + } + this.config = config; + var first = Math.max(firstRow, config.firstRow); + var last = Math.min(lastRow, config.lastRow); + var lineElements = this.element.childNodes; + var lineElementsIdx = 0; + for (var row = config.firstRow; row < first; row++) { + var foldLine = this.session.getFoldLine(row); + if (foldLine) { + if (foldLine.containsRow(first)) { + first = foldLine.start.row; + break; + } + else { + row = foldLine.end.row; + } + } + lineElementsIdx++; + } + var heightChanged = false; + var row = first; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + while (true) { + if (row > foldStart) { + row = foldLine.end.row + 1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (row > last) + break; var lineElement = lineElements[lineElementsIdx++]; + if (lineElement) { + this.dom.removeChildren(lineElement); + this.$renderLine(lineElement, row, row == foldStart ? foldLine : false); + if (heightChanged) + lineElement.style.top = this.$lines.computeLineTop(row, config, this.session) + "px"; + var height = (config.lineHeight * this.session.getRowLength(row)) + "px"; + if (lineElement.style.height != height) { + heightChanged = true; + lineElement.style.height = height; + } + } + row++; + } + if (heightChanged) { + while (lineElementsIdx < this.$lines.cells.length) { + var cell = this.$lines.cells[lineElementsIdx++]; + cell.element.style.top = this.$lines.computeLineTop(cell.row, config, this.session) + "px"; + } + } + }; + Text.prototype.scrollLines = function (config) { + var oldConfig = this.config; + this.config = config; + if (this.$lines.pageChanged(oldConfig, config)) + return this.update(config); + this.$lines.moveContainer(config); + var lastRow = config.lastRow; + var oldLastRow = oldConfig ? oldConfig.lastRow : -1; + if (!oldConfig || oldLastRow < config.firstRow) + return this.update(config); + if (lastRow < oldConfig.firstRow) + return this.update(config); + if (!oldConfig || oldConfig.lastRow < config.firstRow) + return this.update(config); + if (config.lastRow < oldConfig.firstRow) + return this.update(config); + if (oldConfig.firstRow < config.firstRow) + for (var row = this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row > 0; row--) + this.$lines.shift(); + if (oldConfig.lastRow > config.lastRow) + for (var row = this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row > 0; row--) + this.$lines.pop(); + if (config.firstRow < oldConfig.firstRow) { + this.$lines.unshift(this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1)); + } + if (config.lastRow > oldConfig.lastRow) { + this.$lines.push(this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow)); + } + this.$highlightIndentGuide(); + }; + Text.prototype.$renderLinesFragment = function (config, firstRow, lastRow) { + var fragment = []; + var row = firstRow; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + while (true) { + if (row > foldStart) { + row = foldLine.end.row + 1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (row > lastRow) + break; + var line = this.$lines.createCell(row, config, this.session); + var lineEl = line.element; + this.dom.removeChildren(lineEl); + dom.setStyle(lineEl.style, "height", this.$lines.computeLineHeight(row, config, this.session) + "px"); + dom.setStyle(lineEl.style, "top", this.$lines.computeLineTop(row, config, this.session) + "px"); + this.$renderLine(lineEl, row, row == foldStart ? foldLine : false); + if (this.$useLineGroups()) { + lineEl.className = "ace_line_group"; + } + else { + lineEl.className = "ace_line"; + } + fragment.push(line); + row++; + } + return fragment; + }; + Text.prototype.update = function (config) { + this.$lines.moveContainer(config); + this.config = config; + var firstRow = config.firstRow; + var lastRow = config.lastRow; + var lines = this.$lines; + while (lines.getLength()) + lines.pop(); + lines.push(this.$renderLinesFragment(config, firstRow, lastRow)); + }; + Text.prototype.$renderToken = function (parent, screenColumn, token, value) { + var self = this; + var re = /(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC\u2066\u2067\u2068\u202A\u202B\u202D\u202E\u202C\u2069]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g; + var valueFragment = this.dom.createFragment(this.element); + var m; + var i = 0; + while (m = re.exec(value)) { + var tab = m[1]; + var simpleSpace = m[2]; + var controlCharacter = m[3]; + var cjkSpace = m[4]; + var cjk = m[5]; + if (!self.showSpaces && simpleSpace) + continue; + var before = i != m.index ? value.slice(i, m.index) : ""; + i = m.index + m[0].length; + if (before) { + valueFragment.appendChild(this.dom.createTextNode(before, this.element)); + } + if (tab) { + var tabSize = self.session.getScreenTabSize(screenColumn + m.index); + valueFragment.appendChild(self.$tabStrings[tabSize].cloneNode(true)); + screenColumn += tabSize - 1; + } + else if (simpleSpace) { + if (self.showSpaces) { + var span = this.dom.createElement("span"); + span.className = "ace_invisible ace_invisible_space"; + span.textContent = lang.stringRepeat(self.SPACE_CHAR, simpleSpace.length); + valueFragment.appendChild(span); + } + else { + valueFragment.appendChild(this.dom.createTextNode(simpleSpace, this.element)); + } + } + else if (controlCharacter) { + var span = this.dom.createElement("span"); + span.className = "ace_invisible ace_invisible_space ace_invalid"; + span.textContent = lang.stringRepeat(self.SPACE_CHAR, controlCharacter.length); + valueFragment.appendChild(span); + } + else if (cjkSpace) { + screenColumn += 1; + var span = this.dom.createElement("span"); + span.style.width = (self.config.characterWidth * 2) + "px"; + span.className = self.showSpaces ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk"; + span.textContent = self.showSpaces ? self.SPACE_CHAR : cjkSpace; + valueFragment.appendChild(span); + } + else if (cjk) { + screenColumn += 1; + var span = this.dom.createElement("span"); + span.style.width = (self.config.characterWidth * 2) + "px"; + span.className = "ace_cjk"; + span.textContent = cjk; + valueFragment.appendChild(span); + } + } + valueFragment.appendChild(this.dom.createTextNode(i ? value.slice(i) : value, this.element)); + if (!isTextToken(token.type)) { + var classes = "ace_" + token.type.replace(/\./g, " ace_"); + var span = this.dom.createElement("span"); + if (token.type == "fold") { + span.style.width = (token.value.length * this.config.characterWidth) + "px"; + span.setAttribute("title", nls("inline-fold.closed.title", "Unfold code")); + } + span.className = classes; + span.appendChild(valueFragment); + parent.appendChild(span); + } + else { + parent.appendChild(valueFragment); + } + return screenColumn + value.length; + }; + Text.prototype.renderIndentGuide = function (parent, value, max) { + var cols = value.search(this.$indentGuideRe); + if (cols <= 0 || cols >= max) + return value; + if (value[0] == " ") { + cols -= cols % this.tabSize; + var count = cols / this.tabSize; + for (var i = 0; i < count; i++) { + parent.appendChild(this.$tabStrings[" "].cloneNode(true)); + } + this.$highlightIndentGuide(); + return value.substr(cols); + } + else if (value[0] == "\t") { + for (var i = 0; i < cols; i++) { + parent.appendChild(this.$tabStrings["\t"].cloneNode(true)); + } + this.$highlightIndentGuide(); + return value.substr(cols); + } + this.$highlightIndentGuide(); + return value; + }; + Text.prototype.$highlightIndentGuide = function () { + if (!this.$highlightIndentGuides || !this.displayIndentGuides) + return; + this.$highlightIndentGuideMarker = { + indentLevel: undefined, + start: undefined, + end: undefined, + dir: undefined + }; + var lines = this.session.doc.$lines; + if (!lines) + return; + var cursor = this.session.selection.getCursor(); + var initialIndent = /^\s*/.exec(this.session.doc.getLine(cursor.row))[0].length; + var elementIndentLevel = Math.floor(initialIndent / this.tabSize); + this.$highlightIndentGuideMarker = { + indentLevel: elementIndentLevel, + start: cursor.row + }; + var bracketHighlight = this.session.$bracketHighlight; + if (bracketHighlight) { + var ranges = this.session.$bracketHighlight.ranges; + for (var i = 0; i < ranges.length; i++) { + if (cursor.row !== ranges[i].start.row) { + this.$highlightIndentGuideMarker.end = ranges[i].start.row; + if (cursor.row > ranges[i].start.row) { + this.$highlightIndentGuideMarker.dir = -1; + } + else { + this.$highlightIndentGuideMarker.dir = 1; + } + break; + } + } + } + if (!this.$highlightIndentGuideMarker.end) { + if (lines[cursor.row] !== '' && cursor.column === lines[cursor.row].length) { + this.$highlightIndentGuideMarker.dir = 1; + for (var i = cursor.row + 1; i < lines.length; i++) { + var line = lines[i]; + var currentIndent = /^\s*/.exec(line)[0].length; + if (line !== '') { + this.$highlightIndentGuideMarker.end = i; + if (currentIndent <= initialIndent) + break; + } + } + } + } + this.$renderHighlightIndentGuide(); + }; + Text.prototype.$clearActiveIndentGuide = function () { + var cells = this.$lines.cells; + for (var i = 0; i < cells.length; i++) { + var cell = cells[i]; + var childNodes = cell.element.childNodes; + if (childNodes.length > 0) { + for (var j = 0; j < childNodes.length; j++) { + if (childNodes[j].classList && childNodes[j].classList.contains("ace_indent-guide-active")) { + childNodes[j].classList.remove("ace_indent-guide-active"); + break; + } + } + } + } + }; + Text.prototype.$setIndentGuideActive = function (cell, indentLevel) { + var line = this.session.doc.getLine(cell.row); + if (line !== "") { + var childNodes = cell.element.childNodes; + if (childNodes) { + var node = childNodes[indentLevel - 1]; + if (node && node.classList && node.classList.contains("ace_indent-guide")) + node.classList.add("ace_indent-guide-active"); + } + } + }; + Text.prototype.$renderHighlightIndentGuide = function () { + if (!this.$lines) + return; + var cells = this.$lines.cells; + this.$clearActiveIndentGuide(); + var indentLevel = this.$highlightIndentGuideMarker.indentLevel; + if (indentLevel !== 0) { + if (this.$highlightIndentGuideMarker.dir === 1) { + for (var i = 0; i < cells.length; i++) { + var cell = cells[i]; + if (this.$highlightIndentGuideMarker.end && cell.row >= this.$highlightIndentGuideMarker.start + + 1) { + if (cell.row >= this.$highlightIndentGuideMarker.end) + break; + this.$setIndentGuideActive(cell, indentLevel); + } + } + } + else { + for (var i = cells.length - 1; i >= 0; i--) { + var cell = cells[i]; + if (this.$highlightIndentGuideMarker.end && cell.row < this.$highlightIndentGuideMarker.start) { + if (cell.row <= this.$highlightIndentGuideMarker.end) + break; + this.$setIndentGuideActive(cell, indentLevel); + } + } + } + } + }; + Text.prototype.$createLineElement = function (parent) { + var lineEl = this.dom.createElement("div"); + lineEl.className = "ace_line"; + lineEl.style.height = this.config.lineHeight + "px"; + return lineEl; + }; + Text.prototype.$renderWrappedLine = function (parent, tokens, splits) { + var chars = 0; + var split = 0; + var splitChars = splits[0]; + var screenColumn = 0; + var lineEl = this.$createLineElement(); + parent.appendChild(lineEl); + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + var value = token.value; + if (i == 0 && this.displayIndentGuides) { + chars = value.length; + value = this.renderIndentGuide(lineEl, value, splitChars); + if (!value) + continue; + chars -= value.length; + } + if (chars + value.length < splitChars) { + screenColumn = this.$renderToken(lineEl, screenColumn, token, value); + chars += value.length; + } + else { + while (chars + value.length >= splitChars) { + screenColumn = this.$renderToken(lineEl, screenColumn, token, value.substring(0, splitChars - chars)); + value = value.substring(splitChars - chars); + chars = splitChars; + lineEl = this.$createLineElement(); + parent.appendChild(lineEl); + lineEl.appendChild(this.dom.createTextNode(lang.stringRepeat("\xa0", splits.indent), this.element)); + split++; + screenColumn = 0; + splitChars = splits[split] || Number.MAX_VALUE; + } + if (value.length != 0) { + chars += value.length; + screenColumn = this.$renderToken(lineEl, screenColumn, token, value); + } + } + } + if (splits[splits.length - 1] > this.MAX_LINE_LENGTH) + this.$renderOverflowMessage(lineEl, screenColumn, null, "", true); + }; + Text.prototype.$renderSimpleLine = function (parent, tokens) { + var screenColumn = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + var value = token.value; + if (i == 0 && this.displayIndentGuides) { + value = this.renderIndentGuide(parent, value); + if (!value) + continue; + } + if (screenColumn + value.length > this.MAX_LINE_LENGTH) + return this.$renderOverflowMessage(parent, screenColumn, token, value); + screenColumn = this.$renderToken(parent, screenColumn, token, value); + } + }; + Text.prototype.$renderOverflowMessage = function (parent, screenColumn, token, value, hide) { + token && this.$renderToken(parent, screenColumn, token, value.slice(0, this.MAX_LINE_LENGTH - screenColumn)); + var overflowEl = this.dom.createElement("span"); + overflowEl.className = "ace_inline_button ace_keyword ace_toggle_wrap"; + overflowEl.textContent = hide ? "" : ""; + parent.appendChild(overflowEl); + }; + Text.prototype.$renderLine = function (parent, row, foldLine) { + if (!foldLine && foldLine != false) + foldLine = this.session.getFoldLine(row); + if (foldLine) + var tokens = this.$getFoldLineTokens(row, foldLine); + else + var tokens = this.session.getTokens(row); + var lastLineEl = parent; + if (tokens.length) { + var splits = this.session.getRowSplitData(row); + if (splits && splits.length) { + this.$renderWrappedLine(parent, tokens, splits); + var lastLineEl = parent.lastChild; + } + else { + var lastLineEl = parent; + if (this.$useLineGroups()) { + lastLineEl = this.$createLineElement(); + parent.appendChild(lastLineEl); + } + this.$renderSimpleLine(lastLineEl, tokens); + } + } + else if (this.$useLineGroups()) { + lastLineEl = this.$createLineElement(); + parent.appendChild(lastLineEl); + } + if (this.showEOL && lastLineEl) { + if (foldLine) + row = foldLine.end.row; + var invisibleEl = this.dom.createElement("span"); + invisibleEl.className = "ace_invisible ace_invisible_eol"; + invisibleEl.textContent = row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR; + lastLineEl.appendChild(invisibleEl); + } + }; + Text.prototype.$getFoldLineTokens = function (row, foldLine) { + var session = this.session; + var renderTokens = []; + function addTokens(tokens, from, to) { + var idx = 0, col = 0; + while ((col + tokens[idx].value.length) < from) { + col += tokens[idx].value.length; + idx++; + if (idx == tokens.length) + return; + } + if (col != from) { + var value = tokens[idx].value.substring(from - col); + if (value.length > (to - from)) + value = value.substring(0, to - from); + renderTokens.push({ + type: tokens[idx].type, + value: value + }); + col = from + value.length; + idx += 1; + } + while (col < to && idx < tokens.length) { + var value = tokens[idx].value; + if (value.length + col > to) { + renderTokens.push({ + type: tokens[idx].type, + value: value.substring(0, to - col) + }); + } + else + renderTokens.push(tokens[idx]); + col += value.length; + idx += 1; + } + } + var tokens = session.getTokens(row); + foldLine.walk(function (placeholder, row, column, lastColumn, isNewRow) { + if (placeholder != null) { + renderTokens.push({ + type: "fold", + value: placeholder + }); + } + else { + if (isNewRow) + tokens = session.getTokens(row); + if (tokens.length) + addTokens(tokens, lastColumn, column); + } + }, foldLine.end.row, this.session.getLine(foldLine.end.row).length); + return renderTokens; + }; + Text.prototype.$useLineGroups = function () { + return this.session.getUseWrapMode(); + }; + return Text; +}()); +Text.prototype.EOF_CHAR = "\xB6"; +Text.prototype.EOL_CHAR_LF = "\xAC"; +Text.prototype.EOL_CHAR_CRLF = "\xa4"; +Text.prototype.EOL_CHAR = Text.prototype.EOL_CHAR_LF; +Text.prototype.TAB_CHAR = "\u2014"; //"\u21E5"; +Text.prototype.SPACE_CHAR = "\xB7"; +Text.prototype.$padding = 0; +Text.prototype.MAX_LINE_LENGTH = 10000; +Text.prototype.showInvisibles = false; +Text.prototype.showSpaces = false; +Text.prototype.showTabs = false; +Text.prototype.showEOL = false; +Text.prototype.displayIndentGuides = true; +Text.prototype.$highlightIndentGuides = true; +Text.prototype.$tabStrings = []; +Text.prototype.destroy = {}; +Text.prototype.onChangeTabSize = Text.prototype.$computeTabString; +oop.implement(Text.prototype, EventEmitter); +exports.Text = Text; + +}); + +ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(require, exports, module){"use strict"; +var dom = require("../lib/dom"); +var Cursor = /** @class */ (function () { + function Cursor(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_cursor-layer"; + parentEl.appendChild(this.element); + this.isVisible = false; + this.isBlinking = true; + this.blinkInterval = 1000; + this.smoothBlinking = false; + this.cursors = []; + this.cursor = this.addCursor(); + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.$updateCursors = this.$updateOpacity.bind(this); + } + Cursor.prototype.$updateOpacity = function (val) { + var cursors = this.cursors; + for (var i = cursors.length; i--;) + dom.setStyle(cursors[i].style, "opacity", val ? "" : "0"); + }; + Cursor.prototype.$startCssAnimation = function () { + var cursors = this.cursors; + for (var i = cursors.length; i--;) + cursors[i].style.animationDuration = this.blinkInterval + "ms"; + this.$isAnimating = true; + setTimeout(function () { + if (this.$isAnimating) { + dom.addCssClass(this.element, "ace_animate-blinking"); + } + }.bind(this)); + }; + Cursor.prototype.$stopCssAnimation = function () { + this.$isAnimating = false; + dom.removeCssClass(this.element, "ace_animate-blinking"); + }; + Cursor.prototype.setPadding = function (padding) { + this.$padding = padding; + }; + Cursor.prototype.setSession = function (session) { + this.session = session; + }; + Cursor.prototype.setBlinking = function (blinking) { + if (blinking != this.isBlinking) { + this.isBlinking = blinking; + this.restartTimer(); + } + }; + Cursor.prototype.setBlinkInterval = function (blinkInterval) { + if (blinkInterval != this.blinkInterval) { + this.blinkInterval = blinkInterval; + this.restartTimer(); + } + }; + Cursor.prototype.setSmoothBlinking = function (smoothBlinking) { + if (smoothBlinking != this.smoothBlinking) { + this.smoothBlinking = smoothBlinking; + dom.setCssClass(this.element, "ace_smooth-blinking", smoothBlinking); + this.$updateCursors(true); + this.restartTimer(); + } + }; + Cursor.prototype.addCursor = function () { + var el = dom.createElement("div"); + el.className = "ace_cursor"; + this.element.appendChild(el); + this.cursors.push(el); + return el; + }; + Cursor.prototype.removeCursor = function () { + if (this.cursors.length > 1) { + var el = this.cursors.pop(); + el.parentNode.removeChild(el); + return el; + } + }; + Cursor.prototype.hideCursor = function () { + this.isVisible = false; + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); + }; + Cursor.prototype.showCursor = function () { + this.isVisible = true; + dom.removeCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); + }; + Cursor.prototype.restartTimer = function () { + var update = this.$updateCursors; + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + this.$stopCssAnimation(); + if (this.smoothBlinking) { + this.$isSmoothBlinking = false; + dom.removeCssClass(this.element, "ace_smooth-blinking"); + } + update(true); + if (!this.isBlinking || !this.blinkInterval || !this.isVisible) { + this.$stopCssAnimation(); + return; + } + if (this.smoothBlinking) { + this.$isSmoothBlinking = true; + setTimeout(function () { + if (this.$isSmoothBlinking) { + dom.addCssClass(this.element, "ace_smooth-blinking"); + } + }.bind(this)); + } + if (dom.HAS_CSS_ANIMATION) { + this.$startCssAnimation(); + } + else { + var blink = /**@this{Cursor}*/ function () { + this.timeoutId = setTimeout(function () { + update(false); + }, 0.6 * this.blinkInterval); + }.bind(this); + this.intervalId = setInterval(function () { + update(true); + blink(); + }, this.blinkInterval); + blink(); + } + }; + Cursor.prototype.getPixelPosition = function (position, onScreen) { + if (!this.config || !this.session) + return { left: 0, top: 0 }; + if (!position) + position = this.session.selection.getCursor(); + var pos = this.session.documentToScreenPosition(position); + var cursorLeft = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, position.row) + ? this.session.$bidiHandler.getPosLeft(pos.column) + : pos.column * this.config.characterWidth); + var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) * + this.config.lineHeight; + return { left: cursorLeft, top: cursorTop }; + }; + Cursor.prototype.isCursorInView = function (pixelPos, config) { + return pixelPos.top >= 0 && pixelPos.top < config.maxHeight; + }; + Cursor.prototype.update = function (config) { + this.config = config; + var selections = this.session.$selectionMarkers; + var i = 0, cursorIndex = 0; + if (selections === undefined || selections.length === 0) { + selections = [{ cursor: null }]; + } + for (var i = 0, n = selections.length; i < n; i++) { + var pixelPos = this.getPixelPosition(selections[i].cursor, true); + if ((pixelPos.top > config.height + config.offset || + pixelPos.top < 0) && i > 1) { + continue; + } + var element = this.cursors[cursorIndex++] || this.addCursor(); + var style = element.style; + if (!this.drawCursor) { + if (!this.isCursorInView(pixelPos, config)) { + dom.setStyle(style, "display", "none"); + } + else { + dom.setStyle(style, "display", "block"); + dom.translate(element, pixelPos.left, pixelPos.top); + dom.setStyle(style, "width", Math.round(config.characterWidth) + "px"); + dom.setStyle(style, "height", config.lineHeight + "px"); + } + } + else { + this.drawCursor(element, pixelPos, config, selections[i], this.session); + } + } + while (this.cursors.length > cursorIndex) + this.removeCursor(); + var overwrite = this.session.getOverwrite(); + this.$setOverwrite(overwrite); + this.$pixelPos = pixelPos; + this.restartTimer(); + }; + Cursor.prototype.$setOverwrite = function (overwrite) { + if (overwrite != this.overwrite) { + this.overwrite = overwrite; + if (overwrite) + dom.addCssClass(this.element, "ace_overwrite-cursors"); + else + dom.removeCssClass(this.element, "ace_overwrite-cursors"); + } + }; + Cursor.prototype.destroy = function () { + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + }; + return Cursor; +}()); +Cursor.prototype.$padding = 0; +Cursor.prototype.drawCursor = null; +exports.Cursor = Cursor; + +}); + +ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var MAX_SCROLL_H = 0x8000; +var Scrollbar = /** @class */ (function () { + function Scrollbar(parent, classSuffix) { + this.element = dom.createElement("div"); + this.element.className = "ace_scrollbar ace_scrollbar" + classSuffix; + this.inner = dom.createElement("div"); + this.inner.className = "ace_scrollbar-inner"; + this.inner.textContent = "\xa0"; + this.element.appendChild(this.inner); + parent.appendChild(this.element); + this.setVisible(false); + this.skipEvent = false; + event.addListener(this.element, "scroll", this.onScroll.bind(this)); + event.addListener(this.element, "mousedown", event.preventDefault); + } + Scrollbar.prototype.setVisible = function (isVisible) { + this.element.style.display = isVisible ? "" : "none"; + this.isVisible = isVisible; + this.coeff = 1; + }; + return Scrollbar; +}()); +oop.implement(Scrollbar.prototype, EventEmitter); +var VScrollBar = /** @class */ (function (_super) { + __extends(VScrollBar, _super); + function VScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-v') || this; + _this.scrollTop = 0; + _this.scrollHeight = 0; + renderer.$scrollbarWidth = + _this.width = dom.scrollbarWidth(parent.ownerDocument); + _this.inner.style.width = + _this.element.style.width = (_this.width || 15) + 5 + "px"; + _this.$minWidth = 0; + return _this; + } + VScrollBar.prototype.onScroll = function () { + if (!this.skipEvent) { + this.scrollTop = this.element.scrollTop; + if (this.coeff != 1) { + var h = this.element.clientHeight / this.scrollHeight; + this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h); + } + this._emit("scroll", { data: this.scrollTop }); + } + this.skipEvent = false; + }; + VScrollBar.prototype.getWidth = function () { + return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0); + }; + VScrollBar.prototype.setHeight = function (height) { + this.element.style.height = height + "px"; + }; + VScrollBar.prototype.setScrollHeight = function (height) { + this.scrollHeight = height; + if (height > MAX_SCROLL_H) { + this.coeff = MAX_SCROLL_H / height; + height = MAX_SCROLL_H; + } + else if (this.coeff != 1) { + this.coeff = 1; + } + this.inner.style.height = height + "px"; + }; + VScrollBar.prototype.setScrollTop = function (scrollTop) { + if (this.scrollTop != scrollTop) { + this.skipEvent = true; + this.scrollTop = scrollTop; + this.element.scrollTop = scrollTop * this.coeff; + } + }; + return VScrollBar; +}(Scrollbar)); +VScrollBar.prototype.setInnerHeight = VScrollBar.prototype.setScrollHeight; +var HScrollBar = /** @class */ (function (_super) { + __extends(HScrollBar, _super); + function HScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-h') || this; + _this.scrollLeft = 0; + _this.height = renderer.$scrollbarWidth; + _this.inner.style.height = + _this.element.style.height = (_this.height || 15) + 5 + "px"; + return _this; + } + HScrollBar.prototype.onScroll = function () { + if (!this.skipEvent) { + this.scrollLeft = this.element.scrollLeft; + this._emit("scroll", { data: this.scrollLeft }); + } + this.skipEvent = false; + }; + HScrollBar.prototype.getHeight = function () { + return this.isVisible ? this.height : 0; + }; + HScrollBar.prototype.setWidth = function (width) { + this.element.style.width = width + "px"; + }; + HScrollBar.prototype.setInnerWidth = function (width) { + this.inner.style.width = width + "px"; + }; + HScrollBar.prototype.setScrollWidth = function (width) { + this.inner.style.width = width + "px"; + }; + HScrollBar.prototype.setScrollLeft = function (scrollLeft) { + if (this.scrollLeft != scrollLeft) { + this.skipEvent = true; + this.scrollLeft = this.element.scrollLeft = scrollLeft; + } + }; + return HScrollBar; +}(Scrollbar)); +exports.ScrollBar = VScrollBar; // backward compatibility +exports.ScrollBarV = VScrollBar; // backward compatibility +exports.ScrollBarH = HScrollBar; // backward compatibility +exports.VScrollBar = VScrollBar; +exports.HScrollBar = HScrollBar; + +}); + +ace.define("ace/scrollbar_custom",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +dom.importCssString(".ace_editor>.ace_sb-v div, .ace_editor>.ace_sb-h div{\n position: absolute;\n background: rgba(128, 128, 128, 0.6);\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n border: 1px solid #bbb;\n border-radius: 2px;\n z-index: 8;\n}\n.ace_editor>.ace_sb-v, .ace_editor>.ace_sb-h {\n position: absolute;\n z-index: 6;\n background: none;\n overflow: hidden!important;\n}\n.ace_editor>.ace_sb-v {\n z-index: 6;\n right: 0;\n top: 0;\n width: 12px;\n}\n.ace_editor>.ace_sb-v div {\n z-index: 8;\n right: 0;\n width: 100%;\n}\n.ace_editor>.ace_sb-h {\n bottom: 0;\n left: 0;\n height: 12px;\n}\n.ace_editor>.ace_sb-h div {\n bottom: 0;\n height: 100%;\n}\n.ace_editor>.ace_sb_grabbed {\n z-index: 8;\n background: #000;\n}", "ace_scrollbar.css", false); +var ScrollBar = /** @class */ (function () { + function ScrollBar(parent, classSuffix) { + this.element = dom.createElement("div"); + this.element.className = "ace_sb" + classSuffix; + this.inner = dom.createElement("div"); + this.inner.className = ""; + this.element.appendChild(this.inner); + this.VScrollWidth = 12; + this.HScrollHeight = 12; + parent.appendChild(this.element); + this.setVisible(false); + this.skipEvent = false; + event.addMultiMouseDownListener(this.element, [500, 300, 300], this, "onMouseDown"); + } + ScrollBar.prototype.setVisible = function (isVisible) { + this.element.style.display = isVisible ? "" : "none"; + this.isVisible = isVisible; + this.coeff = 1; + }; + return ScrollBar; +}()); +oop.implement(ScrollBar.prototype, EventEmitter); +var VScrollBar = /** @class */ (function (_super) { + __extends(VScrollBar, _super); + function VScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-v') || this; + _this.scrollTop = 0; + _this.scrollHeight = 0; + _this.parent = parent; + _this.width = _this.VScrollWidth; + _this.renderer = renderer; + _this.inner.style.width = _this.element.style.width = (_this.width || 15) + "px"; + _this.$minWidth = 0; + return _this; + } + VScrollBar.prototype.onMouseDown = function (eType, e) { + if (eType !== "mousedown") + return; + if (event.getButton(e) !== 0 || e.detail === 2) { + return; + } + if (e.target === this.inner) { + var self = this; + var mousePageY = e.clientY; + var onMouseMove = function (e) { + mousePageY = e.clientY; + }; + var onMouseUp = function () { + clearInterval(timerId); + }; + var startY = e.clientY; + var startTop = this.thumbTop; + var onScrollInterval = function () { + if (mousePageY === undefined) + return; + var scrollTop = self.scrollTopFromThumbTop(startTop + mousePageY - startY); + if (scrollTop === self.scrollTop) + return; + self._emit("scroll", { data: scrollTop }); + }; + event.capture(this.inner, onMouseMove, onMouseUp); + var timerId = setInterval(onScrollInterval, 20); + return event.preventDefault(e); + } + var top = e.clientY - this.element.getBoundingClientRect().top - this.thumbHeight / 2; + this._emit("scroll", { data: this.scrollTopFromThumbTop(top) }); + return event.preventDefault(e); + }; + VScrollBar.prototype.getHeight = function () { + return this.height; + }; + VScrollBar.prototype.scrollTopFromThumbTop = function (thumbTop) { + var scrollTop = thumbTop * (this.pageHeight - this.viewHeight) / (this.slideHeight - this.thumbHeight); + scrollTop = scrollTop >> 0; + if (scrollTop < 0) { + scrollTop = 0; + } + else if (scrollTop > this.pageHeight - this.viewHeight) { + scrollTop = this.pageHeight - this.viewHeight; + } + return scrollTop; + }; + VScrollBar.prototype.getWidth = function () { + return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0); + }; + VScrollBar.prototype.setHeight = function (height) { + this.height = Math.max(0, height); + this.slideHeight = this.height; + this.viewHeight = this.height; + this.setScrollHeight(this.pageHeight, true); + }; + VScrollBar.prototype.setScrollHeight = function (height, force) { + if (this.pageHeight === height && !force) + return; + this.pageHeight = height; + this.thumbHeight = this.slideHeight * this.viewHeight / this.pageHeight; + if (this.thumbHeight > this.slideHeight) + this.thumbHeight = this.slideHeight; + if (this.thumbHeight < 15) + this.thumbHeight = 15; + this.inner.style.height = this.thumbHeight + "px"; + if (this.scrollTop > (this.pageHeight - this.viewHeight)) { + this.scrollTop = (this.pageHeight - this.viewHeight); + if (this.scrollTop < 0) + this.scrollTop = 0; + this._emit("scroll", { data: this.scrollTop }); + } + }; + VScrollBar.prototype.setScrollTop = function (scrollTop) { + this.scrollTop = scrollTop; + if (scrollTop < 0) + scrollTop = 0; + this.thumbTop = scrollTop * (this.slideHeight - this.thumbHeight) / (this.pageHeight - this.viewHeight); + this.inner.style.top = this.thumbTop + "px"; + }; + return VScrollBar; +}(ScrollBar)); +VScrollBar.prototype.setInnerHeight = VScrollBar.prototype.setScrollHeight; +var HScrollBar = /** @class */ (function (_super) { + __extends(HScrollBar, _super); + function HScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-h') || this; + _this.scrollLeft = 0; + _this.scrollWidth = 0; + _this.height = _this.HScrollHeight; + _this.inner.style.height = _this.element.style.height = (_this.height || 12) + "px"; + _this.renderer = renderer; + return _this; + } + HScrollBar.prototype.onMouseDown = function (eType, e) { + if (eType !== "mousedown") + return; + if (event.getButton(e) !== 0 || e.detail === 2) { + return; + } + if (e.target === this.inner) { + var self = this; + var mousePageX = e.clientX; + var onMouseMove = function (e) { + mousePageX = e.clientX; + }; + var onMouseUp = function () { + clearInterval(timerId); + }; + var startX = e.clientX; + var startLeft = this.thumbLeft; + var onScrollInterval = function () { + if (mousePageX === undefined) + return; + var scrollLeft = self.scrollLeftFromThumbLeft(startLeft + mousePageX - startX); + if (scrollLeft === self.scrollLeft) + return; + self._emit("scroll", { data: scrollLeft }); + }; + event.capture(this.inner, onMouseMove, onMouseUp); + var timerId = setInterval(onScrollInterval, 20); + return event.preventDefault(e); + } + var left = e.clientX - this.element.getBoundingClientRect().left - this.thumbWidth / 2; + this._emit("scroll", { data: this.scrollLeftFromThumbLeft(left) }); + return event.preventDefault(e); + }; + HScrollBar.prototype.getHeight = function () { + return this.isVisible ? this.height : 0; + }; + HScrollBar.prototype.scrollLeftFromThumbLeft = function (thumbLeft) { + var scrollLeft = thumbLeft * (this.pageWidth - this.viewWidth) / (this.slideWidth - this.thumbWidth); + scrollLeft = scrollLeft >> 0; + if (scrollLeft < 0) { + scrollLeft = 0; + } + else if (scrollLeft > this.pageWidth - this.viewWidth) { + scrollLeft = this.pageWidth - this.viewWidth; + } + return scrollLeft; + }; + HScrollBar.prototype.setWidth = function (width) { + this.width = Math.max(0, width); + this.element.style.width = this.width + "px"; + this.slideWidth = this.width; + this.viewWidth = this.width; + this.setScrollWidth(this.pageWidth, true); + }; + HScrollBar.prototype.setScrollWidth = function (width, force) { + if (this.pageWidth === width && !force) + return; + this.pageWidth = width; + this.thumbWidth = this.slideWidth * this.viewWidth / this.pageWidth; + if (this.thumbWidth > this.slideWidth) + this.thumbWidth = this.slideWidth; + if (this.thumbWidth < 15) + this.thumbWidth = 15; + this.inner.style.width = this.thumbWidth + "px"; + if (this.scrollLeft > (this.pageWidth - this.viewWidth)) { + this.scrollLeft = (this.pageWidth - this.viewWidth); + if (this.scrollLeft < 0) + this.scrollLeft = 0; + this._emit("scroll", { data: this.scrollLeft }); + } + }; + HScrollBar.prototype.setScrollLeft = function (scrollLeft) { + this.scrollLeft = scrollLeft; + if (scrollLeft < 0) + scrollLeft = 0; + this.thumbLeft = scrollLeft * (this.slideWidth - this.thumbWidth) / (this.pageWidth - this.viewWidth); + this.inner.style.left = (this.thumbLeft) + "px"; + }; + return HScrollBar; +}(ScrollBar)); +HScrollBar.prototype.setInnerWidth = HScrollBar.prototype.setScrollWidth; +exports.ScrollBar = VScrollBar; // backward compatibility +exports.ScrollBarV = VScrollBar; // backward compatibility +exports.ScrollBarH = HScrollBar; // backward compatibility +exports.VScrollBar = VScrollBar; +exports.HScrollBar = HScrollBar; + +}); + +ace.define("ace/renderloop",["require","exports","module","ace/lib/event"], function(require, exports, module){"use strict"; +var event = require("./lib/event"); +var RenderLoop = /** @class */ (function () { + function RenderLoop(onRender, win) { + this.onRender = onRender; + this.pending = false; + this.changes = 0; + this.$recursionLimit = 2; + this.window = win || window; + var _self = this; + this._flush = function (ts) { + _self.pending = false; + var changes = _self.changes; + if (changes) { + event.blockIdle(100); + _self.changes = 0; + _self.onRender(changes); + } + if (_self.changes) { + if (_self.$recursionLimit-- < 0) + return; + _self.schedule(); + } + else { + _self.$recursionLimit = 2; + } + }; + } + RenderLoop.prototype.schedule = function (change) { + this.changes = this.changes | change; + if (this.changes && !this.pending) { + event.nextFrame(this._flush); + this.pending = true; + } + }; + RenderLoop.prototype.clear = function (change) { + var changes = this.changes; + this.changes = 0; + return changes; + }; + return RenderLoop; +}()); +exports.RenderLoop = RenderLoop; + +}); + +ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module){var oop = require("../lib/oop"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var CHAR_COUNT = 512; +var USE_OBSERVER = typeof ResizeObserver == "function"; +var L = 200; +var FontMetrics = /** @class */ (function () { + function FontMetrics(parentEl) { + this.el = dom.createElement("div"); + this.$setMeasureNodeStyles(this.el.style, true); + this.$main = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$main.style); + this.$measureNode = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$measureNode.style); + this.el.appendChild(this.$main); + this.el.appendChild(this.$measureNode); + parentEl.appendChild(this.el); + this.$measureNode.textContent = lang.stringRepeat("X", CHAR_COUNT); + this.$characterSize = { width: 0, height: 0 }; + if (USE_OBSERVER) + this.$addObserver(); + else + this.checkForSizeChanges(); + } + FontMetrics.prototype.$setMeasureNodeStyles = function (style, isRoot) { + style.width = style.height = "auto"; + style.left = style.top = "0px"; + style.visibility = "hidden"; + style.position = "absolute"; + style.whiteSpace = "pre"; + if (useragent.isIE < 8) { + style["font-family"] = "inherit"; + } + else { + style.font = "inherit"; + } + style.overflow = isRoot ? "hidden" : "visible"; + }; + FontMetrics.prototype.checkForSizeChanges = function (size) { + if (size === undefined) + size = this.$measureSizes(); + if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) { + this.$measureNode.style.fontWeight = "bold"; + var boldSize = this.$measureSizes(); + this.$measureNode.style.fontWeight = ""; + this.$characterSize = size; + this.charSizes = Object.create(null); + this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height; + this._emit("changeCharacterSize", { data: size }); + } + }; + FontMetrics.prototype.$addObserver = function () { + var self = this; + this.$observer = new window.ResizeObserver(function (e) { + self.checkForSizeChanges(); + }); + this.$observer.observe(this.$measureNode); + }; + FontMetrics.prototype.$pollSizeChanges = function () { + if (this.$pollSizeChangesTimer || this.$observer) + return this.$pollSizeChangesTimer; + var self = this; + return this.$pollSizeChangesTimer = event.onIdle(function cb() { + self.checkForSizeChanges(); + event.onIdle(cb, 500); + }, 500); + }; + FontMetrics.prototype.setPolling = function (val) { + if (val) { + this.$pollSizeChanges(); + } + else if (this.$pollSizeChangesTimer) { + clearInterval(this.$pollSizeChangesTimer); + this.$pollSizeChangesTimer = 0; + } + }; + FontMetrics.prototype.$measureSizes = function (node) { + var size = { + height: (node || this.$measureNode).clientHeight, + width: (node || this.$measureNode).clientWidth / CHAR_COUNT + }; + if (size.width === 0 || size.height === 0) + return null; + return size; + }; + FontMetrics.prototype.$measureCharWidth = function (ch) { + this.$main.textContent = lang.stringRepeat(ch, CHAR_COUNT); + var rect = this.$main.getBoundingClientRect(); + return rect.width / CHAR_COUNT; + }; + FontMetrics.prototype.getCharacterWidth = function (ch) { + var w = this.charSizes[ch]; + if (w === undefined) { + w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width; + } + return w; + }; + FontMetrics.prototype.destroy = function () { + clearInterval(this.$pollSizeChangesTimer); + if (this.$observer) + this.$observer.disconnect(); + if (this.el && this.el.parentNode) + this.el.parentNode.removeChild(this.el); + }; + FontMetrics.prototype.$getZoom = function (element) { + if (!element || !element.parentElement) + return 1; + return (Number(window.getComputedStyle(element)["zoom"]) || 1) * this.$getZoom(element.parentElement); + }; + FontMetrics.prototype.$initTransformMeasureNodes = function () { + var t = function (t, l) { + return ["div", { + style: "position: absolute;top:" + t + "px;left:" + l + "px;" + }]; + }; + this.els = dom.buildDom([t(0, 0), t(L, 0), t(0, L), t(L, L)], this.el); + }; + FontMetrics.prototype.transformCoordinates = function (clientPos, elPos) { + if (clientPos) { + var zoom = this.$getZoom(this.el); + clientPos = mul(1 / zoom, clientPos); + } + function solve(l1, l2, r) { + var det = l1[1] * l2[0] - l1[0] * l2[1]; + return [ + (-l2[1] * r[0] + l2[0] * r[1]) / det, + (+l1[1] * r[0] - l1[0] * r[1]) / det + ]; + } + function sub(a, b) { return [a[0] - b[0], a[1] - b[1]]; } + function add(a, b) { return [a[0] + b[0], a[1] + b[1]]; } + function mul(a, b) { return [a * b[0], a * b[1]]; } + if (!this.els) + this.$initTransformMeasureNodes(); + function p(el) { + var r = el.getBoundingClientRect(); + return [r.left, r.top]; + } + var a = p(this.els[0]); + var b = p(this.els[1]); + var c = p(this.els[2]); + var d = p(this.els[3]); + var h = solve(sub(d, b), sub(d, c), sub(add(b, c), add(d, a))); + var m1 = mul(1 + h[0], sub(b, a)); + var m2 = mul(1 + h[1], sub(c, a)); + if (elPos) { + var x = elPos; + var k = h[0] * x[0] / L + h[1] * x[1] / L + 1; + var ut = add(mul(x[0], m1), mul(x[1], m2)); + return add(mul(1 / k / L, ut), a); + } + var u = sub(clientPos, a); + var f = solve(sub(m1, mul(h[0], u)), sub(m2, mul(h[1], u)), u); + return mul(L, f); + }; + return FontMetrics; +}()); +FontMetrics.prototype.$characterSize = { width: 0, height: 0 }; +oop.implement(FontMetrics.prototype, EventEmitter); +exports.FontMetrics = FontMetrics; + +}); + +ace.define("ace/css/editor-css",["require","exports","module"], function(require, exports, module){/* +styles = [] +for (var i = 1; i < 16; i++) { + styles.push(".ace_br" + i + "{" + ( + ["top-left", "top-right", "bottom-right", "bottom-left"] + ).map(function(x, j) { + return i & (1< .ace_line, .ace_text-layer > .ace_line_group {\n contain: style size layout;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n}\n\n.ace_hidpi .ace_text-layer,\n.ace_hidpi .ace_gutter-layer,\n.ace_hidpi .ace_content,\n.ace_hidpi .ace_gutter {\n contain: strict;\n}\n.ace_hidpi .ace_text-layer > .ace_line, \n.ace_hidpi .ace_text-layer > .ace_line_group {\n contain: strict;\n}\n\n.ace_cjk {\n display: inline-block;\n text-align: center;\n}\n\n.ace_cursor-layer {\n z-index: 4;\n}\n\n.ace_cursor {\n z-index: 4;\n position: absolute;\n box-sizing: border-box;\n border-left: 2px solid;\n /* workaround for smooth cursor repaintng whole screen in chrome */\n transform: translatez(0);\n}\n\n.ace_multiselect .ace_cursor {\n border-left-width: 1px;\n}\n\n.ace_slim-cursors .ace_cursor {\n border-left-width: 1px;\n}\n\n.ace_overwrite-cursors .ace_cursor {\n border-left-width: 0;\n border-bottom: 1px solid;\n}\n\n.ace_hidden-cursors .ace_cursor {\n opacity: 0.2;\n}\n\n.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\n opacity: 0;\n}\n\n.ace_smooth-blinking .ace_cursor {\n transition: opacity 0.18s;\n}\n\n.ace_animate-blinking .ace_cursor {\n animation-duration: 1000ms;\n animation-timing-function: step-end;\n animation-name: blink-ace-animate;\n animation-iteration-count: infinite;\n}\n\n.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\n animation-duration: 1000ms;\n animation-timing-function: ease-in-out;\n animation-name: blink-ace-animate-smooth;\n}\n \n@keyframes blink-ace-animate {\n from, to { opacity: 1; }\n 60% { opacity: 0; }\n}\n\n@keyframes blink-ace-animate-smooth {\n from, to { opacity: 1; }\n 45% { opacity: 1; }\n 60% { opacity: 0; }\n 85% { opacity: 0; }\n}\n\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\n position: absolute;\n z-index: 3;\n}\n\n.ace_marker-layer .ace_selection {\n position: absolute;\n z-index: 5;\n}\n\n.ace_marker-layer .ace_bracket {\n position: absolute;\n z-index: 6;\n}\n\n.ace_marker-layer .ace_error_bracket {\n position: absolute;\n border-bottom: 1px solid #DE5555;\n border-radius: 0;\n}\n\n.ace_marker-layer .ace_active-line {\n position: absolute;\n z-index: 2;\n}\n\n.ace_marker-layer .ace_selected-word {\n position: absolute;\n z-index: 4;\n box-sizing: border-box;\n}\n\n.ace_line .ace_fold {\n box-sizing: border-box;\n\n display: inline-block;\n height: 11px;\n margin-top: -2px;\n vertical-align: middle;\n\n background-image:\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\n background-repeat: no-repeat, repeat-x;\n background-position: center center, top left;\n color: transparent;\n\n border: 1px solid black;\n border-radius: 2px;\n\n cursor: pointer;\n pointer-events: auto;\n}\n\n.ace_dark .ace_fold {\n}\n\n.ace_fold:hover{\n background-image:\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\n}\n\n.ace_tooltip {\n background-color: #f5f5f5;\n border: 1px solid gray;\n border-radius: 1px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\n color: black;\n max-width: 100%;\n padding: 3px 4px;\n position: fixed;\n z-index: 999999;\n box-sizing: border-box;\n cursor: default;\n white-space: pre-wrap;\n word-wrap: break-word;\n line-height: normal;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n pointer-events: none;\n overflow: auto;\n max-width: min(60em, 66vw);\n overscroll-behavior: contain;\n}\n.ace_tooltip pre {\n white-space: pre-wrap;\n}\n\n.ace_tooltip.ace_dark {\n background-color: #636363;\n color: #fff;\n}\n\n.ace_tooltip:focus {\n outline: 1px solid #5E9ED6;\n}\n\n.ace_icon {\n display: inline-block;\n width: 18px;\n vertical-align: top;\n}\n\n.ace_icon_svg {\n display: inline-block;\n width: 12px;\n vertical-align: top;\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-size: 12px;\n -webkit-mask-position: center;\n}\n\n.ace_folding-enabled > .ace_gutter-cell, .ace_folding-enabled > .ace_gutter-cell_svg-icons {\n padding-right: 13px;\n}\n\n.ace_fold-widget {\n box-sizing: border-box;\n\n margin: 0 -12px 0 1px;\n display: none;\n width: 11px;\n vertical-align: top;\n\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\n background-repeat: no-repeat;\n background-position: center;\n\n border-radius: 3px;\n \n border: 1px solid transparent;\n cursor: pointer;\n}\n\n.ace_folding-enabled .ace_fold-widget {\n display: inline-block; \n}\n\n.ace_fold-widget.ace_end {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\n}\n\n.ace_fold-widget.ace_closed {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\n}\n\n.ace_fold-widget:hover {\n border: 1px solid rgba(0, 0, 0, 0.3);\n background-color: rgba(255, 255, 255, 0.2);\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n}\n\n.ace_fold-widget:active {\n border: 1px solid rgba(0, 0, 0, 0.4);\n background-color: rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n}\n/**\n * Dark version for fold widgets\n */\n.ace_dark .ace_fold-widget {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\n}\n.ace_dark .ace_fold-widget.ace_end {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\n}\n.ace_dark .ace_fold-widget.ace_closed {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\n}\n.ace_dark .ace_fold-widget:hover {\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\n background-color: rgba(255, 255, 255, 0.1);\n}\n.ace_dark .ace_fold-widget:active {\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\n}\n\n.ace_inline_button {\n border: 1px solid lightgray;\n display: inline-block;\n margin: -1px 8px;\n padding: 0 5px;\n pointer-events: auto;\n cursor: pointer;\n}\n.ace_inline_button:hover {\n border-color: gray;\n background: rgba(200,200,200,0.2);\n display: inline-block;\n pointer-events: auto;\n}\n\n.ace_fold-widget.ace_invalid {\n background-color: #FFB4B4;\n border-color: #DE5555;\n}\n\n.ace_fade-fold-widgets .ace_fold-widget {\n transition: opacity 0.4s ease 0.05s;\n opacity: 0;\n}\n\n.ace_fade-fold-widgets:hover .ace_fold-widget {\n transition: opacity 0.05s ease 0.05s;\n opacity:1;\n}\n\n.ace_underline {\n text-decoration: underline;\n}\n\n.ace_bold {\n font-weight: bold;\n}\n\n.ace_nobold .ace_bold {\n font-weight: normal;\n}\n\n.ace_italic {\n font-style: italic;\n}\n\n\n.ace_error-marker {\n background-color: rgba(255, 0, 0,0.2);\n position: absolute;\n z-index: 9;\n}\n\n.ace_highlight-marker {\n background-color: rgba(255, 255, 0,0.2);\n position: absolute;\n z-index: 8;\n}\n\n.ace_mobile-menu {\n position: absolute;\n line-height: 1.5;\n border-radius: 4px;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n background: white;\n box-shadow: 1px 3px 2px grey;\n border: 1px solid #dcdcdc;\n color: black;\n}\n.ace_dark > .ace_mobile-menu {\n background: #333;\n color: #ccc;\n box-shadow: 1px 3px 2px grey;\n border: 1px solid #444;\n\n}\n.ace_mobile-button {\n padding: 2px;\n cursor: pointer;\n overflow: hidden;\n}\n.ace_mobile-button:hover {\n background-color: #eee;\n opacity:1;\n}\n.ace_mobile-button:active {\n background-color: #ddd;\n}\n\n.ace_placeholder {\n position: relative;\n font-family: arial;\n transform: scale(0.9);\n transform-origin: left;\n white-space: pre;\n opacity: 0.7;\n margin: 0 10px;\n z-index: 1;\n}\n\n.ace_ghost_text {\n opacity: 0.5;\n font-style: italic;\n}\n\n.ace_ghost_text_container > div {\n white-space: pre;\n}\n\n.ghost_text_line_wrapped::after {\n content: \"\u21A9\";\n position: absolute;\n}\n\n.ace_lineWidgetContainer.ace_ghost_text {\n margin: 0px 4px\n}\n\n.ace_screenreader-only {\n position:absolute;\n left:-10000px;\n top:auto;\n width:1px;\n height:1px;\n overflow:hidden;\n}\n\n.ace_hidden_token {\n display: none;\n}"; + +}); + +ace.define("ace/layer/decorators",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var Decorator = /** @class */ (function () { + function Decorator(parent, renderer) { + this.canvas = dom.createElement("canvas"); + this.renderer = renderer; + this.pixelRatio = 1; + this.maxHeight = renderer.layerConfig.maxHeight; + this.lineHeight = renderer.layerConfig.lineHeight; + this.canvasHeight = parent.parent.scrollHeight; + this.heightRatio = this.canvasHeight / this.maxHeight; + this.canvasWidth = parent.width; + this.minDecorationHeight = (2 * this.pixelRatio) | 0; + this.halfMinDecorationHeight = (this.minDecorationHeight / 2) | 0; + this.canvas.width = this.canvasWidth; + this.canvas.height = this.canvasHeight; + this.canvas.style.top = 0 + "px"; + this.canvas.style.right = 0 + "px"; + this.canvas.style.zIndex = 7 + "px"; + this.canvas.style.position = "absolute"; + this.colors = {}; + this.colors.dark = { + "error": "rgba(255, 18, 18, 1)", + "warning": "rgba(18, 136, 18, 1)", + "info": "rgba(18, 18, 136, 1)" + }; + this.colors.light = { + "error": "rgb(255,51,51)", + "warning": "rgb(32,133,72)", + "info": "rgb(35,68,138)" + }; + parent.element.appendChild(this.canvas); + } + Decorator.prototype.$updateDecorators = function (config) { + var colors = (this.renderer.theme.isDark === true) ? this.colors.dark : this.colors.light; + if (config) { + this.maxHeight = config.maxHeight; + this.lineHeight = config.lineHeight; + this.canvasHeight = config.height; + var allLineHeight = (config.lastRow + 1) * this.lineHeight; + if (allLineHeight < this.canvasHeight) { + this.heightRatio = 1; + } + else { + this.heightRatio = this.canvasHeight / this.maxHeight; + } + } + var ctx = this.canvas.getContext("2d"); + function compare(a, b) { + if (a.priority < b.priority) + return -1; + if (a.priority > b.priority) + return 1; + return 0; + } + var annotations = this.renderer.session.$annotations; + ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + if (annotations) { + var priorities = { + "info": 1, + "warning": 2, + "error": 3 + }; + annotations.forEach(function (item) { + item.priority = priorities[item.type] || null; + }); + annotations = annotations.sort(compare); + var foldData = this.renderer.session.$foldData; + for (var i = 0; i < annotations.length; i++) { + var row = annotations[i].row; + var compensateFold = this.compensateFoldRows(row, foldData); + var currentY = Math.round((row - compensateFold) * this.lineHeight * this.heightRatio); + var y1 = Math.round(((row - compensateFold) * this.lineHeight * this.heightRatio)); + var y2 = Math.round((((row - compensateFold) * this.lineHeight + this.lineHeight) * this.heightRatio)); + var height = y2 - y1; + if (height < this.minDecorationHeight) { + var yCenter = ((y1 + y2) / 2) | 0; + if (yCenter < this.halfMinDecorationHeight) { + yCenter = this.halfMinDecorationHeight; + } + else if (yCenter + this.halfMinDecorationHeight > this.canvasHeight) { + yCenter = this.canvasHeight - this.halfMinDecorationHeight; + } + y1 = Math.round(yCenter - this.halfMinDecorationHeight); + y2 = Math.round(yCenter + this.halfMinDecorationHeight); + } + ctx.fillStyle = colors[annotations[i].type] || null; + ctx.fillRect(0, currentY, this.canvasWidth, y2 - y1); + } + } + var cursor = this.renderer.session.selection.getCursor(); + if (cursor) { + var compensateFold = this.compensateFoldRows(cursor.row, foldData); + var currentY = Math.round((cursor.row - compensateFold) * this.lineHeight * this.heightRatio); + ctx.fillStyle = "rgba(0, 0, 0, 0.5)"; + ctx.fillRect(0, currentY, this.canvasWidth, 2); + } + }; + Decorator.prototype.compensateFoldRows = function (row, foldData) { + var compensateFold = 0; + if (foldData && foldData.length > 0) { + for (var j = 0; j < foldData.length; j++) { + if (row > foldData[j].start.row && row < foldData[j].end.row) { + compensateFold += row - foldData[j].start.row; + } + else if (row >= foldData[j].end.row) { + compensateFold += foldData[j].end.row - foldData[j].start.row; + } + } + } + return compensateFold; + }; + return Decorator; +}()); +oop.implement(Decorator.prototype, EventEmitter); +exports.Decorator = Decorator; + +}); + +ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/scrollbar_custom","ace/scrollbar_custom","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/css/editor-css","ace/layer/decorators","ace/lib/useragent","ace/layer/text_util"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var lang = require("./lib/lang"); +var config = require("./config"); +var GutterLayer = require("./layer/gutter").Gutter; +var MarkerLayer = require("./layer/marker").Marker; +var TextLayer = require("./layer/text").Text; +var CursorLayer = require("./layer/cursor").Cursor; +var HScrollBar = require("./scrollbar").HScrollBar; +var VScrollBar = require("./scrollbar").VScrollBar; +var HScrollBarCustom = require("./scrollbar_custom").HScrollBar; +var VScrollBarCustom = require("./scrollbar_custom").VScrollBar; +var RenderLoop = require("./renderloop").RenderLoop; +var FontMetrics = require("./layer/font_metrics").FontMetrics; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var editorCss = require("./css/editor-css"); +var Decorator = require("./layer/decorators").Decorator; +var useragent = require("./lib/useragent"); +var isTextToken = require("./layer/text_util").isTextToken; +dom.importCssString(editorCss, "ace_editor.css", false); +var VirtualRenderer = /** @class */ (function () { + function VirtualRenderer(container, theme) { + var _self = this; + this.container = container || dom.createElement("div"); + dom.addCssClass(this.container, "ace_editor"); + if (dom.HI_DPI) + dom.addCssClass(this.container, "ace_hidpi"); + this.setTheme(theme); + if (config.get("useStrictCSP") == null) + config.set("useStrictCSP", false); + this.$gutter = dom.createElement("div"); + this.$gutter.className = "ace_gutter"; + this.container.appendChild(this.$gutter); + this.$gutter.setAttribute("aria-hidden", "true"); + this.scroller = dom.createElement("div"); + this.scroller.className = "ace_scroller"; + this.container.appendChild(this.scroller); + this.content = dom.createElement("div"); + this.content.className = "ace_content"; + this.scroller.appendChild(this.content); + this.$gutterLayer = new GutterLayer(this.$gutter); + this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); + this.$markerBack = new MarkerLayer(this.content); + var textLayer = this.$textLayer = new TextLayer(this.content); + this.canvas = textLayer.element; + this.$markerFront = new MarkerLayer(this.content); + this.$cursorLayer = new CursorLayer(this.content); + this.$horizScroll = false; + this.$vScroll = false; + this.scrollBar = + this.scrollBarV = new VScrollBar(this.container, this); + this.scrollBarH = new HScrollBar(this.container, this); + this.scrollBarV.on("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.on("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + this.scrollTop = 0; + this.scrollLeft = 0; + this.cursorPos = { + row: 0, + column: 0 + }; + this.$fontMetrics = new FontMetrics(this.container); + this.$textLayer.$setFontMetrics(this.$fontMetrics); + this.$textLayer.on("changeCharacterSize", function (e) { + _self.updateCharacterSize(); + _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height); + _self._signal("changeCharacterSize", e); + }); + this.$size = { + width: 0, + height: 0, + scrollerHeight: 0, + scrollerWidth: 0, + $dirty: true + }; + this.layerConfig = { + width: 1, + padding: 0, + firstRow: 0, + firstRowScreen: 0, + lastRow: 0, + lineHeight: 0, + characterWidth: 0, + minHeight: 1, + maxHeight: 1, + offset: 0, + height: 1, + gutterOffset: 1 + }; + this.scrollMargin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + this.margin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + this.$keepTextAreaAtCursor = !useragent.isIOS; + this.$loop = new RenderLoop(this.$renderChanges.bind(this), this.container.ownerDocument.defaultView); + this.$loop.schedule(this.CHANGE_FULL); + this.updateCharacterSize(); + this.setPadding(4); + this.$addResizeObserver(); + config.resetOptions(this); + config._signal("renderer", this); + } + VirtualRenderer.prototype.updateCharacterSize = function () { + if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) { + this.$allowBoldFonts = this.$textLayer.allowBoldFonts; + this.setStyle("ace_nobold", !this.$allowBoldFonts); + } + this.layerConfig.characterWidth = + this.characterWidth = this.$textLayer.getCharacterWidth(); + this.layerConfig.lineHeight = + this.lineHeight = this.$textLayer.getLineHeight(); + this.$updatePrintMargin(); + dom.setStyle(this.scroller.style, "line-height", this.lineHeight + "px"); + }; + VirtualRenderer.prototype.setSession = function (session) { + if (this.session) + this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode); + this.session = session; + if (session && this.scrollMargin.top && session.getScrollTop() <= 0) + session.setScrollTop(-this.scrollMargin.top); + this.$cursorLayer.setSession(session); + this.$markerBack.setSession(session); + this.$markerFront.setSession(session); + this.$gutterLayer.setSession(session); + this.$textLayer.setSession(session); + if (!session) + return; + this.$loop.schedule(this.CHANGE_FULL); + this.session.$setFontMetrics(this.$fontMetrics); + this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null; + this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this); + this.onChangeNewLineMode(); + this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode); + }; + VirtualRenderer.prototype.updateLines = function (firstRow, lastRow, force) { + if (lastRow === undefined) + lastRow = Infinity; + if (!this.$changedLines) { + this.$changedLines = { + firstRow: firstRow, + lastRow: lastRow + }; + } + else { + if (this.$changedLines.firstRow > firstRow) + this.$changedLines.firstRow = firstRow; + if (this.$changedLines.lastRow < lastRow) + this.$changedLines.lastRow = lastRow; + } + if (this.$changedLines.lastRow < this.layerConfig.firstRow) { + if (force) + this.$changedLines.lastRow = this.layerConfig.lastRow; + else + return; + } + if (this.$changedLines.firstRow > this.layerConfig.lastRow) + return; + this.$loop.schedule(this.CHANGE_LINES); + }; + VirtualRenderer.prototype.onChangeNewLineMode = function () { + this.$loop.schedule(this.CHANGE_TEXT); + this.$textLayer.$updateEolChar(); + this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR); + }; + VirtualRenderer.prototype.onChangeTabSize = function () { + this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER); + this.$textLayer.onChangeTabSize(); + }; + VirtualRenderer.prototype.updateText = function () { + this.$loop.schedule(this.CHANGE_TEXT); + }; + VirtualRenderer.prototype.updateFull = function (force) { + if (force) + this.$renderChanges(this.CHANGE_FULL, true); + else + this.$loop.schedule(this.CHANGE_FULL); + }; + VirtualRenderer.prototype.updateFontSize = function () { + this.$textLayer.checkForSizeChanges(); + }; + VirtualRenderer.prototype.$updateSizeAsync = function () { + if (this.$loop.pending) + this.$size.$dirty = true; + else + this.onResize(); + }; + VirtualRenderer.prototype.onResize = function (force, gutterWidth, width, height) { + if (this.resizing > 2) + return; + else if (this.resizing > 0) + this.resizing++; + else + this.resizing = force ? 1 : 0; + var el = this.container; + if (!height) + height = el.clientHeight || el.scrollHeight; + if (!height && this.$maxLines && this.lineHeight > 1) { + if (!el.style.height || el.style.height == "0px") { + el.style.height = "1px"; + height = el.clientHeight || el.scrollHeight; + } + } + if (!width) + width = el.clientWidth || el.scrollWidth; + var changes = this.$updateCachedSize(force, gutterWidth, width, height); + if (this.$resizeTimer) + this.$resizeTimer.cancel(); + if (!this.$size.scrollerHeight || (!width && !height)) + return this.resizing = 0; + if (force) + this.$gutterLayer.$padding = null; + if (force) + this.$renderChanges(changes | this.$changes, true); + else + this.$loop.schedule(changes | this.$changes); + if (this.resizing) + this.resizing = 0; + this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null; + if (this.$customScrollbar) { + this.$updateCustomScrollbar(true); + } + }; + VirtualRenderer.prototype.$updateCachedSize = function (force, gutterWidth, width, height) { + height -= (this.$extraHeight || 0); + var changes = 0; + var size = this.$size; + var oldSize = { + width: size.width, + height: size.height, + scrollerHeight: size.scrollerHeight, + scrollerWidth: size.scrollerWidth + }; + if (height && (force || size.height != height)) { + size.height = height; + changes |= this.CHANGE_SIZE; + size.scrollerHeight = size.height; + if (this.$horizScroll) + size.scrollerHeight -= this.scrollBarH.getHeight(); + this.scrollBarV.setHeight(size.scrollerHeight); + this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px"; + changes = changes | this.CHANGE_SCROLL; + } + if (width && (force || size.width != width)) { + changes |= this.CHANGE_SIZE; + size.width = width; + if (gutterWidth == null) + gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; + this.gutterWidth = gutterWidth; + dom.setStyle(this.scrollBarH.element.style, "left", gutterWidth + "px"); + dom.setStyle(this.scroller.style, "left", gutterWidth + this.margin.left + "px"); + size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth() - this.margin.h); + dom.setStyle(this.$gutter.style, "left", this.margin.left + "px"); + var right = this.scrollBarV.getWidth() + "px"; + dom.setStyle(this.scrollBarH.element.style, "right", right); + dom.setStyle(this.scroller.style, "right", right); + dom.setStyle(this.scroller.style, "bottom", this.scrollBarH.getHeight()); + this.scrollBarH.setWidth(size.scrollerWidth); + if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) { + changes |= this.CHANGE_FULL; + } + } + size.$dirty = !width || !height; + if (changes) + this._signal("resize", oldSize); + return changes; + }; + VirtualRenderer.prototype.onGutterResize = function (width) { + var gutterWidth = this.$showGutter ? width : 0; + if (gutterWidth != this.gutterWidth) + this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height); + if (this.session.getUseWrapMode() && this.adjustWrapLimit()) { + this.$loop.schedule(this.CHANGE_FULL); + } + else if (this.$size.$dirty) { + this.$loop.schedule(this.CHANGE_FULL); + } + else { + this.$computeLayerConfig(); + } + }; + VirtualRenderer.prototype.adjustWrapLimit = function () { + var availableWidth = this.$size.scrollerWidth - this.$padding * 2; + var limit = Math.floor(availableWidth / this.characterWidth); + return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn); + }; + VirtualRenderer.prototype.setAnimatedScroll = function (shouldAnimate) { + this.setOption("animatedScroll", shouldAnimate); + }; + VirtualRenderer.prototype.getAnimatedScroll = function () { + return this.$animatedScroll; + }; + VirtualRenderer.prototype.setShowInvisibles = function (showInvisibles) { + this.setOption("showInvisibles", showInvisibles); + this.session.$bidiHandler.setShowInvisibles(showInvisibles); + }; + VirtualRenderer.prototype.getShowInvisibles = function () { + return this.getOption("showInvisibles"); + }; + VirtualRenderer.prototype.getDisplayIndentGuides = function () { + return this.getOption("displayIndentGuides"); + }; + VirtualRenderer.prototype.setDisplayIndentGuides = function (display) { + this.setOption("displayIndentGuides", display); + }; + VirtualRenderer.prototype.getHighlightIndentGuides = function () { + return this.getOption("highlightIndentGuides"); + }; + VirtualRenderer.prototype.setHighlightIndentGuides = function (highlight) { + this.setOption("highlightIndentGuides", highlight); + }; + VirtualRenderer.prototype.setShowPrintMargin = function (showPrintMargin) { + this.setOption("showPrintMargin", showPrintMargin); + }; + VirtualRenderer.prototype.getShowPrintMargin = function () { + return this.getOption("showPrintMargin"); + }; + VirtualRenderer.prototype.setPrintMarginColumn = function (printMarginColumn) { + this.setOption("printMarginColumn", printMarginColumn); + }; + VirtualRenderer.prototype.getPrintMarginColumn = function () { + return this.getOption("printMarginColumn"); + }; + VirtualRenderer.prototype.getShowGutter = function () { + return this.getOption("showGutter"); + }; + VirtualRenderer.prototype.setShowGutter = function (show) { + return this.setOption("showGutter", show); + }; + VirtualRenderer.prototype.getFadeFoldWidgets = function () { + return this.getOption("fadeFoldWidgets"); + }; + VirtualRenderer.prototype.setFadeFoldWidgets = function (show) { + this.setOption("fadeFoldWidgets", show); + }; + VirtualRenderer.prototype.setHighlightGutterLine = function (shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + VirtualRenderer.prototype.getHighlightGutterLine = function () { + return this.getOption("highlightGutterLine"); + }; + VirtualRenderer.prototype.$updatePrintMargin = function () { + if (!this.$showPrintMargin && !this.$printMarginEl) + return; + if (!this.$printMarginEl) { + var containerEl = dom.createElement("div"); + containerEl.className = "ace_layer ace_print-margin-layer"; + this.$printMarginEl = dom.createElement("div"); + this.$printMarginEl.className = "ace_print-margin"; + containerEl.appendChild(this.$printMarginEl); + this.content.insertBefore(containerEl, this.content.firstChild); + } + var style = this.$printMarginEl.style; + style.left = Math.round(this.characterWidth * this.$printMarginColumn + this.$padding) + "px"; + style.visibility = this.$showPrintMargin ? "visible" : "hidden"; + if (this.session && this.session.$wrap == -1) + this.adjustWrapLimit(); + }; + VirtualRenderer.prototype.getContainerElement = function () { + return this.container; + }; + VirtualRenderer.prototype.getMouseEventTarget = function () { + return this.scroller; + }; + VirtualRenderer.prototype.getTextAreaContainer = function () { + return this.container; + }; + VirtualRenderer.prototype.$moveTextAreaToCursor = function () { + if (this.$isMousePressed) + return; + var style = this.textarea.style; + var composition = this.$composition; + if (!this.$keepTextAreaAtCursor && !composition) { + dom.translate(this.textarea, -100, 0); + return; + } + var pixelPos = this.$cursorLayer.$pixelPos; + if (!pixelPos) + return; + if (composition && composition.markerRange) + pixelPos = this.$cursorLayer.getPixelPosition(composition.markerRange.start, true); + var config = this.layerConfig; + var posTop = pixelPos.top; + var posLeft = pixelPos.left; + posTop -= config.offset; + var h = composition && composition.useTextareaForIME || useragent.isMobile ? this.lineHeight : 1; + if (posTop < 0 || posTop > config.height - h) { + dom.translate(this.textarea, 0, 0); + return; + } + var w = 1; + var maxTop = this.$size.height - h; + if (!composition) { + posTop += this.lineHeight; + } + else { + if (composition.useTextareaForIME) { + var val = this.textarea.value; + w = this.characterWidth * (this.session.$getStringScreenWidth(val)[0]); + } + else { + posTop += this.lineHeight + 2; + } + } + posLeft -= this.scrollLeft; + if (posLeft > this.$size.scrollerWidth - w) + posLeft = this.$size.scrollerWidth - w; + posLeft += this.gutterWidth + this.margin.left; + dom.setStyle(style, "height", h + "px"); + dom.setStyle(style, "width", w + "px"); + dom.translate(this.textarea, Math.min(posLeft, this.$size.scrollerWidth - w), Math.min(posTop, maxTop)); + }; + VirtualRenderer.prototype.getFirstVisibleRow = function () { + return this.layerConfig.firstRow; + }; + VirtualRenderer.prototype.getFirstFullyVisibleRow = function () { + return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1); + }; + VirtualRenderer.prototype.getLastFullyVisibleRow = function () { + var config = this.layerConfig; + var lastRow = config.lastRow; + var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight; + if (top - this.session.getScrollTop() > config.height - config.lineHeight) + return lastRow - 1; + return lastRow; + }; + VirtualRenderer.prototype.getLastVisibleRow = function () { + return this.layerConfig.lastRow; + }; + VirtualRenderer.prototype.setPadding = function (padding) { + this.$padding = padding; + this.$textLayer.setPadding(padding); + this.$cursorLayer.setPadding(padding); + this.$markerFront.setPadding(padding); + this.$markerBack.setPadding(padding); + this.$loop.schedule(this.CHANGE_FULL); + this.$updatePrintMargin(); + }; + VirtualRenderer.prototype.setScrollMargin = function (top, bottom, left, right) { + var sm = this.scrollMargin; + sm.top = top | 0; + sm.bottom = bottom | 0; + sm.right = right | 0; + sm.left = left | 0; + sm.v = sm.top + sm.bottom; + sm.h = sm.left + sm.right; + if (sm.top && this.scrollTop <= 0 && this.session) + this.session.setScrollTop(-sm.top); + this.updateFull(); + }; + VirtualRenderer.prototype.setMargin = function (top, bottom, left, right) { + var sm = this.margin; + sm.top = top | 0; + sm.bottom = bottom | 0; + sm.right = right | 0; + sm.left = left | 0; + sm.v = sm.top + sm.bottom; + sm.h = sm.left + sm.right; + this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height); + this.updateFull(); + }; + VirtualRenderer.prototype.getHScrollBarAlwaysVisible = function () { + return this.$hScrollBarAlwaysVisible; + }; + VirtualRenderer.prototype.setHScrollBarAlwaysVisible = function (alwaysVisible) { + this.setOption("hScrollBarAlwaysVisible", alwaysVisible); + }; + VirtualRenderer.prototype.getVScrollBarAlwaysVisible = function () { + return this.$vScrollBarAlwaysVisible; + }; + VirtualRenderer.prototype.setVScrollBarAlwaysVisible = function (alwaysVisible) { + this.setOption("vScrollBarAlwaysVisible", alwaysVisible); + }; + VirtualRenderer.prototype.$updateScrollBarV = function () { + var scrollHeight = this.layerConfig.maxHeight; + var scrollerHeight = this.$size.scrollerHeight; + if (!this.$maxLines && this.$scrollPastEnd) { + scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd; + if (this.scrollTop > scrollHeight - scrollerHeight) { + scrollHeight = this.scrollTop + scrollerHeight; + this.scrollBarV.scrollTop = null; + } + } + this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v); + this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top); + }; + VirtualRenderer.prototype.$updateScrollBarH = function () { + this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h); + this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left); + }; + VirtualRenderer.prototype.freeze = function () { + this.$frozen = true; + }; + VirtualRenderer.prototype.unfreeze = function () { + this.$frozen = false; + }; + VirtualRenderer.prototype.$renderChanges = function (changes, force) { + if (this.$changes) { + changes |= this.$changes; + this.$changes = 0; + } + if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) { + this.$changes |= changes; + return; + } + if (this.$size.$dirty) { + this.$changes |= changes; + return this.onResize(true); + } + if (!this.lineHeight) { + this.$textLayer.checkForSizeChanges(); + } + this._signal("beforeRender", changes); + if (this.session && this.session.$bidiHandler) + this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics); + var config = this.layerConfig; + if (changes & this.CHANGE_FULL || + changes & this.CHANGE_SIZE || + changes & this.CHANGE_TEXT || + changes & this.CHANGE_LINES || + changes & this.CHANGE_SCROLL || + changes & this.CHANGE_H_SCROLL) { + changes |= this.$computeLayerConfig() | this.$loop.clear(); + if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) { + var st = this.scrollTop + (config.firstRow - Math.max(this.layerConfig.firstRow, 0)) * this.lineHeight; + if (st > 0) { + this.scrollTop = st; + changes = changes | this.CHANGE_SCROLL; + changes |= this.$computeLayerConfig() | this.$loop.clear(); + } + } + config = this.layerConfig; + this.$updateScrollBarV(); + if (changes & this.CHANGE_H_SCROLL) + this.$updateScrollBarH(); + dom.translate(this.content, -this.scrollLeft, -config.offset); + var width = config.width + 2 * this.$padding + "px"; + var height = config.minHeight + "px"; + dom.setStyle(this.content.style, "width", width); + dom.setStyle(this.content.style, "height", height); + } + if (changes & this.CHANGE_H_SCROLL) { + dom.translate(this.content, -this.scrollLeft, -config.offset); + this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller " : "ace_scroller ace_scroll-left "; + if (this.enableKeyboardAccessibility) + this.scroller.className += this.keyboardFocusClassName; + } + if (changes & this.CHANGE_FULL) { + this.$changedLines = null; + this.$textLayer.update(config); + if (this.$showGutter) + this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } + this.$markerBack.update(config); + this.$markerFront.update(config); + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + this._signal("afterRender", changes); + return; + } + if (changes & this.CHANGE_SCROLL) { + this.$changedLines = null; + if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES) + this.$textLayer.update(config); + else + this.$textLayer.scrollLines(config); + if (this.$showGutter) { + if (changes & this.CHANGE_GUTTER || changes & this.CHANGE_LINES) + this.$gutterLayer.update(config); + else + this.$gutterLayer.scrollLines(config); + } + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } + this.$markerBack.update(config); + this.$markerFront.update(config); + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + this._signal("afterRender", changes); + return; + } + if (changes & this.CHANGE_TEXT) { + this.$changedLines = null; + this.$textLayer.update(config); + if (this.$showGutter) + this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } + } + else if (changes & this.CHANGE_LINES) { + if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter) + this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } + } + else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) { + if (this.$showGutter) + this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } + } + else if (changes & this.CHANGE_CURSOR) { + if (this.$highlightGutterLine) + this.$gutterLayer.updateLineHighlight(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } + } + if (changes & this.CHANGE_CURSOR) { + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + } + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { + this.$markerFront.update(config); + } + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) { + this.$markerBack.update(config); + } + this._signal("afterRender", changes); + }; + VirtualRenderer.prototype.$autosize = function () { + var height = this.session.getScreenLength() * this.lineHeight; + var maxHeight = this.$maxLines * this.lineHeight; + var desiredHeight = Math.min(maxHeight, Math.max((this.$minLines || 1) * this.lineHeight, height)) + this.scrollMargin.v + (this.$extraHeight || 0); + if (this.$horizScroll) + desiredHeight += this.scrollBarH.getHeight(); + if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight) + desiredHeight = this.$maxPixelHeight; + var hideScrollbars = desiredHeight <= 2 * this.lineHeight; + var vScroll = !hideScrollbars && height > maxHeight; + if (desiredHeight != this.desiredHeight || + this.$size.height != this.desiredHeight || vScroll != this.$vScroll) { + if (vScroll != this.$vScroll) { + this.$vScroll = vScroll; + this.scrollBarV.setVisible(vScroll); + } + var w = this.container.clientWidth; + this.container.style.height = desiredHeight + "px"; + this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight); + this.desiredHeight = desiredHeight; + this._signal("autosize"); + } + }; + VirtualRenderer.prototype.$computeLayerConfig = function () { + var session = this.session; + var size = this.$size; + var hideScrollbars = size.height <= 2 * this.lineHeight; + var screenLines = this.session.getScreenLength(); + var maxHeight = screenLines * this.lineHeight; + var longestLine = this.$getLongestLine(); + var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible || + size.scrollerWidth - longestLine - 2 * this.$padding < 0); + var hScrollChanged = this.$horizScroll !== horizScroll; + if (hScrollChanged) { + this.$horizScroll = horizScroll; + this.scrollBarH.setVisible(horizScroll); + } + var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine + if (this.$maxLines && this.lineHeight > 1) + this.$autosize(); + var minHeight = size.scrollerHeight + this.lineHeight; + var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd + ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd + : 0; + maxHeight += scrollPastEnd; + var sm = this.scrollMargin; + this.session.setScrollTop(Math.max(-sm.top, Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom))); + this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, longestLine + 2 * this.$padding - size.scrollerWidth + sm.right))); + var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible || + size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top); + var vScrollChanged = vScrollBefore !== vScroll; + if (vScrollChanged) { + this.$vScroll = vScroll; + this.scrollBarV.setVisible(vScroll); + } + var offset = this.scrollTop % this.lineHeight; + var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; + var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); + var lastRow = firstRow + lineCount; + var firstRowScreen, firstRowHeight; + var lineHeight = this.lineHeight; + firstRow = session.screenToDocumentRow(firstRow, 0); + var foldLine = session.getFoldLine(firstRow); + if (foldLine) { + firstRow = foldLine.start.row; + } + firstRowScreen = session.documentToScreenRow(firstRow, 0); + firstRowHeight = session.getRowLength(firstRow) * lineHeight; + lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); + minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + + firstRowHeight; + offset = this.scrollTop - firstRowScreen * lineHeight; + var changes = 0; + if (this.layerConfig.width != longestLine || hScrollChanged) + changes = this.CHANGE_H_SCROLL; + if (hScrollChanged || vScrollChanged) { + changes |= this.$updateCachedSize(true, this.gutterWidth, size.width, size.height); + this._signal("scrollbarVisibilityChanged"); + if (vScrollChanged) + longestLine = this.$getLongestLine(); + } + this.layerConfig = { + width: longestLine, + padding: this.$padding, + firstRow: firstRow, + firstRowScreen: firstRowScreen, + lastRow: lastRow, + lineHeight: lineHeight, + characterWidth: this.characterWidth, + minHeight: minHeight, + maxHeight: maxHeight, + offset: offset, + gutterOffset: lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0, + height: this.$size.scrollerHeight + }; + if (this.session.$bidiHandler) + this.session.$bidiHandler.setContentWidth(longestLine - this.$padding); + return changes; + }; + VirtualRenderer.prototype.$updateLines = function () { + if (!this.$changedLines) + return; + var firstRow = this.$changedLines.firstRow; + var lastRow = this.$changedLines.lastRow; + this.$changedLines = null; + var layerConfig = this.layerConfig; + if (firstRow > layerConfig.lastRow + 1) { + return; + } + if (lastRow < layerConfig.firstRow) { + return; + } + if (lastRow === Infinity) { + if (this.$showGutter) + this.$gutterLayer.update(layerConfig); + this.$textLayer.update(layerConfig); + return; + } + this.$textLayer.updateLines(layerConfig, firstRow, lastRow); + return true; + }; + VirtualRenderer.prototype.$getLongestLine = function () { + var charCount = this.session.getScreenWidth(); + if (this.showInvisibles && !this.session.$useWrapMode) + charCount += 1; + if (this.$textLayer && charCount > this.$textLayer.MAX_LINE_LENGTH) + charCount = this.$textLayer.MAX_LINE_LENGTH + 30; + return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth)); + }; + VirtualRenderer.prototype.updateFrontMarkers = function () { + this.$markerFront.setMarkers(this.session.getMarkers(true)); + this.$loop.schedule(this.CHANGE_MARKER_FRONT); + }; + VirtualRenderer.prototype.updateBackMarkers = function () { + this.$markerBack.setMarkers(this.session.getMarkers()); + this.$loop.schedule(this.CHANGE_MARKER_BACK); + }; + VirtualRenderer.prototype.addGutterDecoration = function (row, className) { + this.$gutterLayer.addGutterDecoration(row, className); + }; + VirtualRenderer.prototype.removeGutterDecoration = function (row, className) { + this.$gutterLayer.removeGutterDecoration(row, className); + }; + VirtualRenderer.prototype.updateBreakpoints = function (rows) { + this._rows = rows; + this.$loop.schedule(this.CHANGE_GUTTER); + }; + VirtualRenderer.prototype.setAnnotations = function (annotations) { + this.$gutterLayer.setAnnotations(annotations); + this.$loop.schedule(this.CHANGE_GUTTER); + }; + VirtualRenderer.prototype.updateCursor = function () { + this.$loop.schedule(this.CHANGE_CURSOR); + }; + VirtualRenderer.prototype.hideCursor = function () { + this.$cursorLayer.hideCursor(); + }; + VirtualRenderer.prototype.showCursor = function () { + this.$cursorLayer.showCursor(); + }; + VirtualRenderer.prototype.scrollSelectionIntoView = function (anchor, lead, offset) { + this.scrollCursorIntoView(anchor, offset); + this.scrollCursorIntoView(lead, offset); + }; + VirtualRenderer.prototype.scrollCursorIntoView = function (cursor, offset, $viewMargin) { + if (this.$size.scrollerHeight === 0) + return; + var pos = this.$cursorLayer.getPixelPosition(cursor); + var newLeft = pos.left; + var newTop = pos.top; + var topMargin = $viewMargin && $viewMargin.top || 0; + var bottomMargin = $viewMargin && $viewMargin.bottom || 0; + if (this.$scrollAnimation) { + this.$stopAnimation = true; + } + var currentTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; + if (currentTop + topMargin > newTop) { + if (offset && currentTop + topMargin > newTop + this.lineHeight) + newTop -= offset * this.$size.scrollerHeight; + if (newTop === 0) + newTop = -this.scrollMargin.top; + this.session.setScrollTop(newTop); + } + else if (currentTop + this.$size.scrollerHeight - bottomMargin < newTop + this.lineHeight) { + if (offset && currentTop + this.$size.scrollerHeight - bottomMargin < newTop - this.lineHeight) + newTop += offset * this.$size.scrollerHeight; + this.session.setScrollTop(newTop + this.lineHeight + bottomMargin - this.$size.scrollerHeight); + } + var currentLeft = this.scrollLeft; + var twoCharsWidth = 2 * this.layerConfig.characterWidth; + if (newLeft - twoCharsWidth < currentLeft) { + newLeft -= twoCharsWidth; + if (newLeft < this.$padding + twoCharsWidth) { + newLeft = -this.scrollMargin.left; + } + this.session.setScrollLeft(newLeft); + } + else { + newLeft += twoCharsWidth; + if (currentLeft + this.$size.scrollerWidth < newLeft + this.characterWidth) { + this.session.setScrollLeft(Math.round(newLeft + this.characterWidth - this.$size.scrollerWidth)); + } + else if (currentLeft <= this.$padding && newLeft - currentLeft < this.characterWidth) { + this.session.setScrollLeft(0); + } + } + }; + VirtualRenderer.prototype.getScrollTop = function () { + return this.session.getScrollTop(); + }; + VirtualRenderer.prototype.getScrollLeft = function () { + return this.session.getScrollLeft(); + }; + VirtualRenderer.prototype.getScrollTopRow = function () { + return this.scrollTop / this.lineHeight; + }; + VirtualRenderer.prototype.getScrollBottomRow = function () { + return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); + }; + VirtualRenderer.prototype.scrollToRow = function (row) { + this.session.setScrollTop(row * this.lineHeight); + }; + VirtualRenderer.prototype.alignCursor = function (cursor, alignment) { + if (typeof cursor == "number") + cursor = { row: cursor, column: 0 }; + var pos = this.$cursorLayer.getPixelPosition(cursor); + var h = this.$size.scrollerHeight - this.lineHeight; + var offset = pos.top - h * (alignment || 0); + this.session.setScrollTop(offset); + return offset; + }; + VirtualRenderer.prototype.$calcSteps = function (fromValue, toValue) { + var i = 0; + var l = this.STEPS; + var steps = []; + var func = function (t, x_min, dx) { + return dx * (Math.pow(t - 1, 3) + 1) + x_min; + }; + for (i = 0; i < l; ++i) + steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); + return steps; + }; + VirtualRenderer.prototype.scrollToLine = function (line, center, animate, callback) { + var pos = this.$cursorLayer.getPixelPosition({ row: line, column: 0 }); + var offset = pos.top; + if (center) + offset -= this.$size.scrollerHeight / 2; + var initialScroll = this.scrollTop; + this.session.setScrollTop(offset); + if (animate !== false) + this.animateScrolling(initialScroll, callback); + }; + VirtualRenderer.prototype.animateScrolling = function (fromValue, callback) { + var toValue = this.scrollTop; + if (!this.$animatedScroll) + return; + var _self = this; + if (fromValue == toValue) + return; + if (this.$scrollAnimation) { + var oldSteps = this.$scrollAnimation.steps; + if (oldSteps.length) { + fromValue = oldSteps[0]; + if (fromValue == toValue) + return; + } + } + var steps = _self.$calcSteps(fromValue, toValue); + this.$scrollAnimation = { from: fromValue, to: toValue, steps: steps }; + clearInterval(this.$timer); + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + function endAnimation() { + _self.$timer = clearInterval(_self.$timer); + _self.$scrollAnimation = null; + _self.$stopAnimation = false; + callback && callback(); + } + this.$timer = setInterval(function () { + if (_self.$stopAnimation) { + endAnimation(); + return; + } + if (!_self.session) + return clearInterval(_self.$timer); + if (steps.length) { + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + } + else if (toValue != null) { + _self.session.$scrollTop = -1; + _self.session.setScrollTop(toValue); + toValue = null; + } + else { + endAnimation(); + } + }, 10); + }; + VirtualRenderer.prototype.scrollToY = function (scrollTop) { + if (this.scrollTop !== scrollTop) { + this.$loop.schedule(this.CHANGE_SCROLL); + this.scrollTop = scrollTop; + } + }; + VirtualRenderer.prototype.scrollToX = function (scrollLeft) { + if (this.scrollLeft !== scrollLeft) + this.scrollLeft = scrollLeft; + this.$loop.schedule(this.CHANGE_H_SCROLL); + }; + VirtualRenderer.prototype.scrollTo = function (x, y) { + this.session.setScrollTop(y); + this.session.setScrollLeft(x); + }; + VirtualRenderer.prototype.scrollBy = function (deltaX, deltaY) { + deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); + deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); + }; + VirtualRenderer.prototype.isScrollableBy = function (deltaX, deltaY) { + if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) + return true; + if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight + - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom) + return true; + if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) + return true; + if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth + - this.layerConfig.width < -1 + this.scrollMargin.right) + return true; + }; + VirtualRenderer.prototype.pixelToScreenCoordinates = function (x, y) { + var canvasPos; + if (this.$hasCssTransforms) { + canvasPos = { top: 0, left: 0 }; + var p = this.$fontMetrics.transformCoordinates([x, y]); + x = p[1] - this.gutterWidth - this.margin.left; + y = p[0]; + } + else { + canvasPos = this.scroller.getBoundingClientRect(); + } + var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; + var offset = offsetX / this.characterWidth; + var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); + var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); + return { row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX }; + }; + VirtualRenderer.prototype.screenToTextCoordinates = function (x, y) { + var canvasPos; + if (this.$hasCssTransforms) { + canvasPos = { top: 0, left: 0 }; + var p = this.$fontMetrics.transformCoordinates([x, y]); + x = p[1] - this.gutterWidth - this.margin.left; + y = p[0]; + } + else { + canvasPos = this.scroller.getBoundingClientRect(); + } + var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; + var offset = offsetX / this.characterWidth; + var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); + var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); + return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX); + }; + VirtualRenderer.prototype.textToScreenCoordinates = function (row, column) { + var canvasPos = this.scroller.getBoundingClientRect(); + var pos = this.session.documentToScreenPosition(row, column); + var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row) + ? this.session.$bidiHandler.getPosLeft(pos.column) + : Math.round(pos.column * this.characterWidth)); + var y = pos.row * this.lineHeight; + return { + pageX: canvasPos.left + x - this.scrollLeft, + pageY: canvasPos.top + y - this.scrollTop + }; + }; + VirtualRenderer.prototype.visualizeFocus = function () { + dom.addCssClass(this.container, "ace_focus"); + }; + VirtualRenderer.prototype.visualizeBlur = function () { + dom.removeCssClass(this.container, "ace_focus"); + }; + VirtualRenderer.prototype.showComposition = function (composition) { + this.$composition = composition; + if (!composition.cssText) { + composition.cssText = this.textarea.style.cssText; + } + if (composition.useTextareaForIME == undefined) + composition.useTextareaForIME = this.$useTextareaForIME; + if (this.$useTextareaForIME) { + dom.addCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = ""; + this.$moveTextAreaToCursor(); + this.$cursorLayer.element.style.display = "none"; + } + else { + composition.markerId = this.session.addMarker(composition.markerRange, "ace_composition_marker", "text"); + } + }; + VirtualRenderer.prototype.setCompositionText = function (text) { + var cursor = this.session.selection.cursor; + this.addToken(text, "composition_placeholder", cursor.row, cursor.column); + this.$moveTextAreaToCursor(); + }; + VirtualRenderer.prototype.hideComposition = function () { + if (!this.$composition) + return; + if (this.$composition.markerId) + this.session.removeMarker(this.$composition.markerId); + dom.removeCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = this.$composition.cssText; + var cursor = this.session.selection.cursor; + this.removeExtraToken(cursor.row, cursor.column); + this.$composition = null; + this.$cursorLayer.element.style.display = ""; + }; + VirtualRenderer.prototype.setGhostText = function (text, position) { + var cursor = this.session.selection.cursor; + var insertPosition = position || { row: cursor.row, column: cursor.column }; + this.removeGhostText(); + var textChunks = this.$calculateWrappedTextChunks(text, insertPosition); + this.addToken(textChunks[0].text, "ghost_text", insertPosition.row, insertPosition.column); + this.$ghostText = { + text: text, + position: { + row: insertPosition.row, + column: insertPosition.column + } + }; + var widgetDiv = dom.createElement("div"); + if (textChunks.length > 1) { + var hiddenTokens = this.hideTokensAfterPosition(insertPosition.row, insertPosition.column); + var lastLineDiv; + textChunks.slice(1).forEach(function (el) { + var chunkDiv = dom.createElement("div"); + var chunkSpan = dom.createElement("span"); + chunkSpan.className = "ace_ghost_text"; + if (el.wrapped) + chunkDiv.className = "ghost_text_line_wrapped"; + if (el.text.length === 0) + el.text = " "; + chunkSpan.appendChild(dom.createTextNode(el.text)); + chunkDiv.appendChild(chunkSpan); + widgetDiv.appendChild(chunkDiv); + lastLineDiv = chunkDiv; + }); + hiddenTokens.forEach(function (token) { + var element = dom.createElement("span"); + if (!isTextToken(token.type)) + element.className = "ace_" + token.type.replace(/\./g, " ace_"); + element.appendChild(dom.createTextNode(token.value)); + lastLineDiv.appendChild(element); + }); + this.$ghostTextWidget = { + el: widgetDiv, + row: insertPosition.row, + column: insertPosition.column, + className: "ace_ghost_text_container" + }; + this.session.widgetManager.addLineWidget(this.$ghostTextWidget); + var pixelPosition = this.$cursorLayer.getPixelPosition(insertPosition, true); + var el = this.container; + var height = el.getBoundingClientRect().height; + var ghostTextHeight = textChunks.length * this.lineHeight; + var fitsY = ghostTextHeight < (height - pixelPosition.top); + if (fitsY) + return; + if (ghostTextHeight < height) { + this.scrollBy(0, (textChunks.length - 1) * this.lineHeight); + } + else { + this.scrollToRow(insertPosition.row); + } + } + }; + VirtualRenderer.prototype.$calculateWrappedTextChunks = function (text, position) { + var availableWidth = this.$size.scrollerWidth - this.$padding * 2; + var limit = Math.floor(availableWidth / this.characterWidth) - 2; + limit = limit <= 0 ? 60 : limit; // this is a hack to prevent the editor from crashing when the window is too small + var textLines = text.split(/\r?\n/); + var textChunks = []; + for (var i = 0; i < textLines.length; i++) { + var displayTokens = this.session.$getDisplayTokens(textLines[i], position.column); + var wrapSplits = this.session.$computeWrapSplits(displayTokens, limit, this.session.$tabSize); + if (wrapSplits.length > 0) { + var start = 0; + wrapSplits.push(textLines[i].length); + for (var j = 0; j < wrapSplits.length; j++) { + var textSlice = textLines[i].slice(start, wrapSplits[j]); + textChunks.push({ text: textSlice, wrapped: true }); + start = wrapSplits[j]; + } + } + else { + textChunks.push({ text: textLines[i], wrapped: false }); + } + } + return textChunks; + }; + VirtualRenderer.prototype.removeGhostText = function () { + if (!this.$ghostText) + return; + var position = this.$ghostText.position; + this.removeExtraToken(position.row, position.column); + if (this.$ghostTextWidget) { + this.session.widgetManager.removeLineWidget(this.$ghostTextWidget); + this.$ghostTextWidget = null; + } + this.$ghostText = null; + }; + VirtualRenderer.prototype.addToken = function (text, type, row, column) { + var session = this.session; + session.bgTokenizer.lines[row] = null; + var newToken = { type: type, value: text }; + var tokens = session.getTokens(row); + if (column == null || !tokens.length) { + tokens.push(newToken); + } + else { + var l = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + l += token.value.length; + if (column <= l) { + var diff = token.value.length - (l - column); + var before = token.value.slice(0, diff); + var after = token.value.slice(diff); + tokens.splice(i, 1, { type: token.type, value: before }, newToken, { type: token.type, value: after }); + break; + } + } + } + this.updateLines(row, row); + }; + VirtualRenderer.prototype.hideTokensAfterPosition = function (row, column) { + var tokens = this.session.getTokens(row); + var l = 0; + var hasPassedCursor = false; + var hiddenTokens = []; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + l += token.value.length; + if (token.type === "ghost_text") + continue; + if (hasPassedCursor) { + hiddenTokens.push({ type: token.type, value: token.value }); + token.type = "hidden_token"; + continue; + } + if (l === column) { + hasPassedCursor = true; + } + } + this.updateLines(row, row); + return hiddenTokens; + }; + VirtualRenderer.prototype.removeExtraToken = function (row, column) { + this.session.bgTokenizer.lines[row] = null; + this.updateLines(row, row); + }; + VirtualRenderer.prototype.setTheme = function (theme, cb) { + var _self = this; + this.$themeId = theme; + _self._dispatchEvent('themeChange', { theme: theme }); + if (!theme || typeof theme == "string") { + var moduleName = theme || this.$options.theme.initialValue; + config.loadModule(["theme", moduleName], afterLoad); + } + else { + afterLoad(theme); + } + function afterLoad(module) { + if (_self.$themeId != theme) + return cb && cb(); + if (!module || !module.cssClass) + throw new Error("couldn't load module " + theme + " or it didn't call define"); + if (module.$id) + _self.$themeId = module.$id; + dom.importCssString(module.cssText, module.cssClass, _self.container); + if (_self.theme) + dom.removeCssClass(_self.container, _self.theme.cssClass); + var padding = "padding" in module ? module.padding + : "padding" in (_self.theme || {}) ? 4 : _self.$padding; + if (_self.$padding && padding != _self.$padding) + _self.setPadding(padding); + _self.$theme = module.cssClass; + _self.theme = module; + dom.addCssClass(_self.container, module.cssClass); + dom.setCssClass(_self.container, "ace_dark", module.isDark); + if (_self.$size) { + _self.$size.width = 0; + _self.$updateSizeAsync(); + } + _self._dispatchEvent('themeLoaded', { theme: module }); + cb && cb(); + if (useragent.isSafari && _self.scroller) { + _self.scroller.style.background = "red"; + _self.scroller.style.background = ""; + } + } + }; + VirtualRenderer.prototype.getTheme = function () { + return this.$themeId; + }; + VirtualRenderer.prototype.setStyle = function (style, include) { + dom.setCssClass(this.container, style, include !== false); + }; + VirtualRenderer.prototype.unsetStyle = function (style) { + dom.removeCssClass(this.container, style); + }; + VirtualRenderer.prototype.setCursorStyle = function (style) { + dom.setStyle(this.scroller.style, "cursor", style); + }; + VirtualRenderer.prototype.setMouseCursor = function (cursorStyle) { + dom.setStyle(this.scroller.style, "cursor", cursorStyle); + }; + VirtualRenderer.prototype.attachToShadowRoot = function () { + dom.importCssString(editorCss, "ace_editor.css", this.container); + }; + VirtualRenderer.prototype.destroy = function () { + this.freeze(); + this.$fontMetrics.destroy(); + this.$cursorLayer.destroy(); + this.removeAllListeners(); + this.container.textContent = ""; + this.setOption("useResizeObserver", false); + }; + VirtualRenderer.prototype.$updateCustomScrollbar = function (val) { + var _self = this; + this.$horizScroll = this.$vScroll = null; + this.scrollBarV.element.remove(); + this.scrollBarH.element.remove(); + if (this.$scrollDecorator) { + delete this.$scrollDecorator; + } + if (val === true) { + this.scrollBarV = new VScrollBarCustom(this.container, this); + this.scrollBarH = new HScrollBarCustom(this.container, this); + this.scrollBarV.setHeight(this.$size.scrollerHeight); + this.scrollBarH.setWidth(this.$size.scrollerWidth); + this.scrollBarV.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + this.$scrollDecorator = new Decorator(this.scrollBarV, this); + this.$scrollDecorator.$updateDecorators(); + } + else { + this.scrollBarV = new VScrollBar(this.container, this); + this.scrollBarH = new HScrollBar(this.container, this); + this.scrollBarV.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + } + }; + VirtualRenderer.prototype.$addResizeObserver = function () { + if (!window.ResizeObserver || this.$resizeObserver) + return; + var self = this; + this.$resizeTimer = lang.delayedCall(function () { + if (!self.destroyed) + self.onResize(); + }, 50); + this.$resizeObserver = new window.ResizeObserver(function (e) { + var w = e[0].contentRect.width; + var h = e[0].contentRect.height; + if (Math.abs(self.$size.width - w) > 1 + || Math.abs(self.$size.height - h) > 1) { + self.$resizeTimer.delay(); + } + else { + self.$resizeTimer.cancel(); + } + }); + this.$resizeObserver.observe(this.container); + }; + return VirtualRenderer; +}()); +VirtualRenderer.prototype.CHANGE_CURSOR = 1; +VirtualRenderer.prototype.CHANGE_MARKER = 2; +VirtualRenderer.prototype.CHANGE_GUTTER = 4; +VirtualRenderer.prototype.CHANGE_SCROLL = 8; +VirtualRenderer.prototype.CHANGE_LINES = 16; +VirtualRenderer.prototype.CHANGE_TEXT = 32; +VirtualRenderer.prototype.CHANGE_SIZE = 64; +VirtualRenderer.prototype.CHANGE_MARKER_BACK = 128; +VirtualRenderer.prototype.CHANGE_MARKER_FRONT = 256; +VirtualRenderer.prototype.CHANGE_FULL = 512; +VirtualRenderer.prototype.CHANGE_H_SCROLL = 1024; +VirtualRenderer.prototype.$changes = 0; +VirtualRenderer.prototype.$padding = null; +VirtualRenderer.prototype.$frozen = false; +VirtualRenderer.prototype.STEPS = 8; +oop.implement(VirtualRenderer.prototype, EventEmitter); +config.defineOptions(VirtualRenderer.prototype, "renderer", { + useResizeObserver: { + set: function (value) { + if (!value && this.$resizeObserver) { + this.$resizeObserver.disconnect(); + this.$resizeTimer.cancel(); + this.$resizeTimer = this.$resizeObserver = null; + } + else if (value && !this.$resizeObserver) { + this.$addResizeObserver(); + } + } + }, + animatedScroll: { initialValue: false }, + showInvisibles: { + set: function (value) { + if (this.$textLayer.setShowInvisibles(value)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: false + }, + showPrintMargin: { + set: function () { this.$updatePrintMargin(); }, + initialValue: true + }, + printMarginColumn: { + set: function () { this.$updatePrintMargin(); }, + initialValue: 80 + }, + printMargin: { + set: function (val) { + if (typeof val == "number") + this.$printMarginColumn = val; + this.$showPrintMargin = !!val; + this.$updatePrintMargin(); + }, + get: function () { + return this.$showPrintMargin && this.$printMarginColumn; + } + }, + showGutter: { + set: function (show) { + this.$gutter.style.display = show ? "block" : "none"; + this.$loop.schedule(this.CHANGE_FULL); + this.onGutterResize(); + }, + initialValue: true + }, + useSvgGutterIcons: { + set: function (value) { + this.$gutterLayer.$useSvgGutterIcons = value; + }, + initialValue: false + }, + showFoldedAnnotations: { + set: function (value) { + this.$gutterLayer.$showFoldedAnnotations = value; + }, + initialValue: false + }, + fadeFoldWidgets: { + set: function (show) { + dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); + }, + initialValue: false + }, + showFoldWidgets: { + set: function (show) { + this.$gutterLayer.setShowFoldWidgets(show); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + displayIndentGuides: { + set: function (show) { + if (this.$textLayer.setDisplayIndentGuides(show)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: true + }, + highlightIndentGuides: { + set: function (show) { + if (this.$textLayer.setHighlightIndentGuides(show) == true) { + this.$textLayer.$highlightIndentGuide(); + } + else { + this.$textLayer.$clearActiveIndentGuide(this.$textLayer.$lines.cells); + } + }, + initialValue: true + }, + highlightGutterLine: { + set: function (shouldHighlight) { + this.$gutterLayer.setHighlightGutterLine(shouldHighlight); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + hScrollBarAlwaysVisible: { + set: function (val) { + if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + vScrollBarAlwaysVisible: { + set: function (val) { + if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + fontSize: { + set: function (size) { + if (typeof size == "number") + size = size + "px"; + this.container.style.fontSize = size; + this.updateFontSize(); + }, + initialValue: 12 + }, + fontFamily: { + set: function (name) { + this.container.style.fontFamily = name; + this.updateFontSize(); + } + }, + maxLines: { + set: function (val) { + this.updateFull(); + } + }, + minLines: { + set: function (val) { + if (!(this.$minLines < 0x1ffffffffffff)) + this.$minLines = 0; + this.updateFull(); + } + }, + maxPixelHeight: { + set: function (val) { + this.updateFull(); + }, + initialValue: 0 + }, + scrollPastEnd: { + set: function (val) { + val = +val || 0; + if (this.$scrollPastEnd == val) + return; + this.$scrollPastEnd = val; + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: 0, + handlesSet: true + }, + fixedWidthGutter: { + set: function (val) { + this.$gutterLayer.$fixedWidth = !!val; + this.$loop.schedule(this.CHANGE_GUTTER); + } + }, + customScrollbar: { + set: function (val) { + this.$updateCustomScrollbar(val); + }, + initialValue: false + }, + theme: { + set: function (val) { this.setTheme(val); }, + get: function () { return this.$themeId || this.theme; }, + initialValue: "./theme/textmate", + handlesSet: true + }, + hasCssTransforms: {}, + useTextareaForIME: { + initialValue: !useragent.isMobile && !useragent.isIE + } +}); +exports.VirtualRenderer = VirtualRenderer; + +}); + +ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var net = require("../lib/net"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var config = require("../config"); + +function $workerBlob(workerUrl) { + var script = "importScripts('" + net.qualifyURL(workerUrl) + "');"; + try { + return new Blob([script], {"type": "application/javascript"}); + } catch (e) { // Backwards-compatibility + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; + var blobBuilder = new BlobBuilder(); + blobBuilder.append(script); + return blobBuilder.getBlob("application/javascript"); + } +} + +function createWorker(workerUrl) { + if (typeof Worker == "undefined") + return { postMessage: function() {}, terminate: function() {} }; + if (config.get("loadWorkerFromBlob")) { + var blob = $workerBlob(workerUrl); + var URL = window.URL || window.webkitURL; + var blobURL = URL.createObjectURL(blob); + return new Worker(blobURL); + } + return new Worker(workerUrl); +} + +var WorkerClient = function(worker) { + if (!worker.postMessage) + worker = this.$createWorkerFromOldConfig.apply(this, arguments); + + this.$worker = worker; + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.onMessage = this.onMessage.bind(this); + + this.callbackId = 1; + this.callbacks = {}; + + this.$worker.onmessage = this.onMessage; +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.$createWorkerFromOldConfig = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) { + if (require.nameToUrl && !require.toUrl) + require.toUrl = require.nameToUrl; + + if (config.get("packaged") || !require.toUrl) { + workerUrl = workerUrl || config.moduleUrl(mod, "worker"); + } else { + var normalizePath = this.$normalizePath; + workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); + + var tlns = {}; + topLevelNamespaces.forEach(function(ns) { + tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); + }); + } + + this.$worker = createWorker(workerUrl); + if (importScripts) { + this.send("importScripts", importScripts); + } + this.$worker.postMessage({ + init : true, + tlns : tlns, + module : mod, + classname : classname + }); + return this.$worker; + }; + + this.onMessage = function(e) { + var msg = e.data; + switch (msg.type) { + case "event": + this._signal(msg.name, {data: msg.data}); + break; + case "call": + var callback = this.callbacks[msg.id]; + if (callback) { + callback(msg.data); + delete this.callbacks[msg.id]; + } + break; + case "error": + this.reportError(msg.data); + break; + case "log": + window.console && console.log && console.log.apply(console, msg.data); + break; + } + }; + + this.reportError = function(err) { + window.console && console.error && console.error(err); + }; + + this.$normalizePath = function(path) { + return net.qualifyURL(path); + }; + + this.terminate = function() { + this._signal("terminate", {}); + this.deltaQueue = null; + this.$worker.terminate(); + this.$worker.onerror = function(e) { + e.preventDefault(); + }; + this.$worker = null; + if (this.$doc) + this.$doc.off("change", this.changeListener); + this.$doc = null; + }; + + this.send = function(cmd, args) { + this.$worker.postMessage({command: cmd, args: args}); + }; + + this.call = function(cmd, args, callback) { + if (callback) { + var id = this.callbackId++; + this.callbacks[id] = callback; + args.push(id); + } + this.send(cmd, args); + }; + + this.emit = function(event, data) { + try { + if (data.data && data.data.err) + data.data.err = {message: data.data.err.message, stack: data.data.err.stack, code: data.data.err.code}; + this.$worker && this.$worker.postMessage({event: event, data: {data: data.data}}); + } + catch(ex) { + console.error(ex.stack); + } + }; + + this.attachToDocument = function(doc) { + if (this.$doc) + this.terminate(); + + this.$doc = doc; + this.call("setValue", [doc.getValue()]); + doc.on("change", this.changeListener, true); + }; + + this.changeListener = function(delta) { + if (!this.deltaQueue) { + this.deltaQueue = []; + setTimeout(this.$sendDeltaQueue, 0); + } + if (delta.action == "insert") + this.deltaQueue.push(delta.start, delta.lines); + else + this.deltaQueue.push(delta.start, delta.end); + }; + + this.$sendDeltaQueue = function() { + var q = this.deltaQueue; + if (!q) return; + this.deltaQueue = null; + if (q.length > 50 && q.length > this.$doc.getLength() >> 1) { + this.call("setValue", [this.$doc.getValue()]); + } else + this.emit("change", {data: q}); + }; + +}).call(WorkerClient.prototype); + + +var UIWorkerClient = function(topLevelNamespaces, mod, classname) { + var main = null; + var emitSync = false; + var sender = Object.create(EventEmitter); + + var messageBuffer = []; + var workerClient = new WorkerClient({ + messageBuffer: messageBuffer, + terminate: function() {}, + postMessage: function(e) { + messageBuffer.push(e); + if (!main) return; + if (emitSync) + setTimeout(processNext); + else + processNext(); + } + }); + + workerClient.setEmitSync = function(val) { emitSync = val; }; + + var processNext = function() { + var msg = messageBuffer.shift(); + if (msg.command) + main[msg.command].apply(main, msg.args); + else if (msg.event) + sender._signal(msg.event, msg.data); + }; + + sender.postMessage = function(msg) { + workerClient.onMessage({data: msg}); + }; + sender.callback = function(data, callbackId) { + this.postMessage({type: "call", id: callbackId, data: data}); + }; + sender.emit = function(name, data) { + this.postMessage({type: "event", name: name, data: data}); + }; + + config.loadModule(["worker", mod], function(Main) { + main = new Main[classname](sender); + while (messageBuffer.length) + processNext(); + }); + + return workerClient; +}; + +exports.UIWorkerClient = UIWorkerClient; +exports.WorkerClient = WorkerClient; +exports.createWorker = createWorker; + + +}); + +ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(require, exports, module){"use strict"; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var oop = require("./lib/oop"); +var PlaceHolder = /** @class */ (function () { + function PlaceHolder(session, length, pos, others, mainClass, othersClass) { + var _self = this; + this.length = length; + this.session = session; + this.doc = session.getDocument(); + this.mainClass = mainClass; + this.othersClass = othersClass; + this.$onUpdate = this.onUpdate.bind(this); + this.doc.on("change", this.$onUpdate, true); + this.$others = others; + this.$onCursorChange = function () { + setTimeout(function () { + _self.onCursorChange(); + }); + }; + this.$pos = pos; + var undoStack = session.getUndoManager().$undoStack || session.getUndoManager()["$undostack"] || { length: -1 }; + this.$undoStackDepth = undoStack.length; + this.setup(); + session.selection.on("changeCursor", this.$onCursorChange); + } + PlaceHolder.prototype.setup = function () { + var _self = this; + var doc = this.doc; + var session = this.session; + this.selectionBefore = session.selection.toJSON(); + if (session.selection.inMultiSelectMode) + session.selection.toSingleRange(); + this.pos = doc.createAnchor(this.$pos.row, this.$pos.column); + var pos = this.pos; + pos.$insertRight = true; + pos.detach(); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); + this.others = []; + this.$others.forEach(function (other) { + var anchor = doc.createAnchor(other.row, other.column); + anchor.$insertRight = true; + anchor.detach(); + _self.others.push(anchor); + }); + session.setUndoSelect(false); + }; + PlaceHolder.prototype.showOtherMarkers = function () { + if (this.othersActive) + return; + var session = this.session; + var _self = this; + this.othersActive = true; + this.others.forEach(function (anchor) { + anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column + _self.length), _self.othersClass, null, false); + }); + }; + PlaceHolder.prototype.hideOtherMarkers = function () { + if (!this.othersActive) + return; + this.othersActive = false; + for (var i = 0; i < this.others.length; i++) { + this.session.removeMarker(this.others[i].markerId); + } + }; + PlaceHolder.prototype.onUpdate = function (delta) { + if (this.$updating) + return this.updateAnchors(delta); + var range = delta; + if (range.start.row !== range.end.row) + return; + if (range.start.row !== this.pos.row) + return; + this.$updating = true; + var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column; + var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1; + var distanceFromStart = range.start.column - this.pos.column; + this.updateAnchors(delta); + if (inMainRange) + this.length += lengthDiff; + if (inMainRange && !this.session.$fromUndo) { + if (delta.action === 'insert') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = { row: otherPos.row, column: otherPos.column + distanceFromStart }; + this.doc.insertMergedLines(newPos, delta.lines); + } + } + else if (delta.action === 'remove') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = { row: otherPos.row, column: otherPos.column + distanceFromStart }; + this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); + } + } + } + this.$updating = false; + this.updateMarkers(); + }; + PlaceHolder.prototype.updateAnchors = function (delta) { + this.pos.onChange(delta); + for (var i = this.others.length; i--;) + this.others[i].onChange(delta); + this.updateMarkers(); + }; + PlaceHolder.prototype.updateMarkers = function () { + if (this.$updating) + return; + var _self = this; + var session = this.session; + var updateMarker = function (pos, className) { + session.removeMarker(pos.markerId); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + _self.length), className, null, false); + }; + updateMarker(this.pos, this.mainClass); + for (var i = this.others.length; i--;) + updateMarker(this.others[i], this.othersClass); + }; + PlaceHolder.prototype.onCursorChange = function (event) { + if (this.$updating || !this.session) + return; + var pos = this.session.selection.getCursor(); + if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { + this.showOtherMarkers(); + this._emit("cursorEnter", event); + } + else { + this.hideOtherMarkers(); + this._emit("cursorLeave", event); + } + }; + PlaceHolder.prototype.detach = function () { + this.session.removeMarker(this.pos && this.pos.markerId); + this.hideOtherMarkers(); + this.doc.off("change", this.$onUpdate); + this.session.selection.off("changeCursor", this.$onCursorChange); + this.session.setUndoSelect(true); + this.session = null; + }; + PlaceHolder.prototype.cancel = function () { + if (this.$undoStackDepth === -1) + return; + var undoManager = this.session.getUndoManager(); + var undosRequired = (undoManager.$undoStack || undoManager["$undostack"]).length - this.$undoStackDepth; + for (var i = 0; i < undosRequired; i++) { + undoManager.undo(this.session, true); + } + if (this.selectionBefore) + this.session.selection.fromJSON(this.selectionBefore); + }; + return PlaceHolder; +}()); +oop.implement(PlaceHolder.prototype, EventEmitter); +exports.PlaceHolder = PlaceHolder; + +}); + +ace.define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module){var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} +function onMouseDown(e) { + var ev = e.domEvent; + var alt = ev.altKey; + var shift = ev.shiftKey; + var ctrl = ev.ctrlKey; + var accel = e.getAccelKey(); + var button = e.getButton(); + if (ctrl && useragent.isMac) + button = ev.button; + if (e.editor.inMultiSelectMode && button == 2) { + e.editor.textInput.onContextMenu(e.domEvent); + return; + } + if (!ctrl && !alt && !accel) { + if (button === 0 && e.editor.inMultiSelectMode) + e.editor.exitMultiSelectMode(); + return; + } + if (button !== 0) + return; + var editor = e.editor; + var selection = editor.selection; + var isMultiSelect = editor.inMultiSelectMode; + var pos = e.getDocumentPosition(); + var cursor = selection.getCursor(); + var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); + var mouseX = e.x, mouseY = e.y; + var onMouseSelection = function (e) { + mouseX = e.clientX; + mouseY = e.clientY; + }; + var session = editor.session; + var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var screenCursor = screenAnchor; + var selectionMode; + if (editor.$mouseHandler.$enableJumpToDef) { + if (ctrl && alt || accel && alt) + selectionMode = shift ? "block" : "add"; + else if (alt && editor.$blockSelectEnabled) + selectionMode = "block"; + } + else { + if (accel && !alt) { + selectionMode = "add"; + if (!isMultiSelect && shift) + return; + } + else if (alt && editor.$blockSelectEnabled) { + selectionMode = "block"; + } + } + if (selectionMode && useragent.isMac && ev.ctrlKey) { + editor.$mouseHandler.cancelContextMenu(); + } + if (selectionMode == "add") { + if (!isMultiSelect && inSelection) + return; // dragging + if (!isMultiSelect) { + var range = selection.toOrientedRange(); + editor.addSelectionMarker(range); + } + var oldRange = selection.rangeList.rangeAtPoint(pos); + editor.inVirtualSelectionMode = true; + if (shift) { + oldRange = null; + range = selection.ranges[0] || range; + editor.removeSelectionMarker(range); + } + editor.once("mouseup", function () { + var tmpSel = selection.toOrientedRange(); + if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) + selection.substractPoint(tmpSel.cursor); + else { + if (shift) { + selection.substractPoint(range.cursor); + } + else if (range) { + editor.removeSelectionMarker(range); + selection.addRange(range); + } + selection.addRange(tmpSel); + } + editor.inVirtualSelectionMode = false; + }); + } + else if (selectionMode == "block") { + e.stop(); + editor.inVirtualSelectionMode = true; + var initialRange; + var rectSel = []; + var blockSelect = function () { + var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX); + if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead)) + return; + screenCursor = newCursor; + editor.selection.moveToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + editor.removeSelectionMarkers(rectSel); + rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); + if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty()) + rectSel[0] = editor.$mouseHandler.$clickSelection.clone(); + rectSel.forEach(editor.addSelectionMarker, editor); + editor.updateSelectionMarkers(); + }; + if (isMultiSelect && !accel) { + selection.toSingleRange(); + } + else if (!isMultiSelect && accel) { + initialRange = selection.toOrientedRange(); + editor.addSelectionMarker(initialRange); + } + if (shift) + screenAnchor = session.documentToScreenPosition(selection.lead); + else + selection.moveToPosition(pos); + screenCursor = { row: -1, column: -1 }; + var onMouseSelectionEnd = function (e) { + blockSelect(); + clearInterval(timerId); + editor.removeSelectionMarkers(rectSel); + if (!rectSel.length) + rectSel = [selection.toOrientedRange()]; + if (initialRange) { + editor.removeSelectionMarker(initialRange); + selection.toSingleRange(initialRange); + } + for (var i = 0; i < rectSel.length; i++) + selection.addRange(rectSel[i]); + editor.inVirtualSelectionMode = false; + editor.$mouseHandler.$clickSelection = null; + }; + var onSelectionInterval = blockSelect; + event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); + var timerId = setInterval(function () { onSelectionInterval(); }, 20); + return e.preventDefault(); + } +} +exports.onMouseDown = onMouseDown; + +}); + +ace.define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module){/** + * commands to enter multiselect mode + * @type {import("../../ace-internal").Ace.Command[]} + */ +exports.defaultCommands = [{ + name: "addCursorAbove", + description: "Add cursor above", + exec: function (editor) { editor.selectMoreLines(-1); }, + bindKey: { win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "addCursorBelow", + description: "Add cursor below", + exec: function (editor) { editor.selectMoreLines(1); }, + bindKey: { win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "addCursorAboveSkipCurrent", + description: "Add cursor above (skip current)", + exec: function (editor) { editor.selectMoreLines(-1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "addCursorBelowSkipCurrent", + description: "Add cursor below (skip current)", + exec: function (editor) { editor.selectMoreLines(1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectMoreBefore", + description: "Select more before", + exec: function (editor) { editor.selectMore(-1); }, + bindKey: { win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectMoreAfter", + description: "Select more after", + exec: function (editor) { editor.selectMore(1); }, + bindKey: { win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectNextBefore", + description: "Select next before", + exec: function (editor) { editor.selectMore(-1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectNextAfter", + description: "Select next after", + exec: function (editor) { editor.selectMore(1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "toggleSplitSelectionIntoLines", + description: "Split selection into lines", + exec: function (editor) { + if (editor.multiSelect.rangeCount > 1) + editor.multiSelect.joinSelections(); + else + editor.multiSelect.splitIntoLines(); + }, + bindKey: { win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L" }, + readOnly: true + }, { + name: "splitSelectionIntoLines", + description: "Split into lines", + exec: function (editor) { editor.multiSelect.splitIntoLines(); }, + readOnly: true + }, { + name: "alignCursors", + description: "Align cursors", + exec: function (editor) { editor.alignCursors(); }, + bindKey: { win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A" }, + scrollIntoView: "cursor" + }, { + name: "findAll", + description: "Find all", + exec: function (editor) { editor.findAll(); }, + bindKey: { win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G" }, + scrollIntoView: "cursor", + readOnly: true + }]; +exports.multiSelectCommands = [{ + name: "singleSelection", + description: "Single selection", + bindKey: "esc", + exec: function (editor) { editor.exitMultiSelectMode(); }, + scrollIntoView: "cursor", + readOnly: true, + isAvailable: function (editor) { return editor && editor.inMultiSelectMode; } + }]; +var HashHandler = require("../keyboard/hash_handler").HashHandler; +exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); + +}); + +ace.define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(require, exports, module){/** + * @typedef {import("./anchor").Anchor} Anchor + * @typedef {import("../ace-internal").Ace.Point} Point + * @typedef {import("../ace-internal").Ace.ScreenCoordinates} ScreenCoordinates + */ +var RangeList = require("./range_list").RangeList; +var Range = require("./range").Range; +var Selection = require("./selection").Selection; +var onMouseDown = require("./mouse/multi_select_handler").onMouseDown; +var event = require("./lib/event"); +var lang = require("./lib/lang"); +var commands = require("./commands/multi_select_commands"); +exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands); +var Search = require("./search").Search; +var search = new Search(); +function find(session, needle, dir) { + search.$options.wrap = true; + search.$options.needle = needle; + search.$options.backwards = dir == -1; + return search.find(session); +} +var EditSession = require("./edit_session").EditSession; +(function () { + this.getSelectionMarkers = function () { + return this.$selectionMarkers; + }; +}).call(EditSession.prototype); +(function () { + this.ranges = null; + this.rangeList = null; + this.addRange = function (range, $blockChangeEvents) { + if (!range) + return; + if (!this.inMultiSelectMode && this.rangeCount === 0) { + var oldRange = this.toOrientedRange(); + this.rangeList.add(oldRange); + this.rangeList.add(range); + if (this.rangeList.ranges.length != 2) { + this.rangeList.removeAll(); + return $blockChangeEvents || this.fromOrientedRange(range); + } + this.rangeList.removeAll(); + this.rangeList.add(oldRange); + this.$onAddRange(oldRange); + } + if (!range.cursor) + range.cursor = range.end; + var removed = this.rangeList.add(range); + this.$onAddRange(range); + if (removed.length) + this.$onRemoveRange(removed); + if (this.rangeCount > 1 && !this.inMultiSelectMode) { + this._signal("multiSelect"); + this.inMultiSelectMode = true; + this.session.$undoSelect = false; + this.rangeList.attach(this.session); + } + return $blockChangeEvents || this.fromOrientedRange(range); + }; + this.toSingleRange = function (range) { + range = range || this.ranges[0]; + var removed = this.rangeList.removeAll(); + if (removed.length) + this.$onRemoveRange(removed); + range && this.fromOrientedRange(range); + }; + this.substractPoint = function (pos) { + var removed = this.rangeList.substractPoint(pos); + if (removed) { + this.$onRemoveRange(removed); + return removed[0]; + } + }; + this.mergeOverlappingRanges = function () { + var removed = this.rangeList.merge(); + if (removed.length) + this.$onRemoveRange(removed); + }; + this.$onAddRange = function (range) { + this.rangeCount = this.rangeList.ranges.length; + this.ranges.unshift(range); + this._signal("addRange", { range: range }); + }; + this.$onRemoveRange = function (removed) { + this.rangeCount = this.rangeList.ranges.length; + if (this.rangeCount == 1 && this.inMultiSelectMode) { + var lastRange = this.rangeList.ranges.pop(); + removed.push(lastRange); + this.rangeCount = 0; + } + for (var i = removed.length; i--;) { + var index = this.ranges.indexOf(removed[i]); + this.ranges.splice(index, 1); + } + this._signal("removeRange", { ranges: removed }); + if (this.rangeCount === 0 && this.inMultiSelectMode) { + this.inMultiSelectMode = false; + this._signal("singleSelect"); + this.session.$undoSelect = true; + this.rangeList.detach(this.session); + } + lastRange = lastRange || this.ranges[0]; + if (lastRange && !lastRange.isEqual(this.getRange())) + this.fromOrientedRange(lastRange); + }; + this.$initRangeList = function () { + if (this.rangeList) + return; + this.rangeList = new RangeList(); + this.ranges = []; + this.rangeCount = 0; + }; + this.getAllRanges = function () { + return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()]; + }; + this.splitIntoLines = function () { + var ranges = this.ranges.length ? this.ranges : [this.getRange()]; + var newRanges = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + var row = range.start.row; + var endRow = range.end.row; + if (row === endRow) { + newRanges.push(range.clone()); + } + else { + newRanges.push(new Range(row, range.start.column, row, this.session.getLine(row).length)); + while (++row < endRow) + newRanges.push(this.getLineRange(row, true)); + newRanges.push(new Range(endRow, 0, endRow, range.end.column)); + } + if (i == 0 && !this.isBackwards()) + newRanges = newRanges.reverse(); + } + this.toSingleRange(); + for (var i = newRanges.length; i--;) + this.addRange(newRanges[i]); + }; + this.joinSelections = function () { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + }; + this.toggleBlockSelection = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + } + else { + var cursor = this.session.documentToScreenPosition(this.cursor); + var anchor = this.session.documentToScreenPosition(this.anchor); + var rectSel = this.rectangularRangeBlock(cursor, anchor); + rectSel.forEach(this.addRange, this); + } + }; + this.rectangularRangeBlock = function (screenCursor, screenAnchor, includeEmptyLines) { + var rectSel = []; + var xBackwards = screenCursor.column < screenAnchor.column; + if (xBackwards) { + var startColumn = screenCursor.column; + var endColumn = screenAnchor.column; + var startOffsetX = screenCursor.offsetX; + var endOffsetX = screenAnchor.offsetX; + } + else { + var startColumn = screenAnchor.column; + var endColumn = screenCursor.column; + var startOffsetX = screenAnchor.offsetX; + var endOffsetX = screenCursor.offsetX; + } + var yBackwards = screenCursor.row < screenAnchor.row; + if (yBackwards) { + var startRow = screenCursor.row; + var endRow = screenAnchor.row; + } + else { + var startRow = screenAnchor.row; + var endRow = screenCursor.row; + } + if (startColumn < 0) + startColumn = 0; + if (startRow < 0) + startRow = 0; + if (startRow == endRow) + includeEmptyLines = true; + var docEnd; + for (var row = startRow; row <= endRow; row++) { + var range = Range.fromPoints(this.session.screenToDocumentPosition(row, startColumn, startOffsetX), this.session.screenToDocumentPosition(row, endColumn, endOffsetX)); + if (range.isEmpty()) { + if (docEnd && isSamePoint(range.end, docEnd)) + break; + docEnd = range.end; + } + range.cursor = xBackwards ? range.start : range.end; + rectSel.push(range); + } + if (yBackwards) + rectSel.reverse(); + if (!includeEmptyLines) { + var end = rectSel.length - 1; + while (rectSel[end].isEmpty() && end > 0) + end--; + if (end > 0) { + var start = 0; + while (rectSel[start].isEmpty()) + start++; + } + for (var i = end; i >= start; i--) { + if (rectSel[i].isEmpty()) + rectSel.splice(i, 1); + } + } + return rectSel; + }; +}).call(Selection.prototype); +var Editor = require("./editor").Editor; +(function () { + this.updateSelectionMarkers = function () { + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.addSelectionMarker = function (orientedRange) { + if (!orientedRange.cursor) + orientedRange.cursor = orientedRange.end; + var style = this.getSelectionStyle(); + orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style); + this.session.$selectionMarkers.push(orientedRange); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + return orientedRange; + }; + this.removeSelectionMarker = function (range) { + if (!range.marker) + return; + this.session.removeMarker(range.marker); + var index = this.session.$selectionMarkers.indexOf(range); + if (index != -1) + this.session.$selectionMarkers.splice(index, 1); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + }; + this.removeSelectionMarkers = function (ranges) { + var markerList = this.session.$selectionMarkers; + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.marker) + continue; + this.session.removeMarker(range.marker); + var index = markerList.indexOf(range); + if (index != -1) + markerList.splice(index, 1); + } + this.session.selectionMarkerCount = markerList.length; + }; + this.$onAddRange = function (e) { + this.addSelectionMarker(e.range); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.$onRemoveRange = function (e) { + this.removeSelectionMarkers(e.ranges); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.$onMultiSelect = function (e) { + if (this.inMultiSelectMode) + return; + this.inMultiSelectMode = true; + this.setStyle("ace_multiselect"); + this.keyBinding.addKeyboardHandler(commands.keyboardHandler); + this.commands.setDefaultHandler("exec", this.$onMultiSelectExec); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.$onSingleSelect = function (e) { + if (this.session.multiSelect.inVirtualMode) + return; + this.inMultiSelectMode = false; + this.unsetStyle("ace_multiselect"); + this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); + this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + this._emit("changeSelection"); + }; + this.$onMultiSelectExec = function (e) { + var command = e.command; + var editor = e.editor; + if (!editor.multiSelect) + return; + if (!command.multiSelectAction) { + var result = command.exec(editor, e.args || {}); + editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); + editor.multiSelect.mergeOverlappingRanges(); + } + else if (command.multiSelectAction == "forEach") { + result = editor.forEachSelection(command, e.args); + } + else if (command.multiSelectAction == "forEachLine") { + result = editor.forEachSelection(command, e.args, true); + } + else if (command.multiSelectAction == "single") { + editor.exitMultiSelectMode(); + result = command.exec(editor, e.args || {}); + } + else { + result = command.multiSelectAction(editor, e.args || {}); + } + return result; + }; + this.forEachSelection = function (cmd, args, options) { + if (this.inVirtualSelectionMode) + return; + var keepOrder = options && options.keepOrder; + var $byLines = options == true || options && options.$byLines; + var session = this.session; + var selection = this.selection; + var rangeList = selection.rangeList; + var ranges = (keepOrder ? selection : rangeList).ranges; + var result; + if (!ranges.length) + return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + var reg = selection._eventRegistry; + selection._eventRegistry = {}; + var tmpSel = new Selection(session); + this.inVirtualSelectionMode = true; + for (var i = ranges.length; i--;) { + if ($byLines) { + while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row) + i--; + } + tmpSel.fromOrientedRange(ranges[i]); + tmpSel.index = i; + this.selection = session.selection = tmpSel; + var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + if (!result && cmdResult !== undefined) + result = cmdResult; + tmpSel.toOrientedRange(ranges[i]); + } + tmpSel.detach(); + this.selection = session.selection = selection; + this.inVirtualSelectionMode = false; + selection._eventRegistry = reg; + selection.mergeOverlappingRanges(); + if (selection.ranges[0]) + selection.fromOrientedRange(selection.ranges[0]); + var anim = this.renderer.$scrollAnimation; + this.onCursorChange(); + this.onSelectionChange(); + if (anim && anim.from == anim.to) + this.renderer.animateScrolling(anim.from); + return result; + }; + this.exitMultiSelectMode = function () { + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) + return; + this.multiSelect.toSingleRange(); + }; + this.getSelectedText = function () { + var text = ""; + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var ranges = this.multiSelect.rangeList.ranges; + var buf = []; + for (var i = 0; i < ranges.length; i++) { + buf.push(this.session.getTextRange(ranges[i])); + } + var nl = this.session.getDocument().getNewLineCharacter(); + text = buf.join(nl); + if (text.length == (buf.length - 1) * nl.length) + text = ""; + } + else if (!this.selection.isEmpty()) { + text = this.session.getTextRange(this.getSelectionRange()); + } + return text; + }; + this.$checkMultiselectChange = function (e, anchor) { + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var range = this.multiSelect.ranges[0]; + if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor) + return; + var pos = anchor == this.multiSelect.anchor + ? range.cursor == range.start ? range.end : range.start + : range.cursor; + if (pos.row != anchor.row + || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column) + this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange()); + else + this.multiSelect.mergeOverlappingRanges(); + } + }; + this.findAll = function (needle, options, additive) { + options = options || {}; + options.needle = needle || options.needle; + if (options.needle == undefined) { + var range = this.selection.isEmpty() + ? this.selection.getWordRange() + : this.selection.getRange(); + options.needle = this.session.getTextRange(range); + } + this.$search.set(options); + var ranges = this.$search.findAll(this.session); + if (!ranges.length) + return 0; + var selection = this.multiSelect; + if (!additive) + selection.toSingleRange(ranges[0]); + for (var i = ranges.length; i--;) + selection.addRange(ranges[i], true); + if (range && selection.rangeList.rangeAtPoint(range.start)) + selection.addRange(range, true); + return ranges.length; + }; + this.selectMoreLines = function (dir, skip) { + var range = this.selection.toOrientedRange(); + var isBackwards = range.cursor == range.end; + var screenLead = this.session.documentToScreenPosition(range.cursor); + if (this.selection.$desiredColumn) + screenLead.column = this.selection.$desiredColumn; + var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column); + if (!range.isEmpty()) { + var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start); + var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column); + } + else { + var anchor = lead; + } + if (isBackwards) { + var newRange = Range.fromPoints(lead, anchor); + newRange.cursor = newRange.start; + } + else { + var newRange = Range.fromPoints(anchor, lead); + newRange.cursor = newRange.end; + } + newRange.desiredColumn = screenLead.column; + if (!this.selection.inMultiSelectMode) { + this.selection.addRange(range); + } + else { + if (skip) + var toRemove = range.cursor; + } + this.selection.addRange(newRange); + if (toRemove) + this.selection.substractPoint(toRemove); + }; + this.transposeSelections = function (dir) { + var session = this.session; + var sel = session.multiSelect; + var all = sel.ranges; + for (var i = all.length; i--;) { + var range = all[i]; + if (range.isEmpty()) { + var tmp_1 = session.getWordRange(range.start.row, range.start.column); + range.start.row = tmp_1.start.row; + range.start.column = tmp_1.start.column; + range.end.row = tmp_1.end.row; + range.end.column = tmp_1.end.column; + } + } + sel.mergeOverlappingRanges(); + var words = []; + for (var i = all.length; i--;) { + var range = all[i]; + words.unshift(session.getTextRange(range)); + } + if (dir < 0) + words.unshift(words.pop()); + else + words.push(words.shift()); + for (var i = all.length; i--;) { + var range = all[i]; + var tmp = range.clone(); + session.replace(range, words[i]); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + } + sel.fromOrientedRange(sel.ranges[0]); + }; + this.selectMore = function (dir, skip, stopAtFirst) { + var session = this.session; + var sel = session.multiSelect; + var range = sel.toOrientedRange(); + if (range.isEmpty()) { + range = session.getWordRange(range.start.row, range.start.column); + range.cursor = dir == -1 ? range.start : range.end; + this.multiSelect.addRange(range); + if (stopAtFirst) + return; + } + var needle = session.getTextRange(range); + var newRange = find(session, needle, dir); + if (newRange) { + newRange.cursor = dir == -1 ? newRange.start : newRange.end; + this.session.unfold(newRange); + this.multiSelect.addRange(newRange); + this.renderer.scrollCursorIntoView(null, 0.5); + } + if (skip) + this.multiSelect.substractPoint(range.cursor); + }; + this.alignCursors = function () { + var session = this.session; + var sel = session.multiSelect; + var ranges = sel.ranges; + var row = -1; + var sameRowRanges = ranges.filter(function (r) { + if (r.cursor.row == row) + return true; + row = r.cursor.row; + }); + if (!ranges.length || sameRowRanges.length == ranges.length - 1) { + var range = this.selection.getRange(); + var fr = range.start.row, lr = range.end.row; + var guessRange = fr == lr; + if (guessRange) { + var max = this.session.getLength(); + var line; + do { + line = this.session.getLine(lr); + } while (/[=:]/.test(line) && ++lr < max); + do { + line = this.session.getLine(fr); + } while (/[=:]/.test(line) && --fr > 0); + if (fr < 0) + fr = 0; + if (lr >= max) + lr = max - 1; + } + var lines = this.session.removeFullLines(fr, lr); + lines = this.$reAlignText(lines, guessRange); + this.session.insert({ row: fr, column: 0 }, lines.join("\n") + "\n"); + if (!guessRange) { + range.start.column = 0; + range.end.column = lines[lines.length - 1].length; + } + this.selection.setRange(range); + } + else { + sameRowRanges.forEach(function (r) { + sel.substractPoint(r.cursor); + }); + var maxCol = 0; + var minSpace = Infinity; + var spaceOffsets = ranges.map(function (r) { + var p = r.cursor; + var line = session.getLine(p.row); + var spaceOffset = line.substr(p.column).search(/\S/g); + if (spaceOffset == -1) + spaceOffset = 0; + if (p.column > maxCol) + maxCol = p.column; + if (spaceOffset < minSpace) + minSpace = spaceOffset; + return spaceOffset; + }); + ranges.forEach(function (r, i) { + var p = r.cursor; + var l = maxCol - p.column; + var d = spaceOffsets[i] - minSpace; + if (l > d) + session.insert(p, lang.stringRepeat(" ", l - d)); + else + session.remove(new Range(p.row, p.column, p.row, p.column - l + d)); + r.start.column = r.end.column = maxCol; + r.start.row = r.end.row = p.row; + r.cursor = r.end; + }); + sel.fromOrientedRange(ranges[0]); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + } + }; + this.$reAlignText = function (lines, forceLeft) { + var isLeftAligned = true, isRightAligned = true; + var startW, textW, endW; + return lines.map(function (line) { + var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/); + if (!m) + return [line]; + if (startW == null) { + startW = m[1].length; + textW = m[2].length; + endW = m[3].length; + return m; + } + if (startW + textW + endW != m[1].length + m[2].length + m[3].length) + isRightAligned = false; + if (startW != m[1].length) + isLeftAligned = false; + if (startW > m[1].length) + startW = m[1].length; + if (textW < m[2].length) + textW = m[2].length; + if (endW > m[3].length) + endW = m[3].length; + return m; + }).map(forceLeft ? alignLeft : + isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); + function spaces(n) { + return lang.stringRepeat(" ", n); + } + function alignLeft(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(textW - m[2].length + endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + function alignRight(m) { + return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + function unAlign(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + }; +}).call(Editor.prototype); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} +exports.onSessionChange = function (e) { + var session = e.session; + if (session && !session.multiSelect) { + session.$selectionMarkers = []; + session.selection.$initRangeList(); + session.multiSelect = session.selection; + } + this.multiSelect = session && session.multiSelect; + var oldSession = e.oldSession; + if (oldSession) { + oldSession.multiSelect.off("addRange", this.$onAddRange); + oldSession.multiSelect.off("removeRange", this.$onRemoveRange); + oldSession.multiSelect.off("multiSelect", this.$onMultiSelect); + oldSession.multiSelect.off("singleSelect", this.$onSingleSelect); + oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange); + oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange); + } + if (session) { + session.multiSelect.on("addRange", this.$onAddRange); + session.multiSelect.on("removeRange", this.$onRemoveRange); + session.multiSelect.on("multiSelect", this.$onMultiSelect); + session.multiSelect.on("singleSelect", this.$onSingleSelect); + session.multiSelect.lead.on("change", this.$checkMultiselectChange); + session.multiSelect.anchor.on("change", this.$checkMultiselectChange); + } + if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) { + if (session.selection.inMultiSelectMode) + this.$onMultiSelect(); + else + this.$onSingleSelect(); + } +}; +function MultiSelect(editor) { + if (editor.$multiselectOnSessionChange) + return; + editor.$onAddRange = editor.$onAddRange.bind(editor); + editor.$onRemoveRange = editor.$onRemoveRange.bind(editor); + editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); + editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); + editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor); + editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor); + editor.$multiselectOnSessionChange(editor); + editor.on("changeSession", editor.$multiselectOnSessionChange); + editor.on("mousedown", onMouseDown); + editor.commands.addCommands(commands.defaultCommands); + addAltCursorListeners(editor); +} +function addAltCursorListeners(editor) { + if (!editor.textInput) + return; + var el = editor.textInput.getElement(); + var altCursor = false; + event.addListener(el, "keydown", function (e) { + var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey); + if (editor.$blockSelectEnabled && altDown) { + if (!altCursor) { + editor.renderer.setMouseCursor("crosshair"); + altCursor = true; + } + } + else if (altCursor) { + reset(); + } + }, editor); + event.addListener(el, "keyup", reset, editor); + event.addListener(el, "blur", reset, editor); + function reset(e) { + if (altCursor) { + editor.renderer.setMouseCursor(""); + altCursor = false; + } + } +} +exports.MultiSelect = MultiSelect; +require("./config").defineOptions(Editor.prototype, "editor", { + enableMultiselect: { + set: function (val) { + MultiSelect(this); + if (val) { + this.on("mousedown", onMouseDown); + } + else { + this.off("mousedown", onMouseDown); + } + }, + value: true + }, + enableBlockSelect: { + set: function (val) { + this.$blockSelectEnabled = val; + }, + value: true + } +}); + +}); + +ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("../../range").Range; +var FoldMode = exports.FoldMode = function () { }; +(function () { + this.foldingStartMarker = null; + this.foldingStopMarker = null; + this.getFoldWidget = function (session, foldStyle, row) { + var line = session.getLine(row); + if (this.foldingStartMarker.test(line)) + return "start"; + if (foldStyle == "markbeginend" + && this.foldingStopMarker + && this.foldingStopMarker.test(line)) + return "end"; + return ""; + }; + this.getFoldWidgetRange = function (session, foldStyle, row) { + return null; + }; + this.indentationBlock = function (session, row, column) { + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1) + return; + var startColumn = column || line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + while (++row < maxRow) { + var level = session.getLine(row).search(re); + if (level == -1) + continue; + if (level <= startLevel) { + var token = session.getTokenAt(row, 0); + if (!token || token.type !== "string") + break; + } + endRow = row; + } + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.openingBracketBlock = function (session, bracket, row, column, typeRe) { + var start = { row: row, column: column + 1 }; + var end = session.$findClosingBracket(bracket, start, typeRe); + if (!end) + return; + var fw = session.foldWidgets[end.row]; + if (fw == null) + fw = session.getFoldWidget(end.row); + if (fw == "start" && end.row > start.row) { + end.row--; + end.column = session.getLine(end.row).length; + } + return Range.fromPoints(start, end); + }; + this.closingBracketBlock = function (session, bracket, row, column, typeRe) { + var end = { row: row, column: column }; + var start = session.$findOpeningBracket(bracket, end); + if (!start) + return; + start.column++; + end.column--; + return Range.fromPoints(start, end); + }; +}).call(FoldMode.prototype); + +}); + +ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range","ace/config"], function(require, exports, module){"use strict"; +var LineWidgets = require("../line_widgets").LineWidgets; +var dom = require("../lib/dom"); +var Range = require("../range").Range; +var nls = require("../config").nls; +function binarySearch(array, needle, comparator) { + var first = 0; + var last = array.length - 1; + while (first <= last) { + var mid = (first + last) >> 1; + var c = comparator(needle, array[mid]); + if (c > 0) + first = mid + 1; + else if (c < 0) + last = mid - 1; + else + return mid; + } + return -(first + 1); +} +function findAnnotations(session, row, dir) { + var annotations = session.getAnnotations().sort(Range.comparePoints); + if (!annotations.length) + return; + var i = binarySearch(annotations, { row: row, column: -1 }, Range.comparePoints); + if (i < 0) + i = -i - 1; + if (i >= annotations.length) + i = dir > 0 ? 0 : annotations.length - 1; + else if (i === 0 && dir < 0) + i = annotations.length - 1; + var annotation = annotations[i]; + if (!annotation || !dir) + return; + if (annotation.row === row) { + do { + annotation = annotations[i += dir]; + } while (annotation && annotation.row === row); + if (!annotation) + return annotations.slice(); + } + var matched = []; + row = annotation.row; + do { + matched[dir < 0 ? "unshift" : "push"](annotation); + annotation = annotations[i += dir]; + } while (annotation && annotation.row == row); + return matched.length && matched; +} +exports.showErrorMarker = function (editor, dir) { + var session = editor.session; + if (!session.widgetManager) { + session.widgetManager = new LineWidgets(session); + session.widgetManager.attach(editor); + } + var pos = editor.getCursorPosition(); + var row = pos.row; + var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function (w) { + return w.type == "errorMarker"; + })[0]; + if (oldWidget) { + oldWidget.destroy(); + } + else { + row -= dir; + } + var annotations = findAnnotations(session, row, dir); + var gutterAnno; + if (annotations) { + var annotation = annotations[0]; + pos.column = (annotation.pos && typeof annotation.column != "number" + ? annotation.pos.sc + : annotation.column) || 0; + pos.row = annotation.row; + gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row]; + } + else if (oldWidget) { + return; + } + else { + gutterAnno = { + displayText: [nls("error-marker.good-state", "Looks good!")], + className: "ace_ok" + }; + } + editor.session.unfold(pos.row); + editor.selection.moveToPosition(pos); + var w = { + row: pos.row, + fixedWidth: true, + coverGutter: true, + el: dom.createElement("div"), + type: "errorMarker" + }; + var el = w.el.appendChild(dom.createElement("div")); + var arrow = w.el.appendChild(dom.createElement("div")); + arrow.className = "error_widget_arrow " + gutterAnno.className; + var left = editor.renderer.$cursorLayer + .getPixelPosition(pos).left; + arrow.style.left = left + editor.renderer.gutterWidth - 5 + "px"; + w.el.className = "error_widget_wrapper"; + el.className = "error_widget " + gutterAnno.className; + gutterAnno.displayText.forEach(function (annoTextLine, i) { + el.appendChild(dom.createTextNode(annoTextLine)); + if (i < gutterAnno.displayText.length - 1) { + el.appendChild(dom.createElement("br")); + } + }); + el.appendChild(dom.createElement("div")); + var kb = function (_, hashId, keyString) { + if (hashId === 0 && (keyString === "esc" || keyString === "return")) { + w.destroy(); + return { command: "null" }; + } + }; + w.destroy = function () { + if (editor.$mouseHandler.isMousePressed) + return; + editor.keyBinding.removeKeyboardHandler(kb); + session.widgetManager.removeLineWidget(w); + editor.off("changeSelection", w.destroy); + editor.off("changeSession", w.destroy); + editor.off("mouseup", w.destroy); + editor.off("change", w.destroy); + }; + editor.keyBinding.addKeyboardHandler(kb); + editor.on("changeSelection", w.destroy); + editor.on("changeSession", w.destroy); + editor.on("mouseup", w.destroy); + editor.on("change", w.destroy); + editor.session.widgetManager.addLineWidget(w); + w.el.onmousedown = editor.focus.bind(editor); + editor.renderer.scrollCursorIntoView(null, 0.5, { bottom: w.el.offsetHeight }); +}; +dom.importCssString("\n .error_widget_wrapper {\n background: inherit;\n color: inherit;\n border:none\n }\n .error_widget {\n border-top: solid 2px;\n border-bottom: solid 2px;\n margin: 5px 0;\n padding: 10px 40px;\n white-space: pre-wrap;\n }\n .error_widget.ace_error, .error_widget_arrow.ace_error{\n border-color: #ff5a5a\n }\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\n border-color: #F1D817\n }\n .error_widget.ace_info, .error_widget_arrow.ace_info{\n border-color: #5a5a5a\n }\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\n border-color: #5aaa5a\n }\n .error_widget_arrow {\n position: absolute;\n border: solid 5px;\n border-top-color: transparent!important;\n border-right-color: transparent!important;\n border-left-color: transparent!important;\n top: -5px;\n }\n", "error_marker.css", false); + +}); + +ace.define("ace/ace",["require","exports","module","ace/lib/dom","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config","ace/loader_build"], function(require, exports, module){/** + * The main class required to set up an Ace instance in the browser. + * + * @namespace Ace + **/ +"use strict"; +require("./loader_build")(exports) +var dom = require("./lib/dom"); +var Range = require("./range").Range; +var Editor = require("./editor").Editor; +var EditSession = require("./edit_session").EditSession; +var UndoManager = require("./undomanager").UndoManager; +var Renderer = require("./virtual_renderer").VirtualRenderer; +require("./worker/worker_client"); +require("./keyboard/hash_handler"); +require("./placeholder"); +require("./multi_select"); +require("./mode/folding/fold_mode"); +require("./theme/textmate"); +require("./ext/error_marker"); +exports.config = require("./config"); +exports.edit = function (el, options) { + if (typeof el == "string") { + var _id = el; + el = document.getElementById(_id); + if (!el) + throw new Error("ace.edit can't find div #" + _id); + } + if (el && el.env && el.env.editor instanceof Editor) + return el.env.editor; + var value = ""; + if (el && /input|textarea/i.test(el.tagName)) { + var oldNode = el; + value = oldNode.value; + el = dom.createElement("pre"); + oldNode.parentNode.replaceChild(el, oldNode); + } + else if (el) { + value = el.textContent; + el.innerHTML = ""; + } + var doc = exports.createEditSession(value); + var editor = new Editor(new Renderer(el), doc, options); + var env = { + document: doc, + editor: editor, + onResize: editor.resize.bind(editor, null) + }; + if (oldNode) + env.textarea = oldNode; + editor.on("destroy", function () { + env.editor.container.env = null; // prevent memory leak on old ie + }); + editor.container.env = editor.env = env; + return editor; +}; +exports.createEditSession = function (text, mode) { + var doc = new EditSession(text, mode); + doc.setUndoManager(new UndoManager()); + return doc; +}; +exports.Range = Range; +exports.Editor = Editor; +exports.EditSession = EditSession; +exports.UndoManager = UndoManager; +exports.VirtualRenderer = Renderer; +exports.version = exports.config.version; + +}); (function() { + ace.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = ace.define; + } + var global = (function () { + return this; + })(); + if (!global && typeof window != "undefined") global = window; // can happen in strict mode + if (!global && typeof self != "undefined") global = self; // can happen in webworker + + if (!global.ace) + global.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + global.ace[key] = a[key]; + global.ace["default"] = global.ace; + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = global.ace; + } + }); + })(); + \ No newline at end of file diff --git a/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-fleet-highlight-rules.js b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-fleet-highlight-rules.js new file mode 100644 index 0000000000..808e33e3cc --- /dev/null +++ b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-fleet-highlight-rules.js @@ -0,0 +1,30737 @@ +/* eslint-disable */ +// @ts-nocheck +var osqueryFleetTablesJSON = [ + { + "name": "account_policy_data", + "description": "Additional macOS user account data from the AccountPolicy section of [OpenDirectory](https://en.wikipedia.org/wiki/Apple_Open_Directory), the identity provider used by Apple.", + "url": "https://fleetdm.com/tables/account_policy_data", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "- The values in this OpenDirectory table are related to account creation. In the past, it was fairly common to use OpenDirectory to have a home folder (`~`) on a server, and then log in and get that folder wherever they are. (These days, this use case is more uncommon.)\n- To determine who is logged in to the Mac, or for example, to check the record name versus the computer's \"short name\", consider using the data in [the DSCL table](https://fleetdm.com/tables/dscl).\n- Many installers incorporate scripts due to actions that are handled by pre or post-scripts vs installer package payloads. These script actions aren't tracked in the \"bill of materials\" (.bom) file. So, don't blindly trust the \"bill of materials\" (.bom) file as the source of truth on what has or hasn't been installed.", + "examples": "Query the creation date of user accounts. You could also query the date of the last failed login attempt or password change.\n\n```\nSELECT strftime('%Y-%m-%d %H:%M:%S',creation_time,'unixepoch') AS creationdate FROM account_policy_data;\n```\n\nSee each user's last password set date and number of failed logins since last successful login to detect any intrusion attempts.\n\n```\nSELECT u.username u.uid, strftime('%Y-%m-%dT%H:%M:%S', a.password_last_set_time, 'unixepoch') AS password_last_set_time, a.failed_login_count, strftime('%Y-%m-%dT%H:%M:%S', a.failed_login_timestamp, 'unixepoch') AS failed_login_timestamp FROM account_policy_data AS a CROSS JOIN users AS u USING (uid) ORDER BY password_last_set_time ASC;\n```", + "columns": [ + { + "name": "uid", + "description": "[User ID](https://superuser.com/a/1108201)", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "creation_time", + "description": "When the account was first created", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "failed_login_count", + "description": "The number of failed login attempts using an incorrect password. Count resets after a correct password is entered.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "failed_login_timestamp", + "description": "The time of the last failed login attempt. Resets after a correct password is entered", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "password_last_set_time", + "description": "The time the password was last changed", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/account_policy_data.yml" + }, + { + "name": "acpi_tables", + "description": "Firmware ACPI functional table common metadata and content.", + "url": "https://fleetdm.com/tables/acpi_tables", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "name", + "description": "ACPI table name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of compiled table data", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "md5", + "description": "MD5 hash of table content", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "hidden": true, + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/acpi_tables.yml" + }, + { + "name": "ad_config", + "description": "macOS Active Directory configuration.", + "url": "https://fleetdm.com/tables/ad_config", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "\n- Active Directory is a directory service used to manage users and computers. A domain is the high level grouping of these objects, which a workstation must join in order to provide the user with features such as Single Sign-On to internal applications using Kerberos. \n- If a host is not bound to an Active Directory domain, then the table returns no results.", + "examples": "See the [Active Directory](https://en.wikipedia.org/wiki/Active_Directory) domain, if any, that the Mac is bound to.\n\n```\nSELECT domain FROM ad_config;\n```", + "columns": [ + { + "name": "name", + "description": "The macOS-specific configuration name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "domain", + "description": "Active Directory trust domain", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "option", + "description": "Canonical name of option", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Variable typed option value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/ad_config.yml" + }, + { + "name": "alf", + "description": "Details about the status of the built-in firewall protection on this Mac.", + "url": "https://fleetdm.com/tables/alf", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "- This table provides information about the built-in firewall in macOS, also known as [Application Layer Firewall (ALF)](https://support.apple.com/guide/mac-help/block-connections-to-your-mac-with-a-firewall-mh34041/mac)", + "examples": "See the state of the Application Layer Firewall on a Mac. A result of 0 means\nit is disabled, 1 means it is enabled, and 2 means it is enabled and blocking\nall inbound connections. See our standard query library for an example policy\nquery using this.\n\n```\nSELECT global_state FROM alf;\n```", + "columns": [ + { + "name": "allow_signed_enabled", + "description": "1 If allow signed mode is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "firewall_unload", + "description": "1 If firewall unloading enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "global_state", + "description": "1 If the firewall is enabled with exceptions, 2 if the firewall is configured to block all incoming connections, else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logging_enabled", + "description": "1 If logging mode is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logging_option", + "description": "Firewall logging option", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "stealth_enabled", + "description": "1 If stealth mode is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Application Layer Firewall version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/alf.yml" + }, + { + "name": "alf_exceptions", + "description": "The exceptions configured for the [built-in firewall protection](https://fleetdm.com/tables/alf) on this Mac.", + "url": "https://fleetdm.com/tables/alf_exceptions", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List applications that are able to receive inbound connections across the\nfirewall. This is useful when looking to see if vulnerable software is exposed\nto networks. \n\n```\nSELECT * FROM alf_exceptions;\n```", + "columns": [ + { + "name": "path", + "description": "Path to the executable that is excepted", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "Firewall [exception state](https://krypted.com/mac-security/command-line-alf-on-mac-os-x/)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/alf_exceptions.yml" + }, + { + "name": "alf_explicit_auths", + "description": "ALF services explicitly allowed to perform networking.", + "url": "https://fleetdm.com/tables/alf_explicit_auths", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "This table is currently affected by a [bug](https://github.com/osquery/osquery/issues/2322) and not returning applications visible in the preferences interface.", + "examples": "List applications were granted explicit access through the firewall. This is\nuseful when looking to see if vulnerable software is exposed to networks. \n\n```\nSELECT * FROM alf_exceptions;\n```", + "columns": [ + { + "name": "process", + "description": "Process name explicitly allowed", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/alf_explicit_auths.yml" + }, + { + "name": "apfs_physical_stores", + "platforms": [ + "darwin" + ], + "description": "Information about APFS physical stores from the `diskutil apfs list -plist` command.", + "columns": [ + { + "name": "container_uuid", + "type": "text", + "required": false, + "description": "The UUID of the APFS Contianer" + }, + { + "name": "container_designated_physical_store", + "type": "text", + "required": false, + "description": "The disk displayed as the backing store of the container. There may be multiple,\nuse `apfs_physical_stores` to see all actual physical stores" + }, + { + "name": "container_reference", + "type": "text", + "required": false, + "description": "The current reference for the APFS container, e.g. \"disk3\"" + }, + { + "name": "container_fusion", + "type": "text", + "required": false, + "description": "Whether this container is on a \"fusion drive\" (i.e. SSHD)" + }, + { + "name": "container_capacity_ceiling", + "type": "bigint", + "required": false, + "description": "The total amount of space in the container" + }, + { + "name": "container_capacity_free", + "type": "bigint", + "required": false, + "description": "The amount of remaining free space in the container" + }, + { + "name": "uuid", + "type": "text", + "required": false, + "description": "The UUID of the physical store" + }, + { + "name": "identifier", + "type": "text", + "required": false, + "description": "The current identifier of the physical store (e.g. disk1s2)" + }, + { + "name": "size", + "type": "bigint", + "required": false, + "description": "The size of the physical store in byptes" + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/apfs_physical_stores", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/apfs_physical_stores.yml" + }, + { + "name": "apfs_volumes", + "platforms": [ + "darwin" + ], + "description": "Information about APFS volumes from the `diskutil apfs list -plist` command.", + "columns": [ + { + "name": "container_uuid", + "type": "text", + "required": false, + "description": "The UUID of the APFS Contianer" + }, + { + "name": "container_designated_physical_store", + "type": "text", + "required": false, + "description": "The disk displayed as the backing store of the container. There may be multiple,\nuse `apfs_physical_stores` to see all actual physical stores" + }, + { + "name": "container_reference", + "type": "text", + "required": false, + "description": "The current reference for the APFS container, e.g. \"disk3\"" + }, + { + "name": "container_fusion", + "type": "text", + "required": false, + "description": "Whether this container is on a \"fusion drive\" (i.e. SSHD)" + }, + { + "name": "container_capacity_ceiling", + "type": "bigint", + "required": false, + "description": "The total amount of space in the container" + }, + { + "name": "container_capacity_free", + "type": "bigint", + "required": false, + "description": "The amount of remaining free space in the container" + }, + { + "name": "uuid", + "type": "text", + "required": false, + "description": "The UUID of the volume" + }, + { + "name": "device_identifier", + "type": "text", + "required": false, + "description": "The current identifier of the volume (e.g. disk3s2)" + }, + { + "name": "name", + "type": "text", + "required": false, + "description": "The user-selected name of the volume (e.g. \"Macintosh HD\")" + }, + { + "name": "role", + "type": "text", + "required": false, + "description": "The first role of the volume. User-created volumes will have no role (this will be empty).\nSystem volumes might have roles like \"Data\", \"Hardware\", etc." + }, + { + "name": "capacity_in_use", + "type": "bigint", + "required": false, + "description": "Storage space used by the volume" + }, + { + "name": "capacity_quota", + "type": "bigint", + "required": false, + "description": "Storage quota for the volume, or 0 if disabled" + }, + { + "name": "capacity_reserve", + "type": "bigint", + "required": false, + "description": "Storage reserved for this volume even if contianer is otherwise full, or 0 if disabled" + }, + { + "name": "crypto_migration_on", + "type": "integer", + "required": false, + "description": "Whether the volume is in the process of being encrypted" + }, + { + "name": "encryption", + "type": "integer", + "required": false, + "description": "Whether the volume is encrypted, including without requiring a password" + }, + { + "name": "filevault", + "type": "integer", + "required": false, + "description": "Whether the volume requires a password to decrypt" + }, + { + "name": "locked", + "type": "integer", + "required": false, + "description": "Whether the volume is unreadable because it does not have a key entered" + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/apfs_volumes", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/apfs_volumes.yml" + }, + { + "name": "app_icons", + "description": "Icons and their locations for macOS applications.", + "evented": false, + "notes": "This table is not a core osquery table. It is included as part of fleetd, the osquery manager from Fleet. Code based on work by [Kolide](https://github.com/kolide/launcher).", + "platforms": [ + "darwin" + ], + "columns": [ + { + "name": "path", + "description": "The icon's path.", + "type": "text", + "required": false + }, + { + "name": "icon", + "description": "The icon.", + "type": "text", + "required": false + }, + { + "name": "hash", + "description": "The icon's hash.", + "type": "text", + "required": false + } + ], + "url": "https://fleetdm.com/tables/app_icons", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/app_icons.yml" + }, + { + "name": "app_schemes", + "description": "macOS application schemes and handlers (e.g., http, file, mailto).", + "url": "https://fleetdm.com/tables/app_schemes", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List applications that have registered the URL scheme \"mailto\" to handle email\nlinks.\n\n```\nSELECT * FROM app_schemes WHERE scheme='mailto';\n```", + "columns": [ + { + "name": "scheme", + "description": "Name of the scheme/protocol", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "handler", + "description": "Application label for the handler", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enabled", + "description": "1 if this handler is the OS default, else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "external", + "description": "1 if this handler does NOT exist on macOS by default, else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protected", + "description": "1 if this handler is protected (reserved) by macOS, else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/app_schemes.yml" + }, + { + "name": "apparmor_events", + "description": "Track AppArmor events.", + "url": "https://fleetdm.com/tables/apparmor_events", + "platforms": [ + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "type", + "description": "Event type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "message", + "description": "Raw audit message", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uptime", + "description": "Time of execution in system uptime", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "apparmor", + "description": "Apparmor Status like ALLOWED, DENIED etc.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "operation", + "description": "Permission requested by the process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Parent process PID", + "type": "unsigned_bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "profile", + "description": "Apparmor profile name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Process name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process ID", + "type": "unsigned_bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "comm", + "description": "Command-line name of the command that was used to invoke the analyzed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "denied_mask", + "description": "Denied permissions for the process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "capname", + "description": "Capability requested by the process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fsuid", + "description": "Filesystem user ID", + "type": "unsigned_bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ouid", + "description": "Object owner's user ID", + "type": "unsigned_bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "capability", + "description": "Capability number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "requested_mask", + "description": "Requested access mask", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "info", + "description": "Additional information", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "error", + "description": "Error information", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "namespace", + "description": "AppArmor namespace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "label", + "description": "AppArmor label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/apparmor_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fapparmor_events.yml&value=name%3A%20apparmor_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "apparmor_profiles", + "description": "Track active AppArmor profiles.", + "url": "https://fleetdm.com/tables/apparmor_profiles", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nSELECT * FROM apparmor_profiles WHERE mode = 'complain'\n```", + "columns": [ + { + "name": "path", + "description": "Unique, aa-status compatible, policy identifier.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "Policy name.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "attach", + "description": "Which executable(s) a profile will attach to.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mode", + "description": "How the policy is applied.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha1", + "description": "A unique hash that identifies this policy.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/apparmor_profiles.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fapparmor_profiles.yml&value=name%3A%20apparmor_profiles%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "appcompat_shims", + "description": "Application Compatibility shims are a way to persist malware. This table presents the AppCompat Shim information from the registry in a nice format. See http://files.brucon.org/2015/Tomczak_and_Ballenthin_Shims_for_the_Win.pdf for more details.", + "url": "https://fleetdm.com/tables/appcompat_shims", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from appcompat_shims;\n```", + "columns": [ + { + "name": "executable", + "description": "Name of the executable that is being shimmed. This is pulled from the registry.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "This is the path to the SDB database.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Description of the SDB.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "install_time", + "description": "Install time of the SDB", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Type of the SDB database.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sdb_id", + "description": "Unique GUID of the SDB.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/appcompat_shims.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fappcompat_shims.yml&value=name%3A%20appcompat_shims%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "apps", + "description": "macOS applications installed in known search paths (e.g., /Applications).", + "url": "https://fleetdm.com/tables/apps", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "See the last time applications were used. Useful to know if a vulnerable\napplication is being used as well as for licensing purposes.\n\n```\nSELECT *, strftime('%Y-%m-%d %H:%M:%S',last_opened_time,'unixepoch') as LastUseDate FROM apps WHERE last_opened_time!='-1.0';\n```", + "columns": [ + { + "name": "name", + "description": "Name of the Name.app folder", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Absolute and full Name.app path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "bundle_executable", + "description": "Info properties CFBundleExecutable label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bundle_identifier", + "description": "Info properties CFBundleIdentifier label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bundle_name", + "description": "Info properties CFBundleName label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bundle_short_version", + "description": "Info properties CFBundleShortVersionString label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bundle_version", + "description": "Info properties CFBundleVersion label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bundle_package_type", + "description": "Info properties CFBundlePackageType label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "environment", + "description": "Application-set environment variables", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "element", + "description": "Does the app identify as a background agent", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "compiler", + "description": "Info properties DTCompiler label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "development_region", + "description": "Info properties CFBundleDevelopmentRegion label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "display_name", + "description": "Info properties CFBundleDisplayName label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "info_string", + "description": "Info properties CFBundleGetInfoString label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "minimum_system_version", + "description": "Minimum version of macOS required for the app to run", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "category", + "description": "The UTI that categorizes the app for the App Store", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "applescript_enabled", + "description": "Info properties NSAppleScriptEnabled label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "copyright", + "description": "Info properties NSHumanReadableCopyright label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_opened_time", + "description": "The time that the app was last used", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/apps.yml" + }, + { + "name": "apt_sources", + "description": "Current list of APT repositories or software channels.", + "url": "https://fleetdm.com/tables/apt_sources", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "On Ubuntu or other Debian based systems, identify APT repositories that are\nnot maintained by Ubuntu.\n\n```\nSELECT * FROM apt_sources WHERE maintainer!='Ubuntu';\n```", + "columns": [ + { + "name": "name", + "description": "Repository name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source", + "description": "Source file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "base_uri", + "description": "Repository base URI", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "release", + "description": "Release name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Repository source version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "maintainer", + "description": "Repository maintainer", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "components", + "description": "Repository components", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "architectures", + "description": "Repository architectures", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/apt_sources.yml" + }, + { + "name": "arp_cache", + "description": "The Address Resolution Protocol (ARP) cache maps IP addresses to MAC addresses in the network stack on Linux, macOS & Windows.", + "url": "https://fleetdm.com/tables/arp_cache", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "The first six digits of a MAC address are the known as the [Organizationally Unique Identifier](https://en.wikipedia.org/wiki/Organizationally_unique_identifier)\n\nManufacturer and model information can be looked up by MAC address using [Wireshark OUI Lookup](https://www.wireshark.org/tools/oui-lookup.html)\n\nOUI is used to populate manufacturer information in applications like [Wi-Fi Explorer](https://www.intuitibits.com/products/wifiexplorer/)\n\nMonitoring the [ARP Cache](https://en.wikipedia.org/wiki/ARP_cache) is useful for maintaining network integrity & security. Querying data from this table can help to:\n\n - Find network anomalies\n - Troubleshoot network connectivity\n - Uncover [ARP Spoofing](https://en.wikipedia.org/wiki/ARP_spoofing)", + "examples": "Basic query:\n\n```\nSELECT address, interface, mac FROM arp_cache;\n```\n\nCompare gateway IP addresses (which are typically routers) to a list of known MAC addresses:\n\n```\nSELECT * FROM arp_cache WHERE address IN (INSERT_GATEWAY_IPS) AND mac NOT IN (INSERT_EXPECTED_MAC_ADDRESSES);\n```", + "columns": [ + { + "name": "address", + "description": "IPv4 address target", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mac", + "description": "MAC address of broadcasted address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "interface", + "description": "Interface of the network for the MAC", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "permanent", + "description": "1 for true, 0 for false", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/arp_cache.yml" + }, + { + "name": "asl", + "description": "Queries the Apple System Log data structure for system events.", + "url": "https://fleetdm.com/tables/asl", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Apple System Logger (ASL) is deprecated since macOS 10.12. On older Macs, this\ntable can be used to read logs. On newer ones, see the *unified_log* table.\nThis example is from the osquery documentation.\n\n```\nSELECT time, message FROM asl WHERE facility = 'authpriv' AND sender = 'sudo' AND message LIKE '%python%';\n```", + "columns": [ + { + "name": "time", + "description": "Unix timestamp. Set automatically", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time_nano_sec", + "description": "Nanosecond time.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "host", + "description": "Sender's address (set by the server).", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sender", + "description": "Sender's identification string. Default is process name.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "facility", + "description": "Sender's facility. Default is 'user'.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Sending process ID encoded as a string. Set automatically.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "GID that sent the log message (set by the server).", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "UID that sent the log message (set by the server).", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "level", + "description": "Log level number. See levels in asl.h.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "message", + "description": "Message text.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ref_pid", + "description": "Reference PID for messages proxied by launchd", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ref_proc", + "description": "Reference process for messages proxied by launchd", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "extra", + "description": "Extra columns, in JSON format. Queries against this column are performed entirely in SQLite, so do not benefit from efficient querying via asl.h.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/asl.yml" + }, + { + "name": "augeas", + "description": "Configuration files parsed by [augeas](https://augeas.net/).", + "url": "https://fleetdm.com/tables/augeas", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "This table requires augeas [lenses](https://augeas.net/docs/lenses.html) to be\ninstalled in their default location. This query will output *sshd_config* as\nif it was a table. This is especially useful to check for specific\nconfigurations in text files.\n\n```\nSELECT * FROM augeas WHERE path='/etc/ssh/sshd_config';\n```", + "columns": [ + { + "name": "node", + "description": "The node path of the configuration item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "value", + "description": "The value of the configuration item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "label", + "description": "The label of the configuration item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "The path to the configuration file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/augeas.yml" + }, + { + "name": "authdb", + "platforms": [ + "darwin" + ], + "description": "The macOS authorizationdb is used by Mac admins to give their users or themselves granular permissions on the Macs they manage. The `authdb` osquery table returns JSON output for the `authorizationdb read ` command.", + "evented": false, + "columns": [ + { + "name": "right_name", + "type": "text", + "required": true, + "description": "The right_name to query in the `authorizationdb read ` command." + }, + { + "name": "json_result", + "type": "text", + "required": false, + "description": "The JSON output parsed from `authorizationdb` plist. " + } + ], + "examples": "The “right_name” string `system.login.console` is used in the mandatory WHERE clause for this table:\n\n```\nSELECT * FROM authdb WHERE right_name='system.login.console';\n```", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).\n\nThe authorizationdb is a SQLite database that can be dumped out with the following Terminal command:\n\n```\nsudo /usr/bin/sqlite3 /var/db/auth.db .dump\n```\n\nThe following command generates a .plist showing the attributes of the authorizationdb configuration:\n\n```\nsecurity authorizationdb read system.login.console\n```\n\n- [Apple documentation](https://developer.apple.com/library/archive/documentation/Security/Conceptual/authorization_concepts/02authconcepts/authconcepts.html)\n- A general purpose [authorizationdb article](https://theevilbit.github.io/posts/macos_authorization/)\n- Armin Briegel (Scripting OS X) on the [macOS root user and the authorizationdb](https://scriptingosx.com/2018/05/demystifying-root-on-macos-part-4-the-authorization-database/)\n- Elliot Jordan on using the authorizationdb in his tool [Escrow Buddy](https://www.elliotjordan.com/posts/macos-authdb-mechs/)", + "url": "https://fleetdm.com/tables/authdb", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/authdb.yml" + }, + { + "name": "authenticode", + "description": "File (executable, bundle, installer, disk) code signing status.", + "url": "https://fleetdm.com/tables/authenticode", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nSELECT process.pid, process.path, signature.result FROM processes as process LEFT JOIN authenticode AS signature ON process.path = signature.path;\n```", + "columns": [ + { + "name": "path", + "description": "Must provide a path or directory", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "original_program_name", + "description": "The original program name that the publisher has signed", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial_number", + "description": "The certificate serial number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "issuer_name", + "description": "The certificate issuer name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subject_name", + "description": "The certificate subject name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "result", + "description": "The signature check result", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/authenticode.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fauthenticode.yml&value=name%3A%20authenticode%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "authorization_mechanisms", + "description": "macOS Authorization mechanisms database.", + "url": "https://fleetdm.com/tables/authorization_mechanisms", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Discover privileged macOS authorization mechanisms, which could include third\nparty software. Finding third party software using this means it is likely an\nimportant piece of software that should be kept very up to date.\n\n```\nSELECT * FROM authorization_mechanisms WHERE privileged='true';\n```", + "columns": [ + { + "name": "label", + "description": "Label of the authorization right", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "plugin", + "description": "Authorization plugin name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mechanism", + "description": "Name of the mechanism that will be called", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "privileged", + "description": "If privileged it will run as root, else as an anonymous user", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "entry", + "description": "The whole string entry", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/authorization_mechanisms.yml" + }, + { + "name": "authorizations", + "description": "macOS Authorization rights database.", + "url": "https://fleetdm.com/tables/authorizations", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See macOS authorizations that have been modified since their creation. Useful\nfor threat hunting.\n\n```\nSELECT * FROM authorizations WHERE created!=modified;\n```", + "columns": [ + { + "name": "label", + "description": "Item name, usually in reverse domain format", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "modified", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "allow_root", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "timeout", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tries", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "authenticate_user", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "shared", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "comment", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "created", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "class", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "session_owner", + "description": "Label top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/authorizations.yml" + }, + { + "name": "authorized_keys", + "description": "A line-delimited authorized_keys table.", + "url": "https://fleetdm.com/tables/authorized_keys", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)", + "examples": "```\nSELECT * FROM users CROSS JOIN authorized_keys USING (uid);\n```", + "columns": [ + { + "name": "uid", + "description": "The local owner of authorized_keys file", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "algorithm", + "description": "Key type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key", + "description": "Key encoded as base64", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "options", + "description": "Optional list of login options", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "comment", + "description": "Optional comment", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key_file", + "description": "Path to the authorized_keys file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/authorized_keys.yml" + }, + { + "name": "autoexec", + "description": "Aggregate of executables that will automatically execute on the target machine. This is an amalgamation of other tables like services, scheduled_tasks, startup_items and more.", + "url": "https://fleetdm.com/tables/autoexec", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "path", + "description": "Path to the executable", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "Name of the program", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source", + "description": "Source table of the autoexec item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/autoexec.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fautoexec.yml&value=name%3A%20autoexec%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "azure_instance_metadata", + "description": "Azure instance metadata.", + "url": "https://fleetdm.com/tables/azure_instance_metadata", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "See in which Azure location a VM is located\n\n```\nSELECT location FROM azure_instance_metadata;\n```", + "columns": [ + { + "name": "location", + "description": "Azure Region the VM is running in", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Name of the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "offer", + "description": "Offer information for the VM image (Azure image gallery VMs only)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "publisher", + "description": "Publisher of the VM image", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sku", + "description": "SKU for the VM image", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Version of the VM image", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "os_type", + "description": "Linux or Windows", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "platform_update_domain", + "description": "Update domain the VM is running in", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "platform_fault_domain", + "description": "Fault domain the VM is running in", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vm_id", + "description": "Unique identifier for the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "vm_size", + "description": "VM size", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subscription_id", + "description": "Azure subscription for the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "resource_group_name", + "description": "Resource group for the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "placement_group_id", + "description": "Placement group for the VM scale set", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vm_scale_set_name", + "description": "VM scale set name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "zone", + "description": "Availability zone of the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/azure_instance_metadata.yml" + }, + { + "name": "azure_instance_tags", + "description": "Azure instance tags.", + "url": "https://fleetdm.com/tables/azure_instance_tags", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "List the tags assigned to an Azure VM\n\n```\nSELECT key, value FROM azure_instance_tags;\n```", + "columns": [ + { + "name": "vm_id", + "description": "Unique identifier for the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key", + "description": "The tag key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "The tag value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/azure_instance_tags.yml" + }, + { + "name": "background_activities_moderator", + "description": "Background Activities Moderator (BAM) tracks application execution.", + "url": "https://fleetdm.com/tables/background_activities_moderator", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from background_activities_moderator;\n```", + "columns": [ + { + "name": "path", + "description": "Application file path.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_execution_time", + "description": "Most recent time application was executed.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sid", + "description": "User SID.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/background_activities_moderator.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fbackground_activities_moderator.yml&value=name%3A%20background_activities_moderator%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "battery", + "description": "Provides information about the internal battery of a laptop. Note: On Windows, columns with Ah or mAh units assume that the battery is 12V.", + "url": "https://fleetdm.com/tables/battery", + "platforms": [ + "darwin", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "This table contains a lot of information about the health of batteries. This\nquery shows how many cycles the battery of a device was used for, allowing you\nto identify users who put more wear on it and might need more frequent\nreplacements.\n\n```\nSELECT cycle_count FROM battery;\n```", + "columns": [ + { + "name": "manufacturer", + "description": "The battery manufacturer's name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model", + "description": "The battery's model number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial_number", + "description": "The battery's serial number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cycle_count", + "description": "The number of charge/discharge cycles", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "One of the following: \"AC Power\" indicates the battery is connected to an external power source, \"Battery Power\" indicates that the battery is drawing internal power, \"Off Line\" indicates the battery is off-line or no longer connected", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "charging", + "description": "1 if the battery is currently being charged by a power source. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "charged", + "description": "1 if the battery is currently completely charged. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "designed_capacity", + "description": "The battery's designed capacity in mAh", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "max_capacity", + "description": "The battery's actual capacity when it is fully charged in mAh", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "current_capacity", + "description": "The battery's current capacity (level of charge) in mAh", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "percent_remaining", + "description": "The percentage of battery remaining before it is drained", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "amperage", + "description": "The current amperage in/out of the battery in mA (positive means charging, negative means discharging)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "voltage", + "description": "The battery's current voltage in mV", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "minutes_until_empty", + "description": "The number of minutes until the battery is fully depleted. This value is -1 if this time is still being calculated", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "minutes_to_full_charge", + "description": "The number of minutes until the battery is fully charged. This value is -1 if this time is still being calculated. On Windows this is calculated from the charge rate and capacity and may not agree with the number reported in \"Power & Battery\"", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "chemistry", + "description": "The battery chemistry type (eg. LiP). Some possible values are documented in https://learn.microsoft.com/en-us/windows/win32/power/battery-information-str.", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "health", + "description": "One of the following: \"Good\" describes a well-performing battery, \"Fair\" describes a functional battery with limited capacity, or \"Poor\" describes a battery that's not capable of providing power", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "condition", + "description": "One of the following: \"Normal\" indicates the condition of the battery is within normal tolerances, \"Service Needed\" indicates that the battery should be checked out by a licensed Mac repair service, \"Permanent Failure\" indicates the battery needs replacement", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "manufacture_date", + "description": "The date the battery was manufactured UNIX Epoch", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/battery.yml" + }, + { + "name": "bitlocker_info", + "description": "Retrieve bitlocker status of the machine.", + "url": "https://fleetdm.com/tables/bitlocker_info", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "* `protection_status` is quite nuanced - from the [Microsoft documentation](https://learn.microsoft.com/en-us/windows/win32/secprov/getprotectionstatus-win32-encryptablevolume#parameters):\n\n `protection_status = 0`\n\n For an Internal HD:\n The volume is unencrypted, partially encrypted, or the volume's encryption key is available in the clear on the hard disk.\n\n For an External HD:\n The band for the volume is perpetually unlocked, has no key manager, or is managed by a third party key manager.\n This can also mean that the band is managed by BitLocker but the DisableKeyProtectors method has been called and the drive is suspended.\n\n `protection_status = 1`\n\n For an Internal HD:\n The volume is fully encrypted and the encryption key for the volume is not available in the clear on the hard disk.\n\n For an External HD:\n BitLocker is the key manager for the band. The drive can be locked or unlocked but cannot be perpetually unlocked.\n\n `protection_status = 2`\n\n The volume protection status cannot be determined. This can be caused by the volume being in a locked state.", + "examples": "Full Disk Encryption (FDE) reduces the risk of compromise when a device is lost or stolen. This query lists any system that does not have BitLocker enabled on its OS drive (typically `C:`). \n\n```\nSELECT * FROM bitlocker_info WHERE drive_letter='C:' AND protection_status != 1;\n```", + "columns": [ + { + "name": "device_id", + "description": "ID of the encrypted drive.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "drive_letter", + "description": "Drive letter of the encrypted drive.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "persistent_volume_id", + "description": "Persistent ID of the drive.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "conversion_status", + "description": "The bitlocker conversion status of the drive.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protection_status", + "description": "The bitlocker protection status of the drive.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "encryption_method", + "description": "The encryption type of the device.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "The FVE metadata version of the drive.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "percentage_encrypted", + "description": "The percentage of the drive that is encrypted.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "lock_status", + "description": "The accessibility status of the drive from Windows.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/bitlocker_info.yml" + }, + { + "name": "block_devices", + "description": "Block (buffered access) device file nodes: disks, ramdisks, and DMG containers.", + "url": "https://fleetdm.com/tables/block_devices", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify USB storage in use\n\n```\nSELECT * FROM block_devices WHERE type='USB';\n```", + "columns": [ + { + "name": "name", + "description": "Block device name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Block device parent name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor", + "description": "Block device vendor string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model", + "description": "Block device model string identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Block device size in blocks", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "block_size", + "description": "Block size in bytes", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uuid", + "description": "Block device Universally Unique Identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Block device type string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "label", + "description": "Block device label string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/block_devices.yml" + }, + { + "name": "bpf_process_events", + "description": "Track time/action process executions.", + "url": "https://fleetdm.com/tables/bpf_process_events", + "platforms": [ + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "tid", + "description": "Thread ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Parent process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "User ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cid", + "description": "Cgroup ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exit_code", + "description": "Exit code of the system call", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "probe_error", + "description": "Set to 1 if one or more buffers could not be captured", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "syscall", + "description": "System call name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Binary path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cwd", + "description": "Current working directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cmdline", + "description": "Command line arguments", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "duration", + "description": "How much time was spent inside the syscall (nsecs)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "json_cmdline", + "description": "Command line arguments, in JSON format", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "ntime", + "description": "The nsecs uptime timestamp as obtained from BPF", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/bpf_process_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fbpf_process_events.yml&value=name%3A%20bpf_process_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "bpf_socket_events", + "description": "Track network socket opens and closes.", + "url": "https://fleetdm.com/tables/bpf_socket_events", + "platforms": [ + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "tid", + "description": "Thread ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Parent process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "User ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cid", + "description": "Cgroup ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exit_code", + "description": "Exit code of the system call", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "probe_error", + "description": "Set to 1 if one or more buffers could not be captured", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "syscall", + "description": "System call name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of executed file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fd", + "description": "The file description for the process socket", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "family", + "description": "The Internet protocol family ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "The socket type", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protocol", + "description": "The network protocol ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_address", + "description": "Local address associated with socket", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_address", + "description": "Remote address associated with socket", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_port", + "description": "Local network protocol port number", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_port", + "description": "Remote network protocol port number", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "duration", + "description": "How much time was spent inside the syscall (nsecs)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ntime", + "description": "The nsecs uptime timestamp as obtained from BPF", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/bpf_socket_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fbpf_socket_events.yml&value=name%3A%20bpf_socket_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "browser_plugins", + "description": "All C/NPAPI browser plugin details for all users. C/NPAPI has been deprecated on all major browsers. To query for plugins on modern browsers, try: `chrome_extensions` `firefox_addons` `safari_extensions`.", + "url": "https://fleetdm.com/tables/browser_plugins", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)", + "examples": "See classic browser plugins (C/NPAPI) installed by users. These plugins have\nbeen deprecated for a long time, so this query will usually not return\nanything.\n\n```\nSELECT * FROM users CROSS JOIN browser_plugins USING (uid);\n```", + "columns": [ + { + "name": "uid", + "description": "The local user that owns the plugin", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "Plugin display name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "identifier", + "description": "Plugin identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Plugin short version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sdk", + "description": "Build SDK used to compile plugin", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Plugin description text", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "development_region", + "description": "Plugin language-localization", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "native", + "description": "Plugin requires native execution", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to plugin bundle", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "disabled", + "description": "Is the plugin disabled. 1 = Disabled", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "hidden": true, + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/browser_plugins.yml" + }, + { + "name": "carbon_black_info", + "description": "Returns info about a Carbon Black sensor install.", + "url": "https://fleetdm.com/tables/carbon_black_info", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See systems running Carbon Black but which have protection disabled.\n\n```\nSELECT * FROM carbon_black_info WHERE protection_disabled='1';\n```", + "columns": [ + { + "name": "sensor_id", + "description": "Sensor ID of the Carbon Black sensor", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "config_name", + "description": "Sensor group", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_store_files", + "description": "If the sensor is configured to send back binaries to the Carbon Black server", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_module_loads", + "description": "If the sensor is configured to capture module loads", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_module_info", + "description": "If the sensor is configured to collect metadata of binaries", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_file_mods", + "description": "If the sensor is configured to collect file modification events", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_reg_mods", + "description": "If the sensor is configured to collect registry modification events", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_net_conns", + "description": "If the sensor is configured to collect network connections", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_processes", + "description": "If the sensor is configured to process events", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_cross_processes", + "description": "If the sensor is configured to cross process events", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_emet_events", + "description": "If the sensor is configured to EMET events", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_data_file_writes", + "description": "If the sensor is configured to collect non binary file writes", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_process_user_context", + "description": "If the sensor is configured to collect the user running a process", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collect_sensor_operations", + "description": "Unknown", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "log_file_disk_quota_mb", + "description": "Event file disk quota in MB", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "log_file_disk_quota_percentage", + "description": "Event file disk quota in a percentage", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protection_disabled", + "description": "If the sensor is configured to report tamper events", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sensor_ip_addr", + "description": "IP address of the sensor", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sensor_backend_server", + "description": "Carbon Black server", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "event_queue", + "description": "Size in bytes of Carbon Black event files on disk", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "binary_queue", + "description": "Size in bytes of binaries waiting to be sent to Carbon Black server", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/carbon_black_info.yml" + }, + { + "name": "carves", + "description": "List the set of completed and in-progress carves. If carve=1 then the query is treated as a new carve request.", + "url": "https://fleetdm.com/tables/carves", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from carves where path like '/Users/%/Downloads/%' and carve=1\n```", + "columns": [ + { + "name": "time", + "description": "Time at which the carve was kicked off", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha256", + "description": "A SHA256 sum of the carved archive", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of the carved archive", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "The path of the requested carve", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "Status of the carve, can be STARTING, PENDING, SUCCESS, or FAILED", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "carve_guid", + "description": "Identifying value of the carve session", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "request_id", + "description": "Identifying value of the carve request (e.g., scheduled query name, distributed request, etc)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "carve", + "description": "Set this value to '1' to start a file carve", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/carves.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fcarves.yml&value=name%3A%20carves%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "certificates", + "description": "[Certificate authorities](https://en.wikipedia.org/wiki/Certificate_authority) installed in Keychains/ca-bundles.", + "url": "https://fleetdm.com/tables/certificates", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "- This table should be used sparingly as it uses an Apple API which occasionally corrupts the underlying certificate. Learn more [here](https://github.com/fleetdm/fleet/issues/13065#issuecomment-1658849614).", + "examples": "Replace 1QAZ2WSX with your Apple Developer ID, if you have one. This query\nwill then let you identify Macs that have a copy of your code signing and\nnotarization certificates.\n\n```\nSELECT * FROM certificates WHERE common_\"name\" LIKE '%%1QAZ2SWX%%';\n```", + "columns": [ + { + "name": "common_name", + "description": "Certificate CommonName", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subject", + "description": "Certificate distinguished name (deprecated, use subject2)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "issuer", + "description": "Certificate issuer distinguished name (deprecated, use issuer2)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ca", + "description": "1 if CA: true (certificate is an authority) else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "self_signed", + "description": "1 if self-signed, else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "not_valid_before", + "description": "Lower bound of valid date", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "not_valid_after", + "description": "Certificate expiration data", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "signing_algorithm", + "description": "Signing algorithm used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key_algorithm", + "description": "Key algorithm used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key_strength", + "description": "Key size used for RSA/DSA, or curve name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key_usage", + "description": "Certificate key usage and extended key usage", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subject_key_id", + "description": "SKID an optionally included SHA1", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "authority_key_id", + "description": "AKID an optionally included SHA1", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha1", + "description": "SHA1 hash of the raw certificate contents", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to Keychain or PEM bundle", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial", + "description": "Certificate serial number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sid", + "description": "SID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "store_location", + "description": "Certificate system store location", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "store", + "description": "Certificate system store", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "username", + "description": "Username", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "store_id", + "description": "Exists for service/user stores. Contains raw store id provided by WinAPI.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "issuer2", + "description": "Certificate issuer distinguished name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux", + "macOS" + ] + }, + { + "name": "subject2", + "description": "Certificate distinguished name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux", + "macOS" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/certificates.yml" + }, + { + "name": "chassis_info", + "description": "Display information pertaining to the chassis and its security status.", + "url": "https://fleetdm.com/tables/chassis_info", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from chassis_info\n```", + "columns": [ + { + "name": "audible_alarm", + "description": "If TRUE, the frame is equipped with an audible alarm.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "breach_description", + "description": "If provided, gives a more detailed description of a detected security breach.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "chassis_types", + "description": "A comma-separated list of chassis types, such as Desktop or Laptop.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "An extended description of the chassis if available.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "lock", + "description": "If TRUE, the frame is equipped with a lock.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufacturer", + "description": "The manufacturer of the chassis.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model", + "description": "The model of the chassis.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "security_breach", + "description": "The physical status of the chassis such as Breach Successful, Breach Attempted, etc.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial", + "description": "The serial number of the chassis.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "smbios_tag", + "description": "The assigned asset tag number of the chassis.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sku", + "description": "The Stock Keeping Unit number if available.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "If available, gives various operational or nonoperational statuses such as OK, Degraded, and Pred Fail.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "visible_alarm", + "description": "If TRUE, the frame is equipped with a visual alarm.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/chassis_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fchassis_info.yml&value=name%3A%20chassis_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "chocolatey_packages", + "description": "Chocolatey packages installed in a system.", + "url": "https://fleetdm.com/tables/chocolatey_packages", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "name", + "description": "Package display name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Package-supplied version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "summary", + "description": "Package-supplied summary", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "author", + "description": "Optional package author", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "license", + "description": "License under which package is launched", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path at which this package resides", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/chocolatey_packages.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fchocolatey_packages.yml&value=name%3A%20chocolatey_packages%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "chrome_extension_content_scripts", + "description": "Chrome browser extension content scripts.", + "url": "https://fleetdm.com/tables/chrome_extension_content_scripts", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)", + "examples": "```\nSELECT * FROM users CROSS JOIN chrome_extension_content_scripts USING (uid);\n```", + "columns": [ + { + "name": "browser_type", + "description": "The browser type (Valid values: chrome, chromium, opera, yandex, brave)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "The local user that owns the extension", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "identifier", + "description": "Extension identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Extension-supplied version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "script", + "description": "The content script used by the extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "match", + "description": "The pattern that the script is matched against", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "profile_path", + "description": "The profile path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to extension folder", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "referenced", + "description": "1 if this extension is referenced by the Preferences file of the profile", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/chrome_extension_content_scripts.yml" + }, + { + "name": "chrome_extensions", + "description": "The `chrome_extensions` table maps browser extensions installed in [Chromium](https://en.wikipedia.org/wiki/Chromium_(web_browser)) browsers like [Google Chrome](https://en.wikipedia.org/wiki/Google_Chrome), [Edge](https://en.wikipedia.org/wiki/Microsoft_Edge), [Brave](https://en.wikipedia.org/wiki/Brave_(web_browser)), [Opera](https://en.wikipedia.org/wiki/Opera_(web_browser)), and [Yandex](https://en.wikipedia.org/wiki/Yandex_Browser).", + "url": "https://fleetdm.com/tables/chrome_extensions", + "platforms": [ + "darwin", + "windows", + "linux", + "chrome" + ], + "evented": false, + "cacheable": false, + "notes": "Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)\n\nOn ChromeOS, this table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).\n\nExamples of [malicious Chrome extensions](https://palant.info/2023/06/08/another-cluster-of-potentially-malicious-chrome-extensions/)\n\nLoosely restricted extension permissions can be an [indicator of malicious intent](https://developer.chrome.com/docs/extensions/reference/api/permissions)\n\nTracking browser extensions in an organization can help with:\n\n - Compliance audits: Ensure extensions comply with company policies\n - Security training: Educate users about Chrome extension risks\n - Incident response: Identify suspicious or vulnerable extensions", + "examples": "\nBecause browser data lives in user space, this query uses a join to include a UID: \n\n```\nSELECT * FROM users CROSS JOIN chrome_extensions USING (uid);\n```\n\nThis query shows Chrome extensions that have full access to HTTPS browsing;\n\n```\nSELECT u.username, ce.name, ce.description, ce.version, ce.profile, ce.permissions FROM users u CROSS JOIN chrome_extensions ce USING (uid) WHERE ce.permissions LIKE '%%https://*/*%%';\n```", + "columns": [ + { + "name": "browser_type", + "description": "The browser type (Valid values: chrome, chromium, opera, yandex, brave, edge, edge_beta)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "The local user that owns the extension", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "name", + "description": "Extension display name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "profile", + "description": "The name of the Chrome profile that contains this extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "profile_path", + "description": "The profile path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "referenced_identifier", + "description": "Extension identifier, as specified by the preferences file. Empty if the extension is not in the profile.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "identifier", + "description": "Extension identifier, computed from its manifest. Empty in case of error.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Extension-supplied version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Extension-optional description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "default_locale", + "description": "Default locale supported by extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "current_locale", + "description": "Current locale supported by extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "update_url", + "description": "Extension-supplied update URI", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "author", + "description": "Optional extension author", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "persistent", + "description": "1 If extension is persistent across all tabs else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "path", + "description": "Path to extension folder. Defaults to '' on ChromeOS", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "permissions", + "description": "The permissions required by the extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "permissions_json", + "description": "The JSON-encoded permissions required by the extension", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "optional_permissions", + "description": "The permissions optionally required by the extensions", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "optional_permissions_json", + "description": "The JSON-encoded permissions optionally required by the extensions", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "manifest_hash", + "description": "The SHA256 hash of the manifest.json file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "referenced", + "description": "1 if this extension is referenced by the Preferences file of the profile", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "from_webstore", + "description": "True if this extension was installed from the web store", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "state", + "description": "1 if this extension is enabled", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "install_time", + "description": "Extension install time, in its original Webkit format", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "install_timestamp", + "description": "Extension install time, converted to unix time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "manifest_json", + "description": "The manifest file of the extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "key", + "description": "The extension key, from the manifest file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/chrome_extensions.yml" + }, + { + "name": "cis_audit", + "platforms": [ + "windows" + ], + "description": "Enables querying CIS items values.", + "columns": [ + { + "name": "item", + "type": "text", + "required": false, + "description": "Contains the input CIS item to query. If empty, no CIS item is queried." + }, + { + "name": "value", + "type": "text", + "required": false, + "description": "Contains the value for the queried CIS item." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/cis_audit", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/cis_audit.yml" + }, + { + "name": "connected_displays", + "description": "Provides information about the connected displays of the machine.", + "url": "https://fleetdm.com/tables/connected_displays", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "name", + "description": "The name of the display.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "product_id", + "description": "The product ID of the display.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial_number", + "description": "The serial number of the display. (may not be unique)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor_id", + "description": "The vendor ID of the display.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufactured_week", + "description": "The manufacture week of the display. This field is 0 if not supported", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufactured_year", + "description": "The manufacture year of the display. This field is 0 if not supported", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "display_id", + "description": "The display ID.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pixels", + "description": "The number of pixels of the display.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "resolution", + "description": "The resolution of the display.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ambient_brightness_enabled", + "description": "The ambient brightness setting associated with the display. This will be 1 if enabled and is 0 if disabled or not supported.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "connection_type", + "description": "The connection type associated with the display.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "display_type", + "description": "The type of display.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "main", + "description": "If the display is the main display.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mirror", + "description": "If the display is mirrored or not. This field is 1 if mirrored and 0 if not mirrored.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "online", + "description": "The online status of the display. This field is 1 if the display is online and 0 if it is offline.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "rotation", + "description": "The orientation of the display.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/connected_displays.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fconnected_displays.yml&value=name%3A%20connected_displays%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "connectivity", + "description": "Provides the overall system's network state.", + "url": "https://fleetdm.com/tables/connectivity", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect ipv4_internet from connectivity\n```", + "columns": [ + { + "name": "disconnected", + "description": "True if the all interfaces are not connected to any network", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv4_no_traffic", + "description": "True if any interface is connected via IPv4, but has seen no traffic", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv6_no_traffic", + "description": "True if any interface is connected via IPv6, but has seen no traffic", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv4_subnet", + "description": "True if any interface is connected to the local subnet via IPv4", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv4_local_network", + "description": "True if any interface is connected to a routed network via IPv4", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv4_internet", + "description": "True if any interface is connected to the Internet via IPv4", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv6_subnet", + "description": "True if any interface is connected to the local subnet via IPv6", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv6_local_network", + "description": "True if any interface is connected to a routed network via IPv6", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv6_internet", + "description": "True if any interface is connected to the Internet via IPv6", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/connectivity.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fconnectivity.yml&value=name%3A%20connectivity%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "corestorage_logical_volume_families", + "platforms": [ + "darwin" + ], + "description": "Information about CoreStorage Logical Volume Families from the `diskutil coreStorage list -plist` command.", + "columns": [ + { + "name": "vg_UUID", + "type": "text", + "required": false, + "description": "The unique identifier of the containing volume group" + }, + { + "name": "vg_Version", + "type": "integer", + "required": false, + "description": "The version of the volume group, probably 1" + }, + { + "name": "vg_FreeSpace", + "type": "bigint", + "required": false, + "description": "Amount of space, in bytes, in the volume group that have not been allocated by any logical volume" + }, + { + "name": "vg_FusionDrive", + "type": "integer", + "required": false, + "description": "Whether the volume group is a \"fusion drive\" (i.e. SSHD)" + }, + { + "name": "vg_Name", + "type": "text", + "required": false, + "description": "The customizable name of the volume group" + }, + { + "name": "vg_Sequence", + "type": "bigint", + "required": false, + "description": "Current sequence number of the volume group" + }, + { + "name": "vg_Size", + "type": "bigint", + "required": false, + "description": "Total (i.e. either allocated or unallocated) size of the volume group" + }, + { + "name": "vg_Sparse", + "type": "integer", + "required": false, + "description": "Whether the volume group allows overcommitting storage" + }, + { + "name": "vg_Status", + "type": "text", + "required": false, + "description": "Status of the volume group, e.g. \"Online\"" + }, + { + "name": "UUID", + "type": "text", + "required": false, + "description": "Unique ID of the logical volume family" + }, + { + "name": "EncryptionStatus", + "type": "text", + "required": false, + "description": "Unlock status of the logical volume family, e.g. \"Locked\" or \"Unlocked\"" + }, + { + "name": "EncryptionType", + "type": "text", + "required": false, + "description": "Encryption algorithm for the logical volume family, normally \"AES-XTS\" or \"None\"" + }, + { + "name": "HasVisibleUsers", + "type": "integer", + "required": false, + "description": "Undocumented field returned from `diskutil cs info`" + }, + { + "name": "HasVolumeKey", + "type": "integer", + "required": false, + "description": "Whether there is an encryption key assigned for the logical volume" + }, + { + "name": "IsAcceptingNewUsers", + "type": "integer", + "required": false, + "description": "Whether new users may be granted access to the logical volume family encryption key" + }, + { + "name": "IsFullySecure", + "type": "integer", + "required": false, + "description": "Undocumented field returned from `diskutil cs info`" + }, + { + "name": "MayHaveEncryptedEvents", + "type": "integer", + "required": false, + "description": "Undocumented field returned from `diskutil cs info`" + }, + { + "name": "RequiresPasswordUnlock", + "type": "integer", + "required": false, + "description": "Whether a password is currently required to unlock the volume" + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/corestorage_logical_volume_families", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/corestorage_logical_volume_families.yml" + }, + { + "name": "corestorage_logical_volumes", + "platforms": [ + "darwin" + ], + "description": "Information about CoreStorage Logical Volumes from the `diskutil coreStorage list -plist` command.", + "columns": [ + { + "name": "vg_UUID", + "type": "text", + "required": false, + "description": "The unique identifier of the containing volume group" + }, + { + "name": "vg_Version", + "type": "integer", + "required": false, + "description": "The version of the volume group, probably 1" + }, + { + "name": "vg_FreeSpace", + "type": "bigint", + "required": false, + "description": "Amount of space, in bytes, in the volume group that have not been allocated by any logical volume" + }, + { + "name": "vg_FusionDrive", + "type": "integer", + "required": false, + "description": "Whether the volume group is a \"fusion drive\" (i.e. SSHD)" + }, + { + "name": "vg_Name", + "type": "text", + "required": false, + "description": "The customizable name of the volume group" + }, + { + "name": "vg_Sequence", + "type": "bigint", + "required": false, + "description": "Current sequence number of the volume group" + }, + { + "name": "vg_Size", + "type": "bigint", + "required": false, + "description": "Total (i.e. either allocated or unallocated) size of the volume group" + }, + { + "name": "vg_Sparse", + "type": "integer", + "required": false, + "description": "Whether the volume group allows overcommitting storage" + }, + { + "name": "vg_Status", + "type": "text", + "required": false, + "description": "Status of the volume group, e.g. \"Online\"" + }, + { + "name": "lvf_UUID", + "type": "text", + "required": false, + "description": "Unique ID of the logical volume family" + }, + { + "name": "lvf_EncryptionStatus", + "type": "text", + "required": false, + "description": "Unlock status of the logical volume family, e.g. \"Locked\" or \"Unlocked\"" + }, + { + "name": "lvf_EncryptionType", + "type": "text", + "required": false, + "description": "Encryption algorithm for the logical volume family, normally \"AES-XTS\" or \"None\"" + }, + { + "name": "lvf_HasVisibleUsers", + "type": "integer", + "required": false, + "description": "Undocumented field returned from `diskutil cs info`" + }, + { + "name": "lvf_HasVolumeKey", + "type": "integer", + "required": false, + "description": "Whether there is an encryption key assigned for the logical volume" + }, + { + "name": "lvf_IsAcceptingNewUsers", + "type": "integer", + "required": false, + "description": "Whether new users may be granted access to the logical volume family encryption key" + }, + { + "name": "lvf_IsFullySecure", + "type": "integer", + "required": false, + "description": "Undocumented field returned from `diskutil cs info`" + }, + { + "name": "lvf_MayHaveEncryptedEvents", + "type": "integer", + "required": false, + "description": "Undocumented field returned from `diskutil cs info`" + }, + { + "name": "lvf_RequiresPasswordUnlock", + "type": "integer", + "required": false, + "description": "Whether a password is currently required to unlock the volume" + }, + { + "name": "ContentHint", + "type": "text", + "required": false, + "description": "What type of filesystem is on the logical volume, as written in metadata, e.g. \"Apple_HFS\"" + }, + { + "name": "ConverstionProgressPercent", + "type": "integer", + "required": false, + "description": "How far the current conversion status has progressed, either empty or 0-100" + }, + { + "name": "ConversionState", + "type": "text", + "required": false, + "description": "Status of the conversion, e.g. from HFS+ to CoreStorage or encrypting a volume" + }, + { + "name": "Name", + "type": "text", + "required": false, + "description": "Name of the logical volume" + }, + { + "name": "Sequence", + "type": "bigint", + "required": false, + "description": "Sequence number of the logical volume" + }, + { + "name": "Size", + "type": "bigint", + "required": false, + "description": "Size of the logical volume in bytes" + }, + { + "name": "Status", + "type": "text", + "required": false, + "description": "Lock status of the logical volume, e.g. \"Locked\"" + }, + { + "name": "Version", + "type": "bigint", + "required": false, + "description": "CoreStorage version of the logical volume, normally 65536" + }, + { + "name": "UUID", + "type": "text", + "required": false, + "description": "Unique ID of the logical volume" + }, + { + "name": "DesignatedPhysicalVolume", + "type": "text", + "required": false, + "description": "UUID of one of the physical volumes on which the logical volume is stored" + }, + { + "name": "DesignatedPhysicalVolumeIdentifier", + "type": "text", + "required": false, + "description": "Identifier of one of the physical volumes that holds this logical volume (e.g disk0s2)" + }, + { + "name": "Identifier", + "type": "text", + "required": false, + "description": "Current identifier of the logical volume (e.g. \"disk5\")" + }, + { + "name": "VolumeName", + "type": "text", + "required": false, + "description": "Name of the filesystem in the logical volume" + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/corestorage_logical_volumes", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/corestorage_logical_volumes.yml" + }, + { + "name": "cpu_info", + "description": "The `cpu_info` table expresses the data made available from a computer or mobile device by its Central Processing Unit (CPU).", + "url": "https://fleetdm.com/tables/cpu_info", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "The `cpu_info` table is a good example of the cross-platform capabilities of osquery. It can be used on Linux, Mac and Windows hardware.\n\nAs seen in the schema table above, there are differences in CPU metadata made available across different platforms. These differences arise from various hardware manufacturers and operating systems not necessarily being held to an industry-wide, agreed-upon standard or protocol for CPU data.", + "examples": "Basic query:\n\n```\nSELECT * FROM cpu_info;\n```", + "columns": [ + { + "name": "device_id", + "description": "The DeviceID of the CPU.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model", + "description": "The model of the CPU.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufacturer", + "description": "The manufacturer of the CPU.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "processor_type", + "description": "The processor type, such as Central, Math, or Video.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_status", + "description": "The current operating status of the CPU.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "number_of_cores", + "description": "The number of cores of the CPU.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logical_processors", + "description": "The number of logical processors of the CPU.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "address_width", + "description": "The width of the CPU address bus.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "current_clock_speed", + "description": "The current frequency of the CPU.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "max_clock_speed", + "description": "The maximum possible frequency of the CPU.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "socket_designation", + "description": "The assigned socket on the board for the given CPU.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "availability", + "description": "The availability and status of the CPU.", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "load_percentage", + "description": "The current percentage of utilization of the CPU.", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "number_of_efficiency_cores", + "description": "The number of efficiency cores of the CPU. Only available on Apple Silicon", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "number_of_performance_cores", + "description": "The number of performance cores of the CPU. Only available on Apple Silicon", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/cpu_info.yml" + }, + { + "name": "cpu_time", + "description": "The `cpu_time` table displays data from the `/proc/stat` file which records how the Central Processing Unit (CPU) in a computer or mobile device allocates time to processing workloads.", + "url": "https://fleetdm.com/tables/cpu_time", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "[CPU time](https://en.wikipedia.org/wiki/CPU_time)\n\n[Benchmarking code by referencing CPU time](https://dev.to/satrobit/cpu-time-how-to-accurately-benchmark-your-code-572p)", + "examples": "This query identifies Hosts on which the ratio of CPU time spent processing System workloads compared to User workloads is 2:1. This could be evidence of a corrupted operating system or malicious activity:\n\n```\nSELECT * FROM cpu_time WHERE user/system > 2;\n```\n\nThis query duplicates the macOS Activity Monitor.app GUI which shows the percentage of CPU time spent on System, User and Idle workloads:\n\n```\n SELECT printf(ROUND((CAST(SUM(system) AS FLOAT)/(SUM(idle)+SUM(system)+SUM(user)))*100,2)) AS system_pct,\nprintf(ROUND((CAST(SUM(user) AS FLOAT)/(SUM(idle)+SUM(system)+SUM(user)))*100,2)) AS user_pct,\nprintf(ROUND((CAST(SUM(idle) AS FLOAT)/(SUM(idle)+SUM(system)+SUM(user)))*100,2)) AS idle_pct\nFROM cpu_time;\n```", + "columns": [ + { + "name": "core", + "description": "Name of the cpu (core)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user", + "description": "Time spent in user mode", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "nice", + "description": "Time spent in user mode with low priority (nice)", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "system", + "description": "Time spent in system mode", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "idle", + "description": "Time spent in the idle task", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "iowait", + "description": "Time spent waiting for I/O to complete", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "irq", + "description": "Time spent servicing interrupts", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "softirq", + "description": "Time spent servicing softirqs", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "steal", + "description": "Time spent in other operating systems when running in a virtualized environment", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "guest", + "description": "Time spent running a virtual CPU for a guest OS under the control of the Linux kernel", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "guest_nice", + "description": "Time spent running a niced guest ", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/cpu_time.yml" + }, + { + "name": "cpuid", + "description": "Useful CPU features from the cpuid ASM call.", + "url": "https://fleetdm.com/tables/cpuid", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify Intel powered Macs that support a specific Intel CPU feature, such as\nsgx1.\n\n```\nSELECT * from cpuid WHERE feature='sgx1';\n```", + "columns": [ + { + "name": "feature", + "description": "Present feature flags", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Bit value or string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "output_register", + "description": "Register used to for feature value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "output_bit", + "description": "Bit in register value for feature value", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "input_eax", + "description": "Value of EAX used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/cpuid.yml" + }, + { + "name": "crashes", + "description": "Application, System, and Mobile App crash logs.", + "url": "https://fleetdm.com/tables/crashes", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)", + "examples": "```\nSELECT * FROM users CROSS JOIN crashes USING (uid);\n```", + "columns": [ + { + "name": "type", + "description": "Type of crash log", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process (or thread) ID of the crashed process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to the crashed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "crash_path", + "description": "Location of log file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "identifier", + "description": "Identifier of the crashed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Version info of the crashed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Parent PID of the crashed process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "responsible", + "description": "Process responsible for the crashed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "User ID of the crashed process", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "datetime", + "description": "Date/Time at which the crash occurred", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "crashed_thread", + "description": "Thread ID which crashed", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "stack_trace", + "description": "Most recent frame from the stack trace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exception_type", + "description": "Exception type of the crash", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exception_codes", + "description": "Exception codes from the crash", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exception_notes", + "description": "Exception notes from the crash", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "registers", + "description": "The value of the system registers", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/crashes.yml" + }, + { + "name": "crontab", + "description": "Line parsed values from system and user cron/tab.", + "url": "https://fleetdm.com/tables/crontab", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "List commands scheduled for execution as cron jobs\n\n```\nSELECT * FROM crontab;\n```", + "columns": [ + { + "name": "event", + "description": "The job @event name (rare)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "minute", + "description": "The exact minute for the job", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hour", + "description": "The hour of the day for the job", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "day_of_month", + "description": "The day of the month for the job", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "month", + "description": "The month of the year for the job", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "day_of_week", + "description": "The day of the week for the job", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "command", + "description": "Raw command string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "File parsed", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/crontab.yml" + }, + { + "name": "cryptoinfo", + "description": "Get info about a certificate on the host.", + "evented": false, + "notes": "This table is not a core osquery table. It is included as part of fleetd, the osquery manager from Fleet. Code based on work by [Kolide](https://github.com/kolide/launcher).", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "columns": [ + { + "name": "path", + "description": "Path to the certificate.", + "type": "text", + "required": true + }, + { + "name": "passphrase", + "description": "The passphrase for the certificate.", + "type": "text", + "required": false + }, + { + "name": "key", + "description": "A specific item that describes the drive.", + "type": "text", + "required": false + }, + { + "name": "value", + "description": "The value for the specified key.", + "type": "text", + "required": false + }, + { + "name": "fullkey", + "description": "The expanded name of the specific item that describes the drive.", + "type": "text", + "required": false + }, + { + "name": "parent", + "description": "The key's parent.", + "type": "text", + "required": false + }, + { + "name": "query", + "description": "The query is printed in this column. For example the SQL `SELECT * FROM cryuptsetup_status WHERE name = 'LUKS_DRIVE' will print \"*\"` in the query column.", + "type": "text", + "required": false + } + ], + "url": "https://fleetdm.com/tables/cryptoinfo", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/cryptoinfo.yml" + }, + { + "name": "cryptsetup_status", + "description": "Get info about the encrypted drive on the host.", + "evented": false, + "notes": "This table is not a core osquery table. It is included as part of fleetd, the osquery manager from Fleet. Code based on work by [Kolide](https://github.com/kolide/launcher).", + "platforms": [ + "linux" + ], + "columns": [ + { + "name": "name", + "required": true, + "description": "The name of the drive.", + "type": "text" + }, + { + "name": "key", + "description": "A specific item that describes the drive.", + "type": "text", + "required": false + }, + { + "name": "value", + "description": "The value for the specified key.", + "type": "text", + "required": false + }, + { + "name": "fullkey", + "description": "The expanded name of the specific item that describes the drive.", + "type": "text", + "required": false + }, + { + "name": "parent", + "description": "The key's parent.", + "type": "text", + "required": false + }, + { + "name": "query", + "description": "The query is printed in this column. For example the SQL `SELECT * FROM cryuptsetup_status WHERE name = 'LUKS_DRIVE'` will print \"*\" in the query column.", + "type": "text", + "required": false + } + ], + "url": "https://fleetdm.com/tables/cryptsetup_status", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/cryptsetup_status.yml" + }, + { + "name": "csrutil_info", + "platforms": [ + "darwin" + ], + "description": "Information from csrutil system call.", + "columns": [ + { + "name": "ssv_enabled", + "type": "integer", + "required": false, + "description": "Sealed System Volume is a security feature introduced in macOS 11.0 Big Sur.\nDuring system installation, a SHA-256 cryptographic hash is calculated for all immutable system files and stored in a Merkle tree which itself is hashed as the Seal. Both are stored in the metadata of the snapshot created of the System volume.\nThe seal is verified by the boot loader at startup. macOS will not boot if system files have been tampered with. If validation fails, the user will be instructed to reinstall the operating system.\nDuring read operations for files located in the Sealed System Volume, a hash is calculated and compared to the value stored in the Merkle tree." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/csrutil_info", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/csrutil_info.yml" + }, + { + "name": "cups_destinations", + "description": "Returns all configured printers.", + "url": "https://fleetdm.com/tables/cups_destinations", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify the types of printers connected to computers. This query works for\nboth network and local printers.\n\n```\nSELECT * FROM cups_destinations WHERE option_\"name\"='printer-info';\n```", + "columns": [ + { + "name": "name", + "description": "Name of the printer", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "option_name", + "description": "Option name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "option_value", + "description": "Option value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/cups_destinations.yml" + }, + { + "name": "cups_jobs", + "description": "Returns all completed print jobs from cups.", + "url": "https://fleetdm.com/tables/cups_jobs", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See what file format are being printed to what printer. This is useful for\nidentifying systems that print a lot, which can help you ensure they have\naccess to faster printers. Using this table, you could also highlight slow\nprint jobs that might benefit from troubleshooting.\n\n```\nSELECT destination, format, strftime('%Y-%m-%d %H:%M:%S',creation_time,'unixepoch') AS creationDate FROM cups_jobs;\n```", + "columns": [ + { + "name": "title", + "description": "Title of the printed job", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "destination", + "description": "The printer the job was sent to", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user", + "description": "The user who printed the job", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "format", + "description": "The format of the print job", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "The size of the print job", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "completed_time", + "description": "When the job completed printing", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "processing_time", + "description": "How long the job took to process", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "creation_time", + "description": "When the print request was initiated", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/cups_jobs.yml" + }, + { + "name": "curl", + "description": "Perform an http request and return stats about it.", + "url": "https://fleetdm.com/tables/curl", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Connect over HTTP and retrieve statistics about the process. This is useful to\ndetect machines on slow networks, or that have no Internet access.\n\n```\nSELECT round_trip_time FROM curl WHERE URL='https://fleetdm.com';\n```", + "columns": [ + { + "name": "url", + "description": "The url for the request", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "method", + "description": "The HTTP method for the request", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user_agent", + "description": "The user-agent string to use for the request", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "response_code", + "description": "The HTTP status code for the response", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "round_trip_time", + "description": "Time taken to complete the request", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bytes", + "description": "Number of bytes in the response", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "result", + "description": "The HTTP response body", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/curl.yml" + }, + { + "name": "curl_certificate", + "description": "Inspect TLS certificates by connecting to input hostnames.", + "url": "https://fleetdm.com/tables/curl_certificate", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify the certificates being served to osquery clients. This can allow you\nto detect machines that are behind a proxy or firewall attempting to decrypt\nTLS, maliciously or not.\n\n```\nSELECT issuer_organization, signature, sha256_fingerprint FROM curl_certificate WHERE hostname='google.com';\n```", + "columns": [ + { + "name": "hostname", + "description": "Hostname to CURL (domain[:port], e.g. osquery.io)", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "common_name", + "description": "Common name of company issued to", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "organization", + "description": "Organization issued to", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "organization_unit", + "description": "Organization unit issued to", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial_number", + "description": "Certificate serial number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "issuer_common_name", + "description": "Issuer common name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "issuer_organization", + "description": "Issuer organization", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "issuer_organization_unit", + "description": "Issuer organization unit", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "valid_from", + "description": "Period of validity start date", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "valid_to", + "description": "Period of validity end date", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha256_fingerprint", + "description": "SHA-256 fingerprint", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha1_fingerprint", + "description": "SHA1 fingerprint", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Version Number", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "signature_algorithm", + "description": "Signature Algorithm", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "signature", + "description": "Signature", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subject_key_identifier", + "description": "Subject Key Identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "authority_key_identifier", + "description": "Authority Key Identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key_usage", + "description": "Usage of key in certificate", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "extended_key_usage", + "description": "Extended usage of key in certificate", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "policies", + "description": "Certificate Policies", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subject_alternative_names", + "description": "Subject Alternative Name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "issuer_alternative_names", + "description": "Issuer Alternative Name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "info_access", + "description": "Authority Information Access", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subject_info_access", + "description": "Subject Information Access", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "policy_mappings", + "description": "Policy Mappings", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "has_expired", + "description": "1 if the certificate has expired, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "basic_constraint", + "description": "Basic Constraints", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name_constraints", + "description": "Name Constraints", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "policy_constraints", + "description": "Policy Constraints", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dump_certificate", + "description": "Set this value to '1' to dump certificate", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "timeout", + "description": "Set this value to the timeout in seconds to complete the TLS handshake (default 4s, use 0 for no timeout)", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "pem", + "description": "Certificate PEM format", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/curl_certificate.yml" + }, + { + "name": "deb_packages", + "description": "The installed DEB package database.", + "url": "https://fleetdm.com/tables/deb_packages", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": true, + "notes": "", + "columns": [ + { + "name": "name", + "description": "Package name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Package version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source", + "description": "Package source", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Package size in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "arch", + "description": "Package architecture", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "revision", + "description": "Package revision", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "Package status", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "maintainer", + "description": "Package maintainer", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "section", + "description": "Package section", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "priority", + "description": "Package priority", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "admindir", + "description": "libdpkg admindir. Defaults to /var/lib/dpkg", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "mount_namespace_id", + "description": "Mount namespace id", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/deb_packages.yml" + }, + { + "name": "default_environment", + "description": "Default environment variables and values.", + "url": "https://fleetdm.com/tables/default_environment", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "variable", + "description": "Name of the environment variable", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Value of the environment variable", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "expand", + "description": "1 if the variable needs expanding, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/default_environment.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdefault_environment.yml&value=name%3A%20default_environment%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "device_file", + "description": "Similar to the file table, but use TSK and allow block address access.", + "url": "https://fleetdm.com/tables/device_file", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "device", + "description": "Absolute file path to device node", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "partition", + "description": "A partition number", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "path", + "description": "A logical path within the device node", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "filename", + "description": "Name portion of file path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inode", + "description": "Filesystem inode number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "uid", + "description": "Owning user ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Owning group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mode", + "description": "Permission bits", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of file in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "block_size", + "description": "Block size of filesystem", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "atime", + "description": "Last access time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mtime", + "description": "Last modification time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ctime", + "description": "Creation time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hard_links", + "description": "Number of hard links", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "File status", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/sleuthkit/device_file.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdevice_file.yml&value=name%3A%20device_file%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "device_firmware", + "description": "A best-effort list of discovered firmware versions.", + "url": "https://fleetdm.com/tables/device_firmware", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify the firmware version of hardware on a Mac, such as the SSD controller\nin this case. Older versions might indicate a problem with software updates,\nand this information can be useful when troubleshooting various issues.\n\n```\nSELECT * FROM device_firmware WHERE device='AppleANS3NVMeController';\n```", + "columns": [ + { + "name": "type", + "description": "Type of device", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device", + "description": "The device name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "version", + "description": "Firmware version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/device_firmware.yml" + }, + { + "name": "device_hash", + "description": "Similar to the hash table, but use TSK and allow block address access.", + "url": "https://fleetdm.com/tables/device_hash", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "device", + "description": "Absolute file path to device node", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "partition", + "description": "A partition number", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "inode", + "description": "Filesystem inode number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "md5", + "description": "MD5 hash of provided inode data", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha1", + "description": "SHA1 hash of provided inode data", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha256", + "description": "SHA256 hash of provided inode data", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/sleuthkit/device_hash.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdevice_hash.yml&value=name%3A%20device_hash%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "device_partitions", + "description": "Use TSK to enumerate details about partitions on a disk device.", + "url": "https://fleetdm.com/tables/device_partitions", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "device", + "description": "Absolute file path to device node", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "partition", + "description": "A partition number or description", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "label", + "description": "", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "offset", + "description": "", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "blocks_size", + "description": "Byte size of each block", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "blocks", + "description": "Number of blocks", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inodes", + "description": "Number of meta nodes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "flags", + "description": "", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/sleuthkit/device_partitions.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdevice_partitions.yml&value=name%3A%20device_partitions%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "disk_encryption", + "description": "Disk encryption status and information.", + "url": "https://fleetdm.com/tables/disk_encryption", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "A policy query to check if Filevault disk encryption is enabled on a Mac.\n\n```\nSELECT 1 FROM disk_encryption WHERE user_uuid IS NOT '' AND filevault_status = 'on' LIMIT 1;\n```", + "columns": [ + { + "name": "name", + "description": "Disk name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uuid", + "description": "Disk Universally Unique Identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "encrypted", + "description": "1 If encrypted: true (disk is encrypted), else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Description of cipher type and mode if available", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "encryption_status", + "description": "Disk encryption status with one of following values: encrypted | not encrypted | undefined", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "Currently authenticated user if available", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "user_uuid", + "description": "UUID of authenticated user if available", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "filevault_status", + "description": "FileVault status with one of following values: on | off | unknown", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/disk_encryption.yml" + }, + { + "name": "disk_events", + "description": "Track DMG disk image events (appearance/disappearance) when opened.", + "url": "https://fleetdm.com/tables/disk_events", + "platforms": [ + "darwin" + ], + "evented": true, + "cacheable": false, + "notes": "", + "examples": "This is an evented table, and as such, is more useful if you are sending\nosquery logs to a SIEM or other centralized destination via Fleet. Events must\nbe enabled. This query will contain the list of all actions related to\nconnecting and removing disks, including SMB drives and USB storage, which can\nbe very useful for investigative purposes.\n\n```\nSELECT * FROM disk_events;\n```", + "columns": [ + { + "name": "action", + "description": "Appear or disappear", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of the DMG file accessed", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Disk event name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device", + "description": "Disk event BSD name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uuid", + "description": "UUID of the volume inside DMG if available", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of partition in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ejectable", + "description": "1 if ejectable, 0 if not", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mountable", + "description": "1 if mountable, 0 if not", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "writable", + "description": "1 if writable, 0 if not", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "content", + "description": "Disk event content", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "media_name", + "description": "Disk event media name string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor", + "description": "Disk event vendor string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "filesystem", + "description": "Filesystem if available", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "checksum", + "description": "UDIF Master checksum if available (CRC32)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of appearance/disappearance in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/disk_events.yml" + }, + { + "name": "disk_info", + "description": "Retrieve basic information about the physical disks of a system.", + "url": "https://fleetdm.com/tables/disk_info", + "platforms": [ + "windows", + "chrome" + ], + "evented": false, + "cacheable": false, + "notes": "- On ChromeOS, this table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).\n\n- Available for ChromeOS 91+.", + "examples": "```\nSELECT * FROM disk_info;\n```", + "columns": [ + { + "name": "partitions", + "description": "Number of detected partitions on disk.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "disk_index", + "description": "Physical drive number of the disk.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "type", + "description": "The interface type of the disk.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "id", + "description": "The unique identifier of the drive on the system.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pnp_device_id", + "description": "The unique identifier of the drive on the system.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "disk_size", + "description": "Size of the disk.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufacturer", + "description": "The manufacturer of the disk.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "hardware_model", + "description": "Hard drive model.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "name", + "description": "The label of the disk object.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial", + "description": "The serial number of the disk.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "description", + "description": "The OS's description of the disk.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/disk_info.yml" + }, + { + "name": "dns_cache", + "description": "Enumerate the DNS cache using the undocumented DnsGetCacheDataTable function in dnsapi.dll.", + "url": "https://fleetdm.com/tables/dns_cache", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "\nThis table pulls from the local system's DNS cache. By default, the local DNS cache entry for a domain will be removed once the TTL for the domain has expired. For instance, osquery.io has a TTL of 60 seconds. When this domain has been resolved on a local Windows system, the DNS mapping will expire in 60 seconds from the resolution time - so `SELECT * FROM dns_cache WHERE name = 'osquery.io'` will only return results during that 60 second window.\n\nWindows has a maximum time that it allows a cache entry to exist- by default, it is 1 day. If the domain has a TTL of greater than 1 day, Windows will still remove the DNS entry from its cache after 1 day.", + "examples": "An integral part of incident response is understanding all systems that may have been compromised. To help with this, a query like the following will return positive for a system that has resolved a domain that contains `baddomain`. It's important to note that a system will only cache the DNS mapping for a limited time - see Notes below for further information. \n\n```\nSELECT name, type FROM dns_cache WHERE name LIKE '%baddomain%';\n```", + "columns": [ + { + "name": "name", + "description": "DNS record name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "DNS record type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "flags", + "description": "DNS record flags", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/dns_cache.yml" + }, + { + "name": "dns_resolvers", + "description": "Resolvers used by this host.", + "url": "https://fleetdm.com/tables/dns_resolvers", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify computers that are using an external DNS server instead of an\ninternal one. This query also removes null and empty strings that can be\nreturned by this table.\n\n```\nSELECT address FROM dns_resolvers WHERE type='nameserver' AND address NOT LIKE '192.168%%' AND address NOT LIKE '172.16%%' AND address NOT LIKE '172.17%%' AND address NOT LIKE '172.18%%' AND address NOT LIKE '172.19%%' AND address NOT LIKE '172.20%%' AND address NOT LIKE '172.21%%' AND address NOT LIKE '172.22%%' AND address NOT LIKE '172.23%%' AND address NOT LIKE '10.%%' AND address NOT LIKE '127.%%' AND address IS NOT NULL AND address IS NOT ' ' AND address IS NOT ''; \n```", + "columns": [ + { + "name": "id", + "description": "Address type index or order", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Address type: sortlist, nameserver, search", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "address", + "description": "Resolver IP/IPv6 address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "netmask", + "description": "Address (sortlist) netmask length", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "options", + "description": "Resolver options", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/dns_resolvers.yml" + }, + { + "name": "docker_container_envs", + "description": "Docker container environment variables.", + "url": "https://fleetdm.com/tables/docker_container_envs", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "This table allows you to list environment variables for running Docker\ncontainers. This query will output the value of a variable called\n*MYSQL_VERSION* for example.\n\n```\nSELECT key, value FROM docker_container_envs WHERE key LIKE 'MYSQL_VERSION';\n```", + "columns": [ + { + "name": "id", + "description": "Container ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "key", + "description": "Environment variable name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Environment variable value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/docker_container_envs.yml" + }, + { + "name": "docker_container_fs_changes", + "description": "Changes to files or directories on container's filesystem.", + "url": "https://fleetdm.com/tables/docker_container_fs_changes", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from docker_container_fs_changes where id = '11b2399e1426d906e62a0c357650e363426d6c56dbe2f35cbaa9b452250e3355'\n```", + "columns": [ + { + "name": "id", + "description": "Container ID", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "path", + "description": "FIle or directory path relative to rootfs", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "change_type", + "description": "Type of change: C:Modified, A:Added, D:Deleted", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_container_fs_changes.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_container_fs_changes.yml&value=name%3A%20docker_container_fs_changes%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_container_labels", + "description": "Docker container labels.", + "url": "https://fleetdm.com/tables/docker_container_labels", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "This table exposes all Docker labels on running containers. By joining it to\nthe [docker_containers](https://fleetdm.com/tables/docker_containers)table, we\ncan list containers and their maintainers.\n\n```\nSELECT dl.value, dc.name, FROM docker_container_labels dl JOIN docker_containers dc ON dl.id = dc.id WHERE key='maintainer';\n```", + "columns": [ + { + "name": "id", + "description": "Container ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "key", + "description": "Label key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "value", + "description": "Optional label value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/docker_container_labels.yml" + }, + { + "name": "docker_container_mounts", + "description": "Docker container mounts.", + "url": "https://fleetdm.com/tables/docker_container_mounts", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List the source and destination of Docker bind and volume mounts.\n\n```\nSELECT dm.source, dm.destination, dm.mode, dc.name FROM docker_container_mounts dm JOIN docker_containers dc ON dm.id = dc.id;\n```", + "columns": [ + { + "name": "id", + "description": "Container ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "type", + "description": "Type of mount (bind, volume)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Optional mount name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "source", + "description": "Source path on host", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "destination", + "description": "Destination path inside container", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "driver", + "description": "Driver providing the mount", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mode", + "description": "Mount options (rw, ro)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "rw", + "description": "1 if read/write. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "propagation", + "description": "Mount propagation", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/docker_container_mounts.yml" + }, + { + "name": "docker_container_networks", + "description": "Docker container networks.", + "url": "https://fleetdm.com/tables/docker_container_networks", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List the IP address of Docker containers.\n\n```\nSELECT dn.ip_address, dc.name FROM docker_container_networks dn JOIN docker_containers dc ON dn.id=dc.id;\n```", + "columns": [ + { + "name": "id", + "description": "Container ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "Network name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "network_id", + "description": "Network ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "endpoint_id", + "description": "Endpoint ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gateway", + "description": "Gateway", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ip_address", + "description": "IP address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ip_prefix_len", + "description": "IP subnet prefix length", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv6_gateway", + "description": "IPv6 gateway", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv6_address", + "description": "IPv6 address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv6_prefix_len", + "description": "IPv6 subnet prefix length", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mac_address", + "description": "MAC address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/docker_container_networks.yml" + }, + { + "name": "docker_container_ports", + "description": "Docker container ports.", + "url": "https://fleetdm.com/tables/docker_container_ports", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify the ports exposed at the host level and see which containers they\nredirect traffic to.\n\n```\nSELECT dc.name, dp.type, dp.port, dp.host_ip, dp.host_port FROM docker_container_ports dp JOIN docker_containers dc ON dp.id=dc.id WHERE dp.host_port !='0';\n```", + "columns": [ + { + "name": "id", + "description": "Container ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Protocol (tcp, udp)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "port", + "description": "Port inside the container", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "host_ip", + "description": "Host IP address on which public port is listening", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "host_port", + "description": "Host port", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/docker_container_ports.yml" + }, + { + "name": "docker_container_processes", + "description": "Docker container processes.", + "url": "https://fleetdm.com/tables/docker_container_processes", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from docker_container_processes where id = '11b2399e1426d906e62a0c357650e363426d6c56dbe2f35cbaa9b452250e3355'\n```", + "columns": [ + { + "name": "id", + "description": "Container ID", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "pid", + "description": "Process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "The process path or shorthand argv[0]", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cmdline", + "description": "Complete argv", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "Process state", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "User ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "euid", + "description": "Effective user ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "egid", + "description": "Effective group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "suid", + "description": "Saved user ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sgid", + "description": "Saved group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "wired_size", + "description": "Bytes of unpageable memory used by process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "resident_size", + "description": "Bytes of private memory used by process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "total_size", + "description": "Total virtual memory size", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "start_time", + "description": "Process start in seconds since boot (non-sleeping)", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Process parent's PID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pgroup", + "description": "Process group", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "threads", + "description": "Number of threads used by process", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "nice", + "description": "Process nice level (-20 to 20, default 0)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user", + "description": "User name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Cumulative CPU time. [DD-]HH:MM:SS format", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu", + "description": "CPU utilization as percentage", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mem", + "description": "Memory utilization as percentage", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_container_processes.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_container_processes.yml&value=name%3A%20docker_container_processes%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_container_stats", + "description": "Docker container statistics. Queries on this table take at least one second.", + "url": "https://fleetdm.com/tables/docker_container_stats", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from docker_container_stats where id = 'de8cfdc74c850967fd3832e128f4d12e2d5476a4aea282734bfb7e57f66fce2f'\n```", + "columns": [ + { + "name": "id", + "description": "Container ID", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "name", + "description": "Container name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "pids", + "description": "Number of processes", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "read", + "description": "UNIX time when stats were read", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "preread", + "description": "UNIX time when stats were last read", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "interval", + "description": "Difference between read and preread in nano-seconds", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "disk_read", + "description": "Total disk read bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "disk_write", + "description": "Total disk write bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "num_procs", + "description": "Number of processors", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_total_usage", + "description": "Total CPU usage", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_kernelmode_usage", + "description": "CPU kernel mode usage", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_usermode_usage", + "description": "CPU user mode usage", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "system_cpu_usage", + "description": "CPU system usage", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "online_cpus", + "description": "Online CPUs", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pre_cpu_total_usage", + "description": "Last read total CPU usage", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pre_cpu_kernelmode_usage", + "description": "Last read CPU kernel mode usage", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pre_cpu_usermode_usage", + "description": "Last read CPU user mode usage", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pre_system_cpu_usage", + "description": "Last read CPU system usage", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pre_online_cpus", + "description": "Last read online CPUs", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_usage", + "description": "Memory usage", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_cached", + "description": "Memory cached", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_max_usage", + "description": "Memory maximum usage", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_limit", + "description": "Memory limit", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "network_rx_bytes", + "description": "Total network bytes read", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "network_tx_bytes", + "description": "Total network bytes transmitted", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_container_stats.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_container_stats.yml&value=name%3A%20docker_container_stats%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_containers", + "description": "Docker containers information.", + "url": "https://fleetdm.com/tables/docker_containers", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify containers that are running with high privileges.\n\n```\nSELECT state, status, image, image_id FROM docker_containers WHERE privileged='1';\n```", + "columns": [ + { + "name": "id", + "description": "Container ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "Container name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "image", + "description": "Docker image (name) used to launch this container", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "image_id", + "description": "Docker image ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "command", + "description": "Command with arguments", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "created", + "description": "Time of creation as UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "Container state (created, restarting, running, removing, paused, exited, dead)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "Container status information", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Identifier of the initial process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Container path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "config_entrypoint", + "description": "Container entrypoint(s)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "started_at", + "description": "Container start time as string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "finished_at", + "description": "Container finish time as string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "privileged", + "description": "Is the container [privileged](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "security_options", + "description": "List of container security options", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "env_variables", + "description": "Container environmental variables", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "readonly_rootfs", + "description": "Is the root filesystem mounted as read only", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cgroup_namespace", + "description": "cgroup namespace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "ipc_namespace", + "description": "IPC namespace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "mnt_namespace", + "description": "Mount namespace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "net_namespace", + "description": "Network namespace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "pid_namespace", + "description": "PID namespace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "user_namespace", + "description": "User namespace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "uts_namespace", + "description": "UTS namespace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/docker_containers.yml" + }, + { + "name": "docker_image_history", + "description": "Docker image history information.", + "url": "https://fleetdm.com/tables/docker_image_history", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from docker_image_history where id = '6a2f32de169d14e6f8a84538eaa28f2629872d7d4f580a303b296c60db36fbd7'\n```", + "columns": [ + { + "name": "id", + "description": "Image ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "created", + "description": "Time of creation as UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of instruction in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "created_by", + "description": "Created by instruction", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tags", + "description": "Comma-separated list of tags", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "comment", + "description": "Instruction comment", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_image_history.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_image_history.yml&value=name%3A%20docker_image_history%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_image_labels", + "description": "Docker image labels.", + "url": "https://fleetdm.com/tables/docker_image_labels", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from docker_image_labels where id = '11b2399e1426d906e62a0c357650e363426d6c56dbe2f35cbaa9b452250e3355'\n```", + "columns": [ + { + "name": "id", + "description": "Image ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "key", + "description": "Label key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Optional label value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_image_labels.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_image_labels.yml&value=name%3A%20docker_image_labels%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_image_layers", + "description": "Docker image layers information.", + "url": "https://fleetdm.com/tables/docker_image_layers", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from docker_images where id = '6a2f32de169d14e6f8a84538eaa28f2629872d7d4f580a303b296c60db36fbd7'\n```", + "columns": [ + { + "name": "id", + "description": "Image ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "layer_id", + "description": "Layer ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "layer_order", + "description": "Layer Order (1 = base layer)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_image_layers.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_image_layers.yml&value=name%3A%20docker_image_layers%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_images", + "description": "Docker images information.", + "url": "https://fleetdm.com/tables/docker_images", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See how much storage is used by Docker images. Requires Docker to be running.\n\n```\nSELECT ROUND(SUM(size_bytes * 10e-10),2) as gigabytes_of_images FROM docker_images; \n```", + "columns": [ + { + "name": "id", + "description": "Image ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "created", + "description": "Time of creation as UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size_bytes", + "description": "Size of image in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tags", + "description": "Comma-separated list of repository tags", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/docker_images.yml" + }, + { + "name": "docker_info", + "description": "Docker system information.", + "url": "https://fleetdm.com/tables/docker_info", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "```\nselect * from docker_info\n```", + "columns": [ + { + "name": "id", + "description": "Docker system ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "containers", + "description": "Total number of containers", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "containers_running", + "description": "Number of containers currently running", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "containers_paused", + "description": "Number of containers in paused state", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "containers_stopped", + "description": "Number of containers in stopped state", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "images", + "description": "Number of images", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "storage_driver", + "description": "Storage driver", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_limit", + "description": "1 if memory limit support is enabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "swap_limit", + "description": "1 if swap limit support is enabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "kernel_memory", + "description": "1 if kernel memory limit support is enabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_cfs_period", + "description": "1 if CPU Completely Fair Scheduler (CFS) period support is enabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_cfs_quota", + "description": "1 if CPU Completely Fair Scheduler (CFS) quota support is enabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_shares", + "description": "1 if CPU share weighting support is enabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_set", + "description": "1 if CPU set selection support is enabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv4_forwarding", + "description": "1 if IPv4 forwarding is enabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bridge_nf_iptables", + "description": "1 if bridge netfilter iptables is enabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bridge_nf_ip6tables", + "description": "1 if bridge netfilter ip6tables is enabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "oom_kill_disable", + "description": "1 if Out-of-memory kill is disabled. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logging_driver", + "description": "Logging driver", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cgroup_driver", + "description": "Control groups driver", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "kernel_version", + "description": "Kernel version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "os", + "description": "Operating system", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "os_type", + "description": "Operating system type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "architecture", + "description": "Hardware architecture", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpus", + "description": "Number of CPUs", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory", + "description": "Total memory", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "http_proxy", + "description": "HTTP proxy", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "https_proxy", + "description": "HTTPS proxy", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "no_proxy", + "description": "Comma-separated list of domain extensions proxy should not be used for", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Name of the docker host", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "server_version", + "description": "Server version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "root_dir", + "description": "Docker root directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_info.yml&value=name%3A%20docker_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_network_labels", + "description": "Docker network labels.", + "url": "https://fleetdm.com/tables/docker_network_labels", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from docker_network_labels where id = '11b2399e1426d906e62a0c357650e363426d6c56dbe2f35cbaa9b452250e3355'\n```", + "columns": [ + { + "name": "id", + "description": "Network ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "key", + "description": "Label key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Optional label value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_network_labels.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_network_labels.yml&value=name%3A%20docker_network_labels%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_networks", + "description": "Docker networks information.", + "url": "https://fleetdm.com/tables/docker_networks", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from docker_networks where id = 'cfd2ffd494395b75d77539761df40cde06a2b6b497e0c9c1adc6c5a79539bfad'\n```", + "columns": [ + { + "name": "id", + "description": "Network ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "Network name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "driver", + "description": "Network driver", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "created", + "description": "Time of creation as UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enable_ipv6", + "description": "1 if IPv6 is enabled on this network. 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subnet", + "description": "Network subnet", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gateway", + "description": "Network gateway", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_networks.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_networks.yml&value=name%3A%20docker_networks%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_version", + "description": "Docker version information.", + "url": "https://fleetdm.com/tables/docker_version", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "```\nselect version from docker_version\n```", + "columns": [ + { + "name": "version", + "description": "Docker version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "api_version", + "description": "API version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "min_api_version", + "description": "Minimum API version supported", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "git_commit", + "description": "Docker build git commit", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "go_version", + "description": "Go version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "os", + "description": "Operating system", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "arch", + "description": "Hardware architecture", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "kernel_version", + "description": "Kernel version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "build_time", + "description": "Build time", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_version.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_version.yml&value=name%3A%20docker_version%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_volume_labels", + "description": "Docker volume labels.", + "url": "https://fleetdm.com/tables/docker_volume_labels", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from docker_volume_labels where name = 'btrfs'\n```", + "columns": [ + { + "name": "name", + "description": "Volume name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "key", + "description": "Label key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "value", + "description": "Optional label value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/docker_volume_labels.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdocker_volume_labels.yml&value=name%3A%20docker_volume_labels%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "docker_volumes", + "description": "Docker volumes information.", + "url": "https://fleetdm.com/tables/docker_volumes", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from docker_volumes where name = 'btrfs'\n```", + "columns": [ + { + "name": "name", + "description": "Volume name from `docker volume ls`", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "driver", + "description": "Volume driver", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mount_point", + "description": "Mount point", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Volume type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/docker_volumes.yml" + }, + { + "name": "drivers", + "description": "Details for in-use Windows device drivers. This does not display installed but unused drivers.", + "url": "https://fleetdm.com/tables/drivers", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from drivers\n```", + "columns": [ + { + "name": "device_id", + "description": "Device ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device_name", + "description": "Device name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "image", + "description": "Path to driver image file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Driver description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "service", + "description": "Driver service name, if one exists", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "service_key", + "description": "Driver service registry key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Driver version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inf", + "description": "Associated inf file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "class", + "description": "Device/driver class name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "provider", + "description": "Driver provider", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufacturer", + "description": "Device manufacturer", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "driver_key", + "description": "Driver key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "date", + "description": "Driver date", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "signed", + "description": "Whether the driver is signed or not", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/drivers.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fdrivers.yml&value=name%3A%20drivers%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "dscl", + "platforms": [ + "darwin" + ], + "description": "Returns the output of the `dscl . -read` command (local domain).", + "columns": [ + { + "name": "command", + "type": "text", + "required": true, + "description": "The dscl command to execute, only \"read\" is currently supported." + }, + { + "name": "path", + "type": "text", + "required": true, + "description": "The path to use in the read command." + }, + { + "name": "key", + "type": "text", + "required": true, + "description": "The key to query on the read command and path." + }, + { + "name": "value", + "type": "text", + "required": false, + "description": "The value of the read path and key. The value is the empty string if the key doesn't exist." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/dscl", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/dscl.yml" + }, + { + "name": "ec2_instance_metadata", + "description": "EC2 instance metadata.", + "url": "https://fleetdm.com/tables/ec2_instance_metadata", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "```\nselect * from ec2_instance_metadata\n```", + "columns": [ + { + "name": "instance_id", + "description": "EC2 instance ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "instance_type", + "description": "EC2 instance type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "architecture", + "description": "Hardware architecture of this EC2 instance", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "region", + "description": "AWS region in which this instance launched", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "availability_zone", + "description": "Availability zone in which this instance launched", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_hostname", + "description": "Private IPv4 DNS hostname of the first interface of this instance", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_ipv4", + "description": "Private IPv4 address of the first interface of this instance", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mac", + "description": "MAC address for the first network interface of this EC2 instance", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "security_groups", + "description": "Comma separated list of security group names", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "iam_arn", + "description": "If there is an IAM role associated with the instance, contains instance profile ARN", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ami_id", + "description": "AMI ID used to launch this EC2 instance", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "reservation_id", + "description": "ID of the reservation", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "account_id", + "description": "AWS account ID which owns this EC2 instance", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ssh_public_key", + "description": "SSH public key. Only available if supplied at instance launch time", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/ec2_instance_metadata.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fec2_instance_metadata.yml&value=name%3A%20ec2_instance_metadata%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "ec2_instance_tags", + "description": "EC2 instance tag key value pairs.", + "url": "https://fleetdm.com/tables/ec2_instance_tags", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "```\nselect * from ec2_instance_tags\n```", + "columns": [ + { + "name": "instance_id", + "description": "EC2 instance ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key", + "description": "Tag key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Tag value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/ec2_instance_tags.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fec2_instance_tags.yml&value=name%3A%20ec2_instance_tags%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "es_process_events", + "description": "Process execution events from EndpointSecurity.", + "url": "https://fleetdm.com/tables/es_process_events", + "platforms": [ + "darwin" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "version", + "description": "Version of EndpointSecurity event", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "seq_num", + "description": "Per event sequence number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "global_seq_num", + "description": "Global sequence number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of executed file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Parent process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "original_parent", + "description": "Original parent process ID in case of reparenting", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cmdline", + "description": "Command line arguments (argv)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cmdline_count", + "description": "Number of command line arguments", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "env", + "description": "Environment variables delimited by spaces", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "env_count", + "description": "Number of environment variables", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cwd", + "description": "The process current working directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "User ID of the process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "euid", + "description": "Effective User ID of the process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Group ID of the process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "egid", + "description": "Effective Group ID of the process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "username", + "description": "Username", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "signing_id", + "description": "Signature identifier of the process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "team_id", + "description": "Team identifier of the process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cdhash", + "description": "Codesigning hash of the process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "platform_binary", + "description": "Indicates if the binary is Apple signed binary (1) or not (0)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exit_code", + "description": "Exit code of a process in case of an exit event", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "child_pid", + "description": "Process ID of a child process in case of a fork event", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "event_type", + "description": "Type of EndpointSecurity event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "codesigning_flags", + "description": "Codesigning flags matching one of these options, in a comma separated list: NOT_VALID, ADHOC, NOT_RUNTIME, INSTALLER. See kern/cs_blobs.h in XNU for descriptions.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/es_process_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fes_process_events.yml&value=name%3A%20es_process_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "es_process_file_events", + "description": "File integrity monitoring events from EndpointSecurity including process context.", + "url": "https://fleetdm.com/tables/es_process_file_events", + "platforms": [ + "darwin" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "version", + "description": "Version of EndpointSecurity event", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "seq_num", + "description": "Per event sequence number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "global_seq_num", + "description": "Global sequence number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Parent process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of executed file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "filename", + "description": "The source or target filename for the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dest_filename", + "description": "Destination filename for the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "event_type", + "description": "Type of EndpointSecurity event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/es_process_file_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fes_process_file_events.yml&value=name%3A%20es_process_file_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "etc_hosts", + "description": "The `hosts` file comprises a local, plain-text configuration for mapping IP addresses to host names. It does not necessarily rely on an external Domain Name System (DNS) for routing. The `etc_hosts` osquery table expresses the data in the `hosts` file.", + "url": "https://fleetdm.com/tables/etc_hosts", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "The `hosts` file is customized by many organizations. As part of a defense-in-depth security posture it's important to track `hosts` modifications. Endpoints with a modified `hosts` configuration connected to enterprise networks can potentially bypass network rules, proxies and firewalls or be routed to malicious sites.\n\nFile paths to `hosts`:\n- Linux: `/etc/hosts`\n- macOS: `/private/etc/hosts`\n- Windows: `C:\\Windows\\system32\\drivers\\etc`\n\n**More info**:\n- [DNS](https://en.wikipedia.org/wiki/Domain_Name_System)\n- The `/etc/hosts` [Guide For Linux](https://thelinuxcode.com/etc-hosts-file-complete-guide-for-linux/)\n- [How to edit the hosts file on Windows](https://www.howtogeek.com/784196/how-to-edit-the-hosts-file-on-windows-10-or-11)", + "examples": "This query detects if the macOS `/private/etc/hosts` file has been modified from its default state:\n\n```\nSELECT * FROM etc_hosts WHERE address != '127.0.0.1' AND address != '::1' AND address != '255.255.255.255';\n```", + "columns": [ + { + "name": "address", + "description": "IP address mapping", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hostnames", + "description": "Raw hosts mapping", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/etc_hosts.yml" + }, + { + "name": "etc_protocols", + "description": "Line-parsed /etc/protocols.", + "url": "https://fleetdm.com/tables/etc_protocols", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "columns": [ + { + "name": "name", + "description": "Protocol name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "number", + "description": "Protocol number", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "alias", + "description": "Protocol alias", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "comment", + "description": "Comment with protocol description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/etc_protocols.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fetc_protocols.yml&value=name%3A%20etc_protocols%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "etc_services", + "description": "Line-parsed /etc/services.", + "url": "https://fleetdm.com/tables/etc_services", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "Identify the TCP and UDP ports associated to standard services.\n\n```\nSELECT * FROM etc_services WHERE name='ftp';\n```", + "columns": [ + { + "name": "name", + "description": "Service name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "port", + "description": "Service port number", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protocol", + "description": "Transport protocol (TCP/UDP)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "aliases", + "description": "Optional space separated list of other names for a service", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "comment", + "description": "Optional comment for a service.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/etc_services.yml" + }, + { + "name": "event_taps", + "description": "Returns information about installed event taps.", + "url": "https://fleetdm.com/tables/event_taps", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify processes that have a tap into the system, such as access to\nkeystrokes, and view details on the executable including signature status,\nteam identifier if signed and the authority that emitted the signing\ncertificate. This can be used to detect keyloggers and other malicious\napplications.\n\n```\nSELECT t.event_tapped, s.identifier, s.signed, s.team_identifier, s.authority FROM event_taps t JOIN processes p ON p.pid = t.tapping_process JOIN signature s on s.path = p.path WHERE s.identifier !='com.apple.ViewBridgeAuxiliary' AND s.identifier !='com.apple.universalaccessd' AND s.identifier !='com.apple.accessibility.AXVisualSupportAgent';\n```", + "columns": [ + { + "name": "enabled", + "description": "Is the Event Tap enabled", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "event_tap_id", + "description": "Unique ID for the Tap", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "event_tapped", + "description": "The mask that identifies the set of events to be observed.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "process_being_tapped", + "description": "The process ID of the target application", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tapping_process", + "description": "The process ID of the application that created the event tap.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/event_taps.yml" + }, + { + "name": "extended_attributes", + "description": "Returns the extended attributes for files (similar to Windows ADS).", + "url": "https://fleetdm.com/tables/extended_attributes", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "path", + "description": "Absolute file path", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "directory", + "description": "Directory of file(s)", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "key", + "description": "Name of the value generated from the extended attribute", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "The parsed information from the attribute", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "base64", + "description": "1 if the value is base64 encoded else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/extended_attributes.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fextended_attributes.yml&value=name%3A%20extended_attributes%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "falcon_kernel_check", + "description": "Get information about Crowdstrike Falcon agent installed on the host.", + "evented": false, + "notes": "This table is not a core osquery table. It is included as part of fleetd, the osquery manager from Fleet. Code based on work by [Kolide](https://github.com/kolide/launcher).", + "platforms": [ + "linux" + ], + "columns": [ + { + "name": "kernel", + "description": "Version of the host's kernel.", + "type": "text", + "required": false + }, + { + "name": "supported", + "description": "Whether or not the host's kernel supports the Crowdstrike Falcon sensor version.", + "type": "text", + "required": false + }, + { + "name": "sensor_version", + "description": "Version of the Crowdstrike Falcon's sensor.", + "type": "text", + "required": false + } + ], + "url": "https://fleetdm.com/tables/falcon_kernel_check", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/falcon_kernel_check.yml" + }, + { + "name": "falconctl_options", + "description": "Get information about Crowdstrike Falcon agent installed on the host.", + "evented": false, + "notes": "This table is not a core osquery table. It is included as part of fleetd, the osquery manager from Fleet. Code based on work by [Kolide](https://github.com/kolide/launcher).", + "platforms": [ + "linux" + ], + "columns": [ + { + "name": "options", + "description": "The falconctl options to run. Supported values are listed here: `--aid`, `--apd`,`--aph`, `--app`, `--cid`, `--feature`, `--metadata-query`, `--rfm-reason`,`--rfm-state`, `--tags`, `--version`", + "type": "text", + "required": true + } + ], + "url": "https://fleetdm.com/tables/falconctl_options", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/falconctl_options.yml" + }, + { + "name": "fan_speed_sensors", + "description": "Fan speeds.", + "url": "https://fleetdm.com/tables/fan_speed_sensors", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "fan", + "description": "Fan number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Fan name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "actual", + "description": "Actual speed", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "min", + "description": "Minimum speed", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "max", + "description": "Maximum speed", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "target", + "description": "Target speed", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/fan_speed_sensors.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Ffan_speed_sensors.yml&value=name%3A%20fan_speed_sensors%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "file", + "description": "Interactive filesystem attributes and metadata.", + "url": "https://fleetdm.com/tables/file", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List zip files in the downloads folder as well as their associated sha256\nhash.\n\n```\nSELECT f.path, h.sha256 FROM file f JOIN hash h ON f.path = h.path WHERE f.path LIKE '/Users/%/Downloads/%%.zip';\n```", + "columns": [ + { + "name": "path", + "description": "Absolute file path", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "directory", + "description": "Directory of file(s)", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "filename", + "description": "Name portion of file path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inode", + "description": "Filesystem inode number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "Owning user ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Owning group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mode", + "description": "Permission bits", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device", + "description": "Device ID (optional)", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of file in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "block_size", + "description": "Block size of filesystem", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "atime", + "description": "Last access time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mtime", + "description": "Last modification time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ctime", + "description": "Last status change time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "btime", + "description": "(B)irth or (cr)eate time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hard_links", + "description": "Number of hard links", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "symlink", + "description": "1 if the path is a symlink, otherwise 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "File status", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "attributes", + "description": "File attrib string. See: https://ss64.com/nt/attrib.html", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "volume_serial", + "description": "Volume serial number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "file_id", + "description": "file ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "file_version", + "description": "File version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "product_version", + "description": "File product version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "original_filename", + "description": "(Executable files only) Original filename", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "shortcut_target_path", + "description": "Full path to the file the shortcut points to", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "windows", + "win32", + "cygwin" + ] + }, + { + "name": "shortcut_target_type", + "description": "Display name for the target type", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "windows", + "win32", + "cygwin" + ] + }, + { + "name": "shortcut_target_location", + "description": "Folder name where the shortcut target resides", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "windows", + "win32", + "cygwin" + ] + }, + { + "name": "shortcut_start_in", + "description": "Full path to the working directory to use when executing the shortcut target", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "windows", + "win32", + "cygwin" + ] + }, + { + "name": "shortcut_run", + "description": "Window mode the target of the shortcut should be run in", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "windows", + "win32", + "cygwin" + ] + }, + { + "name": "shortcut_comment", + "description": "Comment on the shortcut", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "windows", + "win32", + "cygwin" + ] + }, + { + "name": "bsd_flags", + "description": "The BSD file flags (chflags). Possible values: NODUMP, UF_IMMUTABLE, UF_APPEND, OPAQUE, HIDDEN, ARCHIVED, SF_IMMUTABLE, SF_APPEND", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "mount_namespace_id", + "description": "Mount namespace id", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/file.yml" + }, + { + "name": "file_events", + "description": "Track time/action changes to files specified in configuration data.", + "url": "https://fleetdm.com/tables/file_events", + "platforms": [ + "darwin", + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "target_path", + "description": "The path associated with the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "category", + "description": "The category of the file defined in the config", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "action", + "description": "Change action (UPDATE, REMOVE, etc)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "transaction_id", + "description": "ID used during bulk update", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inode", + "description": "Filesystem inode number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "Owning user ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Owning group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mode", + "description": "Permission bits", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of file in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "atime", + "description": "Last access time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mtime", + "description": "Last modification time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ctime", + "description": "Last status change time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "md5", + "description": "The MD5 of the file after change", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha1", + "description": "The SHA1 of the file after change", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha256", + "description": "The SHA256 of the file after change", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hashed", + "description": "1 if the file was hashed, 0 if not, -1 if hashing failed", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of file event", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/file_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Ffile_events.yml&value=name%3A%20file_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "file_lines", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "Allows reading an arbitrary file.", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "evented": false, + "examples": "Output the content of `/etc/hosts` line by line. \n\n```\nSELECT * FROM file_lines WHERE path='/etc/hosts';\n```", + "columns": [ + { + "name": "path", + "description": "Path of the file to read.", + "required": true, + "type": "text" + }, + { + "name": "line", + "description": "Output of the file, line by line.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/file_lines", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/file_lines.yml" + }, + { + "name": "filevault_prk", + "platforms": [ + "darwin" + ], + "description": "Returns contents of `/var/db/FileVaultPRK.dat`.", + "columns": [ + { + "name": "base64_encrypted", + "type": "text", + "required": false, + "description": "The base64-encoded contents of the encrypted FileVault personal recovery key stored at `/var/db/FileVaultPRK.dat` (see also https://developer.apple.com/documentation/devicemanagement/fderecoverykeyescrow)" + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/filevault_prk", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/filevault_prk.yml" + }, + { + "name": "filevault_status", + "description": "Get current FileVault status.", + "evented": false, + "notes": "This table is not a core osquery table. It is included as part of fleetd, the osquery manager from Fleet. Code based on work by [Kolide](https://github.com/kolide/launcher).", + "platforms": [ + "darwin" + ], + "columns": [ + { + "name": "status", + "description": "FileVault status.", + "type": "text", + "required": false + } + ], + "url": "https://fleetdm.com/tables/filevault_status", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/filevault_status.yml" + }, + { + "name": "filevault_users", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "Information on the users able to unlock the current boot volume if protected with FileVault.", + "platforms": [ + "darwin" + ], + "evented": false, + "examples": "List the usernames able to unlock and boot a computer protected by FileVault, joined to\n[users.username](http://fleetdm.com/tables/users) to obtain the description of the operating\nsystem account that owns it.\n\n```\nSELECT fu.username, u.description FROM filevault_users fu JOIN users u ON fu.uuid=u.uuid;\n```", + "columns": [ + { + "name": "username", + "description": "Username of the FileVault user.", + "required": false, + "type": "text" + }, + { + "name": "uuid", + "description": "UUID of the FileVault user, which can be joined to [users.uuid](http://fleetdm.com/tables/users).", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/filevault_users", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/filevault_users.yml" + }, + { + "name": "find_cmd", + "platforms": [ + "darwin" + ], + "description": "Uses the /usr/bin/find command to list files and directories.", + "columns": [ + { + "name": "directory", + "type": "text", + "required": true, + "description": "The directory passed to find as first argument." + }, + { + "name": "type", + "type": "text", + "required": false, + "description": "Sets the value of the `-type` flag." + }, + { + "name": "perm", + "type": "text", + "required": false, + "description": "Sets the value of the `-perm` flag." + }, + { + "name": "path", + "type": "text", + "required": false, + "description": "Contains the found paths." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/find_cmd", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/find_cmd.yml" + }, + { + "name": "firefox_addons", + "description": "Firefox browser [add-ons](https://addons.mozilla.org/en-US/firefox/) (plugins).", + "url": "https://fleetdm.com/tables/firefox_addons", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)", + "examples": "```\nSELECT * FROM users CROSS JOIN firefox_addons USING (uid);\n```\n\nSee Firefox extensions by user as well as information about their creator and\nautomatic update status.\n\n```\nSELECT u.username, f.identifier, f.creator, f.description, f.version, f.autoupdate FROM users u CROSS JOIN firefox_addons f USING (uid) WHERE f.active='1';\n```", + "columns": [ + { + "name": "uid", + "description": "The local user that owns the addon", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Addon display name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "identifier", + "description": "Addon identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "creator", + "description": "Addon-supported creator string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Extension, addon, webapp", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Addon-supplied version string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Addon-supplied description string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source_url", + "description": "URL that installed the addon", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "visible", + "description": "1 If the addon is shown in browser else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "active", + "description": "1 If the addon is active else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "disabled", + "description": "1 If the addon is application-disabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "autoupdate", + "description": "1 If the addon applies background updates else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "location", + "description": "Global, profile location", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to plugin bundle", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/firefox_addons.yml" + }, + { + "name": "firefox_preferences", + "description": "Get the filepath where the host's Firefox preferences live.", + "evented": false, + "notes": "This table is not a core osquery table. It is included as part of fleetd, the osquery manager from Fleet. Code based on work by [Kolide](https://github.com/kolide/launcher).", + "platforms": [ + "darwin" + ], + "columns": [ + { + "name": "path", + "description": "The path to the host's Firefox preferences.", + "type": "text", + "required": true + }, + { + "name": "key", + "description": "A specific item that describes the path.", + "type": "text", + "required": false + }, + { + "name": "value", + "description": "The value for the specified key.", + "type": "text", + "required": false + }, + { + "name": "fullkey", + "description": "The expanded name of the specific item that describes the path.", + "type": "text", + "required": false + }, + { + "name": "parent", + "description": "The key's parent.", + "type": "text", + "required": false + }, + { + "name": "query", + "description": "The query is printed in this column. For example the SQL `SELECT * FROM firefox_preferences WHERE path = 'testdata/prefs.js'` will print \"*\" in the query column.", + "type": "text", + "required": false + } + ], + "url": "https://fleetdm.com/tables/firefox_preferences", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/firefox_preferences.yml" + }, + { + "name": "firmware_eficheck_integrity_check", + "platforms": [ + "darwin" + ], + "description": "Performs eficheck's integrity check on macOS Intel T1 chips (CIS 5.9).", + "columns": [ + { + "name": "chip", + "type": "text", + "required": false, + "description": "Contains the chip type, values are \"apple\", \"intel-t1\" and \"intel-t2\".\nIf chip type is \"apple\" or \"intel-t2\" then no eficheck integrity check is executed." + }, + { + "name": "output", + "type": "text", + "required": false, + "description": "Output of the `/usr/libexec/firmwarecheckers/eficheck/eficheck --integrity-check` command.\nThis value is only valid when chip is \"intel-t1\"." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/firmware_eficheck_integrity_check", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/firmware_eficheck_integrity_check.yml" + }, + { + "name": "firmwarepasswd", + "description": "Information on the device's firmware password. Supported on Intel macOS hosts only. Reference: https://support.apple.com/en-us/HT204455", + "evented": false, + "notes": "This table is not a core osquery table. It is included as part of fleetd, the osquery manager from Fleet. Code based on work by [Kolide](https://github.com/kolide/launcher).", + "platforms": [ + "darwin" + ], + "columns": [ + { + "name": "option_roms_allowed", + "description": "Whether or not option ROMs are allowed.", + "required": false, + "type": "text" + }, + { + "name": "password_enabled", + "description": "Whether or not the host has a firmware password.", + "required": false, + "type": "text" + }, + { + "name": "mode", + "description": "Host's mode setting.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/firmwarepasswd", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/firmwarepasswd.yml" + }, + { + "name": "fleetd_logs", + "evented": false, + "platforms": [ + "darwin", + "windows", + "linux" + ], + "description": "Returns the logs from fleetd's current session. Logs are stored in memory, so they are erased when it restarts.", + "examples": "```\nSELECT * FROM fleetd_logs\n```\n\nReturn only log entries with errors attached\n\n```\nSELECT * FROM fleetd_logs WHERE error != \"\"\n```", + "columns": [ + { + "name": "time", + "description": "The time the event was captured, UTC.", + "type": "text", + "required": false + }, + { + "name": "level", + "description": "The log-level of the event. Info, Debug, etc.", + "type": "text", + "required": false + }, + { + "name": "error", + "description": "The error attached to the event", + "type": "text", + "required": false + }, + { + "name": "message", + "description": "The message attached to the event", + "type": "text", + "required": false + }, + { + "name": "payload", + "description": "Any extra data attached to the event, JSON", + "type": "text", + "required": false + } + ], + "url": "https://fleetdm.com/tables/fleetd_logs", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/fleetd_logs.yml" + }, + { + "name": "gatekeeper", + "description": "macOS Gatekeeper Details.", + "url": "https://fleetdm.com/tables/gatekeeper", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Policy query to check that Gatekeeper is enabled\n\n```\nSELECT 1 FROM gatekeeper WHERE assessments_enabled = 1;\n```", + "columns": [ + { + "name": "assessments_enabled", + "description": "1 If a Gatekeeper is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dev_id_enabled", + "description": "1 If a Gatekeeper allows execution from identified developers else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Version of Gatekeeper's gke.bundle", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "opaque_version", + "description": "Version of Gatekeeper's gkopaque.bundle", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/gatekeeper.yml" + }, + { + "name": "gatekeeper_approved_apps", + "description": "Gatekeeper apps a user has allowed to run.", + "url": "https://fleetdm.com/tables/gatekeeper_approved_apps", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "path", + "description": "Path of executable allowed to run", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "requirement", + "description": "Code signing requirement language", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ctime", + "description": "Last change time", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mtime", + "description": "Last modification time", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/gatekeeper_approved_apps.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fgatekeeper_approved_apps.yml&value=name%3A%20gatekeeper_approved_apps%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "geolocation", + "evented": false, + "platforms": [ + "chrome" + ], + "description": "Last reported geolocation", + "columns": [ + { + "name": "ip", + "type": "text", + "required": false, + "description": "IP address" + }, + { + "name": "city", + "type": "text", + "required": false, + "description": "City" + }, + { + "name": "country", + "type": "text", + "required": false, + "description": "Country" + }, + { + "name": "region", + "type": "text", + "required": false, + "description": "Region" + } + ], + "notes": "- This table is not a core osquery table. This table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).", + "url": "https://fleetdm.com/tables/geolocation", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/geolocation.yml" + }, + { + "name": "google_chrome_profiles", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "Profiles configured in Google Chrome.", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "evented": false, + "examples": "List the Google Chrome accounts logged in to with `fleetdm.com` email addresses, joined to the\n[users](https://fleetdm.com/tables/users) table, to see the description of the operating system\naccount that owns it.\n\n```\nSELECT gp.email, gp.username, u.description FROM google_chrome_profiles gp JOIN users u ON gp.username=u.username WHERE gp.email LIKE '%fleetdm.com';\n```", + "columns": [ + { + "name": "email", + "description": "Email address linked to the Google account this profile uses, if any.", + "required": false, + "type": "text" + }, + { + "name": "ephemeral", + "description": "Boolean indicating if the profile is ephemeral or not.", + "required": false, + "type": "boolean" + }, + { + "name": "name", + "description": "Name of the Chrome profile.", + "required": false, + "type": "text" + }, + { + "name": "username", + "description": "Operating system level username of the account where this profile is located.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/google_chrome_profiles", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/google_chrome_profiles.yml" + }, + { + "name": "groups", + "description": "Local system groups.", + "url": "https://fleetdm.com/tables/groups", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "* On Windows, `gid` and `gid_signed` are always the same", + "examples": "See all groups with the IsHidden OpenDirectory attribute\n\n```\nSELECT * FROM groups WHERE is_hidden='1';\n```", + "columns": [ + { + "name": "gid", + "description": "Unsigned int64 group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "gid_signed", + "description": "A signed int64 version of gid", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "groupname", + "description": "Canonical local group name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "group_sid", + "description": "Unique group ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true, + "platforms": [ + "Windows" + ] + }, + { + "name": "comment", + "description": "Remarks or comments associated with the group", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "is_hidden", + "description": "IsHidden attribute set in OpenDirectory", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/groups.yml" + }, + { + "name": "hardware_events", + "description": "Hardware (PCI/USB/HID) events from UDEV or IOKit.", + "url": "https://fleetdm.com/tables/hardware_events", + "platforms": [ + "darwin", + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "action", + "description": "Remove, insert, change properties, etc", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Local device path assigned (optional)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Type of hardware and hardware event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "driver", + "description": "Driver claiming the device", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor", + "description": "Hardware device vendor", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor_id", + "description": "Hex encoded Hardware vendor identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model", + "description": "Hardware device model", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model_id", + "description": "Hex encoded Hardware model identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial", + "description": "Device serial (optional)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "revision", + "description": "Device revision (optional)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of hardware event", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/hardware_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fhardware_events.yml&value=name%3A%20hardware_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "hash", + "description": "Filesystem hash data.", + "url": "https://fleetdm.com/tables/hash", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List zip files in the downloads folder as well as their associated sha256\nhash.\n\n```\nSELECT f.path, h.sha256 FROM file f JOIN hash h ON f.path = h.path WHERE f.path LIKE '/Users/%/Downloads/%%.zip';\n```", + "columns": [ + { + "name": "path", + "description": "Must provide a path or directory", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "directory", + "description": "Must provide a path or directory", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "md5", + "description": "MD5 hash of provided filesystem data", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha1", + "description": "SHA1 hash of provided filesystem data", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha256", + "description": "SHA256 hash of provided filesystem data", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "mount_namespace_id", + "description": "Mount namespace id", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/hash.yml" + }, + { + "name": "homebrew_packages", + "description": "The installed homebrew package database.", + "url": "https://fleetdm.com/tables/homebrew_packages", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "Check the version of a package installed via homebrew. This example checks the\nversion of ffmeg, which should be replaced by the actual package you want to\ncheck for. This is useful for finding problematic or vulnerable installs,\nthough Fleet will detect vulnerable packages automatically.\n\n```\nSELECT version FROM homebrew_packages WHERE name = 'ffmpeg';\n```", + "columns": [ + { + "name": "name", + "description": "Package name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Package install path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Current 'linked' version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Package type ('formula' or 'cask')", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "prefix", + "description": "Homebrew install prefix", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/homebrew_packages.yml" + }, + { + "name": "hvci_status", + "description": "Retrieve HVCI info of the machine.", + "url": "https://fleetdm.com/tables/hvci_status", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "version", + "description": "The version number of the Device Guard build.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "instance_identifier", + "description": "The instance ID of Device Guard.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vbs_status", + "description": "The status of the virtualization based security settings. Returns UNKNOWN if an error is encountered.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "code_integrity_policy_enforcement_status", + "description": "The status of the code integrity policy enforcement settings. Returns UNKNOWN if an error is encountered.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "umci_policy_status", + "description": "The status of the User Mode Code Integrity security settings. Returns UNKNOWN if an error is encountered.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/hvci_status.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fhvci_status.yml&value=name%3A%20hvci_status%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "ibridge_info", + "description": "Information about the Apple iBridge hardware controller.", + "url": "https://fleetdm.com/tables/ibridge_info", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "columns": [ + { + "name": "boot_uuid", + "description": "Boot UUID of the iBridge controller", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "coprocessor_version", + "description": "The manufacturer and chip version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "firmware_version", + "description": "The build version of the firmware", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "unique_chip_id", + "description": "Unique id of the iBridge controller", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/ibridge_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fibridge_info.yml&value=name%3A%20ibridge_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "icloud_private_relay", + "platforms": [ + "darwin" + ], + "description": "Whether [iCloud Private Relay](https://support.apple.com/en-us/HT212614) is enabled.", + "columns": [ + { + "name": "status", + "type": "integer", + "required": false, + "description": "whether iCloud Private Relay is on or off. 1 is on. 0 is off." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/icloud_private_relay", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/icloud_private_relay.yml" + }, + { + "name": "ie_extensions", + "description": "Installed Internet Explorer (IE) browser extensions (plugins).", + "url": "https://fleetdm.com/tables/ie_extensions", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "name", + "description": "Extension display name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "registry_path", + "description": "Extension identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Version of the executable", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to executable", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/ie_extensions.yml" + }, + { + "name": "intel_me_info", + "description": "Intel ME/CSE Info.", + "url": "https://fleetdm.com/tables/intel_me_info", + "platforms": [ + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "version", + "description": "Intel ME version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linwin/intel_me_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fintel_me_info.yml&value=name%3A%20intel_me_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "interface_addresses", + "description": "Network interfaces and relevant metadata.", + "url": "https://fleetdm.com/tables/interface_addresses", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "Find all interfaces that have a public Internet IP. This query filters out all\nRFC1918 IPv4 addresses as well as IPv6 localhost.\n\n```\nSELECT * FROM interface_addresses WHERE address NOT LIKE '192.168%%' AND address NOT LIKE '172.16%%' AND address NOT LIKE '172.17%%' AND address NOT LIKE '172.18%%' AND address NOT LIKE '172.19%%' AND address NOT LIKE '172.20%%' AND address NOT LIKE '172.21%%' AND address NOT LIKE '172.22%%' AND address NOT LIKE '172.23%%' AND address NOT LIKE '10.%%' AND address NOT LIKE '127.%%' AND address IS NOT NULL AND address IS NOT ' ' AND address IS NOT '' AND address IS NOT '::1' AND mask IS NOT 'ffff:ffff:ffff:ffff::';\n```", + "columns": [ + { + "name": "interface", + "description": "Interface name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "address", + "description": "Specific address for interface", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mask", + "description": "Interface netmask", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "broadcast", + "description": "Broadcast address for the interface", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "point_to_point", + "description": "PtP address for the interface", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Type of address. One of dhcp, manual, auto, other, unknown", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "friendly_name", + "description": "The friendly display name of the interface.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/interface_addresses.yml" + }, + { + "name": "interface_details", + "description": "Detailed information and stats of network interfaces.", + "url": "https://fleetdm.com/tables/interface_details", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "```\nselect interface, mac, type, flags, (1<<3) as loopback_flag from interface_details where (flags & loopback_flag) > 0;\n```", + "columns": [ + { + "name": "interface", + "description": "Interface name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mac", + "description": "MAC of interface (optional)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Interface type (includes virtual)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mtu", + "description": "Network MTU", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "metric", + "description": "Metric based on the speed of the interface", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "flags", + "description": "Flags (netdevice) for the device", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipackets", + "description": "Input packets", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "opackets", + "description": "Output packets", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ibytes", + "description": "Input bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "obytes", + "description": "Output bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ierrors", + "description": "Input errors", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "oerrors", + "description": "Output errors", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "idrops", + "description": "Input drops", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "odrops", + "description": "Output drops", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "collisions", + "description": "Packet Collisions detected", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_change", + "description": "Time of last device modification (optional)", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "link_speed", + "description": "Interface speed in Mb/s", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux", + "macOS" + ] + }, + { + "name": "pci_slot", + "description": "PCI slot number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "friendly_name", + "description": "The friendly display name of the interface.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "description", + "description": "Short description of the object a one-line string.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "manufacturer", + "description": "Name of the network adapter's manufacturer.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "connection_id", + "description": "Name of the network connection as it appears in the Network Connections Control Panel program.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "connection_status", + "description": "State of the network adapter connection to the network.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "enabled", + "description": "Indicates whether the adapter is enabled or not.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "physical_adapter", + "description": "Indicates whether the adapter is a physical or a logical adapter.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "speed", + "description": "Estimate of the current bandwidth in bits per second.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "service", + "description": "The name of the service the network adapter uses.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "dhcp_enabled", + "description": "If TRUE, the dynamic host configuration protocol (DHCP) server automatically assigns an IP address to the computer system when establishing a network connection.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "dhcp_lease_expires", + "description": "Expiration date and time for a leased IP address that was assigned to the computer by the dynamic host configuration protocol (DHCP) server.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "dhcp_lease_obtained", + "description": "Date and time the lease was obtained for the IP address assigned to the computer by the dynamic host configuration protocol (DHCP) server.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "dhcp_server", + "description": "IP address of the dynamic host configuration protocol (DHCP) server.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "dns_domain", + "description": "Organization name followed by a period and an extension that indicates the type of organization, such as 'microsoft.com'.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "dns_domain_suffix_search_order", + "description": "Array of DNS domain suffixes to be appended to the end of host names during name resolution.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "dns_host_name", + "description": "Host name used to identify the local computer for authentication by some utilities.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "dns_server_search_order", + "description": "Array of server IP addresses to be used in querying for DNS servers.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/interface_details.yml" + }, + { + "name": "interface_ipv6", + "description": "IPv6 configuration and stats of network interfaces.", + "url": "https://fleetdm.com/tables/interface_ipv6", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify interfaces using IPv6 with forwarding enabled.\n\n``` \nSELECT interface FROM interface_ipv6 WHERE forwarding_enabled='1';\n```", + "columns": [ + { + "name": "interface", + "description": "Interface name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hop_limit", + "description": "Current Hop Limit", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "forwarding_enabled", + "description": "Enable IP forwarding", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "redirect_accept", + "description": "Accept ICMP redirect messages", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "rtadv_accept", + "description": "Accept ICMP Router Advertisement", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/interface_ipv6.yml" + }, + { + "name": "iokit_devicetree", + "description": "The IOKit registry matching the DeviceTree plane.", + "url": "https://fleetdm.com/tables/iokit_devicetree", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "List the components in a Mac's device tree\n\n```\nSELECT * from iokit_devicetree; \n```", + "columns": [ + { + "name": "name", + "description": "Device node name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "class", + "description": "Best matching device class (most-specific category)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "id", + "description": "IOKit internal registry ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Parent device registry ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device_path", + "description": "Device tree path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "service", + "description": "1 if the device conforms to IOService else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "busy_state", + "description": "1 if the device is in a busy state else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "retain_count", + "description": "The device reference count", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "depth", + "description": "Device nested depth", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/iokit_devicetree.yml" + }, + { + "name": "iokit_registry", + "description": "The full IOKit registry without selecting a plane.", + "url": "https://fleetdm.com/tables/iokit_registry", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "Identify devices with a Yubikey connected. The name will also contain the\nprotocols supported by the key, such as FIDO.\n\n```\nSELECT * from iokit_registry WHERE name LIKE 'Yubi%';\n```", + "columns": [ + { + "name": "name", + "description": "Default name of the node", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "class", + "description": "Best matching device class (most-specific category)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "id", + "description": "IOKit internal registry ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Parent registry ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "busy_state", + "description": "1 if the node is in a busy state else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "retain_count", + "description": "The node reference count", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "depth", + "description": "Node nested depth", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/iokit_registry.yml" + }, + { + "name": "ioreg", + "description": "Get values from macOS ioreg command. Columns are input options for the command. They match the ioreg command line tool.", + "evented": false, + "notes": "This table is not a core osquery table. It is included as part of fleetd, the osquery manager from Fleet. Code based on work by [Kolide](https://github.com/kolide/launcher).", + "platforms": [ + "darwin" + ], + "columns": [ + { + "name": "c", + "description": "List properties of objects with the given class.", + "required": false, + "type": "text" + }, + { + "name": "d", + "description": "Limit tree to the given depth.", + "required": false, + "type": "text" + }, + { + "name": "k", + "description": "List properties of objects with the given key.", + "required": false, + "type": "text" + }, + { + "name": "n", + "description": "List properties of objects with the given name.", + "required": false, + "type": "text" + }, + { + "name": "p", + "description": "Traverse registry over the given plane (IOService is default).", + "required": false, + "type": "text" + }, + { + "name": "r", + "description": "Show subtrees rooted by the given criteria.", + "required": false, + "type": "text" + }, + { + "name": "key", + "description": "A specific item that describes the returned value.", + "type": "text", + "required": false + }, + { + "name": "value", + "description": "The value for the specified key.", + "type": "text", + "required": false + }, + { + "name": "fullkey", + "description": "The expanded name of the specific item that describes the value.", + "type": "text", + "required": false + }, + { + "name": "parent", + "description": "The key's parent.", + "type": "text", + "required": false + }, + { + "name": "query", + "description": "The query is printed in this column.", + "type": "text", + "required": false + } + ], + "url": "https://fleetdm.com/tables/ioreg", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/ioreg.yml" + }, + { + "name": "iptables", + "description": "Linux IP packet filtering and NAT tool.", + "url": "https://fleetdm.com/tables/iptables", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "filter_name", + "description": "Packet matching filter table name.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "chain", + "description": "Size of module content.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "policy", + "description": "Policy that applies for this rule.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "target", + "description": "Target that applies for this rule.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protocol", + "description": "Protocol number identification.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "src_port", + "description": "Protocol source port(s).", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dst_port", + "description": "Protocol destination port(s).", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "src_ip", + "description": "Source IP address.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "src_mask", + "description": "Source IP address mask.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "iniface", + "description": "Input interface for the rule.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "iniface_mask", + "description": "Input interface mask for the rule.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dst_ip", + "description": "Destination IP address.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dst_mask", + "description": "Destination IP address mask.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "outiface", + "description": "Output interface for the rule.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "outiface_mask", + "description": "Output interface mask for the rule.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "match", + "description": "Matching rule that applies.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "packets", + "description": "Number of matching packets for this rule.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bytes", + "description": "Number of matching bytes for this rule.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/iptables.yml" + }, + { + "name": "kernel_extensions", + "description": "macOS's kernel extensions, both loaded and within the load search path.", + "url": "https://fleetdm.com/tables/kernel_extensions", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify third-party kernel extensions.\n\n```\nSELECT * FROM kernel_extensions WHERE name NOT LIKE 'com.apple%' AND name NOT LIKE '__kernel__';\n```", + "columns": [ + { + "name": "idx", + "description": "Extension load tag or index", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "refs", + "description": "Reference count", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Bytes of wired memory used by extension", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Extension label", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Extension version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "linked_against", + "description": "Indexes of extensions this extension is linked against", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Optional path to extension bundle", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/kernel_extensions.yml" + }, + { + "name": "kernel_info", + "description": "Basic active kernel information.", + "url": "https://fleetdm.com/tables/kernel_info", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "See the kernel version running\n\n```\nSELECT version FROM kernel_info;\n```", + "columns": [ + { + "name": "version", + "description": "Kernel version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "arguments", + "description": "Kernel arguments", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Kernel path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device", + "description": "Kernel device identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/kernel_info.yml" + }, + { + "name": "kernel_keys", + "description": "List of security data, authentication keys and encryption keys.", + "url": "https://fleetdm.com/tables/kernel_keys", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from kernel_keys\n```", + "columns": [ + { + "name": "serial_number", + "description": "The serial key of the key.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "flags", + "description": "A set of flags describing the state of the key.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "usage", + "description": "the number of threads and open file references that refer to this key.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "timeout", + "description": "The amount of time until the key will expire, expressed in human-readable form. The string perm here means that the key is permanent (no timeout). The string expd means that the key has already expired.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "permissions", + "description": "The key permissions, expressed as four hexadecimal bytes containing, from left to right, the possessor, user, group, and other permissions.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "The user ID of the key owner.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "The group ID of the key.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "The key type.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "The key description.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/kernel_keys.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fkernel_keys.yml&value=name%3A%20kernel_keys%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "kernel_modules", + "description": "Linux kernel modules both loaded and within the load search path.", + "url": "https://fleetdm.com/tables/kernel_modules", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "name", + "description": "Module name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of module content", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "used_by", + "description": "Module reverse dependencies", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "Kernel module status", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "address", + "description": "Kernel module address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/kernel_modules.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fkernel_modules.yml&value=name%3A%20kernel_modules%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "kernel_panics", + "description": "System kernel panic logs.", + "url": "https://fleetdm.com/tables/kernel_panics", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Look for kernel panics and see which module was last loaded before they\nhappened.\n\n```\nSELECT os_version, name, time, system_model, last_loaded FROM kernel_panics;\n```", + "columns": [ + { + "name": "path", + "description": "Location of log file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Formatted time of the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "registers", + "description": "A space delimited line of register:value pairs", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "frame_backtrace", + "description": "Backtrace of the crashed module", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "module_backtrace", + "description": "Modules appearing in the crashed module's backtrace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dependencies", + "description": "Module dependencies existing in crashed module's backtrace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Process name corresponding to crashed thread", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "os_version", + "description": "Version of the operating system", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "kernel_version", + "description": "Version of the system kernel", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "system_model", + "description": "Physical system model, for example 'MacBookPro12,1 (Mac-E43C1C25D4880AD6)'", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uptime", + "description": "System uptime at kernel panic in nanoseconds", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_loaded", + "description": "Last loaded module before panic", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_unloaded", + "description": "Last unloaded module before panic", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/kernel_panics.yml" + }, + { + "name": "keychain_acls", + "description": "Applications that have ACL entries in the keychain. NOTE: osquery limits frequent access to keychain files. This limit is controlled by keychain_access_interval flag.", + "url": "https://fleetdm.com/tables/keychain_acls", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "Identify keychain items with permissions granted to Applications at the system\nor user level.\n\n```\nSELECT * FROM keychain_acls WHERE path LIKE '/System/Applications/%%' OR path LIKE '/Users/%%/Applications/%%';\n```", + "columns": [ + { + "name": "keychain_path", + "description": "The path of the keychain", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "authorizations", + "description": "A space delimited set of authorization attributes", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "The path of the authorized application", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "The description included with the ACL entry", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "label", + "description": "An optional label tag that may be included with the keychain entry", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/keychain_acls.yml" + }, + { + "name": "keychain_items", + "description": "Generic details about keychain items. NOTE: osquery limits frequent access to keychain files. This limit is controlled by keychain_access_interval flag.", + "url": "https://fleetdm.com/tables/keychain_items", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "- This table should be used sparingly as it uses an Apple API which occasionally corrupts the underlying certificate. Learn more [here](https://github.com/fleetdm/fleet/issues/13065#issuecomment-1658849614).", + "examples": "Identify Macs that contain certificates related to Apple application signing\nand notarization. (replace with your Apple Developer ID string)\n\n```\nSELECT * FROM keychain_items WHERE label LIKE '%8EHZ83LZNU%';\n```", + "columns": [ + { + "name": "label", + "description": "Generic item name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Optional item description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "comment", + "description": "Optional keychain comment", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "account", + "description": "Optional item account", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "created", + "description": "Date item was created", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "modified", + "description": "Date of last modification", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Keychain item type (class)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pk_hash", + "description": "Hash of associated public key (SHA1 of subjectPublicKey, see RFC 8520 4.2.1.2)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to keychain containing item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/keychain_items.yml" + }, + { + "name": "known_hosts", + "description": "A line-delimited known_hosts table.", + "url": "https://fleetdm.com/tables/known_hosts", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "- Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)", + "examples": "```\nSELECT * FROM users CROSS JOIN known_hosts USING (uid);\n```", + "columns": [ + { + "name": "uid", + "description": "The local user that owns the known_hosts file", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "key", + "description": "parsed authorized keys line", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key_file", + "description": "Path to known_hosts file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/known_hosts.yml" + }, + { + "name": "kva_speculative_info", + "description": "Display kernel virtual address and speculative execution information for the system.", + "url": "https://fleetdm.com/tables/kva_speculative_info", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from kva_speculative_info\n```", + "columns": [ + { + "name": "kva_shadow_enabled", + "description": "Kernel Virtual Address shadowing is enabled.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "kva_shadow_user_global", + "description": "User pages are marked as global.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "kva_shadow_pcid", + "description": "Kernel VA PCID flushing optimization is enabled.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "kva_shadow_inv_pcid", + "description": "Kernel VA INVPCID is enabled.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bp_mitigations", + "description": "Branch Prediction mitigations are enabled.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bp_system_pol_disabled", + "description": "Branch Predictions are disabled via system policy.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bp_microcode_disabled", + "description": "Branch Predictions are disabled due to lack of microcode update.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_spec_ctrl_supported", + "description": "SPEC_CTRL MSR supported by CPU Microcode.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ibrs_support_enabled", + "description": "Windows uses IBRS.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "stibp_support_enabled", + "description": "Windows uses STIBP.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_pred_cmd_supported", + "description": "PRED_CMD MSR supported by CPU Microcode.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/kva_speculative_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fkva_speculative_info.yml&value=name%3A%20kva_speculative_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "last", + "description": "System logins and logouts.", + "url": "https://fleetdm.com/tables/last", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "System logins and logouts with formatted time.\n\n```\nSELECT strftime('%Y-%m-%d %H:%M:%S',time,'unixepoch') AS formatted_time, username, pid, type FROM last WHERE tty='console'; \n```", + "columns": [ + { + "name": "username", + "description": "Entry username", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tty", + "description": "Entry terminal", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Entry type, according to ut_type types (utmp.h)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type_name", + "description": "Entry type name, according to ut_type types (utmp.h)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Entry timestamp", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "host", + "description": "Entry hostname", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/last.yml" + }, + { + "name": "launchd", + "description": "LaunchAgents and LaunchDaemons from default search paths.", + "url": "https://fleetdm.com/tables/launchd", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "List launch daemons that run an application in the Applications directory.\n\n```\nSELECT * FROM launchd WHERE program LIKE '/Applications/%%' OR program LIKE '/Users/%%/Applications/%%';\n```", + "columns": [ + { + "name": "path", + "description": "Path to daemon or agent plist", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "File name of plist (used by launchd)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "label", + "description": "Daemon or agent service name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "program", + "description": "Path to target program", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "run_at_load", + "description": "Should the program run on launch load", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "keep_alive", + "description": "Should the process be restarted if killed", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "on_demand", + "description": "Deprecated key, replaced by keep_alive", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "disabled", + "description": "Skip loading this daemon or agent on boot", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "username", + "description": "Run this daemon or agent as this username", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "groupname", + "description": "Run this daemon or agent as this group", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "stdout_path", + "description": "Pipe stdout to a target path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "stderr_path", + "description": "Pipe stderr to a target path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "start_interval", + "description": "Frequency to run in seconds", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "program_arguments", + "description": "Command line arguments passed to program", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "watch_paths", + "description": "Key that launches daemon or agent if path is modified", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "queue_directories", + "description": "Similar to watch_paths but only with non-empty directories", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inetd_compatibility", + "description": "Run this daemon or agent as it was launched from inetd", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "start_on_mount", + "description": "Run daemon or agent every time a filesystem is mounted", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "root_directory", + "description": "Key used to specify a directory to chroot to before launch", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "working_directory", + "description": "Key used to specify a directory to chdir to before launch", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "process_type", + "description": "Key describes the intended purpose of the job", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/launchd.yml" + }, + { + "name": "launchd_overrides", + "description": "Override keys, per user, for LaunchDaemons and Agents.", + "url": "https://fleetdm.com/tables/launchd_overrides", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "columns": [ + { + "name": "label", + "description": "Daemon or agent service name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key", + "description": "Name of the override key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Overridden value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "User ID applied to the override, 0 applies to all", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to daemon or agent plist", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/launchd_overrides.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flaunchd_overrides.yml&value=name%3A%20launchd_overrides%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "listening_ports", + "description": "Processes with listening (bound) network sockets/ports.", + "url": "https://fleetdm.com/tables/listening_ports", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "List executables listening on network ports.\n\n```\nSELECT l.port, l.pid, p.name, p.path FROM listening_ports l JOIN processes p USING (pid); \n```", + "columns": [ + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "port", + "description": "Transport layer port", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protocol", + "description": "Transport protocol (TCP/UDP)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "family", + "description": "Network protocol (IPv4, IPv6)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "address", + "description": "Specific address for bind", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fd", + "description": "Socket file descriptor number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "socket", + "description": "Socket handle or inode number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path for UNIX domain sockets", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "net_namespace", + "description": "The inode number of the network namespace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/listening_ports.yml" + }, + { + "name": "load_average", + "description": "Displays information about the system wide load averages.", + "url": "https://fleetdm.com/tables/load_average", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Find computers with a load average of 3.5 or higher over the last 15 minutes.\n\n```\nSELECT average from load_average WHERE period='15m' AND average|-=3.5;\n```", + "columns": [ + { + "name": "period", + "description": "Period over which the average is calculated.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "average", + "description": "Load average over the specified period.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/load_average.yml" + }, + { + "name": "location_services", + "description": "Reports the status of the Location Services feature of the OS.", + "url": "https://fleetdm.com/tables/location_services", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "If this query returns a 1 in the enabled column, location services are enabled\non this Mac.\n\n```\nSELECT enabled from location_services;\n```", + "columns": [ + { + "name": "enabled", + "description": "1 if Location Services are enabled, else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/location_services.yml" + }, + { + "name": "logged_in_users", + "description": "Users with an active shell on the system.", + "url": "https://fleetdm.com/tables/logged_in_users", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "See the user currently logged in on the console of the computer.\n\n```\nSELECT user, type, tty from logged_in_users WHERE tty='console';\n```", + "columns": [ + { + "name": "type", + "description": "Login type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user", + "description": "User login name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tty", + "description": "Device name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "host", + "description": "Remote hostname", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time entry was made", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sid", + "description": "The user's unique security identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "registry_hive", + "description": "HKEY_USERS registry hive", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/logged_in_users.yml" + }, + { + "name": "logical_drives", + "description": "Details for logical drives on the system. A logical drive generally represents a single partition.", + "url": "https://fleetdm.com/tables/logical_drives", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect free_space from logical_drives where device_id = 'C:'\n```", + "columns": [ + { + "name": "device_id", + "description": "The drive id, usually the drive name, e.g., 'C:'.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Deprecated (always 'Unknown').", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "The canonical description of the drive, e.g. 'Logical Fixed Disk', 'CD-ROM Disk'.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "free_space", + "description": "The amount of free space, in bytes, of the drive (-1 on failure).", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "The total amount of space, in bytes, of the drive (-1 on failure).", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "file_system", + "description": "The file system of the drive.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "boot_partition", + "description": "True if Windows booted from this drive.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/logical_drives.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flogical_drives.yml&value=name%3A%20logical_drives%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "logon_sessions", + "description": "Windows Logon Session.", + "url": "https://fleetdm.com/tables/logon_sessions", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from logon_sessions;\n```", + "columns": [ + { + "name": "logon_id", + "description": "A locally unique identifier (LUID) that identifies a logon session.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user", + "description": "The account name of the security principal that owns the logon session.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logon_domain", + "description": "The name of the domain used to authenticate the owner of the logon session.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "authentication_package", + "description": "The authentication package used to authenticate the owner of the logon session.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logon_type", + "description": "The logon method.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "session_id", + "description": "The Terminal Services session identifier.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logon_sid", + "description": "The user's security identifier (SID).", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logon_time", + "description": "The time the session owner logged on.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logon_server", + "description": "The name of the server used to authenticate the owner of the logon session.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dns_domain_name", + "description": "The DNS name for the owner of the logon session.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "upn", + "description": "The user principal name (UPN) for the owner of the logon session.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logon_script", + "description": "The script used for logging on.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "profile_path", + "description": "The home directory for the logon session.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "home_directory", + "description": "The home directory for the logon session.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "home_directory_drive", + "description": "The drive location of the home directory of the logon session.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/logon_sessions.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flogon_sessions.yml&value=name%3A%20logon_sessions%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "lxd_certificates", + "description": "LXD certificates information.", + "url": "https://fleetdm.com/tables/lxd_certificates", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from lxd_certificates\n```", + "columns": [ + { + "name": "name", + "description": "Name of the certificate", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Type of the certificate", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fingerprint", + "description": "SHA256 hash of the certificate", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "certificate", + "description": "Certificate content", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/lxd_certificates.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flxd_certificates.yml&value=name%3A%20lxd_certificates%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "lxd_cluster", + "description": "LXD cluster information.", + "url": "https://fleetdm.com/tables/lxd_cluster", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from lxd_cluster\n```", + "columns": [ + { + "name": "server_name", + "description": "Name of the LXD server node", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enabled", + "description": "Whether clustering enabled (1) or not (0) on this node", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "member_config_entity", + "description": "Type of configuration parameter for this node", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "member_config_name", + "description": "Name of configuration parameter", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "member_config_key", + "description": "Config key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "member_config_value", + "description": "Config value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "member_config_description", + "description": "Config description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/lxd_cluster.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flxd_cluster.yml&value=name%3A%20lxd_cluster%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "lxd_cluster_members", + "description": "LXD cluster members information.", + "url": "https://fleetdm.com/tables/lxd_cluster_members", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from lxd_cluster_members\n```", + "columns": [ + { + "name": "server_name", + "description": "Name of the LXD server node", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "url", + "description": "URL of the node", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "database", + "description": "Whether the server is a database node (1) or not (0)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "Status of the node (Online/Offline)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "message", + "description": "Message from the node (Online/Offline)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/lxd_cluster_members.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flxd_cluster_members.yml&value=name%3A%20lxd_cluster_members%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "lxd_images", + "description": "LXD images information.", + "url": "https://fleetdm.com/tables/lxd_images", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from lxd_images where id = '0931b693c877ef357b9e17b3195ae952a2450873923ffd2b34b60836ea730cfa'\n```", + "columns": [ + { + "name": "id", + "description": "Image ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "architecture", + "description": "Target architecture for the image", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "os", + "description": "OS on which image is based", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "release", + "description": "OS release version on which the image is based", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Image description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "aliases", + "description": "Comma-separated list of image aliases", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "filename", + "description": "Filename of the image file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of image in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "auto_update", + "description": "Whether the image auto-updates (1) or not (0)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cached", + "description": "Whether image is cached (1) or not (0)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "public", + "description": "Whether image is public (1) or not (0)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "created_at", + "description": "ISO time of image creation", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "expires_at", + "description": "ISO time of image expiration", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uploaded_at", + "description": "ISO time of image upload", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_used_at", + "description": "ISO time for the most recent use of this image in terms of container spawn", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "update_source_server", + "description": "Server for image update", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "update_source_protocol", + "description": "Protocol used for image information update and image import from source server", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "update_source_certificate", + "description": "Certificate for update source server", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "update_source_alias", + "description": "Alias of image at update source server", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/lxd_images.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flxd_images.yml&value=name%3A%20lxd_images%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "lxd_instance_config", + "description": "LXD instance configuration information.", + "url": "https://fleetdm.com/tables/lxd_instance_config", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from lxd_instance_config where name = 'hello'\n```", + "columns": [ + { + "name": "name", + "description": "Instance name", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "key", + "description": "Configuration parameter name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Configuration parameter value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/lxd_instance_config.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flxd_instance_config.yml&value=name%3A%20lxd_instance_config%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "lxd_instance_devices", + "description": "LXD instance devices information.", + "url": "https://fleetdm.com/tables/lxd_instance_devices", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from lxd_instance_devices where name = 'hello'\n```", + "columns": [ + { + "name": "name", + "description": "Instance name", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "device", + "description": "Name of the device", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device_type", + "description": "Device type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key", + "description": "Device info param name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Device info param value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/lxd_instance_devices.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flxd_instance_devices.yml&value=name%3A%20lxd_instance_devices%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "lxd_instances", + "description": "LXD instances information.", + "url": "https://fleetdm.com/tables/lxd_instances", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from lxd_instances where name = 'hello'\n```", + "columns": [ + { + "name": "name", + "description": "Instance name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "status", + "description": "Instance state (running, stopped, etc.)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "stateful", + "description": "Whether the instance is stateful(1) or not(0)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ephemeral", + "description": "Whether the instance is ephemeral(1) or not(0)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "created_at", + "description": "ISO time of creation", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "base_image", + "description": "ID of image used to launch this instance", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "architecture", + "description": "Instance architecture", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "os", + "description": "The OS of this instance", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Instance description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Instance's process ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "processes", + "description": "Number of processes running inside this instance", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/lxd_instances.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flxd_instances.yml&value=name%3A%20lxd_instances%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "lxd_networks", + "description": "LXD network information.", + "url": "https://fleetdm.com/tables/lxd_networks", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from lxd_networks\n```", + "columns": [ + { + "name": "name", + "description": "Name of the network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Type of network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "managed", + "description": "1 if network created by LXD, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv4_address", + "description": "IPv4 address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipv6_address", + "description": "IPv6 address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "used_by", + "description": "URLs for containers using this network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bytes_received", + "description": "Number of bytes received on this network", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bytes_sent", + "description": "Number of bytes sent on this network", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "packets_received", + "description": "Number of packets received on this network", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "packets_sent", + "description": "Number of packets sent on this network", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hwaddr", + "description": "Hardware address for this network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "Network status", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mtu", + "description": "MTU size", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/lxd_networks.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flxd_networks.yml&value=name%3A%20lxd_networks%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "lxd_storage_pools", + "description": "LXD storage pool information.", + "url": "https://fleetdm.com/tables/lxd_storage_pools", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from lxd_storage_pools\n```", + "columns": [ + { + "name": "name", + "description": "Name of the storage pool", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "driver", + "description": "Storage driver", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source", + "description": "Storage pool source", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of the storage pool", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "space_used", + "description": "Storage space used in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "space_total", + "description": "Total available storage space in bytes for this storage pool", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inodes_used", + "description": "Number of inodes used", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inodes_total", + "description": "Total number of inodes available in this storage pool", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/lxd_storage_pools.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Flxd_storage_pools.yml&value=name%3A%20lxd_storage_pools%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "macadmins_unified_log", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "Allows querying macOS [unified logs](https://developer.apple.com/documentation/os/logging).", + "platforms": [ + "darwin" + ], + "evented": false, + "examples": "Select the log entries that happened during the last minute and are related to `LaunchServices`. Convert the UNIX time to a human readable format, and the signature table to verify its cryptographic signature.\n\n```\nSELECT u.category, u.event_message, u.process_id, datetime(u.timestamp, 'unixepoch') AS human_time, p.path, s.signed, s.identifier, s.authority FROM macadmins_unified_log u JOIN processes p ON u.process_id = p.pid JOIN signature s ON p.path = s.path WHERE u.sender_image_path LIKE '%LaunchServices%' AND last = \"1m\";\n```", + "columns": [ + { + "name": "trace_id", + "description": "The ID of a trace event", + "required": false, + "type": "text" + }, + { + "name": "event_type", + "description": "The type of event, this can be logEvent, signpostEvent or stateEvent.", + "required": false, + "type": "text" + }, + { + "name": "format_string", + "description": "The format string used to convert variable content into a string for output.", + "required": false, + "type": "text" + }, + { + "name": "activity_identifier", + "description": "The identifier of the log activity.", + "required": false, + "type": "int" + }, + { + "name": "subsystem", + "description": "The subsystem responsible for this activity.", + "required": false, + "type": "text" + }, + { + "name": "category", + "description": "The category of the log activity.", + "required": false, + "type": "text" + }, + { + "name": "thread_id", + "description": "The ID of the thread that originated the event.", + "required": false, + "type": "bigint" + }, + { + "name": "sender_image_uuid", + "description": "The UUID of the library, framework, kernel extension, or mach-o image, that originated the event.", + "required": false, + "type": "text" + }, + { + "name": "sender_image_path", + "description": "The full path of the library, framework, kernel extension, or mach-o image, that originated the event.", + "required": false, + "type": "text" + }, + { + "name": "boot_uuid", + "description": "The boot UUID of the event.", + "required": false, + "type": "text" + }, + { + "name": "process_id", + "description": "Process ID of the process that generated this log item, which can be joined to multiple other tables including a *PID*.", + "required": false, + "type": "bigint" + }, + { + "name": "process_image_path", + "description": "The full path of the process that originated the event.", + "required": false, + "type": "text" + }, + { + "name": "timestamp", + "description": "Timestamp in [UNIX time format](https://en.wikipedia.org/wiki/Unix_time).", + "required": false, + "type": "bigint" + }, + { + "name": "event_message", + "description": "The message of the log entry.", + "required": false, + "type": "text" + }, + { + "name": "sender_program_counter", + "description": "The program counter of the library, framework, kernel extension, or mach-o image, that originated the event.", + "required": false, + "type": "uint" + }, + { + "name": "parent_activity_identifier", + "description": "ID of the parent activity", + "required": false, + "type": "uint" + }, + { + "name": "log_level", + "description": "The log level of this item, such as `default`, `info`, `fault`, etc.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/macadmins_unified_log", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/macadmins_unified_log.yml" + }, + { + "name": "macos_profiles", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "High level information on installed profiles enrollment.", + "platforms": [ + "darwin" + ], + "evented": false, + "examples": "Identify all profiles that are not *verified*.\n\n```\nSELECT display_name, install_date FROM macos_profiles WHERE verification_state!='verified'; \n```", + "columns": [ + { + "name": "description", + "description": "The description of the profile.", + "required": false, + "type": "text" + }, + { + "name": "display_name", + "description": "The display name of the profile.", + "required": false, + "type": "text" + }, + { + "name": "identifier", + "description": "The identifier of the profile.", + "required": false, + "type": "text" + }, + { + "name": "install_date", + "description": "Date and time at which the profile was installed.", + "required": false, + "type": "text" + }, + { + "name": "organization", + "description": "The profile's organization value.", + "required": false, + "type": "text" + }, + { + "name": "type", + "description": "The type of profile.", + "required": false, + "type": "text" + }, + { + "name": "uuid", + "description": "The [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) of the profile.", + "required": false, + "type": "text" + }, + { + "name": "verification_state", + "description": "The verification state of the profile.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/macos_profiles", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/macos_profiles.yml" + }, + { + "name": "macos_rsr", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "Returns information about installed Rapid Security Responses (RSRs).", + "platforms": [ + "darwin" + ], + "evented": false, + "columns": [ + { + "name": "full_macos_version", + "description": "Full macOS version string (including the RSR suffix)", + "required": false, + "type": "text" + }, + { + "name": "macos_version", + "description": "The macOS version string (excluding the RSR suffix)", + "required": false, + "type": "text" + }, + { + "name": "rsr_supported", + "description": "Whether this macOS version supports RSRs (>= 13). Possible values are 'true' or 'false'.", + "required": false, + "type": "text" + }, + { + "name": "rsr_version", + "description": "RSR version string suffix (with parenthesis included)", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/macos_rsr", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/macos_rsr.yml" + }, + { + "name": "magic", + "description": "Magic number recognition library table.", + "url": "https://fleetdm.com/tables/magic", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "path", + "description": "Absolute path to target file", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "magic_db_files", + "description": "Colon(:) separated list of files where the magic db file can be found. By default one of the following is used: /usr/share/file/magic/magic, /usr/share/misc/magic or /usr/share/misc/magic.mgc", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "data", + "description": "Magic number data from libmagic", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mime_type", + "description": "MIME type data from libmagic", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mime_encoding", + "description": "MIME encoding data from libmagic", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/magic.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmagic.yml&value=name%3A%20magic%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "managed_policies", + "description": "The managed configuration policies from AD, MDM, MCX, etc.", + "url": "https://fleetdm.com/tables/managed_policies", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Check if critical software update installation is enabled via a profile (1 =\nenabled)\n\n```\nSELECT name, value FROM managed_policies WHERE domain='com.apple.SoftwareUpdate' AND name='CriticalUpdateInstall' LIMIT 1;\n```", + "columns": [ + { + "name": "domain", + "description": "System or manager-chosen domain key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uuid", + "description": "Optional UUID assigned to policy set", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Policy key name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Policy value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "username", + "description": "policy only applies to the listed user. Blank if global.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manual", + "description": "1 if policy was loaded manually, otherwise 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/managed_policies.yml" + }, + { + "name": "md_devices", + "description": "Software RAID array settings.", + "url": "https://fleetdm.com/tables/md_devices", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "device_name", + "description": "md device name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "Current state of the array", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "raid_level", + "description": "Current raid level of the array", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "size of the array in blocks", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "chunk_size", + "description": "chunk size in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "raid_disks", + "description": "Number of configured RAID disks in array", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "nr_raid_disks", + "description": "Number of partitions or disk devices to comprise the array", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "working_disks", + "description": "Number of working disks in array", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "active_disks", + "description": "Number of active disks in array", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "failed_disks", + "description": "Number of failed disks in array", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "spare_disks", + "description": "Number of idle disks in array", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "superblock_state", + "description": "State of the superblock", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "superblock_version", + "description": "Version of the superblock", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "superblock_update_time", + "description": "Unix timestamp of last update", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bitmap_on_mem", + "description": "Pages allocated in in-memory bitmap, if enabled", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bitmap_chunk_size", + "description": "Bitmap chunk size", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bitmap_external_file", + "description": "External referenced bitmap file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "recovery_progress", + "description": "Progress of the recovery activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "recovery_finish", + "description": "Estimated duration of recovery activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "recovery_speed", + "description": "Speed of recovery activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "resync_progress", + "description": "Progress of the resync activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "resync_finish", + "description": "Estimated duration of resync activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "resync_speed", + "description": "Speed of resync activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "reshape_progress", + "description": "Progress of the reshape activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "reshape_finish", + "description": "Estimated duration of reshape activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "reshape_speed", + "description": "Speed of reshape activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "check_array_progress", + "description": "Progress of the check array activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "check_array_finish", + "description": "Estimated duration of the check array activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "check_array_speed", + "description": "Speed of the check array activity", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "unused_devices", + "description": "Unused devices", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "other", + "description": "Other information associated with array from /proc/mdstat", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/md_devices.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmd_devices.yml&value=name%3A%20md_devices%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "md_drives", + "description": "Drive devices used for Software RAID.", + "url": "https://fleetdm.com/tables/md_drives", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "md_device_name", + "description": "md device name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "drive_name", + "description": "Drive device name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "slot", + "description": "Slot position of disk", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "State of the drive", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/md_drives.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmd_drives.yml&value=name%3A%20md_drives%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "md_personalities", + "description": "Software RAID setting supported by the kernel.", + "url": "https://fleetdm.com/tables/md_personalities", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "name", + "description": "Name of personality supported by kernel", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/md_personalities.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmd_personalities.yml&value=name%3A%20md_personalities%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "mdfind", + "description": "Run searches against the spotlight database.", + "url": "https://fleetdm.com/tables/mdfind", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from mdfind where query in ('kMDItemDisplayName == \"rook.stl\"', 'kMDItemDisplayName == \"video.mp4\"')\n```", + "columns": [ + { + "name": "path", + "description": "Path of the file returned from spotlight", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "query", + "description": "The query that was run to find the file", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/mdfind.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmdfind.yml&value=name%3A%20mdfind%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "mdls", + "description": "Query file metadata in the Spotlight database.", + "url": "https://fleetdm.com/tables/mdls", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify hidden files that have been indexed by Spotlight. This could reveal\nfiles that were recently deleted and are still in the Spotlight database.\n\n```\nSELECT * FROM mdls WHERE path LIKE '/Users/g/%%' AND key='kMDItemFSIsExtensionHidden' AND value='true';\n```", + "columns": [ + { + "name": "path", + "description": "Path of the file", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "key", + "description": "Name of the metadata key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Value stored in the metadata key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "valuetype", + "description": "CoreFoundation type of data stored in value", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/mdls.yml" + }, + { + "name": "mdm", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).\n\n- Due to changes in macOS 12.3, the output of `profiles show -type enrollment` can only be generated once a day. If you are running this command with another tool, you should set the `PROFILES_SHOW_ENROLLMENT_CACHE_PATH` environment variable to the path you are caching this. The cache file should be `json` with the keys `dep_capable` and `rate_limited present`, both booleans representing whether the device is capable of DEP enrollment and whether the response from `profiles show -type enrollment` is being rate limited or not.", + "description": "Information on the device's MDM enrollment.", + "platforms": [ + "darwin" + ], + "evented": false, + "examples": "Identify Macs that are DEP capable but have not been enrolled to MDM.\n\n```\nSELECT * FROM mdm WHERE dep_capable='true' AND enrolled='false';\n```", + "columns": [ + { + "name": "access_rights", + "description": "The access rights of the payload. The resulting number is the total of every [AccessRight](https://developer.apple.com/documentation/devicemanagement/mdm) added up.", + "required": false, + "type": "integer" + }, + { + "name": "checkin_url", + "description": "The URL the Mac checks in with, which should point to your MDM server.", + "required": false, + "type": "text" + }, + { + "name": "dep_capable", + "description": "Indicates if the computer is DEP capable or not, even if it is not currently enrolled into MDM.", + "required": false, + "type": "text" + }, + { + "name": "enrolled", + "description": "Indicates if the computer is enrolled into MDM.", + "required": false, + "type": "text" + }, + { + "name": "has_scep_payload", + "description": "Indicates if the computer has a certificate used by the MDM server to authenticate it.", + "required": false, + "type": "text" + }, + { + "name": "identity_certificate_uuid", + "description": "The [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) of the [SCEP](https://en.wikipedia.org/wiki/Simple_Certificate_Enrollment_Protocol) certificate.", + "required": false, + "type": "text" + }, + { + "name": "install_date", + "description": "The date on which the MDM payload was installed on the Mac.", + "required": false, + "type": "text" + }, + { + "name": "installed_from_dep", + "description": "Indicates if the MDM payload was installed via DEP or not.", + "required": false, + "type": "text" + }, + { + "name": "payload_identifier", + "description": "The identifier of the MDM payload.", + "required": false, + "type": "text" + }, + { + "name": "server_url", + "description": "The URL of the MDM server used by this computer.", + "required": false, + "type": "text" + }, + { + "name": "sign_message", + "description": "Indicates if messages sent and received from the MDM server must be signed.", + "required": false, + "type": "text" + }, + { + "name": "topic", + "description": "The topic MDM listens to for push notifications.", + "required": false, + "type": "text" + }, + { + "name": "user_approved", + "description": "Indicates if this MDM payload was approved by the user.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/mdm", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/mdm.yml" + }, + { + "name": "mdm_bridge", + "platforms": [ + "windows" + ], + "description": "Allows querying MDM enrolled devices using \"get\" commands.", + "columns": [ + { + "name": "enrollment_status", + "type": "text", + "required": false, + "description": "Contains the enrollment status of the device, possible values are \"device_enrolled\" and \"device_unenrolled\"." + }, + { + "name": "enrolled_user", + "type": "text", + "required": false, + "description": "Contains the enrollment URI of the device." + }, + { + "name": "mdm_command_input", + "type": "text", + "required": false, + "description": "The \"get\" command to execute on the device. If empty, no command is executed and the \"enrollment_status\" and \"enrolled_user\" columns are returned." + }, + { + "name": "mdm_command_output", + "type": "text", + "required": false, + "description": "Value of the \"Results\" field of the MDM command output." + }, + { + "name": "raw_mdm_command_output", + "type": "text", + "required": false, + "description": "The full raw output of the MDM command execution." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)). This table does not work on Windows Server", + "evented": false, + "url": "https://fleetdm.com/tables/mdm_bridge", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/mdm_bridge.yml" + }, + { + "name": "memory_array_mapped_addresses", + "description": "Data associated for address mapping of physical memory arrays.", + "url": "https://fleetdm.com/tables/memory_array_mapped_addresses", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "handle", + "description": "Handle, or instance number, associated with the structure", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_array_handle", + "description": "Handle of the memory array associated with this structure", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "starting_address", + "description": "Physical stating address, in kilobytes, of a range of memory mapped to physical memory array", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ending_address", + "description": "Physical ending address of last kilobyte of a range of memory mapped to physical memory array", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "partition_width", + "description": "Number of memory devices that form a single row of memory for the address partition of this structure", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/memory_array_mapped_addresses.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmemory_array_mapped_addresses.yml&value=name%3A%20memory_array_mapped_addresses%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "memory_arrays", + "description": "Data associated with collection of memory devices that operate to form a memory address.", + "url": "https://fleetdm.com/tables/memory_arrays", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "handle", + "description": "Handle, or instance number, associated with the array", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "location", + "description": "Physical location of the memory array", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "use", + "description": "Function for which the array is used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_error_correction", + "description": "Primary hardware error correction or detection method supported", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "max_capacity", + "description": "Maximum capacity of array in gigabytes", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_error_info_handle", + "description": "Handle, or instance number, associated with any error that was detected for the array", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "number_memory_devices", + "description": "Number of memory devices on array", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/memory_arrays.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmemory_arrays.yml&value=name%3A%20memory_arrays%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "memory_device_mapped_addresses", + "description": "Data associated for address mapping of physical memory devices.", + "url": "https://fleetdm.com/tables/memory_device_mapped_addresses", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "handle", + "description": "Handle, or instance number, associated with the structure", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_device_handle", + "description": "Handle of the memory device structure associated with this structure", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_array_mapped_address_handle", + "description": "Handle of the memory array mapped address to which this device range is mapped to", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "starting_address", + "description": "Physical stating address, in kilobytes, of a range of memory mapped to physical memory array", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ending_address", + "description": "Physical ending address of last kilobyte of a range of memory mapped to physical memory array", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "partition_row_position", + "description": "Identifies the position of the referenced memory device in a row of the address partition", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "interleave_position", + "description": "The position of the device in a interleave, i.e. 0 indicates non-interleave, 1 indicates 1st interleave, 2 indicates 2nd interleave, etc.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "interleave_data_depth", + "description": "The max number of consecutive rows from memory device that are accessed in a single interleave transfer; 0 indicates device is non-interleave", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/memory_device_mapped_addresses.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmemory_device_mapped_addresses.yml&value=name%3A%20memory_device_mapped_addresses%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "memory_devices", + "description": "Physical memory device (type 17) information retrieved from SMBIOS.", + "url": "https://fleetdm.com/tables/memory_devices", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "handle", + "description": "Handle, or instance number, associated with the structure in SMBIOS", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "array_handle", + "description": "The memory array that the device is attached to", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "form_factor", + "description": "Implementation form factor for this memory device", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "total_width", + "description": "Total width, in bits, of this memory device, including any check or error-correction bits", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "data_width", + "description": "Data width, in bits, of this memory device", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size of memory device in Megabyte", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "set", + "description": "Identifies if memory device is one of a set of devices. A value of 0 indicates no set affiliation.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device_locator", + "description": "String number of the string that identifies the physically-labeled socket or board position where the memory device is located", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bank_locator", + "description": "String number of the string that identifies the physically-labeled bank where the memory device is located", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_type", + "description": "Type of memory used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_type_details", + "description": "Additional details for memory device", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "max_speed", + "description": "Max speed of memory device in megatransfers per second (MT/s)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "configured_clock_speed", + "description": "Configured speed of memory device in megatransfers per second (MT/s)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufacturer", + "description": "Manufacturer ID string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial_number", + "description": "Serial number of memory device", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "asset_tag", + "description": "Manufacturer specific asset tag of memory device", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "part_number", + "description": "Manufacturer specific serial number of memory device", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "min_voltage", + "description": "Minimum operating voltage of device in millivolts", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "max_voltage", + "description": "Maximum operating voltage of device in millivolts", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "configured_voltage", + "description": "Configured operating voltage of device in millivolts", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/memory_devices.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmemory_devices.yml&value=name%3A%20memory_devices%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "memory_error_info", + "description": "Data associated with errors of a physical memory array.", + "url": "https://fleetdm.com/tables/memory_error_info", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "handle", + "description": "Handle, or instance number, associated with the structure", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "error_type", + "description": "type of error associated with current error status for array or device", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "error_granularity", + "description": "Granularity to which the error can be resolved", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "error_operation", + "description": "Memory access operation that caused the error", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor_syndrome", + "description": "Vendor specific ECC syndrome or CRC data associated with the erroneous access", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_array_error_address", + "description": "32 bit physical address of the error based on the addressing of the bus to which the memory array is connected", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device_error_address", + "description": "32 bit physical address of the error relative to the start of the failing memory address, in bytes", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "error_resolution", + "description": "Range, in bytes, within which this error can be determined, when an error address is given", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/memory_error_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmemory_error_info.yml&value=name%3A%20memory_error_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "memory_info", + "description": "Main memory information in bytes.", + "url": "https://fleetdm.com/tables/memory_info", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "memory_total", + "description": "Total amount of physical RAM, in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_free", + "description": "The amount of physical RAM, in bytes, left unused by the system", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "memory_available", + "description": "The amount of physical RAM, in bytes, available for starting new applications, without swapping", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "buffers", + "description": "The amount of physical RAM, in bytes, used for file buffers", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cached", + "description": "The amount of physical RAM, in bytes, used as cache memory", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "swap_cached", + "description": "The amount of swap, in bytes, used as cache memory", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "active", + "description": "The total amount of buffer or page cache memory, in bytes, that is in active use", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inactive", + "description": "The total amount of buffer or page cache memory, in bytes, that are free and available", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "swap_total", + "description": "The total amount of swap available, in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "swap_free", + "description": "The total amount of swap free, in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/memory_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmemory_info.yml&value=name%3A%20memory_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "memory_map", + "description": "OS memory region map.", + "url": "https://fleetdm.com/tables/memory_map", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "name", + "description": "Region name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "start", + "description": "Start address of memory region", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "end", + "description": "End address of memory region", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/memory_map.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmemory_map.yml&value=name%3A%20memory_map%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "mounts", + "description": "System mounted devices and filesystems (not process specific).", + "url": "https://fleetdm.com/tables/mounts", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Returns the drive free space in gigabytes and as percentage.\n\n```\nSELECT path, type, ROUND((blocks_available * blocks_size * 10e-10), 2) AS free_gb, ROUND ((blocks_available * 1.0 / blocks * 1.0) * 100, 2) AS free_pc FROM mounts WHERE path = '/';\n```", + "columns": [ + { + "name": "device", + "description": "Mounted device", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device_alias", + "description": "Mounted device alias", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Mounted device path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Mounted device type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "blocks_size", + "description": "Block size in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "blocks", + "description": "Mounted device used blocks", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "blocks_free", + "description": "Mounted device free blocks", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "blocks_available", + "description": "Mounted device available blocks", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inodes", + "description": "Mounted device used inodes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inodes_free", + "description": "Mounted device free inodes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "flags", + "description": "Mounted device flags", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/mounts.yml" + }, + { + "name": "msr", + "description": "Various pieces of data stored in the model specific register per processor. NOTE: the msr kernel module must be enabled, and osquery must be run as root.", + "url": "https://fleetdm.com/tables/msr", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "processor_number", + "description": "The processor number as reported in /proc/cpuinfo", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "turbo_disabled", + "description": "Whether the turbo feature is disabled.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "turbo_ratio_limit", + "description": "The turbo feature ratio limit.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "platform_info", + "description": "Platform information.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "perf_ctl", + "description": "Performance setting for the processor.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "perf_status", + "description": "Performance status for the processor.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "feature_control", + "description": "Bitfield controlling enabled features.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "rapl_power_limit", + "description": "Run Time Average Power Limiting power limit.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "rapl_energy_status", + "description": "Run Time Average Power Limiting energy status.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "rapl_power_units", + "description": "Run Time Average Power Limiting power units.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/msr.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fmsr.yml&value=name%3A%20msr%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "munki_info", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "Information from the last [Munki](https://github.com/munki/munki) run.", + "platforms": [ + "darwin" + ], + "evented": false, + "examples": "Output errors, warnings and problematic installations from Munki.\n\n```\nSELECT errors, warnings, problem_installs FROM munki_info ;\n```", + "columns": [ + { + "name": "console_user", + "description": "The username of the user currently logged into the console of the Mac.", + "required": false, + "type": "text" + }, + { + "name": "end_time", + "description": "The date and time at which the latest Munki run ended.", + "required": false, + "type": "text" + }, + { + "name": "errors", + "description": "If Munki encountered any error during the last run, they will be returned in this column.", + "required": false, + "type": "text" + }, + { + "name": "manifest_name", + "description": "The internal manifest name", + "required": false, + "type": "text" + }, + { + "name": "problem_installs", + "description": "A list of installs that did not succeed, if any.", + "required": false, + "type": "text" + }, + { + "name": "start_time", + "description": "The date and time at which the latest Munki run started.", + "required": false, + "type": "text" + }, + { + "name": "success", + "description": "Shows if the Munki run was a success (true), or not (false).", + "required": false, + "type": "text" + }, + { + "name": "version", + "description": "The version of Munki used during the last run.", + "required": false, + "type": "text" + }, + { + "name": "warnings", + "description": "If Munki encountered any error during the last run, they will be returned in this column.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/munki_info", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/munki_info.yml" + }, + { + "name": "munki_installs", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "Software packages and other items [Munki](https://github.com/munki/munki) is managing.", + "platforms": [ + "darwin" + ], + "evented": false, + "examples": "See the version of software that has been deployed by Munki.\n\n```\nSELECT name, installed_version FROM munki_installs WHERE installed='true';\n```", + "columns": [ + { + "name": "end_time", + "description": "The end time of the last Munki run.", + "required": false, + "type": "text" + }, + { + "name": "installed", + "description": "Shows if Munki installed an item (true) or if it is simply available but not installed (false).", + "required": false, + "type": "text" + }, + { + "name": "installed_version", + "description": "The version number of installed items.", + "required": false, + "type": "text" + }, + { + "name": "name", + "description": "The name of items managed by Munki.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/munki_installs", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/munki_installs.yml" + }, + { + "name": "network_interfaces", + "evented": false, + "platforms": [ + "chrome" + ], + "description": "Uses the `chrome.enterprise.networkingAttributes` API to read information about the host's current network.", + "columns": [ + { + "name": "mac", + "type": "text", + "required": false, + "description": "MAC address (only available to extensions force-installed by enterprise policy)" + }, + { + "name": "ipv4", + "type": "text", + "required": false, + "description": "IPv4 address (only available to extensions force-installed by enterprise policy)" + }, + { + "name": "ipv6", + "type": "text", + "required": false, + "description": "IPv6 address (only available to extensions force-installed by enterprise policy)" + } + ], + "notes": "- This table is not a core osquery table. This table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).\n\n- Requires that the fleetd extension is force-installed by enterprise policy", + "url": "https://fleetdm.com/tables/network_interfaces", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/network_interfaces.yml" + }, + { + "name": "nfs_shares", + "description": "NFS shares exported by the host.", + "url": "https://fleetdm.com/tables/nfs_shares", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List shares exported via NFS on Macs, and if they are read only (readonly=1)\nor not.\n\n```\nSELECT share, readonly FROM nfs_shares;\n```", + "columns": [ + { + "name": "share", + "description": "Filesystem path to the share", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "options", + "description": "Options string set on the export share", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "readonly", + "description": "1 if the share is exported readonly else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/nfs_shares.yml" + }, + { + "name": "npm_packages", + "description": "Node.js packages globally installed on a system.", + "url": "https://fleetdm.com/tables/npm_packages", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List the author, description and more information about the NPM package called `webpack`, if installed:\n\n```sql\nSELECT author, description, directory, version FROM npm_packages WHERE name='webpack';\n```", + "columns": [ + { + "name": "name", + "description": "Package display name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Package-supplied version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Package-supplied description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "author", + "description": "Package-supplied author", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "license", + "description": "License under which package is launched", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "homepage", + "description": "Package supplied homepage", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path at which this module resides", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "directory", + "description": "Directory where node_modules are located", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "mount_namespace_id", + "description": "Mount namespace id", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/npm_packages.yml" + }, + { + "name": "ntdomains", + "description": "Display basic NT domain information of a Windows machine.", + "url": "https://fleetdm.com/tables/ntdomains", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "If the system is joined to a domain, this query will return the domain name as well as all known domain controllers and their IP addresses.\n\n```\nSELECT domain_name, domain_controller_name, domain_controller_address, status FROM ntdomains WHERE domain_name != \"\";\n```", + "columns": [ + { + "name": "name", + "description": "The label by which the object is known.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "client_site_name", + "description": "The name of the site where the domain controller is configured.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dc_site_name", + "description": "The name of the site where the domain controller is located.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dns_forest_name", + "description": "The name of the root of the DNS tree.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "domain_controller_address", + "description": "The IP Address of the discovered domain controller..", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "domain_controller_name", + "description": "The name of the discovered domain controller.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "domain_name", + "description": "The name of the domain.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "The current status of the domain object.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/ntdomains.yml" + }, + { + "name": "ntfs_acl_permissions", + "description": "Retrieve NTFS ACL permission information for files and directories.", + "url": "https://fleetdm.com/tables/ntfs_acl_permissions", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "path", + "description": "Path to the file or directory.", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "type", + "description": "Type of access mode for the access control entry.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "principal", + "description": "User or group to which the ACE applies.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "access", + "description": "Specific permissions that indicate the rights described by the ACE.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inherited_from", + "description": "The inheritance policy of the ACE.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/ntfs_acl_permissions.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fntfs_acl_permissions.yml&value=name%3A%20ntfs_acl_permissions%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "ntfs_journal_events", + "description": "Track time/action changes to files specified in configuration data.", + "url": "https://fleetdm.com/tables/ntfs_journal_events", + "platforms": [ + "windows" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "action", + "description": "Change action (Write, Delete, etc)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "category", + "description": "The category that the event originated from", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "old_path", + "description": "Old path (renames only)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "record_timestamp", + "description": "Journal record timestamp", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "record_usn", + "description": "The update sequence number that identifies the journal record", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "node_ref_number", + "description": "The ordinal that associates a journal record with a filename", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent_ref_number", + "description": "The ordinal that associates a journal record with a filename's parent directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "drive_letter", + "description": "The drive letter identifying the source journal", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "file_attributes", + "description": "File attributes", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "partial", + "description": "Set to 1 if either path or old_path only contains the file or folder name", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of file event", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/ntfs_journal_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fntfs_journal_events.yml&value=name%3A%20ntfs_journal_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "nvram", + "description": "Apple NVRAM variable listing.", + "url": "https://fleetdm.com/tables/nvram", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "If a Mac had a sleep failure, this query will return the reason for it.\n\n```\nSELECT name, value FROM nvram WHERE name='SleepWakeFailureString';\n```", + "columns": [ + { + "name": "name", + "description": "Variable name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "type", + "description": "Data type (CFData, CFString, etc)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Raw variable data", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/nvram.yml" + }, + { + "name": "nvram_info", + "platforms": [ + "darwin" + ], + "description": "Information from nvram system call.", + "columns": [ + { + "name": "amfi_enabled", + "type": "integer", + "required": false, + "description": "Apple Mobile File Integrity (AMFI) was first released in macOS 10.12. The daemon and service block attempts to run unsigned code. AMFI uses lanchd, code signatures, certificates, entitlements, and provisioning profiles to create a filtered entitlement dictionary for an app. AMFI is the macOS kernel module that enforces code-signing and library validation.\nNote: AMFI cannot be disabled with SIP enabled, but a change attempt can be made that will appear successful, and report incorrectly as successful. If the AMFI audit fails, and the SIP audit passes, this is still an issue the admin should research." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/nvram_info", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/nvram_info.yml" + }, + { + "name": "oem_strings", + "description": "OEM defined strings retrieved from SMBIOS.", + "url": "https://fleetdm.com/tables/oem_strings", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "handle", + "description": "Handle, or instance number, associated with the Type 11 structure", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "number", + "description": "The string index of the structure", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "The value of the OEM string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/oem_strings.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Foem_strings.yml&value=name%3A%20oem_strings%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "office_mru", + "description": "View recently opened Office documents.", + "url": "https://fleetdm.com/tables/office_mru", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from office_mru;\n```", + "columns": [ + { + "name": "application", + "description": "Associated Office application", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Office application version number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "File path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_opened_time", + "description": "Most recent opened time file was opened", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sid", + "description": "User SID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/office_mru.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Foffice_mru.yml&value=name%3A%20office_mru%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "orbit_info", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "description": "Returns information about the orbit instance.", + "columns": [ + { + "name": "version", + "type": "text", + "required": false, + "description": "Version of the orbit instance." + }, + { + "name": "device_auth_token", + "type": "text", + "required": false, + "description": "Current Fleet Desktop token in the instance." + }, + { + "name": "enrolled", + "type": "text", + "required": false, + "description": "Returns whether the Orbit instance is enrolled to Fleet (true/false)." + }, + { + "name": "last_recorded_error", + "type": "text", + "required": false, + "description": "Last recorded error in Orbit." + }, + { + "name": "orbit_channel", + "type": "text", + "required": false, + "description": "The Update Framework update channel used for the orbit executable." + }, + { + "name": "osqueryd_channel", + "type": "text", + "required": false, + "description": "The Update Framework update channel used for the osqueryd executable." + }, + { + "name": "desktop_channel", + "type": "text", + "required": false, + "description": "The Update Framework update channel used for the Fleet Desktop executable." + }, + { + "name": "desktop_version", + "type": "text", + "required": false, + "description": "The version of the fleet-desktop instance. Blank if fleet-desktop is not installed." + }, + { + "name": "uptime", + "type": "bigint", + "required": false, + "description": "Uptime of the orbit process in seconds." + }, + { + "name": "scripts_enabled", + "type": "integer", + "required": false, + "description": "1 if running scripts is enabled, 0 if disabled." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/orbit_info", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/orbit_info.yml" + }, + { + "name": "os_version", + "description": "A single row containing the operating system name and version.", + "url": "https://fleetdm.com/tables/os_version", + "platforms": [ + "darwin", + "linux", + "windows", + "chrome" + ], + "evented": false, + "cacheable": false, + "notes": "- On ChromeOS, this table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).", + "examples": "See the OS version as well as the CPU architecture in use (X86 vs ARM for\nexample)\n\n```\nSELECT arch, version FROM os_version;\n```", + "columns": [ + { + "name": "name", + "description": "Distribution or product name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Pretty, suitable for presentation, OS version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "major", + "description": "Major release version", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "minor", + "description": "Minor release version", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "patch", + "description": "Optional patch release", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "build", + "description": "Optional build-specific or variant string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "platform", + "description": "OS Platform or ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "platform_like", + "description": "Closely related platforms", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "codename", + "description": "OS version codename", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "arch", + "description": "OS Architecture", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "extra", + "description": "Optional extra release specification", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "darwin" + ] + }, + { + "name": "install_date", + "description": "The install date of the OS.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "revision", + "description": "Update Build Revision, refers to the specific revision number of a Windows update", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "windows", + "win32", + "cygwin" + ] + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "mount_namespace_id", + "description": "Mount namespace id", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/os_version.yml" + }, + { + "name": "osquery_events", + "description": "Information about the event publishers and subscribers.", + "url": "https://fleetdm.com/tables/osquery_events", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify osquery event types which have no subscriber.\n\n```\nSELECT * from osquery_events WHERE subscriptions='0';\n```", + "columns": [ + { + "name": "name", + "description": "Event publisher or subscriber name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "publisher", + "description": "Name of the associated publisher", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Either publisher or subscriber", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subscriptions", + "description": "Number of subscriptions the publisher received or subscriber used", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "events", + "description": "Number of events emitted or received since osquery started", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "refreshes", + "description": "Publisher only: number of runloop restarts", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "active", + "description": "1 if the publisher or subscriber is active else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/osquery_events.yml" + }, + { + "name": "osquery_extensions", + "description": "List of active osquery extensions.", + "url": "https://fleetdm.com/tables/osquery_extensions", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify osquery extensions in use that are not part of osquery core.\n\n```\nSELECT name, path from osquery_extensions WHERE type IS NOT 'core';\n```", + "columns": [ + { + "name": "uuid", + "description": "The transient ID assigned for communication", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Extension's name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Extension's version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sdk_version", + "description": "osquery SDK version used to build the extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of the extension's Thrift connection or library path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "SDK extension type: core, extension, or module", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/osquery_extensions.yml" + }, + { + "name": "osquery_flags", + "description": "Configurable flags that modify osquery's behavior.", + "url": "https://fleetdm.com/tables/osquery_flags", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "If disable_events has a value of false, events are enabled.\n\n```\nSELECT description, name, value FROM osquery_flags WHERE name='disable_events';\n```", + "columns": [ + { + "name": "name", + "description": "Flag name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Flag type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Flag description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "default_value", + "description": "Flag default value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Flag value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "shell_only", + "description": "Is the flag shell only?", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/osquery_flags.yml" + }, + { + "name": "osquery_info", + "description": "Top level information about the running version of osquery.", + "url": "https://fleetdm.com/tables/osquery_info", + "platforms": [ + "darwin", + "windows", + "linux", + "chrome" + ], + "evented": false, + "cacheable": false, + "notes": "- On ChromeOS, this table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).", + "examples": "See the version of the currently running osquery.\n\n```\nSELECT version FROM osquery_info; \n```", + "columns": [ + { + "name": "pid", + "description": "Process (or thread/handle) ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "uuid", + "description": "Unique ID provided by the system", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "instance_id", + "description": "Unique, long-lived ID per instance of osquery", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "version", + "description": "osquery toolkit version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "config_hash", + "description": "Hash of the working configuration state", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "config_valid", + "description": "1 if the config was loaded and considered valid, else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "extensions", + "description": "osquery extensions status", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "build_platform", + "description": "osquery toolkit build platform", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "build_distro", + "description": "osquery toolkit platform distribution name (os version)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "start_time", + "description": "UNIX time in seconds when the process started", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "watcher", + "description": "Process (or thread/handle) ID of optional watcher process", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "platform_mask", + "description": "The osquery platform bitmask", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/osquery_info.yml" + }, + { + "name": "osquery_packs", + "description": "Information about the current query packs that are loaded in osquery.", + "url": "https://fleetdm.com/tables/osquery_packs", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See query packs currently active on osquery.\n\n```\nSELECT name FROM osquery_packs WHERE active='1';\n```", + "columns": [ + { + "name": "name", + "description": "The given name for this query pack", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "platform", + "description": "Platforms this query is supported on", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Minimum osquery version that this query will run on", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "shard", + "description": "Shard restriction limit, 1-100, 0 meaning no restriction", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "discovery_cache_hits", + "description": "The number of times that the discovery query used cached values since the last time the config was reloaded", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "discovery_executions", + "description": "The number of times that the discovery queries have been executed since the last time the config was reloaded", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "active", + "description": "Whether this pack is active (the version, platform and discovery queries match) yes=1, no=0.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/osquery_packs.yml" + }, + { + "name": "osquery_registry", + "description": "List the osquery registry plugins.", + "url": "https://fleetdm.com/tables/osquery_registry", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See the list of tables available on this instance of osquery.\n\n```\nSELECT DISTINCT name FROM osquery_registry;\n```", + "columns": [ + { + "name": "registry", + "description": "Name of the osquery registry", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Name of the plugin item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "owner_uuid", + "description": "Extension route UUID (0 for core)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "internal", + "description": "1 If the plugin is internal else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "active", + "description": "1 If this plugin is active else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/osquery_registry.yml" + }, + { + "name": "osquery_schedule", + "description": "Information about the current queries that are scheduled in osquery.", + "url": "https://fleetdm.com/tables/osquery_schedule", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify scheduled queries that have been denylisted by the osquery watchdog.\nThis could indicate queries that required a lot of resources to be executed.\nThey will not be executed again until osquery restarts.\n\n```\nSELECT name, query FROM osquery_schedule WHERE denylisted='1';\n```", + "columns": [ + { + "name": "name", + "description": "The given name for this query", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "query", + "description": "The exact query to run", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "interval", + "description": "The interval in seconds to run this query, not an exact interval", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "executions", + "description": "Number of times the query was executed", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_executed", + "description": "UNIX time stamp in seconds of the last completed execution", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "denylisted", + "description": "1 if the query is denylisted else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "output_size", + "description": "Cumulative total number of bytes generated by the resultant rows of the query", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "wall_time", + "description": "Total wall time in seconds spent executing (deprecated), hidden=True", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "wall_time_ms", + "description": "Total wall time in milliseconds spent executing", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_wall_time_ms", + "description": "Wall time in milliseconds of the latest execution", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user_time", + "description": "Total user time in milliseconds spent executing", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_user_time", + "description": "User time in milliseconds of the latest execution", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "system_time", + "description": "Total system time in milliseconds spent executing", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_system_time", + "description": "System time in milliseconds of the latest execution", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "average_memory", + "description": "Average of the bytes of resident memory left allocated after collecting results", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_memory", + "description": "Resident memory in bytes left allocated after collecting results of the latest execution", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/osquery_schedule.yml" + }, + { + "name": "package_bom", + "description": "The \"bill of materials\" (`.bom`) file in a macOS installer package (`.pkg`) lists all files installed by the package. The `package_bom` osquery table collects the data from the `.bom` files created in `/private/var/db/receipts` by macOS when a `.pkg` file is executed.", + "url": "https://fleetdm.com/tables/package_bom", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "Keeping track of files installed by applications is critical for upholding software management best security practices.\n\nApple’s [installer package documentation](https://developer.apple.com/documentation/xcode/packaging-mac-software-for-distribution)", + "examples": "This query collects the filepath and time of installation for the libVFXCore.dylib (Dynamic Library) file installed as part of Xcode.app:\n\n```\nSELECT filepath,modified_time FROM package_bom WHERE path='/private/var/db/receipts/com.apple.pkg.Xcode.bom' AND filepath LIKE '%libVFXCore.dylib';\n```", + "columns": [ + { + "name": "filepath", + "description": "Package file or directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "Expected user of file or directory", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Expected group of file or directory", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mode", + "description": "Expected permissions", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Expected file size", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "modified_time", + "description": "Timestamp the file was installed", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of package bom", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/package_bom.yml" + }, + { + "name": "package_install_history", + "description": "The `package_install_history` table provides a detailed log of all packages installled on macOS.", + "url": "https://fleetdm.com/tables/package_install_history", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "\nMonitoring the macOS package install history is useful for:\n- Regularly checking for newly installed packages and identifying suspicious software\n- Verifying that only approved packages are installed\n- Creating a Fleet policy to receive alerts for any unauthorized or vulnerable installations\n\nApple’s [installer package documentation](https://developer.apple.com/documentation/xcode/packaging-mac-software-for-distribution)", + "examples": "Basic query:\n\n```\nSELECT name,package_id,version,source,datetime(time,'unixepoch') AS install_time FROM package_install_history WHERE install_time >= datetime('now','-7 days');\n```\n\nThis query fetches the following data for a macOS package:\n- Name\n- Package ID\n- Version\n- Source\n- Install time\n\nThe `WHERE` clause filters the results to show only packages installed in the past 7 days.", + "columns": [ + { + "name": "package_id", + "description": "Label packageIdentifiers", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Label date as UNIX timestamp", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Package display name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Package display version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source", + "description": "Install source: usually the installer process name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "content_type", + "description": "Package content_type (optional)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/package_install_history.yml" + }, + { + "name": "package_receipts", + "description": "macOS package receipt details.", + "url": "https://fleetdm.com/tables/package_receipts", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List the location of receipt files related to installed packages.\n\n```\nSELECT * FROM package_receipts;\n```", + "columns": [ + { + "name": "package_id", + "description": "Package domain identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "package_filename", + "description": "Filename of original .pkg file", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": true + }, + { + "name": "version", + "description": "Installed package version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "location", + "description": "Optional relative install path on volume", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "install_time", + "description": "Timestamp of install time", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "installer_name", + "description": "Name of installer process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of receipt plist", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/package_receipts.yml" + }, + { + "name": "parse_ini", + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "description": "Parse a file as INI configuration.", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "evented": false, + "columns": [ + { + "name": "path", + "description": "Path of the file to read.", + "required": true, + "type": "text" + }, + { + "name": "fullkey", + "description": "Key including any parent keys.", + "type": "text", + "required": false + }, + { + "name": "parent", + "description": "Parent key when keys are nested in the document.", + "required": false, + "type": "text" + }, + { + "name": "key", + "description": "JSON key or array index.", + "required": false, + "type": "text" + }, + { + "name": "value", + "description": "JSON value", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/parse_ini", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/parse_ini.yml" + }, + { + "name": "parse_json", + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "description": "Parses an entire file as JSON. See `parse_jsonl` where multiple JSON documents are supported.", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "evented": false, + "columns": [ + { + "name": "path", + "description": "Path of the file to read.", + "required": true, + "type": "text" + }, + { + "name": "fullkey", + "description": "Same as `key` in this table. See `parse_jsonl` where multiple JSON documents are supported.", + "required": false, + "type": "text" + }, + { + "name": "parent", + "description": "Parent key when keys are nested in the document.", + "required": false, + "type": "text" + }, + { + "name": "key", + "description": "JSON key or array index.", + "required": false, + "type": "text" + }, + { + "name": "value", + "description": "JSON value", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/parse_json", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/parse_json.yml" + }, + { + "name": "parse_jsonl", + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "description": "Parses each line of a file as a separate JSON document. See `parse_json` to treat an entire file as a single JSON document.", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "evented": false, + "columns": [ + { + "name": "path", + "description": "Path of the file to read.", + "required": true, + "type": "text" + }, + { + "name": "fullkey", + "description": "Key including any parent keys or document indices.", + "required": false, + "type": "text" + }, + { + "name": "parent", + "description": "Parent key when keys are nested in the document.", + "required": false, + "type": "text" + }, + { + "name": "key", + "description": "INI key", + "required": false, + "type": "text" + }, + { + "name": "value", + "description": "INI value", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/parse_jsonl", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/parse_jsonl.yml" + }, + { + "name": "parse_xml", + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "description": "Parses a file as an XML document.", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "evented": false, + "columns": [ + { + "name": "path", + "description": "Path of the file to read.", + "required": true, + "type": "text" + }, + { + "name": "fullkey", + "description": "Key including any parent keys.", + "required": false, + "type": "text" + }, + { + "name": "parent", + "description": "Parent key when keys are nested in the document.", + "required": false, + "type": "text" + }, + { + "name": "key", + "description": "XML key", + "required": false, + "type": "text" + }, + { + "name": "value", + "description": "XML value", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/parse_xml", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/parse_xml.yml" + }, + { + "name": "password_policy", + "description": "Password Policies for macOS.", + "url": "https://fleetdm.com/tables/password_policy", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "This policy query will return a 1 if the password policy requires passwords that are 10 characters\nor longer.\n\n```\nSELECT 1 FROM (SELECT cast(lengthtxt as integer(2)) minlength FROM (SELECT SUBSTRING(length, 1, 2) AS lengthtxt FROM (SELECT policy_description, policy_identifier, split(policy_content, '{', 1) AS length FROM password_policy WHERE policy_identifier LIKE '%minLength')) WHERE minlength >= 10);\n``` ", + "columns": [ + { + "name": "uid", + "description": "User ID for the policy. Returns `-1` if the policy applies to all users.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "policy_identifier", + "description": "Policy identifier, such as `ProfilePayload:1d33ef8c-da1c-4534-8458-95a4d43d849e:minLength`.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "policy_content", + "description": "Policy content, such as `policyAttributePassword matches '.{10,}'`.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "policy_description", + "description": "Policy description, such as `Contain at least 10 characters.`", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/password_policy.yml" + }, + { + "name": "patches", + "description": "The `patches` osquery table lists Windows security patch updates.", + "url": "https://fleetdm.com/tables/patches", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "Microsoft creates a support page per hotfix patch. Support pages can be discovered by doing a web browser search for the hotfix ID string (e.g., KB5037663).\n\nMicrosoft documentation for [KB5037663](https://support.microsoft.com/en-us/topic/may-29-2024-kb5037853-os-builds-22621-3672-and-22631-3672-preview-dcf14fd8-84d6-4234-9d5b-784c319cd7cf)\n\nThe `patches` table does not include updates that are applied via Windows Installer / Microsoft Standard Installer packages (.msi) or updates downloaded directly from Windows Update (e.g., Service Packs).\n\n[Windows Installer](https://learn.microsoft.com/en-us/windows/win32/msi/windows-installer-portal)", + "examples": "Basic query:\n\n```\nSELECT * FROM patches;\n```\n\nThis query determines if a specific hotfix patch is installed:\n\n```\nSELECT * FROM patches WHERE hotfix_id='kb5037663';\n```", + "columns": [ + { + "name": "csname", + "description": "The name of the host the patch is installed on.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hotfix_id", + "description": "The KB ID of the patch.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "caption", + "description": "Short description of the patch.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Fuller description of the patch.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fix_comments", + "description": "Additional comments about the patch.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "installed_by", + "description": "The system context in which the patch as installed.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "install_date", + "description": "Indicates when the patch was installed. Lack of a value does not indicate that the patch was not installed.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "installed_on", + "description": "The date when the patch was installed.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/patches.yml" + }, + { + "name": "pci_devices", + "description": "PCI devices active on the host system.", + "url": "https://fleetdm.com/tables/pci_devices", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "This table allows you to list PCI devices. With this query, identify devices with a specific model\nID. This can be useful when trying to identify systems that use common hardware, for example, when\ntrying to target firmware updates or understand similarities between problematic systems.\n\n```\nSELECT driver, model, vendor, vendor_id FROM pci_devices WHERE model_id='0x1001';\n```", + "columns": [ + { + "name": "pci_slot", + "description": "PCI Device used slot", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pci_class", + "description": "PCI Device class", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "driver", + "description": "PCI Device used driver", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor", + "description": "PCI Device vendor", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor_id", + "description": "Hex encoded PCI Device vendor identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model", + "description": "PCI Device model", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model_id", + "description": "Hex encoded PCI Device model identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pci_class_id", + "description": "PCI Device class ID in hex format", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "pci_subclass_id", + "description": "PCI Device subclass in hex format", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "pci_subclass", + "description": "PCI Device subclass", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "subsystem_vendor_id", + "description": "Vendor ID of PCI device subsystem", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "subsystem_vendor", + "description": "Vendor of PCI device subsystem", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "subsystem_model_id", + "description": "Model ID of PCI device subsystem", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "subsystem_model", + "description": "Device description of PCI device subsystem", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/pci_devices.yml" + }, + { + "name": "physical_disk_performance", + "description": "Provides provides raw data from performance counters that monitor hard or fixed disk drives on the system.", + "url": "https://fleetdm.com/tables/physical_disk_performance", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "name", + "description": "Name of the physical disk", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "avg_disk_bytes_per_read", + "description": "Average number of bytes transferred from the disk during read operations", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "avg_disk_bytes_per_write", + "description": "Average number of bytes transferred to the disk during write operations", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "avg_disk_read_queue_length", + "description": "Average number of read requests that were queued for the selected disk during the sample interval", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "avg_disk_write_queue_length", + "description": "Average number of write requests that were queued for the selected disk during the sample interval", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "avg_disk_sec_per_read", + "description": "Average time, in seconds, of a read operation of data from the disk", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "avg_disk_sec_per_write", + "description": "Average time, in seconds, of a write operation of data to the disk", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "current_disk_queue_length", + "description": "Number of requests outstanding on the disk at the time the performance data is collected", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "percent_disk_read_time", + "description": "Percentage of elapsed time that the selected disk drive is busy servicing read requests", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "percent_disk_write_time", + "description": "Percentage of elapsed time that the selected disk drive is busy servicing write requests", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "percent_disk_time", + "description": "Percentage of elapsed time that the selected disk drive is busy servicing read or write requests", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "percent_idle_time", + "description": "Percentage of time during the sample interval that the disk was idle", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/physical_disk_performance.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fphysical_disk_performance.yml&value=name%3A%20physical_disk_performance%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "pipes", + "description": "Named pipes in Windows can be used to provide communication between processes on a computer or between processes on different computers across a network. The `pipes` osquery table lists the named pipes currently running on a Windows computer.", + "url": "https://fleetdm.com/tables/pipes", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "Running the following command at a prompt in PowerShell lists the named pipes currently open on a Windows computer:\n\n```\nPS C:\\Windows\\System32> get-childitem \\\\.\\pipe\\\n```\n\nLinks:\n- Microsoft documentation on [named pipes](https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipes)\n- Discover files linked to processes with Windows [Process Explorer](https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer)\n- Windows [PowerShell](https://learn.microsoft.com/en-us/powershell/scripting/overview?view=powershell-7.4)", + "examples": "This query displays all attributes (columns) for the named pipe enabled by opening PowerShell:\n\n```\nSELECT * FROM pipes WHERE name LIKE '%powershell';\n```", + "columns": [ + { + "name": "pid", + "description": "Process ID of the process to which the pipe belongs", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "Name of the pipe", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "instances", + "description": "Number of instances of the named pipe", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "max_instances", + "description": "The maximum number of instances creatable for this pipe", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "flags", + "description": "The flags indicating whether this pipe connection is a server or client end, and if the pipe for sending messages or bytes", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/pipes.yml" + }, + { + "name": "platform_info", + "description": "The `platform_info` osquery table collects boot platform information from a computer. The `platform_info` table works on Linux, macOS and Windows.", + "url": "https://fleetdm.com/tables/platform_info", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "Links:\n- EFI: https://en.wikipedia.org/wiki/EFI_system_partition \n- iboot: https://en.wikipedia.org/wiki/IBoot \n- UEFI: https://en.wikipedia.org/wiki/UEFI#Classes \n- System booting: https://en.wikipedia.org/wiki/Booting ", + "examples": "Basic query:\n\n```\nSELECT extra,firmware_type,vendor FROM platform_info;\n```\n\nThis query results in a listing of the following attributes on a macOS host running a Windows 11 virtual machine in the Parallels.app:\n\nMac -\n- extra = \"Darwin Kernel Version 23.5.0: Wed May 1 20:14:38 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6020\"\n- firmware_type = \"iboot\"\n- vendor = \"Apple Inc.\"\n\nWindows -\n- extra = \"\"\n- firmware_type = \"uefi\"\n- vendor = \"Parallels International GmbH.\"", + "columns": [ + { + "name": "vendor", + "description": "Platform code vendor", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Platform code version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "date", + "description": "Self-reported platform code update date", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "revision", + "description": "BIOS major and minor revision", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "extra", + "description": "Platform-specific additional information", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "firmware_type", + "description": "The type of firmware (uefi, bios, iboot, openfirmware, unknown).", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "address", + "description": "Relative address of firmware mapping", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux", + "macOS" + ] + }, + { + "name": "size", + "description": "Size in bytes of firmware", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux", + "macOS" + ] + }, + { + "name": "volume_size", + "description": "(Optional) size of firmware volume", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux", + "macOS" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/platform_info.yml" + }, + { + "name": "plist", + "description": "Read and parse a plist file.", + "url": "https://fleetdm.com/tables/plist", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Read the contents of a plist file, formatted into a table\n\n```\nSELECT key, subkey, value FROM plist WHERE path LIKE '/Users/%%/Library/Preferences/com.apple.Terminal.plist';\n```", + "columns": [ + { + "name": "key", + "description": "Preference top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subkey", + "description": "Intermediate key path, includes lists/dicts", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "String value of most CF types", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "(required) read preferences from a plist", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/plist.yml" + }, + { + "name": "pmset", + "platforms": [ + "darwin" + ], + "description": "Retrieves macOS power settings with the `pmset -g` command.", + "columns": [ + { + "name": "getting", + "type": "text", + "required": false, + "description": "Allows specifying a getting option when executing pmset." + }, + { + "name": "json_result", + "type": "text", + "required": false, + "description": "Result of the command in JSON format." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/pmset", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/pmset.yml" + }, + { + "name": "portage_keywords", + "description": "A summary about portage configurations like keywords, mask and unmask.", + "url": "https://fleetdm.com/tables/portage_keywords", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "package", + "description": "Package name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "The version which are affected by the use flags, empty means all", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "keyword", + "description": "The keyword applied to the package", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mask", + "description": "If the package is masked", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "unmask", + "description": "If the package is unmasked", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/portage_keywords.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fportage_keywords.yml&value=name%3A%20portage_keywords%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "portage_packages", + "description": "List of currently installed packages.", + "url": "https://fleetdm.com/tables/portage_packages", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "package", + "description": "Package name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "The version which are affected by the use flags, empty means all", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "slot", + "description": "The slot used by package", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "build_time", + "description": "Unix time when package was built", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "repository", + "description": "From which repository the ebuild was used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eapi", + "description": "The eapi for the ebuild", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "The size of the package", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "world", + "description": "If package is in the world file", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/portage_packages.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fportage_packages.yml&value=name%3A%20portage_packages%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "portage_use", + "description": "List of enabled portage USE values for specific package.", + "url": "https://fleetdm.com/tables/portage_use", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "package", + "description": "Package name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "The version of the installed package", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "use", + "description": "USE flag which has been enabled for package", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/portage_use.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fportage_use.yml&value=name%3A%20portage_use%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "power_sensors", + "description": "Machine power (currents, voltages, wattages, etc) sensors.", + "url": "https://fleetdm.com/tables/power_sensors", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "Returns useful results on Intel Macs only.", + "examples": "See the total power usage of an Intel Mac.\n\n```\nSELECT * FROM power_sensors WHERE key='PSTR';\n```", + "columns": [ + { + "name": "key", + "description": "The SMC key on macOS", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "category", + "description": "The sensor category: currents, voltage, wattage", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Name of power source", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Power in Watts", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/power_sensors.yml" + }, + { + "name": "powershell_events", + "description": "Powershell script blocks reconstructed to their full script content, this table requires script block logging to be enabled.", + "url": "https://fleetdm.com/tables/powershell_events", + "platforms": [ + "windows" + ], + "evented": true, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from powershell_events where cosine_similarity < 0.25;\n```", + "columns": [ + { + "name": "time", + "description": "Timestamp the event was received by the osquery event publisher", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "datetime", + "description": "System time at which the Powershell script event occurred", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "script_block_id", + "description": "The unique GUID of the powershell script to which this block belongs", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "script_block_count", + "description": "The total number of script blocks for this script", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "script_text", + "description": "The text content of the Powershell script", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "script_name", + "description": "The name of the Powershell script", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "script_path", + "description": "The path for the Powershell script", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cosine_similarity", + "description": "How similar the Powershell script is to a provided 'normal' character frequency", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/powershell_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fpowershell_events.yml&value=name%3A%20powershell_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "preferences", + "description": "macOS defaults and managed preferences.", + "url": "https://fleetdm.com/tables/preferences", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "- Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)\n\n- The `value` column will be empty for keys that contain binary data.", + "examples": "This table reads a huge amount of preferences, including on third-party apps.\n\n```\nSELECT * FROM users CROSS JOIN preferences USING (username);\n```", + "columns": [ + { + "name": "domain", + "description": "Application ID usually in com.name.product format", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "key", + "description": "Preference top-level key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "subkey", + "description": "Intemediate key path, includes lists/dicts", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "String value of most CF types", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "forced", + "description": "1 if the value is forced/managed, else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "username", + "description": "(optional) read preferences for a specific user", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "host", + "description": "'current' or 'any' host, where 'current' takes precedence", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/preferences.yml" + }, + { + "name": "prefetch", + "description": "Prefetch files show metadata related to file execution.", + "url": "https://fleetdm.com/tables/prefetch", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from prefetch;\n```", + "columns": [ + { + "name": "path", + "description": "Prefetch file path.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "filename", + "description": "Executable filename.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hash", + "description": "Prefetch CRC hash.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_run_time", + "description": "Most recent time application was run.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "other_run_times", + "description": "Other execution times in prefetch file.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "run_count", + "description": "Number of times the application has been run.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Application file size.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "volume_serial", + "description": "Volume serial number.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "volume_creation", + "description": "Volume creation time.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "accessed_files_count", + "description": "Number of files accessed.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "accessed_directories_count", + "description": "Number of directories accessed.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "accessed_files", + "description": "Files accessed by application within ten seconds of launch.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "accessed_directories", + "description": "Directories accessed by application within ten seconds of launch.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/prefetch.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fprefetch.yml&value=name%3A%20prefetch%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "privacy_preferences", + "description": "Information on Chrome features that can affect a user's privacy, available from the [chrome.privacy APIs](https://developer.chrome.com/docs/extensions/reference/privacy/)", + "platforms": [ + "chrome" + ], + "evented": false, + "columns": [ + { + "name": "network_prediction_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "web_rtc_ip_handling_policy", + "description": "One of \"default\", \"default_public_and_private_interfaces\", \"default_public_interface_only\", or \"disable_non_proxied_udp\" * Available for Chrome 48+", + "required": false, + "type": "text" + }, + { + "name": "autofill_address_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "autofill_credit_card_enabled", + "description": "1 if enabled else 0 * Available for Chrome 70+", + "required": false, + "type": "integer" + }, + { + "name": "autofill_enabled", + "description": "1 if enabled else 0 - * Deprecated since Chrome 70, please use privacy.services.autofillAddressEnabled and privacy.services.autofillCreditCardEnabled. This currently remains for backward compatibility and will be removed in the future.", + "required": false, + "type": "integer" + }, + { + "name": "save_passwords_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "safe_browsing_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "safe_browsing_extended_reporting_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "search_suggest_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "spelling_service_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "translation_service_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "ad_measurement_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "do_not_track_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "fledge_enabled", + "description": "1 if enabled else 0 * Available for Chrome 111+", + "required": false, + "type": "integer" + }, + { + "name": "hyperlink_auditing_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "privacy_sandbox_enabled", + "description": "1 if enabled else 0 - * Available for Chrome 90+ Deprecated since Chrome 111, see https://developer.chrome.com/docs/extensions/reference/privacy/#property-websites-privacySandboxEnabled", + "required": false, + "type": "integer" + }, + { + "name": "protected_content_enabled", + "description": "1 if enabled else 0 - * Windows and ChromeOS only", + "required": false, + "type": "integer" + }, + { + "name": "referrers_enabled", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "third_party_cookies_allowed", + "description": "1 if enabled else 0", + "required": false, + "type": "integer" + }, + { + "name": "topics_enabled", + "description": "1 if enabled else 0 * Available for Chrome 111+", + "required": false, + "type": "integer" + } + ], + "notes": "- This table is not a core osquery table. This table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).", + "url": "https://fleetdm.com/tables/privacy_preferences", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/privacy_preferences.yml" + }, + { + "name": "process_envs", + "description": "A key/value table of environment variables for each process.", + "url": "https://fleetdm.com/tables/process_envs", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See what PATH is configured as an environment variable.\n\n```\nSELECT DISTINCT value, key FROM process_envs WHERE key='PATH';\n```", + "columns": [ + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "key", + "description": "Environment variable name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Environment variable value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/process_envs.yml" + }, + { + "name": "process_etw_events", + "description": "Windows process execution events.", + "url": "https://fleetdm.com/tables/process_etw_events", + "platforms": [ + "windows" + ], + "evented": true, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from process_etw_events WHERE datetime BETWEEN '2022-11-18 16:40:00' AND '2022-11-18 16:50:00';\n```", + "columns": [ + { + "name": "type", + "description": "Event Type (ProcessStart, ProcessStop)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ppid", + "description": "Parent Process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "session_id", + "description": "Session ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "flags", + "description": "Process Flags", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exit_code", + "description": "Exit Code - Present only on ProcessStop events", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of executed binary", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cmdline", + "description": "Command Line", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "username", + "description": "User rights - primary token username", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "token_elevation_type", + "description": "Primary token elevation type - Present only on ProcessStart events", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "token_elevation_status", + "description": "Primary token elevation status - Present only on ProcessStart events", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mandatory_label", + "description": "Primary token mandatory label sid - Present only on ProcessStart events", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "datetime", + "description": "Event timestamp in DATETIME format", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time_windows", + "description": "Event timestamp in Windows format", + "type": "bigint", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Event timestamp in Unix format", + "type": "bigint", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "header_pid", + "description": "Process ID of the process reporting the event", + "type": "bigint", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "process_sequence_number", + "description": "Process Sequence Number - Present only on ProcessStart events", + "type": "bigint", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "parent_process_sequence_number", + "description": "Parent Process Sequence Number - Present only on ProcessStart events", + "type": "bigint", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/process_etw_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fprocess_etw_events.yml&value=name%3A%20process_etw_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "process_events", + "description": "Track time/action process executions.", + "url": "https://fleetdm.com/tables/process_events", + "platforms": [ + "darwin", + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of executed file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mode", + "description": "File mode permissions", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cmdline", + "description": "Command line arguments (argv)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cmdline_size", + "description": "Actual size (bytes) of command line arguments", + "type": "bigint", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "env", + "description": "Environment variables delimited by spaces", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "env_count", + "description": "Number of environment variables", + "type": "bigint", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "env_size", + "description": "Actual size (bytes) of environment list", + "type": "bigint", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "cwd", + "description": "The process current working directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "auid", + "description": "Audit User ID at process start", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "User ID at process start", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "euid", + "description": "Effective user ID at process start", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Group ID at process start", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "egid", + "description": "Effective group ID at process start", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "owner_uid", + "description": "File owner user ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "owner_gid", + "description": "File owner group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "atime", + "description": "File last access in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mtime", + "description": "File modification in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ctime", + "description": "File last metadata change in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "btime", + "description": "File creation in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "overflows", + "description": "List of structures that overflowed", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Process parent's PID, or -1 if cannot be determined.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uptime", + "description": "Time of execution in system uptime", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "status", + "description": "OpenBSM Attribute: Status of the process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "fsuid", + "description": "Filesystem user ID at process start", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "suid", + "description": "Saved user ID at process start", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "fsgid", + "description": "Filesystem group ID at process start", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "sgid", + "description": "Saved group ID at process start", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "syscall", + "description": "Syscall name: fork, vfork, clone, execve, execveat", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/process_events.yml" + }, + { + "name": "process_file_events", + "description": "A File Integrity Monitor implementation using the audit service.", + "url": "https://fleetdm.com/tables/process_file_events", + "platforms": [ + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "This table will only include events for changes and files in directories that existed before the fleetd agent starts.", + "columns": [ + { + "name": "operation", + "description": "Operation type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ppid", + "description": "Parent process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "executable", + "description": "The executable path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "partial", + "description": "True if this is a partial event (i.e.: this process existed before we\nstarted osquery)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cwd", + "description": "The current working directory of the process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "The path associated with the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dest_path", + "description": "The canonical path associated with the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "The uid of the process performing the action", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "The gid of the process performing the action", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "auid", + "description": "Audit user ID of the process using the file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "euid", + "description": "Effective user ID of the process using the file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "egid", + "description": "Effective group ID of the process using the file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fsuid", + "description": "Filesystem user ID of the process using the file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fsgid", + "description": "Filesystem group ID of the process using the file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "suid", + "description": "Saved user ID of the process using the file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sgid", + "description": "Saved group ID of the process using the file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uptime", + "description": "Time of execution in system uptime", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/process_file_events.yml" + }, + { + "name": "process_memory_map", + "description": "Process memory mapped files and pseudo device/regions.", + "url": "https://fleetdm.com/tables/process_memory_map", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See the memory ranges with write permissions assigned to processes.\n\n```\nSELECT * FROM process_memory_map WHERE permissions LIKE '%w%';\n```", + "columns": [ + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "start", + "description": "Virtual start address (hex)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "end", + "description": "Virtual end address (hex)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "permissions", + "description": "r=read, w=write, x=execute, p=private (cow)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "offset", + "description": "Offset into mapped path", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "device", + "description": "MA:MI Major/minor device ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inode", + "description": "Mapped path inode, 0 means uninitialized (BSS)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to mapped file or mapped type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pseudo", + "description": "1 If path is a pseudo path, else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/process_memory_map.yml" + }, + { + "name": "process_namespaces", + "description": "Linux namespaces for processes running on the host system.", + "url": "https://fleetdm.com/tables/process_namespaces", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from process_namespaces where pid = 1\n```", + "columns": [ + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "cgroup_namespace", + "description": "cgroup namespace inode", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ipc_namespace", + "description": "ipc namespace inode", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mnt_namespace", + "description": "mnt namespace inode", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "net_namespace", + "description": "net namespace inode", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_namespace", + "description": "pid namespace inode", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user_namespace", + "description": "user namespace inode", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uts_namespace", + "description": "uts namespace inode", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/process_namespaces.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fprocess_namespaces.yml&value=name%3A%20process_namespaces%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "process_open_files", + "description": "File descriptors for each process.", + "url": "https://fleetdm.com/tables/process_open_files", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See what processes have which files open, for example, what processes are\ncurrently interacting with files with 1Password in their name?\n\n```\nSELECT f.path file_path, p.path process_path FROM process_open_files f JOIN processes p ON p.pid = f.pid WHERE f.path LIKE '%1Password%';\n```", + "columns": [ + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "fd", + "description": "Process-specific file descriptor number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Filesystem path of descriptor", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/process_open_files.yml" + }, + { + "name": "process_open_pipes", + "description": "Pipes and partner processes for each process.", + "url": "https://fleetdm.com/tables/process_open_pipes", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from process_open_pipes\n```", + "columns": [ + { + "name": "pid", + "description": "Process ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fd", + "description": "File descriptor", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mode", + "description": "Pipe open mode (r/w)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inode", + "description": "Pipe inode number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Pipe Type: named vs unnamed/anonymous", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "partner_pid", + "description": "Process ID of partner process sharing a particular pipe", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "partner_fd", + "description": "File descriptor of shared pipe at partner's end", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "partner_mode", + "description": "Mode of shared pipe at partner's end", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/process_open_pipes.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fprocess_open_pipes.yml&value=name%3A%20process_open_pipes%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "process_open_sockets", + "description": "Processes which have open network sockets on the system.", + "url": "https://fleetdm.com/tables/process_open_sockets", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "This table allows you to see network activity by process. With this query, list all connections\nmade to or from a process, excluding connections to localhost and\n[RFC1918](https://en.wikipedia.org/wiki/Private_network) IP addresses.\n\n```\nSELECT pos.local_port, pos.remote_port, pos.remote_address, p.pid, p.path FROM process_open_sockets pos JOIN processes p ON pos.pid = p.pid WHERE remote_address NOT LIKE '192.168%' AND remote_address NOT LIKE '10.%' AND remote_address NOT LIKE '172.16.%' AND remote_address NOT LIKE '127.%' AND remote_address!='0.0.0.0' AND remote_address NOT LIKE 'fe80%' AND remote_port!='0';\n```", + "columns": [ + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fd", + "description": "Socket file descriptor number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "socket", + "description": "Socket handle or inode number", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "family", + "description": "Network protocol (IPv4, IPv6)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protocol", + "description": "Transport protocol (TCP/UDP)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_address", + "description": "Socket local address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_address", + "description": "Socket remote address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_port", + "description": "Socket local port", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_port", + "description": "Socket remote port", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "For UNIX sockets (family=AF_UNIX), the domain path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "TCP socket state", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows", + "Linux", + "macOS" + ] + }, + { + "name": "net_namespace", + "description": "The inode number of the network namespace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/process_open_sockets.yml" + }, + { + "name": "processes", + "description": "All running processes on the host system.", + "url": "https://fleetdm.com/tables/processes", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "List executables listening on network ports.\n\n```\nSELECT l.port, l.pid, p.name, p.path FROM listening_ports l JOIN processes p USING (pid); \n```", + "columns": [ + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "The process path or shorthand argv[0]", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to executed binary", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cmdline", + "description": "Complete argv", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "Process state", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cwd", + "description": "Process current working directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "root", + "description": "Process virtual root directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "Unsigned user ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Unsigned group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "euid", + "description": "Unsigned effective user ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "egid", + "description": "Unsigned effective group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "suid", + "description": "Unsigned saved user ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sgid", + "description": "Unsigned saved group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "on_disk", + "description": "The process path exists yes=1, no=0, unknown=-1", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "wired_size", + "description": "Bytes of unpageable memory used by process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "resident_size", + "description": "Bytes of private memory used by process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "total_size", + "description": "Total virtual memory size", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user_time", + "description": "CPU time in milliseconds spent in user space", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "system_time", + "description": "CPU time in milliseconds spent in kernel space", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "disk_bytes_read", + "description": "Bytes read from disk", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "disk_bytes_written", + "description": "Bytes written to disk", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "start_time", + "description": "Process start time in seconds since Epoch, in case of error -1", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "parent", + "description": "Process parent's PID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pgroup", + "description": "Process group", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "threads", + "description": "Number of threads used by process", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "nice", + "description": "Process nice level (-20 to 20, default 0)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "elevated_token", + "description": "Process uses elevated token yes=1, no=0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "secure_process", + "description": "Process is secure (IUM) yes=1, no=0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "protection_type", + "description": "The protection type of the process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "virtual_process", + "description": "Process is virtual (e.g. System, Registry, vmmem) yes=1, no=0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "elapsed_time", + "description": "Elapsed time in seconds this process has been running.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "handle_count", + "description": "Total number of handles that the process has open. This number is the sum of the handles currently opened by each thread in the process.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "percent_processor_time", + "description": "Returns elapsed time that all of the threads of this process used the processor to execute instructions in 100 nanoseconds ticks.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "upid", + "description": "A 64bit pid that is never reused. Returns -1 if we couldn't gather them from the system.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "uppid", + "description": "The 64bit parent pid that is never reused. Returns -1 if we couldn't gather them from the system.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "cpu_type", + "description": "Indicates the specific processor designed for installation.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "cpu_subtype", + "description": "Indicates the specific processor on which an entry may be used.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "translated", + "description": "Indicates whether the process is running under the Rosetta Translation Environment, yes=1, no=0, error=-1.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "cgroup_path", + "description": "The full hierarchical path of the process's control group", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/processes.yml" + }, + { + "name": "programs", + "description": "The `programs` table lists applications installed via Windows Installer from a package.", + "url": "https://fleetdm.com/tables/programs", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "This table includes references for applications:\n\n- downloaded directly from websites and installed by an end user like Google Chrome or Notepad++\n- installed via automation frameworks like winget or Chocolatey\n- installed via command line in cmd or PowerShell\n\nLinks:\n\n- [Windows Installer](https://learn.microsoft.com/en-us/windows/win32/msi/windows-installer-portal)\n- [Chocolatey](https://chocolatey.org/)\n- The Fleet `chocolatey_packages`[table](https://fleetdm.com/tables/chocolatey_packages)\n- [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/)\n- [winget.run](https://winget.run/)\n- Windows [cmd](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd)\n- Windows [PowerShell](https://learn.microsoft.com/en-us/powershell/scripting/overview?view=powershell-7.4)\n- [PowerShell primer](https://www.howtogeek.com/devops/how-to-get-started-with-learning-powershell/)\n- [Notepad++](https://notepad-plus-plus.org/)", + "examples": "Basic query:\n\n```\nSELECT * FROM programs;\n```\n\nThis query determines if a specific version of Google Chrome.exe is installed:\n\n```\nSELECT name,version FROM programs WHERE name='Google Chrome' AND version='125.0.6422.142';\n```", + "columns": [ + { + "name": "name", + "description": "Commonly used product name.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Product version information.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "install_location", + "description": "The installation location directory of the product.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "install_source", + "description": "The installation source of the product.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "language", + "description": "The language of the product.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "publisher", + "description": "Name of the product supplier.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uninstall_string", + "description": "Path and filename of the uninstaller.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "install_date", + "description": "Date that this product was installed on the system. ", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "identifying_number", + "description": "Product identification such as a serial number on software, or a die number on a hardware chip.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/programs.yml" + }, + { + "name": "prometheus_metrics", + "description": "Retrieve metrics from a Prometheus server.", + "url": "https://fleetdm.com/tables/prometheus_metrics", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "target_name", + "description": "Address of prometheus target", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "metric_name", + "description": "Name of collected Prometheus metric", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "metric_value", + "description": "Value of collected Prometheus metric", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "timestamp_ms", + "description": "Unix timestamp of collected data in MS", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/prometheus_metrics.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fprometheus_metrics.yml&value=name%3A%20prometheus_metrics%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "puppet_info", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "Information on the last [Puppet](https://puppet.com/) run. This table uses data from the `last_run_report` that Puppet creates.", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "evented": false, + "examples": "List all the information available about the last Puppet run.\n\n```\nSELECT * FROM puppet_info;\n```", + "columns": [ + { + "name": "cached_catalog_status", + "description": "The status of Puppet catalogs cached on the system.", + "required": false, + "type": "text" + }, + { + "name": "catalog_uuid", + "description": "The [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) of the catalog downloaded by Puppet.", + "required": false, + "type": "text" + }, + { + "name": "code_id", + "description": "The `code_id` links the catalog with the compile-time version of file resources using the `puppet:///` URI.", + "required": false, + "type": "text" + }, + { + "name": "configuration_version", + "description": "The version of the Puppet configuration.", + "required": false, + "type": "text" + }, + { + "name": "corrective_change", + "description": "A corrective change is triggered when Puppet detects a discrepency between the current state and the expected state of a value.", + "required": false, + "type": "text" + }, + { + "name": "environment", + "description": "The environment name.", + "required": false, + "type": "text" + }, + { + "name": "host", + "description": "The host on which Puppet is used.", + "required": false, + "type": "text" + }, + { + "name": "kind", + "description": "Kind of Puppet run.", + "required": false, + "type": "text" + }, + { + "name": "master_used", + "description": "The Puppet server used.", + "required": false, + "type": "text" + }, + { + "name": "noop", + "description": "Indicates if Puppet was run in [noop](https://puppet.com/docs/puppet/latest/metaparameter.html#noop) mode.", + "required": false, + "type": "text" + }, + { + "name": "noop_pending", + "description": "Items pending from a [noop](https://puppet.com/docs/puppet/latest/metaparameter.html#noop) run.", + "required": false, + "type": "text" + }, + { + "name": "puppet_version", + "description": "The version of Puppet used during the last run.", + "required": false, + "type": "text" + }, + { + "name": "report_format", + "description": "The format the Puppet report was exported as.", + "required": false, + "type": "text" + }, + { + "name": "status", + "description": "The status of Puppet on this system.", + "required": false, + "type": "text" + }, + { + "name": "time", + "description": "The time of the last Puppet run.", + "required": false, + "type": "text" + }, + { + "name": "transaction_completed", + "description": "Indicates if the transaction completed or not.", + "required": false, + "type": "text" + }, + { + "name": "transaction_uuid", + "description": "The [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) of the transaction.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/puppet_info", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/puppet_info.yml" + }, + { + "name": "puppet_logs", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "Outputs [Puppet](https://puppet.com/) logs from the last run.", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "evented": false, + "examples": "List Puppet logs that are of a level of anything but informational.\n\n```\nSELECT * FROM puppet_logs WHERE level!='info';\n```", + "columns": [ + { + "name": "level", + "description": "The level of the log item (info, error, etc).", + "required": false, + "type": "text" + }, + { + "name": "message", + "description": "The log message content.", + "required": false, + "type": "text" + }, + { + "name": "source", + "description": "The source of the log item.", + "required": false, + "type": "text" + }, + { + "name": "time", + "description": "The time at which this item was logged.", + "required": false, + "type": "text" + }, + { + "name": "file", + "description": "The file from which osquery read this log.", + "required": false, + "type": "text" + }, + { + "name": "line", + "description": "The line from which this log item was read.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/puppet_logs", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/puppet_logs.yml" + }, + { + "name": "puppet_state", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).", + "description": "State of every resource [Puppet](https://puppet.com/) is managing. This table uses data from the `last_run_report` that Puppet creates.", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "evented": false, + "examples": "List resources that failed or took over a minute to evaluate.\n\n```\nSELECT * FROM puppet_state WHERE failed='true' OR evaluation_time|-'60';\n```", + "columns": [ + { + "name": "title", + "description": "The name of the resource.", + "required": false, + "type": "text" + }, + { + "name": "file", + "description": "The file that contains the resource.", + "required": false, + "type": "text" + }, + { + "name": "line", + "description": "The line on which the resource is specified.", + "required": false, + "type": "text" + }, + { + "name": "resource", + "description": "The resource and its title as `Type[title]`.", + "required": false, + "type": "text" + }, + { + "name": "resource_type", + "description": "The resource type.", + "required": false, + "type": "text" + }, + { + "name": "evaluation_time", + "description": "The amount of seconds it took to evaluate the resource.", + "required": false, + "type": "text" + }, + { + "name": "failed", + "description": "If Puppet failed to evaluate this resource, this column is `true`.", + "required": false, + "type": "text" + }, + { + "name": "changed", + "description": "If `change_count` is above `0`, this is `true`.", + "required": false, + "type": "text" + }, + { + "name": "out_of_sync", + "description": "If `out_of_sync_count` is above `0`, this is `true`.", + "required": false, + "type": "text" + }, + { + "name": "skipped", + "description": "True if this resource was skipped.", + "required": false, + "type": "text" + }, + { + "name": "change_count", + "description": "The count of changes to be performed.", + "required": false, + "type": "text" + }, + { + "name": "out_of_sync_count", + "description": "The number of properties that are out of sync", + "required": false, + "type": "text" + }, + { + "name": "corrective_change", + "description": "True if a change on the system caused unexpected changes between two Puppet runs.", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/puppet_state", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/puppet_state.yml" + }, + { + "name": "pwd_policy", + "platforms": [ + "darwin" + ], + "description": "Password Policy (e.g., max failed password attempts).", + "columns": [ + { + "name": "max_failed_attempts", + "type": "integer", + "required": false, + "description": "The account lockout threshold specifies the amount of times a user can enter an incorrect password before a lockout will occur. Ensure that a lockout threshold is part of the password policy on the computer." + }, + { + "name": "expires_every_n_days", + "type": "integer", + "required": false, + "description": "How many days for a new password to expire." + }, + { + "name": "days_to_expiration", + "type": "integer", + "required": false, + "description": "How many days are left for the expiration of the current password." + }, + { + "name": "history_depth", + "type": "integer", + "required": false, + "description": "This parameter indicates the depth of password history which a new password can't be identical to." + }, + { + "name": "min_mixed_case_characters", + "type": "integer", + "required": false, + "description": "This parameter indicates the minimum number of mixed characters in a password." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/pwd_policy", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/pwd_policy.yml" + }, + { + "name": "python_packages", + "description": "Python packages installed in a system.", + "url": "https://fleetdm.com/tables/python_packages", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List the versions of pip installed.\n\n```\nSELECT author, name, summary, version FROM python_packages WHERE name='pip';\n```", + "columns": [ + { + "name": "name", + "description": "Package display name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Package-supplied version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "summary", + "description": "Package-supplied summary", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "author", + "description": "Optional package author", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "license", + "description": "License under which package is launched", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path at which this module resides", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "directory", + "description": "Directory where Python modules are located", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/python_packages.yml" + }, + { + "name": "quicklook_cache", + "description": "Files and thumbnails within macOS's Quicklook Cache.", + "url": "https://fleetdm.com/tables/quicklook_cache", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "columns": [ + { + "name": "path", + "description": "Path of file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "rowid", + "description": "Quicklook file rowid key", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fs_id", + "description": "Quicklook file fs_id key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "volume_id", + "description": "Parsed volume ID from fs_id", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inode", + "description": "Parsed file ID (inode) from fs_id", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mtime", + "description": "Parsed version date field", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Parsed version size field", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "label", + "description": "Parsed version 'gen' field", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_hit_date", + "description": "Apple date format for last thumbnail cache hit", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hit_count", + "description": "Number of cache hits on thumbnail", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "icon_mode", + "description": "Thumbnail icon mode", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cache_path", + "description": "Path to cache data", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/quicklook_cache.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fquicklook_cache.yml&value=name%3A%20quicklook_cache%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "registry", + "description": "The Windows Registry is a database that stores Windows application data and low-level Windows settings like driver, security, service, system and user information. The `registry` osquery table expresses the data in the Windows Registry.", + "url": "https://fleetdm.com/tables/registry", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "The `registry` table is ideal for use in Fleet policies and queries because of the critical operating system and application data stored in the Windows Registry.\n\nLinks:\n\n- [Windows Registry](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry)\n- [Fleet Windows MDM Setup](https://fleetdm.com/guides/windows-mdm-setup)\n- [Windows Firewall](https://learn.microsoft.com/en-us/windows/security/operating-system-security/network-security/windows-firewall/)", + "examples": "This query returns the date a Windows Host was enrolled in Fleet:\n\n```\nSELECT strftime('%Y-%m-%d %H:%M:%S', mtime, 'unixepoch') AS enroll_time FROM registry WHERE path LIKE 'HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Enrollments\\%%\\DeviceEnroller';\n```\n\nThis query returns the state of the configurable profiles (i.e., domain, public, standard) in the Windows firewall settings (a value of 1 means the firewall is enabled for the profile):\n\n```\nWITH profiles AS (\nSELECT SPLIT(KEY, '\\', 7) AS enabled,name,data,'profile' AS grpkey\nFROM registry r\nWHERE r.path IN (\n'\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\DomainProfile\\EnableFirewall', \n'\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\PublicProfile\\EnableFirewall',\n'\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile\\EnableFirewall'\n )\n),\nfirewall AS (\nSELECT\n MAX(CASE WHEN enabled='DomainProfile' THEN DATA END) AS domain_enabled,\n MAX(CASE WHEN enabled='PublicProfile' THEN DATA END) AS public_enabled,\n MAX(CASE WHEN enabled='StandardProfile' THEN DATA END) AS standard_enabled\nFROM profiles\nGROUP BY grpkey\n)\nSELECT *\nFROM firewall;\n```", + "columns": [ + { + "name": "key", + "description": "Name of the key to search for", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Full path to the value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "Name of the registry value entry", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Type of the registry value, or 'subkey' if item is a subkey", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "data", + "description": "Data content of registry value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mtime", + "description": "timestamp of the most recent registry write", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/registry.yml" + }, + { + "name": "routes", + "description": "The active route table for the host system.", + "url": "https://fleetdm.com/tables/routes", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "Identify static routes\n\n```\nSELECT destination, interface, type FROM routes WHERE type='static';\n```", + "columns": [ + { + "name": "destination", + "description": "Destination IP address", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "netmask", + "description": "Netmask length", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gateway", + "description": "Route gateway", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source", + "description": "Route source", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "flags", + "description": "Flags to describe route", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "interface", + "description": "Route local interface", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mtu", + "description": "Maximum Transmission Unit for the route", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "metric", + "description": "Cost of route. Lowest is preferred", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Type of route", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hopcount", + "description": "Max hops expected", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux", + "macOS" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/routes.yml" + }, + { + "name": "rpm_package_files", + "description": "RPM packages that are currently installed on the host system.", + "url": "https://fleetdm.com/tables/rpm_package_files", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "package", + "description": "RPM package name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "path", + "description": "File path within the package", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "username", + "description": "File default username from info DB", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "groupname", + "description": "File default groupname from info DB", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mode", + "description": "File permissions mode from info DB", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Expected file size in bytes from RPM info DB", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha256", + "description": "SHA256 file digest from RPM info DB", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/rpm_package_files.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Frpm_package_files.yml&value=name%3A%20rpm_package_files%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "rpm_packages", + "description": "RPM packages that are currently installed on the host system.", + "url": "https://fleetdm.com/tables/rpm_packages", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": true, + "notes": "", + "columns": [ + { + "name": "name", + "description": "RPM package name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "version", + "description": "Package version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "release", + "description": "Package release", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "source", + "description": "Source RPM package name (optional)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Package size in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sha1", + "description": "SHA1 hash of the package contents", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "arch", + "description": "Architecture(s) supported", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "epoch", + "description": "Package epoch value", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "install_time", + "description": "When the package was installed", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor", + "description": "Package vendor", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "package_group", + "description": "Package group", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "mount_namespace_id", + "description": "Mount namespace id", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/rpm_packages.yml" + }, + { + "name": "running_apps", + "description": "macOS applications currently running on the host system.", + "url": "https://fleetdm.com/tables/running_apps", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List all running applications. Filter on is_active='1' to see the application\nthat currently has focus.\n\n```\nSELECT * FROM running_apps;\n```", + "columns": [ + { + "name": "pid", + "description": "The pid of the application", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "bundle_identifier", + "description": "The bundle identifier of the application", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "is_active", + "description": "(DEPRECATED)", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/running_apps.yml" + }, + { + "name": "safari_extensions", + "description": "Safari extensions add functionality to Safari.app, the native web browser in macOS. The `safari_extensions` table collects all Safari extensions installed on a Mac.", + "url": "https://fleetdm.com/tables/safari_extensions", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "Because Safari data is intentionally isolated for each macOS user to maintain privacy, this query requires a `JOIN` operation.\n\nQuery explanation:\n\n- The `safari_extensions` table has a row for each installed extension\n- Each row has a column with the `uid` of the user who installed the extension\n- Each `uid` from the `safari_extensions` table is matched in the `users` table to collect Safari extensions in the output data for all user accounts on the Mac by the `JOIN`\n\nLinks:\n\n- Apple dcoumentaion on Safari Extensions: https://support.apple.com/en-us/102343\n- CROSS JOIN SQLite tutorial: https://www.sqlitetutorial.net/sqlite-cross-join/\n- [Fleet documentation on joining against the `users` table](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)\n- Fleet users table: https://fleetdm.com/tables/users", + "examples": "Collect Safari extensions for all Mac users:\n\n```\nSELECT * FROM users CROSS JOIN safari_extensions USING (uid);\n```", + "columns": [ + { + "name": "uid", + "description": "The local user that owns the extension", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "Extension display name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "identifier", + "description": "Extension identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Extension long version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sdk", + "description": "Bundle SDK used to compile extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "update_url", + "description": "Extension-supplied update URI", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "author", + "description": "Optional extension author", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "developer_id", + "description": "Optional developer identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Optional extension description text", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to extension XAR bundle", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bundle_version", + "description": "The version of the build that identifies an iteration of the bundle", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "copyright", + "description": "A human-readable copyright notice for the bundle", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "extension_type", + "description": "Extension Type: WebOrAppExtension or LegacyExtension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/safari_extensions.yml" + }, + { + "name": "sandboxes", + "description": "macOS application sandboxes container details.", + "url": "https://fleetdm.com/tables/sandboxes", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "columns": [ + { + "name": "label", + "description": "UTI-format bundle or label ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user", + "description": "Sandbox owner", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enabled", + "description": "Application sandboxings enabled on container", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "build_id", + "description": "Sandbox-specific identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bundle_path", + "description": "Application bundle used by the sandbox", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to sandbox container directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/sandboxes.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fsandboxes.yml&value=name%3A%20sandboxes%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "scheduled_tasks", + "description": "The Windows Task Scheduler tracks and performs automated tasks on a Windows device. The `scheduled_tasks` table collects the data from the Windows Task Scheduler.", + "url": "https://fleetdm.com/tables/scheduled_tasks", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "Many automated tasks are added to the Task Scheduler by Windows itself, however, administrators can also customize the Task Scheduler. Scheduled tasks are analogous to Launch Daemons and Launch Agents used on Linux or macOS. Because automation is a potential vector for malicious activity, monitoring the Windows Task Scheduler may be critical in an enterprise environment.\n\n[Windows Task Scheduler](https://learn.microsoft.com/en-us/windows/win32/taskschd/about-the-task-scheduler)", + "examples": "This query collects all tasks that are enabled but have not run:\n\n```\nSELECT * FROM scheduled_tasks WHERE enabled='1' AND last_run_message='The task has not yet run.';\n```", + "columns": [ + { + "name": "name", + "description": "Name of the scheduled task", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "action", + "description": "Actions executed by the scheduled task", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to the executable to be run", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enabled", + "description": "Whether or not the scheduled task is enabled", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "State of the scheduled task", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hidden", + "description": "Whether or not the task is visible in the UI", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_run_time", + "description": "Timestamp the task last ran", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "next_run_time", + "description": "Timestamp the task is scheduled to run next", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_run_message", + "description": "Exit status message of the last task run", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_run_code", + "description": "Exit status code of the last task run", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/scheduled_tasks.yml" + }, + { + "name": "screenlock", + "description": "Returns if the screen locks automatically and the time, in seconds, it takes until the screen is locked automatically while idle. For macOS, this table will return no results if osquery is running as root.", + "url": "https://fleetdm.com/tables/screenlock", + "platforms": [ + "darwin", + "chrome" + ], + "evented": false, + "cacheable": false, + "notes": "- For macOS, this only fetches results for osquery's current logged-in user context. The user must also have recently logged in.\n\n- For ChromeOS, this table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).\n\n- For ChromeOS, this table is only available for Chrome 73+.", + "columns": [ + { + "name": "enabled", + "description": "1 If a password is required after sleep or the screensaver begins; else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "grace_period", + "description": "The amount of time in seconds the screen must be asleep or the screensaver on before a password is required on-wake. 0 = immediately; -1 = no password is required on-wake", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/screenlock.yml" + }, + { + "name": "seccomp_events", + "description": "A virtual table that tracks seccomp events.", + "url": "https://fleetdm.com/tables/seccomp_events", + "platforms": [ + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uptime", + "description": "Time of execution in system uptime", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "auid", + "description": "Audit user ID (loginuid) of the user who started the analyzed process", + "type": "unsigned_bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "User ID of the user who started the analyzed process", + "type": "unsigned_bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gid", + "description": "Group ID of the user who started the analyzed process", + "type": "unsigned_bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ses", + "description": "Session ID of the session from which the analyzed process was invoked", + "type": "unsigned_bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process ID", + "type": "unsigned_bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "comm", + "description": "Command-line name of the command that was used to invoke the analyzed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exe", + "description": "The path to the executable that was used to invoke the analyzed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sig", + "description": "Signal value sent to process by seccomp", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "arch", + "description": "Information about the CPU architecture", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "syscall", + "description": "Type of the system call", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "compat", + "description": "Is system call in compatibility mode", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ip", + "description": "Instruction pointer value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "code", + "description": "The seccomp action", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/seccomp_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fseccomp_events.yml&value=name%3A%20seccomp_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "secureboot", + "description": "Secure Boot UEFI Settings.", + "url": "https://fleetdm.com/tables/secureboot", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See the secure boot status (enabled or not) of Windows and Linux systems. You\ncould create a policy looking for it to be set to 1.\n\n```\nSELECT secure_boot FROM secureboot;\n```", + "columns": [ + { + "name": "secure_boot", + "description": "Whether secure boot is enabled", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "secure_mode", + "description": "(Intel) Secure mode: 0 disabled, 1 full security, 2 medium security", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "description", + "description": "(Apple Silicon) Human-readable description: 'Full Security', 'Reduced Security', or 'Permissive Security'", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "kernel_extensions", + "description": "(Apple Silicon) Allow user management of kernel extensions from identified developers (1 if allowed)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "mdm_operations", + "description": "(Apple Silicon) Allow remote (MDM) management of kernel extensions and automatic software updates (1 if allowed)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "setup_mode", + "description": "Whether setup mode is enabled", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "Linux", + "Windows" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/secureboot.yml" + }, + { + "name": "security_profile_info", + "description": "Information on the security profile of a given system by listing the system Account and Audit Policies. This table mimics the exported securitypolicy output from the secedit tool.", + "url": "https://fleetdm.com/tables/security_profile_info", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "minimum_password_age", + "description": "Determines the minimum number of days that a password must be used before the user can change it", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "maximum_password_age", + "description": "Determines the maximum number of days that a password can be used before the client requires the user to change it", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "minimum_password_length", + "description": "Determines the least number of characters that can make up a password for a user account", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "password_complexity", + "description": "Determines whether passwords must meet a series of strong-password guidelines", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "password_history_size", + "description": "Number of unique new passwords that must be associated with a user account before an old password can be reused", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "lockout_bad_count", + "description": "Number of failed logon attempts after which a user account MUST be locked out", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "logon_to_change_password", + "description": "Determines if logon session is required to change the password", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "force_logoff_when_expire", + "description": "Determines whether SMB client sessions with the SMB server will be forcibly disconnected when the client's logon hours expire", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "new_administrator_name", + "description": "Determines the name of the Administrator account on the local computer", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "new_guest_name", + "description": "Determines the name of the Guest account on the local computer", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "clear_text_password", + "description": "Determines whether passwords MUST be stored by using reversible encryption", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "lsa_anonymous_name_lookup", + "description": "Determines if an anonymous user is allowed to query the local LSA policy", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enable_admin_account", + "description": "Determines whether the Administrator account on the local computer is enabled", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enable_guest_account", + "description": "Determines whether the Guest account on the local computer is enabled", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "audit_system_events", + "description": "Determines whether the operating system MUST audit System Change, System Startup, System Shutdown, Authentication Component Load, and Loss or Excess of Security events", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "audit_logon_events", + "description": "Determines whether the operating system MUST audit each instance of a user attempt to log on or log off this computer", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "audit_object_access", + "description": "Determines whether the operating system MUST audit each instance of user attempts to access a non-Active Directory object that has its own SACL specified", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "audit_privilege_use", + "description": "Determines whether the operating system MUST audit each instance of user attempts to exercise a user right", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "audit_policy_change", + "description": "Determines whether the operating system MUST audit each instance of user attempts to change user rights assignment policy, audit policy, account policy, or trust policy", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "audit_account_manage", + "description": "Determines whether the operating system MUST audit each event of account management on a computer", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "audit_process_tracking", + "description": "Determines whether the operating system MUST audit process-related events", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "audit_ds_access", + "description": "Determines whether the operating system MUST audit each instance of user attempts to access an Active Directory object that has its own system access control list (SACL) specified", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "audit_account_logon", + "description": "Determines whether the operating system MUST audit each time this computer validates the credentials of an account", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/security_profile_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fsecurity_profile_info.yml&value=name%3A%20security_profile_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "selinux_events", + "description": "Track SELinux events.", + "url": "https://fleetdm.com/tables/selinux_events", + "platforms": [ + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "type", + "description": "Event type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "message", + "description": "Message", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uptime", + "description": "Time of execution in system uptime", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/selinux_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fselinux_events.yml&value=name%3A%20selinux_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "selinux_settings", + "description": "Track active SELinux settings.", + "url": "https://fleetdm.com/tables/selinux_settings", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nSELECT * FROM selinux_settings WHERE key = 'enforce'\n```", + "columns": [ + { + "name": "scope", + "description": "Where the key is located inside the SELinuxFS mount point.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key", + "description": "Key or class name.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Active value.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/selinux_settings.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fselinux_settings.yml&value=name%3A%20selinux_settings%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "services", + "description": "Lists all installed Windows services and their relevant data.", + "url": "https://fleetdm.com/tables/services", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from services\n```", + "columns": [ + { + "name": "name", + "description": "Service name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "service_type", + "description": "Service Type: OWN_PROCESS, SHARE_PROCESS and maybe Interactive (can interact with the desktop)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "display_name", + "description": "Service Display name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "Service Current status: STOPPED, START_PENDING, STOP_PENDING, RUNNING, CONTINUE_PENDING, PAUSE_PENDING, PAUSED", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "the Process ID of the service", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "start_type", + "description": "Service start type: BOOT_START, SYSTEM_START, AUTO_START, DEMAND_START, DISABLED", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "win32_exit_code", + "description": "The error code that the service uses to report an error that occurs when it is starting or stopping", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "service_exit_code", + "description": "The service-specific error code that the service returns when an error occurs while the service is starting or stopping", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to Service Executable", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "module_path", + "description": "Path to ServiceDll", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Service Description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user_account", + "description": "The name of the account that the service process will be logged on as when it runs. This name can be of the form Domain\\UserName. If the account belongs to the built-in domain, the name can be of the form .\\UserName.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/services.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fservices.yml&value=name%3A%20services%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "shadow", + "description": "Local system users encrypted passwords and related information. Please note, that you usually need superuser rights to access `/etc/shadow`.", + "url": "https://fleetdm.com/tables/shadow", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from shadow where username = 'root'\n```", + "columns": [ + { + "name": "password_status", + "description": "Password status", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hash_alg", + "description": "Password hashing algorithm", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_change", + "description": "Date of last password change (starting from UNIX epoch date)", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "min", + "description": "Minimal number of days between password changes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "max", + "description": "Maximum number of days between password changes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "warning", + "description": "Number of days before password expires to warn user about it", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inactive", + "description": "Number of days after password expires until account is blocked", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "expire", + "description": "Number of days since UNIX epoch date until account is disabled", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "flag", + "description": "Reserved", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "username", + "description": "Username", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/shadow.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fshadow.yml&value=name%3A%20shadow%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "shared_folders", + "description": "Folders available to others via SMB or AFP.", + "url": "https://fleetdm.com/tables/shared_folders", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "List all shared folders except for the standard public ones.\n\n```\nSELECT * FROM shared_folders WHERE path NOT LIKE '/Users/%%/Public%';\n```", + "columns": [ + { + "name": "name", + "description": "The shared name of the folder as it appears to other users", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Absolute path of shared folder on the local system", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/shared_folders.yml" + }, + { + "name": "shared_memory", + "description": "OS shared memory regions.", + "url": "https://fleetdm.com/tables/shared_memory", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "shmid", + "description": "Shared memory segment ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "owner_uid", + "description": "User ID of owning process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "creator_uid", + "description": "User ID of creator process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process ID to last use the segment", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "creator_pid", + "description": "Process ID that created the segment", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "atime", + "description": "Attached time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "dtime", + "description": "Detached time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ctime", + "description": "Changed time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "permissions", + "description": "Memory segment permissions", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Size in bytes", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "attached", + "description": "Number of attached processes", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "Destination/attach status", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "locked", + "description": "1 if segment is locked else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/shared_memory.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fshared_memory.yml&value=name%3A%20shared_memory%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "shared_resources", + "description": "Displays shared resources on a computer system running Windows. This may be a disk drive, printer, interprocess communication, or other sharable device.", + "url": "https://fleetdm.com/tables/shared_resources", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "* `type_name` is a human readable value of the type column. These values can include: \"Disk Drive Admin\", \"IPC Admin\", \"Disk Drive\"", + "examples": "Network shares with loose access controls are common places that leak sensitive information. This query looks for shared drives on Windows systems that likely contain sensitive data, by listing all shared folders that have the word `backup` in their name. This does not include `ADMIN$` type shares.\n\n```\nSELECT description,name,path FROM shared_resources WHERE type = 0 and name like '%backup%';\n```", + "columns": [ + { + "name": "description", + "description": "A textual description of the object", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "install_date", + "description": "Indicates when the object was installed. Lack of a value does not indicate that the object is not installed.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "String that indicates the current status of the object.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "allow_maximum", + "description": "Number of concurrent users for this resource has been limited. If True, the value in the MaximumAllowed property is ignored.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "maximum_allowed", + "description": "Limit on the maximum number of users allowed to use this resource concurrently. The value is only valid if the AllowMaximum property is set to FALSE.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Alias given to a path set up as a share on a computer system running Windows.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Local path of the Windows share.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Type of resource being shared. Types include: disk drives, print queues, interprocess communications (IPC), and general devices.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type_name", + "description": "Human readable value for the 'type' column", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/shared_resources.yml" + }, + { + "name": "sharing_preferences", + "description": "macOS Sharing preferences.", + "url": "https://fleetdm.com/tables/sharing_preferences", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify systems where any type of sharing is enabled. This table can be very\nuseful for building policies for specific types of sharing.\n\n```\nSELECT * FROM sharing_preferences WHERE screen_sharing='1' OR file_sharing='1' OR printer_sharing='1' OR remote_login='1' OR remote_management='1' OR remote_apple_events='1' OR internet_sharing='1' OR bluetooth_sharing='1' OR disc_sharing='1' OR content_caching='1';\n```", + "columns": [ + { + "name": "screen_sharing", + "description": "1 If screen sharing is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "file_sharing", + "description": "1 If file sharing is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "printer_sharing", + "description": "1 If printer sharing is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_login", + "description": "1 If remote login is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_management", + "description": "1 If remote management is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_apple_events", + "description": "1 If remote apple events are enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "internet_sharing", + "description": "1 If internet sharing is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bluetooth_sharing", + "description": "1 If bluetooth sharing is enabled for any user else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "disc_sharing", + "description": "1 If CD or DVD sharing is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "content_caching", + "description": "1 If content caching is enabled else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/sharing_preferences.yml" + }, + { + "name": "shell_history", + "description": "A line-delimited (command) table of per-user .*_history data.", + "url": "https://fleetdm.com/tables/shell_history", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "- Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)", + "examples": "```\nSELECT * FROM users CROSS JOIN shell_history USING (uid);\n```\n\nSee command line executions and related timestamps. Useful for threat hunting\nwhen a device is suspected of being compromised.\n\n```\nSELECT u.username, s.command, s.time FROM users u CROSS JOIN shell_history s USING (uid);\n```", + "columns": [ + { + "name": "uid", + "description": "Shell history owner", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Entry timestamp. It could be absent, default value is 0.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "command", + "description": "Unparsed date/line/command history line", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "history_file", + "description": "Path to the .*_history for this user", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/shell_history.yml" + }, + { + "name": "shellbags", + "description": "Shows directories accessed via Windows Explorer.", + "url": "https://fleetdm.com/tables/shellbags", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from shellbags;\n```", + "columns": [ + { + "name": "sid", + "description": "User SID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source", + "description": "Shellbags source Registry file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Directory name.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "modified_time", + "description": "Directory Modified time.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "created_time", + "description": "Directory Created time.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "accessed_time", + "description": "Directory Accessed time.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mft_entry", + "description": "Directory master file table entry.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mft_sequence", + "description": "Directory master file table sequence.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/shellbags.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fshellbags.yml&value=name%3A%20shellbags%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "shimcache", + "description": "Application Compatibility Cache, contains artifacts of execution.", + "url": "https://fleetdm.com/tables/shimcache", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "\nSome key caveats to know about this data source:\n\n* Process execution logs are only written during a reboot, otherwise they are stored in memory. This means you may not be seeing the data you would expect if the system hasn't been rebooted recently.\n\n* The entry column shows the order of execution - Starting from 1, which is the most-recent process execution, and then on from there.\n\n* The modified_time column displays the last modified time for the file.\n\nSource: https://bromiley.medium.com/windows-wednesday-shim-cache-1997ba8b13e7", + "examples": "As a byproduct of its functionality, the Application Compatibility Cache (also known as the shimcache) logs some details around process execution. These logs can be useful, especially during incident response. The following query looks for a potential IoC (indicator of compromise) - evidence of process execution of a Windows binary named certutil. (Certutil is a legitimate Windows application, but is also known to be a lolbin - living off the land binary. See more details here: https://lolbas-project.github.io/lolbas/Binaries/Certutil/ ) This query joins the local system's uptime to its results because shimcache logs are kept in memory until the system is rebooted, at which point they are written to disk - so we would also want to know the last time this system was rebooted.\n\n```\nSELECT entry AS execution_order, path, DATETIME(modified_time, 'unixepoch') AS file_last_modified, uptime.days || ' days, ' || uptime.hours || ' hours' AS host_uptime FROM shimcache CROSS JOIN uptime WHERE path LIKE '%certutil%';\n```", + "columns": [ + { + "name": "entry", + "description": "Execution order.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "This is the path to the executed file.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "modified_time", + "description": "File Modified time.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "execution_flag", + "description": "Boolean Execution flag, 1 for execution, 0 for no execution, -1 for missing (this flag does not exist on Windows 10 and higher).", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/shimcache.yml" + }, + { + "name": "signature", + "description": "File (executable, bundle, installer, disk) code signing status.", + "url": "https://fleetdm.com/tables/signature", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify system extensions that are not managed via MDM and see their\nsignature status.\n\n```\nSELECT se.identifier, se.bundle_path, se.category, se.state, s.signed FROM system_extensions se JOIN signature s on s.path = se.bundle_path WHERE se.mdm_managed='0';\n```", + "columns": [ + { + "name": "path", + "description": "Must provide a path or directory", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "hash_resources", + "description": "Set to 1 to also hash resources, or 0 otherwise. Default is 1", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "arch", + "description": "If applicable, the arch of the signed code", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "signed", + "description": "1 If the file is signed else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "identifier", + "description": "The signing identifier sealed into the signature", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cdhash", + "description": "Hash of the application Code Directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "team_identifier", + "description": "The team signing identifier sealed into the signature", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "authority", + "description": "Certificate Common Name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/signature.yml" + }, + { + "name": "sip_config", + "description": "macOS System Integrity Protection (SIP) protects the Mac by preventing the execution of unauthorized code. The `sip_config` osquery table collects the current SIP status of a Mac.", + "url": "https://fleetdm.com/tables/sip_config", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "SIP:\n- automatically authorizes apps users download from the App Store\n- authorizes apps developers notarize and distribute directly to users\n- prevents launching of other apps unless users or administrators modify \"Gatekeeper\" settings\n\nOrganizations that develop software for Apple operating systems on the Mac may allow users to disable SIP. Because SIP is a basic and critical macOS security protection it is important to monitor SIP status on Hosts.\n\nLinks:\n\n- [About System Integrity Protection](https://support.apple.com/en-us/102149)\n- [Disabling and Enabling System Integrity Protection](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection/)\n- [Gatekeeper and runtime protection in macOS](https://support.apple.com/guide/security/gatekeeper-and-runtime-protection-sec5599b66df/web)", + "examples": "Basic query:\n\n```\nSELECT * FROM sip_config;\n```\n\nThis query displays the current SIP status (SIP is enabled if the value=1):\n\n```\nSELECT enabled FROM sip_config WHERE config_flag='sip';\n```", + "columns": [ + { + "name": "config_flag", + "description": "The System Integrity Protection config flag", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enabled", + "description": "1 if this configuration is enabled, otherwise 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enabled_nvram", + "description": "1 if this configuration is enabled, otherwise 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/sip_config.yml" + }, + { + "name": "smbios_tables", + "description": "BIOS (DMI) structure common details and content.", + "url": "https://fleetdm.com/tables/smbios_tables", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "This table requires an Intel compatible system.", + "examples": "SMBIOS tables are used to deliver information from the BIOS to the operating system. Use the *md5*\nfield to compare systems and see if their hardware is configured identically.\n\n```\nSELECT * FROM smbios_tables WHERE md5='dd66d84ec724d35db011883052973eae'\n```", + "columns": [ + { + "name": "number", + "description": "Table entry number", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Table entry type", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Table entry description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "handle", + "description": "Table entry handle", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "header_size", + "description": "Header size in bytes", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Table entry size in bytes", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "md5", + "description": "MD5 hash of table entry", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/smbios_tables.yml" + }, + { + "name": "smc_keys", + "description": "Apple's system management controller keys.", + "url": "https://fleetdm.com/tables/smc_keys", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See if the temperature sensor on an Intel Mac is returning values. SMC values\naren't officially documented and as such this table is useful if you are\ntroubleshooting and digging into a specific hardware related issue.\n\n```\nSELECT * FROM smc_keys WHERE key='TC0P';\n```", + "columns": [ + { + "name": "key", + "description": "4-character key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "type", + "description": "SMC-reported type literal type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "Reported size of data in bytes", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "A type-encoded representation of the key value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hidden", + "description": "1 if this key is normally hidden, otherwise 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/smc_keys.yml" + }, + { + "name": "sntp_request", + "platforms": [ + "darwin", + "windows", + "linux" + ], + "description": "Allows querying the timestamp and clock offset from a SNTP server (in millisecond precision).", + "columns": [ + { + "name": "server", + "type": "text", + "required": true, + "description": "Address of the SNTP server to query." + }, + { + "name": "timestamp_ms", + "type": "bigint", + "required": false, + "description": "Timestamp returned by the SNTP server in milliseconds." + }, + { + "name": "clock_offset_ms", + "type": "bigint", + "required": false, + "description": "Offset between the host's time and the SNTP time in milliseconds." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/sntp_request", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/sntp_request.yml" + }, + { + "name": "socket_events", + "description": "Track network socket opens and closes.", + "url": "https://fleetdm.com/tables/socket_events", + "platforms": [ + "darwin", + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "action", + "description": "The socket action (bind, listen, close)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of executed file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fd", + "description": "The file description for the process socket", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "auid", + "description": "Audit User ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "Either 'succeeded', 'failed', 'in_progress' (connect() on non-blocking socket) or 'no_client' (null accept() on non-blocking socket)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "family", + "description": "The Internet protocol family ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protocol", + "description": "The network protocol ID", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "local_address", + "description": "Local address associated with socket", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_address", + "description": "Remote address associated with socket", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_port", + "description": "Local network protocol port number", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_port", + "description": "Remote network protocol port number", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "socket", + "description": "The local path (UNIX domain socket only)", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uptime", + "description": "Time of execution in system uptime", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "success", + "description": "Deprecated. Use the 'status' column instead", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/socket_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fsocket_events.yml&value=name%3A%20socket_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "sofa_security_release_info", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).\n\n- By default this table will return vulnerability data for the running operating system.\n\n- Use the `url` constraint (in the WHERE clause) to specify a data source other than the [SOFA feed](https://sofa.macadmins.io/v1/macos_data_feed.json).", + "description": "The information on the security release the device is running from [SOFA](https://sofa.macadmins.io/).", + "examples": "For historical data, use the `os_version` predicate\n\n```\nSELECT * FROM sofa_security_release_info WHERE os_version=\"14.4.0\"\n```", + "platforms": [ + "darwin" + ], + "evented": false, + "columns": [ + { + "name": "update_name", + "description": "The name of the release, like \"macOS Sonoma 14.4.1\"", + "required": false, + "type": "text" + }, + { + "name": "product_version", + "description": "The version corresponding to this security release, like \"14.4.1\"", + "required": false, + "type": "text" + }, + { + "name": "release_date", + "description": "The date the release was made available", + "required": false, + "type": "text" + }, + { + "name": "security_info", + "description": "The URL to the information for this release", + "required": false, + "type": "text" + }, + { + "name": "unique_cves_count", + "description": "The number of unique CVEs addressed in this release", + "required": false, + "type": "integer" + }, + { + "name": "days_since_previous_release", + "description": "The number of days since the previous (older) release", + "required": false, + "type": "integer" + }, + { + "name": "os_version", + "description": "If not specified, this is the version of the operating system that the device is running", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/sofa_security_release_info", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/sofa_security_release_info.yml" + }, + { + "name": "sofa_unpatched_cves", + "notes": "This table is from the [Mac Admins osquery extension](https://github.com/macadmins/osquery-extension).\n\n- By default this table will return all unpatched vulnerability data for the running operating system.\n\n- Use the `url` constraint (in the WHERE clause) to specify a data source other than the [SOFA feed](https://sofa.macadmins.io/v1/macos_data_feed.json).", + "description": "The CVEs that are unpatched on the device from [SOFA](https://sofa.macadmins.io/).", + "examples": "For historical data, use the `os_version` predicate\n\n```\nSELECT * FROM sofa_unpatched_cves WHERE os_version=\"14.4.0\"\n```", + "platforms": [ + "darwin" + ], + "evented": false, + "columns": [ + { + "name": "cve", + "description": "The CVE identifier, like \"CVE-2024-1580\"", + "required": false, + "type": "text" + }, + { + "name": "patched_version", + "description": "The security release that patched this CVE, like \"14.4.1\"", + "required": false, + "type": "text" + }, + { + "name": "actively_exploited", + "description": "\"true\" if this CVE is being actively exploited, \"false\" otherwise", + "required": false, + "type": "text" + }, + { + "name": "os_version", + "description": "If not specified, this is the version of the operating system that the device is running", + "required": false, + "type": "text" + } + ], + "url": "https://fleetdm.com/tables/sofa_unpatched_cves", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/sofa_unpatched_cves.yml" + }, + { + "name": "software_update", + "description": "The `software_update` table displays the number of updates available from Apple's Software Update service on a Mac.", + "platforms": [ + "darwin" + ], + "examples": "Basic query:\n\n```\nSELECT * FROM software_update;\n```", + "columns": [ + { + "name": "software_update_required", + "type": "integer", + "required": false, + "description": "A value of 0 means no updates are available. Any other integer represents the number of updates available." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).\n\nAvailable updates on a Mac can be displayed in the macOS Graphical User Interface (GUI) by clicking on the Apple menu and then selecting “System Settings”. In the System Settings.app, click General > Software Update.\n\nApple Software Updates can also be listed in Terminal with the following command:\n\n```\nsoftwareupdate --list --verbose\n```\n\n[Update Your Apple Software](https://support.apple.com/guide/personal-safety/update-your-apple-software-ips4930e3486/web)", + "evented": false, + "url": "https://fleetdm.com/tables/software_update", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/software_update.yml" + }, + { + "name": "ssh_configs", + "description": "A table of parsed ssh_configs.", + "url": "https://fleetdm.com/tables/ssh_configs", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)", + "examples": "```\nSELECT * FROM users CROSS JOIN ssh_configs USING (uid);\n```\n\nIdentify SSH clients configured to send their locales to the server.\n\n```\nSELECT * FROM ssh_configs WHERE option='sendenv lang lc_*'; \n```", + "columns": [ + { + "name": "uid", + "description": "The local owner of the ssh_config file", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "block", + "description": "The host or match block", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "option", + "description": "The option and value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ssh_config_file", + "description": "Path to the ssh_config file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/ssh_configs.yml" + }, + { + "name": "startup_items", + "description": "Applications and binaries set as user/login startup items.", + "url": "https://fleetdm.com/tables/startup_items", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "List commands executed as user/logon startup items.\n\n```\nSELECT name, type FROM startup_items WHERE status='enabled';\n```", + "columns": [ + { + "name": "name", + "description": "Name of startup item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of startup item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "args", + "description": "Arguments provided to startup executable", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Startup Item or Login Item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source", + "description": "Directory or plist containing startup item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "status", + "description": "Startup status; either enabled or disabled", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "username", + "description": "The user associated with the startup item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/startup_items.yml" + }, + { + "name": "sudo_info", + "platforms": [ + "darwin" + ], + "description": "Returns the output of `sudo -V` in JSON format.", + "columns": [ + { + "name": "json_result", + "type": "text", + "required": false, + "description": "A JSON document with the key value pairs parsed from `sudo -V` output." + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/sudo_info", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/sudo_info.yml" + }, + { + "name": "sudoers", + "description": "Rules for running commands as other users via sudo.", + "url": "https://fleetdm.com/tables/sudoers", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify systems where sudo is configured in a way to allow users to retain\ntheir existing environment variables, which is a security risk.\n\n```\nSELECT header, source, rule_details FROM sudoers WHERE rule_details='!env_reset';\n```", + "columns": [ + { + "name": "source", + "description": "Source file containing the given rule", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "header", + "description": "Symbol for given rule", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "rule_details", + "description": "Rule definition", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/sudoers.yml" + }, + { + "name": "suid_bin", + "description": "suid binaries in common locations.", + "url": "https://fleetdm.com/tables/suid_bin", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "Identify unsigned executables with suid privileges.\n\n```\nSELECT s.path, s.username, s.permissions, sig.signed, sig.team_identifier, sig.authority FROM suid_bin s JOIN signature sig on s.path = sig.path WHERE sig.signed='0';\n```", + "columns": [ + { + "name": "path", + "description": "Binary path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "username", + "description": "Binary owner username", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "groupname", + "description": "Binary owner group", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "permissions", + "description": "Binary permissions", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/suid_bin.yml" + }, + { + "name": "syslog_events", + "description": "", + "url": "https://fleetdm.com/tables/syslog_events", + "platforms": [ + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "time", + "description": "Current unix epoch time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "datetime", + "description": "Time known to syslog", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "host", + "description": "Hostname configured for syslog", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "severity", + "description": "Syslog severity", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "facility", + "description": "Syslog facility", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tag", + "description": "The syslog tag", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "message", + "description": "The syslog message", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/syslog_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fsyslog_events.yml&value=name%3A%20syslog_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "system_controls", + "description": "The `sysctl` binary found in many UNIX-like operating systems reads and modifies system kernel attributes. The `system_controls` osquery table expresses the data made available by the `sysctl` binary on Linux and macOS.", + "url": "https://fleetdm.com/tables/system_controls", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "Because the `system_control` table provides access to a large quantity of low-level, unique settings available via `sysctl` it is ideal for use in Fleet policies.\n\nE.g., the number of CPU cores can be obtained with the following `sysctl` command:\n\n```\n% sysctl hw.ncpu\nhw.ncpu: 12\n```\n\n[sysctl](https://en.wikipedia.org/wiki/Sysctl)\n\n[Apple sysctl documentation](https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/sysctl.3.html)\n\n[Disable IP Forwarding](https://linuxconfig.org/how-to-turn-on-off-ip-forwarding-in-linux)\n\n[Use sysctl to collect boot, sleep and wake timestamps](https://osxdaily.com/2011/07/14/get-exact-boot-sleep-and-wake-times-from-the-command-line/)", + "examples": "Collect the hardware model and the number of CPU cores from a Mac:\n\n```\nSELECT current_value,name FROM system_controls WHERE name='hw.model' OR name='hw.ncpu';\n```\n\nCollect the reason for the last shutdown event, the duration since and timestamp of the most recent boot, and, the duration since and timestamp of the most recent wake from sleep:\n\n```\nSELECT current_value,name FROM system_controls WHERE name='kern.shutdownreason' OR name='kern.boottime' OR name='kern.waketime';\n```\n\nDiscover if IP Forwarding is enabled:\n\n```\nSELECT name,current_value FROM system_controls WHERE name='net.inet.ip.forwarding' AND current_value='1';\n```", + "columns": [ + { + "name": "name", + "description": "Full sysctl MIB name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "oid", + "description": "Control MIB", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subsystem", + "description": "Subsystem ID, control type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "current_value", + "description": "Value of setting", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "config_value", + "description": "The MIB value set in /etc/sysctl.conf", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Data type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "field_name", + "description": "Specific attribute of opaque type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/system_controls.yml" + }, + { + "name": "system_extensions", + "description": "macOS (>= 10.15) system extension table.", + "url": "https://fleetdm.com/tables/system_extensions", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify system extensions that are not managed via MDM and see their\nsignature status.\n\n```\nSELECT se.identifier, se.bundle_path, se.category, se.state, s.signed FROM system_extensions se JOIN signature s on s.path = se.bundle_path WHERE se.mdm_managed='0';\n```", + "columns": [ + { + "name": "path", + "description": "Original path of system extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "UUID", + "description": "Extension unique id", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "System extension state", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "identifier", + "description": "Identifier name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "System extension version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "category", + "description": "System extension category", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bundle_path", + "description": "System extension bundle path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "team", + "description": "Signing team ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mdm_managed", + "description": "1 if managed by MDM system extension payload configuration, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/system_extensions.yml" + }, + { + "name": "system_info", + "description": "System information for identification.", + "url": "https://fleetdm.com/tables/system_info", + "platforms": [ + "windows", + "darwin", + "linux", + "chrome" + ], + "evented": false, + "cacheable": false, + "notes": "- This table is not a core osquery table. This table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).", + "examples": "See the CPU architecture of a machine as well as who made it and what its\nserial number is.\n\n```\nSELECT CPU_type, hardware_vendor, hardware_model, hardware_serial FROM system_info;\n```", + "columns": [ + { + "name": "hostname", + "description": "Network hostname including domain. For ChromeOS, this is only available if the extension was force-installed by an enterprise policy", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uuid", + "description": "Unique ID provided by the system", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_type", + "description": "CPU type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_subtype", + "description": "CPU subtype", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "cpu_brand", + "description": "CPU brand string, contains vendor and model", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_physical_cores", + "description": "Number of physical CPU cores in to the system", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "cpu_logical_cores", + "description": "Number of logical CPU cores available to the system", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "cpu_sockets", + "description": "Number of processor sockets in the system", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cpu_microcode", + "description": "Microcode version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "physical_memory", + "description": "Total physical memory in bytes", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hardware_vendor", + "description": "Hardware vendor. For ChromeOS, this is only available if the extension was force-installed by an enterprise policy", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hardware_model", + "description": "Hardware model. For ChromeOS, this is only available if the extension was force-installed by an enterprise policy", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hardware_version", + "description": "Hardware version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "hardware_serial", + "description": "The device's serial number. For ChromeOS, this is only available if the extension was force-installed by an enterprise policy", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "board_vendor", + "description": "Board vendor", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "board_model", + "description": "Board model", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "board_version", + "description": "Board version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "board_serial", + "description": "Board serial number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "computer_name", + "description": "Friendly computer name (optional). For ChromeOS, if the extension wasn't force-installed by an enterprise policy this will default to 'ChromeOS' only", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_hostname", + "description": "Local hostname (optional)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/system_info.yml" + }, + { + "name": "system_state", + "platforms": [ + "chrome" + ], + "description": "Returns \"locked\" if the system is locked, \"idle\" if the user has not generated any input for a specified number of seconds, or \"active\" otherwise. Idle time is set to 20% of the user's autolock time or defaults to 30 seconds if autolock is not set.", + "examples": "Returns \"locked\", \"idle\", or \"active\".\n\n```\nSELECT idle_state FROM system_state;\n```", + "columns": [ + { + "name": "idle_state", + "type": "text", + "description": "Returns \"locked\", \"idle\", or \"active\".", + "required": false + } + ], + "evented": false, + "notes": "- This table is not a core osquery table. This table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).", + "url": "https://fleetdm.com/tables/system_state", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/system_state.yml" + }, + { + "name": "systemd_units", + "description": "Track systemd units.", + "url": "https://fleetdm.com/tables/systemd_units", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "id", + "description": "Unique unit identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Unit description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "load_state", + "description": "Reflects whether the unit definition was properly loaded", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "active_state", + "description": "The high-level unit activation state, i.e. generalization of SUB", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sub_state", + "description": "The low-level unit activation state, values depend on unit type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "unit_file_state", + "description": "Whether the unit file is enabled, e.g. `enabled`, `masked`, `disabled`, etc", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "following", + "description": "The name of another unit that this unit follows in state", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "object_path", + "description": "The object path for this unit", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "job_id", + "description": "Next queued job id", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "job_type", + "description": "Job type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "job_path", + "description": "The object path for the job", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fragment_path", + "description": "The unit file path this unit was read from, if there is any", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user", + "description": "The configured user, if any", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source_path", + "description": "Path to the (possibly generated) unit configuration file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/linux/systemd_units.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fsystemd_units.yml&value=name%3A%20systemd_units%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "tcc_access", + "platforms": [ + "darwin" + ], + "description": "Information about macOS TCC database contents, for determining permissions granted to applications.", + "evented": false, + "columns": [ + { + "name": "source", + "type": "text", + "description": "Either \"user\" or \"system\".", + "required": false + }, + { + "name": "uid", + "type": "integer", + "description": "The local user the permissions are for. `0` for the system (root) user.", + "required": false + }, + { + "name": "service", + "type": "text", + "description": "The name of the TCC service.", + "required": false + }, + { + "name": "client", + "type": "text", + "description": "The bundle identifier or absolute path to the program using the TCC service.", + "required": false + }, + { + "name": "client_type", + "type": "integer", + "description": "Indicates whether client is a bundle identifier (0) or absolute path (1).", + "required": false + }, + { + "name": "auth_value", + "type": "integer", + "description": "Indicates whether the access is: denied (0), unknown (1), allowed (2), or limited (3).", + "required": false + }, + { + "name": "auth_reason", + "type": "integer", + "description": "TODO", + "required": false + }, + { + "name": "last_modified", + "type": "bigint", + "description": "The last time the entry was modified, in epoch seconds.", + "required": false + }, + { + "name": "policy_id", + "type": "integer", + "description": "The MDM policy that allows TCC access for the application.", + "required": false + }, + { + "name": "indirect_object_identifier", + "type": "text", + "description": "For kTCCServiceAppleEvents, what the client is asking to interact with, or \"UNUSED\" when it doesn't apply. Absolute path or bundle identifier.", + "required": false + }, + { + "name": "indirect_object_identifier_type", + "type": "integer", + "description": "Indicates whether indirect_object_identifier is a bundle identifier (0) or absolute path (1), if applicable.", + "required": false + } + ], + "notes": "- This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).\n- This table requires that Fleet's agent (fleetd) has Full Disk Access.", + "url": "https://fleetdm.com/tables/tcc_access", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/tcc_access.yml" + }, + { + "name": "temperature_sensors", + "description": "Machine's temperature sensors.", + "url": "https://fleetdm.com/tables/temperature_sensors", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify systems with CPU temperature sensors above or equal to 90c.\n\n```\nSELECT name, celsius FROM temperature_sensors WHERE name LIKE 'CPU%' AND celsius >='90';\n```", + "columns": [ + { + "name": "key", + "description": "The SMC key on macOS", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "name", + "description": "Name of temperature source", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "celsius", + "description": "Temperature in Celsius", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "fahrenheit", + "description": "Temperature in Fahrenheit", + "type": "double", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/temperature_sensors.yml" + }, + { + "name": "time", + "description": "Track current date and time in UTC.", + "url": "https://fleetdm.com/tables/time", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "View the timezone a system is configured in. \n\n```\nSELECT local_timezone FROM time;\n```", + "columns": [ + { + "name": "weekday", + "description": "Current weekday in UTC", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "year", + "description": "Current year in UTC", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "month", + "description": "Current month in UTC", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "day", + "description": "Current day in UTC", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hour", + "description": "Current hour in UTC", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "minutes", + "description": "Current minutes in UTC", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "seconds", + "description": "Current seconds in UTC", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "timezone", + "description": "Timezone for reported time (hardcoded to UTC)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_timezone", + "description": "Current local timezone in of the system", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "unix_time", + "description": "Current UNIX time in UTC", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "timestamp", + "description": "Current timestamp (log format) in UTC", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "datetime", + "description": "Current date and time (ISO format) in UTC", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "iso_8601", + "description": "Current time (ISO format) in UTC", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "win_timestamp", + "description": "Timestamp value in 100 nanosecond units", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/time.yml" + }, + { + "name": "time_machine_backups", + "description": "Backups to drives using TimeMachine.", + "url": "https://fleetdm.com/tables/time_machine_backups", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See the time of the latest backup. In environments where you want to encourage\nbackups, this can be useful to remind users to perform them, and in\nenvironments where you do not allow backups, to detect that they are\nhappening.\n\n```\nSELECT strftime('%Y-%m-%d %H:%M:%S',backup_date,'unixepoch') AS last_backup FROM time_machine_backups;\n```", + "columns": [ + { + "name": "destination_id", + "description": "Time Machine destination ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "backup_date", + "description": "Backup Date", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/time_machine_backups.yml" + }, + { + "name": "time_machine_destinations", + "description": "Locations backed up to using Time Machine.", + "url": "https://fleetdm.com/tables/time_machine_destinations", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "If Time Machine is configured, see what destination it is configured to go\nto. \n\n```\nSELECT alias FROM time_machine_destinations;\n```", + "columns": [ + { + "name": "alias", + "description": "Human readable name of drive", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "destination_id", + "description": "Time Machine destination ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "consistency_scan_date", + "description": "Consistency scan date", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "root_volume_uuid", + "description": "Root UUID of backup volume", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bytes_available", + "description": "Bytes available on volume", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bytes_used", + "description": "Bytes used on volume", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "encryption", + "description": "Last known encrypted state", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/time_machine_destinations.yml" + }, + { + "name": "tpm_info", + "description": "A table that lists the TPM related information.", + "url": "https://fleetdm.com/tables/tpm_info", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from tpm_info\n```", + "columns": [ + { + "name": "activated", + "description": "TPM is activated", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enabled", + "description": "TPM is enabled", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "owned", + "description": "TPM is owned", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufacturer_version", + "description": "TPM version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufacturer_id", + "description": "TPM manufacturers ID", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufacturer_name", + "description": "TPM manufacturers name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "product_name", + "description": "Product name of the TPM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "physical_presence_version", + "description": "Version of the Physical Presence Interface", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "spec_version", + "description": "Trusted Computing Group specification that the TPM supports", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/tpm_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Ftpm_info.yml&value=name%3A%20tpm_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "ulimit_info", + "description": "System resource usage limits.", + "url": "https://fleetdm.com/tables/ulimit_info", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Check the stack size limit\n\n```\nSELECT * FROM ulimit_info WHERE type='stack';\n```", + "columns": [ + { + "name": "type", + "description": "System resource to be limited", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "soft_limit", + "description": "Current limit value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hard_limit", + "description": "Maximum limit value", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/ulimit_info.yml" + }, + { + "name": "unified_log", + "description": "Queries the OSLog framework for entries in the system log. The maximum number of rows returned is limited for performance issues. Use timestamp > or >= constraints to optimize query performance. This table introduces a new idiom for extracting sequential data in batches using multiple queries, ordered by timestamp. To trigger it, the user should include the condition \"timestamp > -1\", and the table will handle pagination. Note that the saved pagination counter is incremented globally across all queries and table invocations within a query. To avoid multiple table invocations within a query, use only AND and = constraints in WHERE clause.", + "url": "https://fleetdm.com/tables/unified_log", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from unified_log where timestamp > -1 and timestamp > (select unix_time - 86400 from time)\n```", + "columns": [ + { + "name": "timestamp", + "description": "unix timestamp associated with the entry", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "storage", + "description": "the storage category for the entry", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "message", + "description": "composed message", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "activity", + "description": "the activity ID associate with the entry", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "process", + "description": "the name of the process that made the entry", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "the pid of the process that made the entry", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sender", + "description": "the name of the binary image that made the entry", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tid", + "description": "the tid of the thread that made the entry", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "category", + "description": "the category of the os_log_t used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subsystem", + "description": "the subsystem of the os_log_t used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "level", + "description": "the severity level of the entry", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "max_rows", + "description": "the max number of rows returned (defaults to 100)", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "predicate", + "description": "predicate to search (see `log help predicates`), note that this is merged into the predicate created from the column constraints", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/unified_log.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Funified_log.yml&value=name%3A%20unified_log%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "uptime", + "description": "Track time passed since last boot. Some systems track this as calendar time, some as runtime.", + "url": "https://fleetdm.com/tables/uptime", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "See how long hosts that have been up for more than a month have been up. This\ncould indicate systems that are not ephemeral as expected, or not being\npatched as frequently as they should be.\n\n```\nSELECT days FROM uptime WHERE days >='31'\n```", + "columns": [ + { + "name": "days", + "description": "Days of uptime", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hours", + "description": "Hours of uptime", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "minutes", + "description": "Minutes of uptime", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "seconds", + "description": "Seconds of uptime", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "total_seconds", + "description": "Total uptime seconds", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/uptime.yml" + }, + { + "name": "usb_devices", + "description": "USB devices that are actively plugged into the host system.", + "url": "https://fleetdm.com/tables/usb_devices", + "platforms": [ + "darwin", + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify Yubikeys currently connected. The model field contains information\nabout what authentication protocols the keys are configured to support. This\ntable can be used to track any type of USB device.\n\n```\nSELECT model, vendor, version FROM usb_devices WHERE vendor='Yubico';\n```", + "columns": [ + { + "name": "usb_address", + "description": "USB Device used address", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "usb_port", + "description": "USB Device used port", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor", + "description": "USB Device vendor string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "vendor_id", + "description": "Hex encoded USB Device vendor identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "USB Device version number", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model", + "description": "USB Device model string", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model_id", + "description": "Hex encoded USB Device model identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial", + "description": "USB Device serial connection", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "class", + "description": "USB Device class", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "subclass", + "description": "USB Device subclass", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protocol", + "description": "USB Device protocol", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "removable", + "description": "1 If USB device is removable else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/usb_devices.yml" + }, + { + "name": "user_events", + "description": "Track user events from the audit framework.", + "url": "https://fleetdm.com/tables/user_events", + "platforms": [ + "darwin", + "linux" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "uid", + "description": "User ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "auid", + "description": "Audit User ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process (or thread) ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "message", + "description": "Message from the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "The file description for the process socket", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Supplied path from event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "address", + "description": "The Internet protocol address or family ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "terminal", + "description": "The network protocol ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of execution in UNIX time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uptime", + "description": "Time of execution in system uptime", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/posix/user_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fuser_events.yml&value=name%3A%20user_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "user_groups", + "description": "Local system user group relationships.", + "url": "https://fleetdm.com/tables/user_groups", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "uid", + "description": "User ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "gid", + "description": "Group ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/user_groups.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fuser_groups.yml&value=name%3A%20user_groups%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "user_interaction_events", + "description": "Track user interaction events from macOS' event tapping framework.", + "url": "https://fleetdm.com/tables/user_interaction_events", + "platforms": [ + "darwin" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "time", + "description": "Time", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/darwin/user_interaction_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fuser_interaction_events.yml&value=name%3A%20user_interaction_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "user_login_settings", + "platforms": [ + "darwin" + ], + "description": "Options of login and password (e.g password hints enabled) for all users.", + "columns": [ + { + "name": "password_hint_enabled", + "type": "integer", + "required": false, + "description": "whether password hint is enabled for any user. 1 means one or more users has a password hint set, 0 means no user has a password hint set" + } + ], + "notes": "This table is not a core osquery table. It is included as part of Fleet's agent ([fleetd](https://fleetdm.com/docs/get-started/anatomy#fleetd)).", + "evented": false, + "url": "https://fleetdm.com/tables/user_login_settings", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/user_login_settings.yml" + }, + { + "name": "user_ssh_keys", + "description": "Returns the private keys in the users ~/.ssh directory and whether or not they are encrypted.", + "url": "https://fleetdm.com/tables/user_ssh_keys", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)", + "examples": "```\nSELECT * FROM users CROSS JOIN user_ssh_keys USING (uid);\n```\n\nIdentify SSH keys stored in clear text in user directories\n\n```\nSELECT * FROM users JOIN user_ssh_keys USING (uid) WHERE encrypted = 0;\n```", + "columns": [ + { + "name": "uid", + "description": "The local user that owns the key file", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path to key file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "encrypted", + "description": "1 if key is encrypted, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "key_type", + "description": "The type of the private key. One of [rsa, dsa, dh, ec, hmac, cmac], or the empty string.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/user_ssh_keys.yml" + }, + { + "name": "userassist", + "description": "UserAssist Registry Key tracks when a user executes an application from Windows Explorer.", + "url": "https://fleetdm.com/tables/userassist", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "The User Assist featureset allows Windows to keep track of most recently used applications. Because of that, it is a useful datasource to pull from during investigations and incident response. The following example queries the userassist table and converts the last_execution_time into a human readable format (using UTC) and then sorts the results by this column, descending. It also joins the users table to change the user SID into a human readable username. The output from this query displays most recently used applications, sorted by most recent timestamp as well as the username of who ran it.\n\n``` \nSELECT userassist.path, datetime(userassist.last_execution_time, 'unixepoch') AS timestamp_of_last_exec, userassist.count as execution_count, users.username FROM userassist join users ON users.uuid = userassist.sid ORDER BY timestamp_of_last_exec DESC;\n```", + "columns": [ + { + "name": "path", + "description": "Application file path.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_execution_time", + "description": "Most recent time application was executed.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "count", + "description": "Number of times the application has been executed.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sid", + "description": "User SID.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/userassist.yml" + }, + { + "name": "users", + "description": "Local user accounts (including domain accounts that have logged on locally (Windows)).", + "url": "https://fleetdm.com/tables/users", + "platforms": [ + "darwin", + "windows", + "linux", + "chrome" + ], + "evented": false, + "cacheable": false, + "notes": "- On ChromeOS, this table requires the [fleetd Chrome extension](https://fleetdm.com/docs/using-fleet/chromeos).", + "examples": "List users that have interactive access via a shell that isn't false.\n\n```\nSELECT * FROM users WHERE shell!='/usr/bin/false';\n```", + "columns": [ + { + "name": "uid", + "description": "User ID", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "gid", + "description": "Group ID (unsigned)", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "uid_signed", + "description": "User ID as int64 signed (Apple)", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "gid_signed", + "description": "Default group ID as int64 signed (Apple)", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "username", + "description": "Username", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Optional user description", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "directory", + "description": "User's home directory", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "shell", + "description": "User's configured default shell", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS", + "Windows", + "Linux" + ] + }, + { + "name": "uuid", + "description": "User's UUID (Apple) or SID (Windows)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "type", + "description": "Whether the account is roaming (domain), local, or a system profile", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Windows" + ] + }, + { + "name": "is_hidden", + "description": "IsHidden attribute set in OpenDirectory", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "macOS" + ] + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + }, + { + "name": "email", + "required": false, + "type": "text", + "description": "Email", + "platforms": [ + "chrome" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/users.yml" + }, + { + "name": "video_info", + "description": "Retrieve video card information of the machine.", + "url": "https://fleetdm.com/tables/video_info", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "color_depth", + "description": "The amount of bits per pixel to represent color.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "driver", + "description": "The driver of the device.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "driver_date", + "description": "The date listed on the installed driver.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "driver_version", + "description": "The version of the installed driver.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "manufacturer", + "description": "The manufacturer of the gpu.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "model", + "description": "The model of the gpu.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "series", + "description": "The series of the gpu.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "video_mode", + "description": "The current resolution of the display.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/video_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fvideo_info.yml&value=name%3A%20video_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "virtual_memory_info", + "description": "Darwin Virtual Memory statistics.", + "url": "https://fleetdm.com/tables/virtual_memory_info", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Identify systems where memory swapping is occuring. These systems might\nbenefit from more RAM.\n\n```\nSELECT * FROM virtual_memory_info WHERE swap_ins>'0';\n```", + "columns": [ + { + "name": "free", + "description": "Total number of free pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "active", + "description": "Total number of active pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "inactive", + "description": "Total number of inactive pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "speculative", + "description": "Total number of speculative pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "throttled", + "description": "Total number of throttled pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "wired", + "description": "Total number of wired down pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "purgeable", + "description": "Total number of purgeable pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "faults", + "description": "Total number of calls to vm_faults.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "copy", + "description": "Total number of copy-on-write pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "zero_fill", + "description": "Total number of zero filled pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "reactivated", + "description": "Total number of reactivated pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "purged", + "description": "Total number of purged pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "file_backed", + "description": "Total number of file backed pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "anonymous", + "description": "Total number of anonymous pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uncompressed", + "description": "Total number of uncompressed pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "compressor", + "description": "The number of pages used to store compressed VM pages.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "decompressed", + "description": "The total number of pages that have been decompressed by the VM compressor.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "compressed", + "description": "The total number of pages that have been compressed by the VM compressor.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "page_ins", + "description": "The total number of requests for pages from a pager.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "page_outs", + "description": "Total number of pages paged out.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "swap_ins", + "description": "The total number of compressed pages that have been swapped out to disk.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "swap_outs", + "description": "The total number of compressed pages that have been swapped back in from disk.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/virtual_memory_info.yml" + }, + { + "name": "vscode_extensions", + "description": "Installed extensions for [Visual Studio (VS) Code](https://code.visualstudio.com/).", + "url": "https://fleetdm.com/tables/vscode_extensions", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "Querying this table requires joining against the `users` table. [Learn more](https://fleetdm.com/guides/osquery-consider-joining-against-the-users-table)", + "examples": "```\nSELECT * FROM users CROSS JOIN vscode_extensions USING (uid);\n```\n\n\nList the name, publisher, and version of the Visual Studio (VS) Code extensions installed on hosts.\n\n```\nSELECT extension.name, extension.publisher, extension.version FROM users JOIN vscode_extensions extension USING (uid);\n```", + "columns": [ + { + "name": "name", + "description": "Extension Name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uuid", + "description": "Extension UUID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "Extension version", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Extension path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "publisher", + "description": "Publisher Name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "publisher_id", + "description": "Publisher ID", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "installed_at", + "description": "Installed Timestamp", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "prerelease", + "description": "Pre release version", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uid", + "description": "The local user that owns the plugin", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/vscode_extensions.yml" + }, + { + "name": "wifi_networks", + "description": "Wi-Fi networks previously connected to by this Mac, or that are otherwise in this computer's known/remembered Wi-Fi networks list.", + "url": "https://fleetdm.com/tables/wifi_networks", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "Find WiFi networks configured on Macs that are unencrypted and require a\ncaptive portal. This can be useful to understand how much people use laptops\nin hotels, airports and other environments, and is a good indicator that tools\nsuch as DNS-over-HTTPS would improve privacy of connectivity.\n\n```\nSELECT network_name FROM wifi_networks WHERE security_type='Open' AND captive_portal='1';\n```", + "columns": [ + { + "name": "ssid", + "description": "SSID octets of the network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "network_name", + "description": "Name of the network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "security_type", + "description": "Type of security on this network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "last_connected", + "description": "Last time this network was connected to as a unix_time", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "passpoint", + "description": "1 if Passpoint is supported, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "possibly_hidden", + "description": "1 if network is possibly a hidden network, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "roaming", + "description": "1 if roaming is supported, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "roaming_profile", + "description": "Describe the roaming profile, usually one of Single, Dual or Multi", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "auto_login", + "description": "1 if auto login is enabled, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "temporarily_disabled", + "description": "1 if this network is temporarily disabled, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "disabled", + "description": "1 if this network is disabled, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "add_reason", + "description": "Shows why this network was added, via menubar or command line or something else ", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "added_at", + "description": "Time this network was added as a unix_time", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "captive_portal", + "description": "1 if this network has a captive portal, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "captive_login_date", + "description": "Time this network logged in to a captive portal as unix_time", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "was_captive_network", + "description": "1 if this network was previously a captive network, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "auto_join", + "description": "1 if this network set to join automatically, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "personal_hotspot", + "description": "1 if this network is a personal hotspot, 0 otherwise", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/wifi_networks.yml" + }, + { + "name": "wifi_status", + "description": "macOS current WiFi status.", + "url": "https://fleetdm.com/tables/wifi_status", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "- `bssid` and `country code` are only available for macOS 11 and earlier because they would enable geolocation. ", + "examples": "See the current speed of the WiFi connection, in megabits per second.\n\n```\nSELECT transmit_rate FROM wifi_status;\n```", + "columns": [ + { + "name": "interface", + "description": "Name of the interface", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ssid", + "description": "SSID octets of the network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bssid", + "description": "The current basic service set identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "network_name", + "description": "Name of the network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "country_code", + "description": "The country code (ISO/IEC 3166-1:1997) for the network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "security_type", + "description": "Type of security on this network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "rssi", + "description": "The current received signal strength indication (dbm)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "noise", + "description": "The current noise measurement (dBm)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "channel", + "description": "Channel number", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "channel_width", + "description": "Channel width", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "channel_band", + "description": "Channel band", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "transmit_rate", + "description": "The current transmit rate", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mode", + "description": "The current operating mode for the Wi-Fi interface", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/wifi_status.yml" + }, + { + "name": "wifi_survey", + "description": "Scan for nearby WiFi networks.", + "url": "https://fleetdm.com/tables/wifi_survey", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "- `bssid` and `country code` are only available for macOS 11 and earlier because they would enable geolocation. ", + "examples": "Count the amount of wireless networks visible to the computer.\n\n```\nSELECT COUNT ( DISTINCT network_name ) AS \"Number of wireless networks visible\" FROM wifi_survey;\n```", + "columns": [ + { + "name": "interface", + "description": "Name of the interface", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ssid", + "description": "SSID octets of the network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "bssid", + "description": "The current basic service set identifier", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "network_name", + "description": "Name of the network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "country_code", + "description": "The country code (ISO/IEC 3166-1:1997) for the network", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "rssi", + "description": "The current received signal strength indication (dbm)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "noise", + "description": "The current noise measurement (dBm)", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "channel", + "description": "Channel number", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "channel_width", + "description": "Channel width", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "channel_band", + "description": "Channel band", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/wifi_survey.yml" + }, + { + "name": "winbaseobj", + "description": "Lists named Windows objects in the default object directories, across all terminal services sessions. Example Windows ojbect types include Mutexes, Events, Jobs and Semaphors.", + "url": "https://fleetdm.com/tables/winbaseobj", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from winbaseobj where type='Mutant'\n```", + "columns": [ + { + "name": "session_id", + "description": "Terminal Services Session Id", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "object_name", + "description": "Object Name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "object_type", + "description": "Object Type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/winbaseobj.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwinbaseobj.yml&value=name%3A%20winbaseobj%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "windows_crashes", + "description": "Extracted information from Windows crash logs (Minidumps).", + "url": "https://fleetdm.com/tables/windows_crashes", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from windows_crashes where stack_trace like '%vlc%'\n```", + "columns": [ + { + "name": "datetime", + "description": "Timestamp (log format) of the crash", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "module", + "description": "Path of the crashed module within the process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "Path of the executable file for the crashed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process ID of the crashed process", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tid", + "description": "Thread ID of the crashed thread", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "version", + "description": "File version info of the crashed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "process_uptime", + "description": "Uptime of the process in seconds", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "stack_trace", + "description": "Multiple stack frames from the stack trace", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exception_code", + "description": "The Windows exception code", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exception_message", + "description": "The NTSTATUS error message associated with the exception code", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "exception_address", + "description": "Address (in hex) where the exception occurred", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "registers", + "description": "The values of the system registers", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "command_line", + "description": "Command-line string passed to the crashed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "current_directory", + "description": "Current working directory of the crashed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "username", + "description": "Username of the user who ran the crashed process", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "machine_name", + "description": "Name of the machine where the crash happened", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "major_version", + "description": "Windows major version of the machine", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "minor_version", + "description": "Windows minor version of the machine", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "build_number", + "description": "Windows build number of the crashing machine", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Type of crash log", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "crash_path", + "description": "Path of the log file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/windows_crashes.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwindows_crashes.yml&value=name%3A%20windows_crashes%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "windows_eventlog", + "description": "Table for querying all recorded Windows event logs.", + "url": "https://fleetdm.com/tables/windows_eventlog", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "* This is not an evented table - instead, it pulls directly from the local system's existing eventlogs. \n\n* The information returned in the `data` column will be JSON formatted, which will require additional parsing. ", + "examples": "Tracking user account changes is a key part of both detection & incident response. This query lists all Windows Eventlogs from the Security channel with an EventID of 4720 - A user account was created. There are many other relevant EventIDs that should be monitored as well: \n\n- [4722: Account enabled](https://www.ultimatewindowssecurity.com/securitylog/encyclopedia/event.aspx?eventID=4722)\n\n- [4724: Password reset](https://www.ultimatewindowssecurity.com/securitylog/encyclopedia/event.aspx?eventid=4724)\n\n- [4728: Added to a security-enabled global group](https://www.ultimatewindowssecurity.com/securitylog/encyclopedia/event.aspx?eventid=4728)\n\n\n```\nSELECT datetime,computer_name,data FROM windows_eventlog WHERE eventid=4720 AND channel='Security'\"\n```", + "columns": [ + { + "name": "channel", + "description": "Source or channel of the event", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": false + }, + { + "name": "datetime", + "description": "System time at which the event occurred", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "task", + "description": "Task value associated with the event", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "level", + "description": "Severity level associated with the event", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "provider_name", + "description": "Provider name of the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "provider_guid", + "description": "Provider guid of the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "computer_name", + "description": "Hostname of system where event was generated", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eventid", + "description": "Event ID of the event", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "keywords", + "description": "A bitmask of the keywords defined in the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "data", + "description": "Data associated with the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid", + "description": "Process ID which emitted the event record", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tid", + "description": "Thread ID which emitted the event record", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time_range", + "description": "System time to selectively filter the events", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "timestamp", + "description": "Timestamp to selectively filter the events", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "xpath", + "description": "The custom query to filter events", + "type": "text", + "notes": "", + "hidden": true, + "required": true, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/windows_eventlog.yml" + }, + { + "name": "windows_events", + "description": "Windows Event logs.", + "url": "https://fleetdm.com/tables/windows_events", + "platforms": [ + "windows" + ], + "evented": true, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from windows_events where eventid=4104 and source='Security'\n```", + "columns": [ + { + "name": "time", + "description": "Timestamp the event was received", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "datetime", + "description": "System time at which the event occurred", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "source", + "description": "Source or channel of the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "provider_name", + "description": "Provider name of the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "provider_guid", + "description": "Provider guid of the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "computer_name", + "description": "Hostname of system where event was generated", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eventid", + "description": "Event ID of the event", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "task", + "description": "Task value associated with the event", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "level", + "description": "The severity level associated with the event", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "keywords", + "description": "A bitmask of the keywords defined in the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "data", + "description": "Data associated with the event", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/windows_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwindows_events.yml&value=name%3A%20windows_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "windows_firewall_rules", + "description": "Provides the list of Windows firewall rules.", + "url": "https://fleetdm.com/tables/windows_firewall_rules", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "* A rule can exist, but it has to be part of the currently enabled firewall profile to be enforced.", + "examples": "Controlling inbound access to remote services is essential for maintaining security on a system. This query lists all enabled Windows Firewall rules that allow inbound RDP, WinRM & VNC connections on the public firewall profile.\n\n```\nSELECT name,app_name,local_ports FROM windows_firewall_rules WHERE enabled = 1 AND direction = \"In\" AND remote_addresses=\"*\" AND profile_public = 1 AND action = \"Allow\" AND local_ports IN (\"3389\",\"5985\",\"5986\",\"5900\");\n```", + "columns": [ + { + "name": "name", + "description": "Friendly name of the rule", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "app_name", + "description": "Friendly name of the application to which the rule applies", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "action", + "description": "Action for the rule or default setting", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enabled", + "description": "1 if the rule is enabled", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "grouping", + "description": "Group to which an individual rule belongs", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "direction", + "description": "Direction of traffic for which the rule applies", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "protocol", + "description": "IP protocol of the rule", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_addresses", + "description": "Local addresses for the rule", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_addresses", + "description": "Remote addresses for the rule", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "local_ports", + "description": "Local ports for the rule", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remote_ports", + "description": "Remote ports for the rule", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "icmp_types_codes", + "description": "ICMP types and codes for the rule", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "profile_domain", + "description": "1 if the rule profile type is domain", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "profile_private", + "description": "1 if the rule profile type is private", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "profile_public", + "description": "1 if the rule profile type is public", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "service_name", + "description": "Service name property of the application", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/windows_firewall_rules.yml" + }, + { + "name": "windows_optional_features", + "description": "Lists names and installation states of windows features. Maps to Win32_OptionalFeature WMI class.", + "url": "https://fleetdm.com/tables/windows_optional_features", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "SMBv1 is deprecated and has known, unpatched vulnerablities; it should be disabled whenever possible. This query lists enabled SMBv1 services (client and/or server).\n\n```\nSELECT name,caption,statename FROM windows_optional_features WHERE name LIKE 'SMB1Protocol%' AND state = 1;\n```", + "columns": [ + { + "name": "name", + "description": "Name of the feature", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "caption", + "description": "Caption of feature in settings UI", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "Installation state value. 1 == Enabled, 2 == Disabled, 3 == Absent", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "statename", + "description": "Installation state name. 'Enabled','Disabled','Absent'", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/windows_optional_features.yml" + }, + { + "name": "windows_search", + "description": "Run searches against the Windows system index database using Advanced Query Syntax. See https://learn.microsoft.com/en-us/windows/win32/search/-search-3x-advancedquerysyntax for details.", + "url": "https://fleetdm.com/tables/windows_search", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect *, datetime(date_created, 'unixepoch') as datetime from windows_search WHERE query = 'folder:documents' AND datetime BETWEEN '2022-11-18 16:40:00' AND '2023-11-18 16:50:00'\n```", + "columns": [ + { + "name": "name", + "description": "The name of the item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "path", + "description": "The full path of the item.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "size", + "description": "The item size in bytes.", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "date_created", + "description": "The unix timestamp of when the item was created.", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "date_modified", + "description": "The unix timestamp of when the item was last modified", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "owner", + "description": "The owner of the item", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "The item type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "properties", + "description": "Additional property values JSON", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "query", + "description": "Windows search query", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "sort", + "description": "Sort for windows api", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "max_results", + "description": "Maximum number of results returned by windows api, set to -1 for unlimited", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "additional_properties", + "description": "Comma separated list of columns to include in properties JSON", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/windows_search.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwindows_search.yml&value=name%3A%20windows_search%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "windows_security_center", + "description": "The health status of Window Security features. Health values can be \"Good\", \"Poor\". \"Snoozed\", \"Not Monitored\", and \"Error\".", + "url": "https://fleetdm.com/tables/windows_security_center", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from windows_security_center\n```", + "columns": [ + { + "name": "firewall", + "description": "The health of the monitored Firewall (see windows_security_products)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "autoupdate", + "description": "The health of the Windows Autoupdate feature", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "antivirus", + "description": "The health of the monitored Antivirus solution (see windows_security_products)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "antispyware", + "description": "Deprecated (always 'Good').", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "internet_settings", + "description": "The health of the Internet Settings", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "windows_security_center_service", + "description": "The health of the Windows Security Center Service", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user_account_control", + "description": "The health of the User Account Control (UAC) capability in Windows", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/windows_security_center.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwindows_security_center.yml&value=name%3A%20windows_security_center%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "windows_security_products", + "description": "Enumeration of registered Windows security products. Note: Not compatible with Windows Server.", + "url": "https://fleetdm.com/tables/windows_security_products", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from windows_security_products\n```", + "columns": [ + { + "name": "type", + "description": "Type of security product", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Name of product", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state", + "description": "State of protection", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "state_timestamp", + "description": "Timestamp for the product state", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "remediation_path", + "description": "Remediation path", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "signatures_up_to_date", + "description": "1 if product signatures are up to date, else 0", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/windows_security_products.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwindows_security_products.yml&value=name%3A%20windows_security_products%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "windows_update_history", + "description": "Provides the history of the windows update events.", + "url": "https://fleetdm.com/tables/windows_update_history", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from windows_update_history\n```", + "columns": [ + { + "name": "client_app_id", + "description": "Identifier of the client application that processed an update", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "date", + "description": "Date and the time an update was applied", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Description of an update", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hresult", + "description": "HRESULT value that is returned from the operation on an update", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "operation", + "description": "Operation on an update", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "result_code", + "description": "Result of an operation on an update", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "server_selection", + "description": "Value that indicates which server provided an update", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "service_id", + "description": "Service identifier of an update service that is not a Windows update", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "support_url", + "description": "Hyperlink to the language-specific support information for an update", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "title", + "description": "Title of an update", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "update_id", + "description": "Revision-independent identifier of an update", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "update_revision", + "description": "Revision number of an update", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/windows_update_history.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwindows_update_history.yml&value=name%3A%20windows_update_history%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "windows_updates", + "description": "Returns information about Windows updates that are available for installation.", + "evented": false, + "notes": "- This table may not return any results while updates are being downloaded and installed.\n- This table is not a core osquery table. It is included as part of fleetd, the osquery manager from Fleet. Code based on work by [Kolide](https://github.com/kolide/launcher).", + "platforms": [ + "windows" + ], + "columns": [ + { + "name": "locale", + "description": "Location of the update.", + "required": false, + "type": "text" + }, + { + "name": "is_default", + "description": "Whether or not the update is the default.", + "required": false, + "type": "text" + }, + { + "name": "key", + "description": "A specific item that describes the update.", + "type": "text", + "required": false + }, + { + "name": "value", + "description": "The value for the specified key.", + "type": "text", + "required": false + }, + { + "name": "fullkey", + "description": "The expanded name of the specific item that describes the update.", + "type": "text", + "required": false + }, + { + "name": "parent", + "description": "The key's parent.", + "type": "text", + "required": false + }, + { + "name": "query", + "description": "The query is printed in this column.", + "type": "text", + "required": false + } + ], + "url": "https://fleetdm.com/tables/windows_updates", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/windows_updates.yml" + }, + { + "name": "wmi_bios_info", + "description": "Lists important information from the system bios.", + "url": "https://fleetdm.com/tables/wmi_bios_info", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from wmi_bios_info where name = 'AMTControl'\n```", + "columns": [ + { + "name": "name", + "description": "Name of the Bios setting", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "value", + "description": "Value of the Bios setting", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/wmi_bios_info.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwmi_bios_info.yml&value=name%3A%20wmi_bios_info%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "wmi_cli_event_consumers", + "description": "WMI CommandLineEventConsumer, which can be used for persistence on Windows. See https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf for more details.", + "url": "https://fleetdm.com/tables/wmi_cli_event_consumers", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect filter,consumer,query,command_line_template,wcec.name from wmi_cli_event_consumers wcec left outer join wmi_filter_consumer_binding wcb on consumer = wcec.relative_path left outer join wmi_event_filters wef on wef.relative_path = wcb.filter;\n```", + "columns": [ + { + "name": "name", + "description": "Unique name of a consumer.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "command_line_template", + "description": "Standard string template that specifies the process to be started. This property can be NULL, and the ExecutablePath property is used as the command line.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "executable_path", + "description": "Module to execute. The string can specify the full path and file name of the module to execute, or it can specify a partial name. If a partial name is specified, the current drive and current directory are assumed.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "class", + "description": "The name of the class.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "relative_path", + "description": "Relative path to the class or instance.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/wmi_cli_event_consumers.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwmi_cli_event_consumers.yml&value=name%3A%20wmi_cli_event_consumers%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "wmi_event_filters", + "description": "Lists WMI event filters.", + "url": "https://fleetdm.com/tables/wmi_event_filters", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from wmi_event_filters\n```", + "columns": [ + { + "name": "name", + "description": "Unique identifier of an event filter.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "query", + "description": "Windows Management Instrumentation Query Language (WQL) event query that specifies the set of events for consumer notification, and the specific conditions for notification.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "query_language", + "description": "Query language that the query is written in.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "class", + "description": "The name of the class.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "relative_path", + "description": "Relative path to the class or instance.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/wmi_event_filters.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwmi_event_filters.yml&value=name%3A%20wmi_event_filters%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "wmi_filter_consumer_binding", + "description": "Lists the relationship between event consumers and filters.", + "url": "https://fleetdm.com/tables/wmi_filter_consumer_binding", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect * from wmi_filter_consumer_binding\n```", + "columns": [ + { + "name": "consumer", + "description": "Reference to an instance of __EventConsumer that represents the object path to a logical consumer, the recipient of an event.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "filter", + "description": "Reference to an instance of __EventFilter that represents the object path to an event filter which is a query that specifies the type of event to be received.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "class", + "description": "The name of the class.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "relative_path", + "description": "Relative path to the class or instance.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/wmi_filter_consumer_binding.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwmi_filter_consumer_binding.yml&value=name%3A%20wmi_filter_consumer_binding%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "wmi_script_event_consumers", + "description": "WMI ActiveScriptEventConsumer, which can be used for persistence on Windows. See https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf for more details.", + "url": "https://fleetdm.com/tables/wmi_script_event_consumers", + "platforms": [ + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "```\nselect filter,consumer,query,scripting_engine,script_file_name,script_text,wsec.name from wmi_script_event_consumers wsec left outer join wmi_filter_consumer_binding wcb on consumer = wsec.relative_path left outer join wmi_event_filters wef on wef.relative_path = wcb.filter;\n```", + "columns": [ + { + "name": "name", + "description": "Unique identifier for the event consumer. ", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "scripting_engine", + "description": "Name of the scripting engine to use, for example, 'VBScript'. This property cannot be NULL.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "script_file_name", + "description": "Name of the file from which the script text is read, intended as an alternative to specifying the text of the script in the ScriptText property.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "script_text", + "description": "Text of the script that is expressed in a language known to the scripting engine. This property must be NULL if the ScriptFileName property is not NULL.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "class", + "description": "The name of the class.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "relative_path", + "description": "Relative path to the class or instance.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/windows/wmi_script_event_consumers.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fwmi_script_event_consumers.yml&value=name%3A%20wmi_script_event_consumers%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "xprotect_entries", + "description": "Database of the machine's XProtect signatures.", + "url": "https://fleetdm.com/tables/xprotect_entries", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "Identify the Bundlore variants Xprotect protects the computer from\n\n```\nSELECT * FROM xprotect_entries WHERE name LIKE 'OSX.Bundlore%';\n```", + "columns": [ + { + "name": "name", + "description": "Description of XProtected malware", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "launch_type", + "description": "Launch services content type", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "identity", + "description": "XProtect identity (SHA1) of content", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "filename", + "description": "Use this file name to match", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "filetype", + "description": "Use this file type to match", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "optional", + "description": "Match any of the identities/patterns for this XProtect name", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "uses_pattern", + "description": "Uses a match pattern instead of identity", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/xprotect_entries.yml" + }, + { + "name": "xprotect_meta", + "description": "This Mac's browser-related [XProtect](https://support.apple.com/en-ca/guide/security/sec469d47bd8/web) signatures.", + "url": "https://fleetdm.com/tables/xprotect_meta", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "See the minimum version of specific components allowed by Xprotect. This\nusually means the previous versions have vulnerabilities that are being\nexploited at scale, or were exploited at scale at some point in time.\n\n```\nSELECT * FROM xprotect_meta WHERE min_version!='any';\n```", + "columns": [ + { + "name": "identifier", + "description": "Browser extension or plugin [identifier](https://fleetdm.com/tables/safari_extensions)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "type", + "description": "Either plugin or extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "developer_id", + "description": "Developer identity (SHA1) of extension", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "min_version", + "description": "The minimum allowed plugin version, or 'any' if no version is allowed.", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/xprotect_meta.yml" + }, + { + "name": "xprotect_reports", + "description": "Database of XProtect matches (if user generated/sent an XProtect report).", + "url": "https://fleetdm.com/tables/xprotect_reports", + "platforms": [ + "darwin" + ], + "evented": false, + "cacheable": false, + "notes": "- In [very specific circumstances](https://github.com/osquery/osquery/issues/6588#issuecomment-1410934706) this table will return empty because xprotect will detect and remediate without generating an eicar file. ", + "examples": "See all Xprotect activity reports, if any are present. This indicates\npotentially malicious software was blocked by Xprotect.\n\n```\nSELECT * FROM xprotect_reports;\n```", + "columns": [ + { + "name": "name", + "description": "Description of XProtected malware", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "user_action", + "description": "Action taken by user after prompted", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Quarantine alert time", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/xprotect_reports.yml" + }, + { + "name": "yara", + "description": "Triggers one-off YARA query for files at the specified path. Requires one of `sig_group`, `sigfile`, or `sigrule`.", + "url": "https://fleetdm.com/tables/yara", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Look for files under `/root` that match a Yara signature. This example uses the [EICAR test file](https://www.eicar.org/download-anti-malware-testfile/).\n\n```\nSELECT * FROM yara WHERE path like '/root/%%' AND sigrule IN (\n 'rule eicar {\n strings:\n $s1 = \"X5O!P%@AP[4\\\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*\" fullword ascii\n condition:\n all of them\n}'\n ) AND matches='eicar';\n```", + "columns": [ + { + "name": "path", + "description": "The path scanned", + "type": "text", + "notes": "", + "hidden": false, + "required": true, + "index": true + }, + { + "name": "matches", + "description": "List of YARA matches", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "count", + "description": "Number of YARA matches", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sig_group", + "description": "Signature group used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sigfile", + "description": "Signature file used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sigrule", + "description": "Signature strings used", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "strings", + "description": "Matching strings", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tags", + "description": "Matching tags", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "sigurl", + "description": "Signature url", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": true, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/yara.yml" + }, + { + "name": "yara_events", + "description": "Track YARA matches for files specified in configuration data.", + "url": "https://fleetdm.com/tables/yara_events", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": true, + "cacheable": false, + "notes": "", + "columns": [ + { + "name": "target_path", + "description": "The path scanned", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "category", + "description": "The category of the file", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "action", + "description": "Change action (UPDATE, REMOVE, etc)", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "transaction_id", + "description": "ID used during bulk update", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "matches", + "description": "List of YARA matches", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "count", + "description": "Number of YARA matches", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "strings", + "description": "Matching strings", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "tags", + "description": "Matching tags", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "time", + "description": "Time of the scan", + "type": "bigint", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "eid", + "description": "Event ID", + "type": "text", + "notes": "", + "hidden": true, + "required": false, + "index": false + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/yara/yara_events.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fyara_events.yml&value=name%3A%20yara_events%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "ycloud_instance_metadata", + "description": "Yandex.Cloud instance metadata.", + "url": "https://fleetdm.com/tables/ycloud_instance_metadata", + "platforms": [ + "darwin", + "linux", + "windows" + ], + "evented": false, + "cacheable": true, + "notes": "", + "examples": "```\nselect * from ycloud_instance_metadata where metadata_endpoint=\"http://169.254.169.254\"\n```", + "columns": [ + { + "name": "instance_id", + "description": "Unique identifier for the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + }, + { + "name": "folder_id", + "description": "Folder identifier for the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "cloud_id", + "description": "Cloud identifier for the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "name", + "description": "Name of the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "description", + "description": "Description of the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "hostname", + "description": "Hostname of the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "zone", + "description": "Availability zone of the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "ssh_public_key", + "description": "SSH public key. Only available if supplied at instance launch time", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "serial_port_enabled", + "description": "Indicates if serial port is enabled for the VM", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "metadata_endpoint", + "description": "Endpoint used to fetch VM metadata", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": true + } + ], + "osqueryRepoUrl": "https://github.com/osquery/osquery/blob/master/specs/ycloud_instance_metadata.table", + "fleetRepoUrl": "https://github.com/fleetdm/fleet/new/main/schema?filename=tables%2Fycloud_instance_metadata.yml&value=name%3A%20ycloud_instance_metadata%0Adescription%3A%20%7C-%20%23%20(required)%20string%20-%20The%20description%20for%20this%20table.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%23%20Add%20description%20here%0Aexamples%3A%20%7C-%20%23%20(optional)%20string%20-%20An%20example%20query%20for%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown%0A%09%23%20Add%20examples%20here%0Anotes%3A%20%7C-%20%23%20(optional)%20string%20-%20Notes%20about%20this%20table.%20Note%3A%20This%20field%20supports%20Markdown.%0A%09%23%20Add%20notes%20here%0Acolumns%3A%20%23%20(required)%0A%09-%20name%3A%20%23%20(required)%20string%20-%20The%20name%20of%20the%20column%0A%09%20%20description%3A%20%23%20(required)%20string%20-%20The%20column's%20description.%20Note%3A%20this%20field%20supports%20Markdown%0A%09%20%20type%3A%20%23%20(required)%20string%20-%20the%20column's%20data%20type%0A%09%20%20required%3A%20%23%20(required)%20boolean%20-%20whether%20or%20not%20this%20column%20is%20required%20to%20query%20this%20table." + }, + { + "name": "yum_sources", + "description": "Current list of Yum repositories or software channels.", + "url": "https://fleetdm.com/tables/yum_sources", + "platforms": [ + "linux" + ], + "evented": false, + "cacheable": false, + "notes": "", + "examples": "Find yum repositories on Linux servers for which cryptographic verification\nvia GPG is disabled. This could allow untrusted packages to be injected into a\nrepository that could then be installed.\n\n```\nSELECT * FROM yum_sources WHERE gpgcheck='0'; \n```", + "columns": [ + { + "name": "name", + "description": "Repository name", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "baseurl", + "description": "Repository base URL", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "mirrorlist", + "description": "Mirrorlist URL", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "enabled", + "description": "Whether the repository is used", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gpgcheck", + "description": "Whether packages are GPG checked", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "gpgkey", + "description": "URL to GPG key", + "type": "text", + "notes": "", + "hidden": false, + "required": false, + "index": false + }, + { + "name": "pid_with_namespace", + "description": "Pids that contain a namespace", + "type": "integer", + "notes": "", + "hidden": false, + "required": false, + "index": false, + "platforms": [ + "Linux" + ] + } + ], + "fleetRepoUrl": "https://github.com/fleetdm/fleet/blob/main/schema/tables/yum_sources.yml" + } +]; + + +// No typecasting is needed in plain JavaScript +var queryTable = osqueryFleetTablesJSON; + +// Sorting the tables by name +var osqueryTables = queryTable.sort(function (a, b) { + return a.name.localeCompare(b.name); +}); + +// Getting the table names, excluding hidden ones +var osqueryTableNames = _.flatten(_.map(osqueryTables, function (table) { + return table.hidden ? [] : table.name; +})); + +// Getting the column names, excluding those from hidden tables +var osqueryTableColumnNames = _.flatten(_.map(osqueryTables, function (table) { + return table.hidden ? [] : _.map(table.columns, function (column) { + return column.name; + }); +})); + +// Getting the table columns, excluding those from hidden tables +var osqueryTableColumns = _.flatten(_.map(osqueryTables, function (table) { + return table.hidden ? [] : table.columns; +}), true); + +// Function to filter columns by selected tables, excluding hidden columns and tables +var selectedTableColumns = function (selectedTables) { + var columnsFilteredBySelection = _.flatten(_.map(osqueryTables, function (table) { + var hideColumns = function () { + if (table.hidden) { + return true; + } + if (selectedTables.length > 0 && !_.includes(selectedTables, table.name)) { + return true; + } + return false; + }; + + return hideColumns() ? [] : table.columns; + }), true); + + return columnsFilteredBySelection; +}; +// const { sqlBuiltinFunctions, sqlDataTypes, sqlKeyWords } = require("utilities/sql_tools"); +const sqlKeyWords = [ + "select", + "insert", + "update", + "delete", + "from", + "where", + "and", + "or", + "group", + "by", + "order", + "limit", + "offset", + "having", + "as", + "case", + "when", + "else", + "end", + "type", + "left", + "right", + "join", + "on", + "outer", + "desc", + "asc", + "union", + "create", + "table", + "primary", + "key", + "if", + "foreign", + "not", + "references", + "default", + "null", + "inner", + "cross", + "natural", + "database", + "drop", + "grant", +]; + +// Note: `last` was removed from the list of built-in functions because it collides with the +// `last` table available in osquery +const sqlBuiltinFunctions = [ + "avg", + "count", + "first", + "max", + "min", + "sum", + "ucase", + "lcase", + "mid", + "len", + "round", + "rank", + "now", + "format", + "coalesce", + "ifnull", + "isnull", + "nvl", +]; + +const sqlDataTypes = [ + "int", + "numeric", + "decimal", + "date", + "varchar", + "char", + "bigint", + "float", + "double", + "bit", + "binary", + "text", + "set", + "timestamp", + "money", + "real", + "number", + "integer", +]; + +ace.define( + "ace/mode/fleet_highlight_rules", + [ + "require", + "exports", + "module", + "ace/lib/oop", + "ace/mode/sql_highlight_rules", + ], + function (acequire, exports, module) { + "use strict"; + + var oop = acequire("../lib/oop"); + var SqlHighlightRules = acequire("./sql_highlight_rules").SqlHighlightRules; + + var FleetHighlightRules = function () { + var keywords = sqlKeyWords.join("|"); + + var builtinConstants = "true|false"; + + var builtinFunctions = sqlBuiltinFunctions.join("|"); + + var dataTypes = sqlDataTypes.join("|"); + + var osqueryTables = osqueryTableNames.join("|"); + var osqueryColumns = osqueryTableColumnNames.join("|"); + + var keywordMapper = this.createKeywordMapper( + { + "osquery-token": osqueryTables, + "osquery-column": osqueryColumns, + "support.function": builtinFunctions, + keyword: keywords, + "constant.language": builtinConstants, + "storage.type": dataTypes, + }, + "identifier", + true + ); + + this.$rules = { + start: [ + { + token: "comment", + regex: "--.*$", + }, + { + token: "comment", + start: "/\\*", + end: "\\*/", + }, + { + token: "string", // " string + regex: '".*?"', + }, + { + token: "string", // ' string + regex: "'.*?'", + }, + { + token: "constant.numeric", // float + regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b", + }, + { + token: keywordMapper, + regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\\b", + }, + { + token: "keyword.operator", + regex: + "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=", + }, + { + token: "paren.lparen", + regex: "[\\(]", + }, + { + token: "paren.rparen", + regex: "[\\)]", + }, + { + token: "text", + regex: "\\s+", + }, + ], + }; + + this.normalizeRules(); + }; + + oop.inherits(FleetHighlightRules, SqlHighlightRules); + + exports.FleetHighlightRules = FleetHighlightRules; + } +); diff --git a/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-fleet.js b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-fleet.js new file mode 100644 index 0000000000..a21acd162f --- /dev/null +++ b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-fleet.js @@ -0,0 +1,35 @@ +/* eslint-disable */ +// @ts-nocheck +ace.define( + "ace/mode/fleet", + [ + "require", + "exports", + "module", + "ace/lib/oop", + "ace/mode/sql", + "ace/mode/fleet_highlight_rules", + "ace/range", + ], + function (acequire, exports, module) { + "use strict"; + + var oop = acequire("../lib/oop"); + var TextMode = acequire("./sql").Mode; + var FleetHighlightRules = acequire("./fleet_highlight_rules").FleetHighlightRules; + var Range = acequire("../range").Range; + + var Mode = function () { + this.HighlightRules = FleetHighlightRules; + // ... any additional mode setup ... + }; + oop.inherits(Mode, TextMode); + + (function () { + this.lineCommentStart = "--"; + this.$id = "ace/mode/fleet"; + }.call(Mode.prototype)); + + exports.Mode = Mode; + } +); diff --git a/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-powershell.js b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-powershell.js new file mode 100644 index 0000000000..817e14c5db --- /dev/null +++ b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-powershell.js @@ -0,0 +1,567 @@ +ace.define("ace/mode/powershell_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module){"use strict"; +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var PowershellHighlightRules = function () { + var identifierRe = "[a-zA-Z\\?_\u00a1-\uffff][a-zA-Z\\d\\?_\u00a1-\uffff]*"; + var keywords = ("begin|break|catch|class|continue|data|define|do|dynamicparam|else|elseif|end|enum|exit|filter|" + + "finally|for|foreach|from|function|if|in|inlinescript|hidden|parallel|param|" + + "process|return|static|sequence|switch|throw|trap|try|until|using|while|workflow|var"); + var builtinFunctions = ( + "Get-AppBackgroundTask|Start-AppBackgroundTask|Unregister-AppBackgroundTask|Disable-AppBackgroundTaskDiagnosticLog|Enable-AppBackgroundTaskDiagnosticLog|Set-AppBackgroundTaskResourcePolicy|" + + "Get-AppLockerFileInformation|Get-AppLockerPolicy|New-AppLockerPolicy|Set-AppLockerPolicy|Test-AppLockerPolicy|" + + "Add-AppvClientConnectionGroup|Add-AppvClientPackage|Add-AppvPublishingServer|Disable-Appv|Disable-AppvClientConnectionGroup|Disable-AppvClientMode|Disable-AppvPublishingServer|Enable-Appv|Enable-AppvClientConnectionGroup|Enable-AppvClientMode|Enable-AppvPublishingServer|Get-AppvClientApplication|Get-AppvClientConfiguration|Get-AppvClientConnectionGroup|Get-AppvClientMode|Get-AppvClientPackage|Get-AppvClientPackageStatus|Get-AppvClientPackageVersion|Get-AppvClientPackageVersionHistory|Get-AppvClientPackageVersionStatus|Get-AppvClientPublishingServer|Get-AppvClientSFTFileSystem|Get-AppvClientStatus|Get-AppvPublishingServer|Get-AppvVirtualProcess|Publish-AppvClientPackage|Remove-AppvClientConnectionGroup|Remove-AppvClientPackage|Remove-AppvPublishingServer|Set-AppvClientConfiguration|Set-AppvClientMode|Set-AppvClientPackage|Set-AppvClientPublishingServer|Set-AppvVirtualProcess|Sync-AppvPublishingServer|Get-AppvStatus|Mount-AppvClientConnectionGroup|Repair-AppvClientConnectionGroup|Repair-AppvClientPackage|Send-AppvClientReport|Set-AppvPublishingServer|Start-AppvVirtualProcess|Stop-AppvClientConnectionGroup|Stop-AppvClientPackage|Unpublish-AppvClientPackage|" + + "Expand-AppvSequencerPackage|New-AppvPackageAccelerator|New-AppvSequencerPackage|Update-AppvSequencerPackage|" + + "Add-AppSharedPackageContainer|Add-AppxPackage|Add-AppxVolume|Dismount-AppxVolume|Get-AppSharedPackageContainer|Get-AppxDefaultVolume|Get-AppxLastError|Get-AppxLog|Get-AppxPackage|Get-AppxPackageAutoUpdateSettings|Get-AppxPackageManifest|Get-AppxVolume|Invoke-CommandInDesktopPackage|Mount-AppxVolume|Move-AppxPackage|Remove-AppSharedPackageContainer|Remove-AppxPackage|Remove-AppxPackageAutoUpdateSettings|Remove-AppxVolume|Reset-AppSharedPackageContainer|Reset-AppxPackage|Set-AppxDefaultVolume|Set-AppxPackageAutoUpdateSettings|" + + "Clear-AssignedAccess|Get-AssignedAccess|Set-AssignedAccess|" + + "Get-BpaModel|Get-BpaResult|Invoke-BpaModel|Set-BpaResult|" + + "Add-BitLockerKeyProtector|Backup-BitLockerKeyProtector|BackupToAAD-BitLockerKeyProtector|Clear-BitLockerAutoUnlock|Disable-BitLocker|Disable-BitLockerAutoUnlock|Enable-BitLocker|Enable-BitLockerAutoUnlock|Get-BitLockerVolume|Lock-BitLocker|Remove-BitLockerKeyProtector|Resume-BitLocker|Suspend-BitLocker|Unlock-BitLocker|" + + "Add-BitsFile|Complete-BitsTransfer|Get-BitsTransfer|Remove-BitsTransfer|Resume-BitsTransfer|Set-BitsTransfer|Start-BitsTransfer|Suspend-BitsTransfer|" + + "Checkpoint-SbecActiveConfig|Clear-SbecProviderCache|Disable-SbecAutologger|Disable-SbecBcd|Enable-SbecAutologger|Enable-SbecBcd|Enable-SbecBootImage|Enable-SbecWdsBcd|Get-SbecActiveConfig|Get-SbecBackupConfig|Get-SbecDestination|Get-SbecForwarding|Get-SbecHistory|Get-SbecLocalizedMessage|Get-SbecLogSession|Get-SbecTraceProviders|New-SbecUnattendFragment|Redo-SbecActiveConfig|Restore-SbecBackupConfig|Save-SbecInstance|Save-SbecLogSession|Set-SbecActiveConfig|Set-SbecLogSession|Start-SbecInstance|Start-SbecLogSession|Start-SbecNtKernelLogSession|Start-SbecSimpleLogSession|Stop-SbecInstance|Stop-SbecLogSession|Test-SbecActiveConfig|Test-SbecConfig|Undo-SbecActiveConfig|" + + "Add-BCDataCacheExtension|Clear-BCCache|Disable-BC|Disable-BCDowngrading|Disable-BCServeOnBattery|Enable-BCDistributed|Enable-BCDowngrading|Enable-BCHostedClient|Enable-BCHostedServer|Enable-BCLocal|Enable-BCServeOnBattery|Export-BCCachePackage|Export-BCSecretKey|Get-BCClientConfiguration|Get-BCContentServerConfiguration|Get-BCDataCache|Get-BCDataCacheExtension|Get-BCHashCache|Get-BCHostedCacheServerConfiguration|Get-BCNetworkConfiguration|Get-BCStatus|Import-BCCachePackage|Import-BCSecretKey|Publish-BCFileContent|Publish-BCWebContent|Remove-BCDataCacheExtension|Reset-BC|Set-BCAuthentication|Set-BCCache|Set-BCDataCacheEntryMaxAge|Set-BCMinSMBLatency|Set-BCSecretKey|" + + "Add-CauClusterRole|Disable-CauClusterRole|Enable-CauClusterRole|Export-CauReport|Get-CauClusterRole|Get-CauPlugin|Get-CauReport|Get-CauRun|Invoke-CauRun|Invoke-CauScan|Register-CauPlugin|Remove-CauClusterRole|Save-CauDebugTrace|Set-CauClusterRole|Stop-CauRun|Test-CauSetup|Unregister-CauPlugin|" + + "Export-BinaryMiLog|Get-CimAssociatedInstance|Get-CimClass|Get-CimInstance|Get-CimSession|Import-BinaryMiLog|Invoke-CimMethod|New-CimInstance|New-CimSession|New-CimSessionOption|Register-CimIndicationEvent|Remove-CimInstance|Remove-CimSession|Set-CimInstance|" + + "ConvertFrom-CIPolicy|" + + "Add-SignerRule|ConvertFrom-CIPolicy|Edit-CIPolicyRule|Get-CIPolicy|Get-CIPolicyIdInfo|Get-CIPolicyInfo|Get-SystemDriver|Merge-CIPolicy|New-CIPolicy|New-CIPolicyRule|Remove-CIPolicyRule|Set-CIPolicyIdInfo|Set-CIPolicySetting|Set-CIPolicyVersion|Set-HVCIOptions|Set-RuleOption|" + + "Disable-NetQosFlowControl|Enable-NetQosFlowControl|Get-NetQosDcbxSetting|Get-NetQosFlowControl|Get-NetQosTrafficClass|New-NetQosTrafficClass|Remove-NetQosTrafficClass|Set-NetQosDcbxSetting|Set-NetQosFlowControl|Set-NetQosTrafficClass|Switch-NetQosDcbxSetting|Switch-NetQosFlowControl|Switch-NetQosTrafficClass|" + + "Disable-DedupVolume|Enable-DedupVolume|Expand-DedupFile|Get-DedupJob|Get-DedupMetadata|Get-DedupSchedule|Get-DedupStatus|Get-DedupVolume|Measure-DedupFileMetadata|New-DedupSchedule|Remove-DedupSchedule|Set-DedupSchedule|Set-DedupVolume|Start-DedupJob|Stop-DedupJob|Update-DedupStatus|" + + "Add-MpPreference|Get-MpComputerStatus|Get-MpPreference|Get-MpThreat|Get-MpThreatCatalog|Get-MpThreatDetection|Remove-MpPreference|Remove-MpThreat|Set-MpPreference|Start-MpScan|Start-MpWDOScan|Update-MpSignature|" + + "Backup-DHASConfiguration|Get-DHASActiveEncryptionCertificate|Get-DHASActiveSigningCertificate|Get-DHASCertificateChainPolicy|Get-DHASInactiveEncryptionCertificate|Get-DHASInactiveSigningCertificate|Install-DeviceHealthAttestation|Remove-DHASInactiveEncryptionCertificate|Remove-DHASInactiveSigningCertificate|Restore-DHASConfiguration|Set-DHASActiveEncryptionCertificate|Set-DHASActiveSigningCertificate|Set-DHASCertificateChainPolicy|Set-DHASSupportedAuthenticationSchema|Uninstall-DeviceHealthAttestation||" + + "Get-DfsnAccess|Get-DfsnFolder|Get-DfsnFolderTarget|Get-DfsnRoot|Get-DfsnRootTarget|Get-DfsnServerConfiguration|Grant-DfsnAccess|Move-DfsnFolder|New-DfsnFolder|New-DfsnFolderTarget|New-DfsnRoot|New-DfsnRootTarget|Remove-DfsnAccess|Remove-DfsnFolder|Remove-DfsnFolderTarget|Remove-DfsnRoot|Remove-DfsnRootTarget|Revoke-DfsnAccess|Set-DfsnFolder|Set-DfsnFolderTarget|Set-DfsnRoot|Set-DfsnRootTarget|Set-DfsnServerConfiguration|" + + "Add-DfsrConnection|Add-DfsrMember|ConvertFrom-DfsrGuid|Export-DfsrClone|Get-DfsrBacklog|Get-DfsrCloneState|Get-DfsrConnection|Get-DfsrConnectionSchedule|Get-DfsrDelegation|Get-DfsReplicatedFolder|Get-DfsReplicationGroup|Get-DfsrFileHash|Get-DfsrGroupSchedule|Get-DfsrIdRecord|Get-DfsrMember|Get-DfsrMembership|Get-DfsrPreservedFiles|Get-DfsrServiceConfiguration|Get-DfsrState|Grant-DfsrDelegation|Import-DfsrClone|New-DfsReplicatedFolder|New-DfsReplicationGroup|Remove-DfsrConnection|Remove-DfsReplicatedFolder|Remove-DfsReplicationGroup|Remove-DfsrMember|Remove-DfsrPropagationTestFile|Reset-DfsrCloneState|Restore-DfsrPreservedFiles|Revoke-DfsrDelegation|Set-DfsrConnection|Set-DfsrConnectionSchedule|Set-DfsReplicatedFolder|Set-DfsReplicationGroup|Set-DfsrGroupSchedule|Set-DfsrMember|Set-DfsrMembership|Set-DfsrServiceConfiguration|Start-DfsrPropagationTest|Suspend-DfsReplicationGroup|Sync-DfsReplicationGroup|Update-DfsrConfigurationFromAD|Write-DfsrHealthReport|Write-DfsrPropagationReport|" + + "Add-DhcpServerInDC|Add-DhcpServerSecurityGroup|Add-DhcpServerv4Class|Add-DhcpServerv4ExclusionRange|Add-DhcpServerv4Failover|Add-DhcpServerv4FailoverScope|Add-DhcpServerv4Filter|Add-DhcpServerv4Lease|Add-DhcpServerv4MulticastExclusionRange|Add-DhcpServerv4MulticastScope|Add-DhcpServerv4OptionDefinition|Add-DhcpServerv4Policy|Add-DhcpServerv4PolicyIPRange|Add-DhcpServerv4Reservation|Add-DhcpServerv4Scope|Add-DhcpServerv4Superscope|Add-DhcpServerv6Class|Add-DhcpServerv6ExclusionRange|Add-DhcpServerv6Lease|Add-DhcpServerv6OptionDefinition|Add-DhcpServerv6Reservation|Add-DhcpServerv6Scope|Backup-DhcpServer|Export-DhcpServer|Get-DhcpServerAuditLog|Get-DhcpServerDatabase|Get-DhcpServerDnsCredential|Get-DhcpServerInDC|Get-DhcpServerSetting|Get-DhcpServerv4Binding|Get-DhcpServerv4Class|Get-DhcpServerv4DnsSetting|Get-DhcpServerv4ExclusionRange|Get-DhcpServerv4Failover|Get-DhcpServerv4Filter|Get-DhcpServerv4FilterList|Get-DhcpServerv4FreeIPAddress|Get-DhcpServerv4Lease|Get-DhcpServerv4MulticastExclusionRange|Get-DhcpServerv4MulticastLease|Get-DhcpServerv4MulticastScope|Get-DhcpServerv4MulticastScopeStatistics|Get-DhcpServerv4OptionDefinition|Get-DhcpServerv4OptionValue|Get-DhcpServerv4Policy|Get-DhcpServerv4PolicyIPRange|Get-DhcpServerv4Reservation|Get-DhcpServerv4Scope|Get-DhcpServerv4ScopeStatistics|Get-DhcpServerv4Statistics|Get-DhcpServerv4Superscope|Get-DhcpServerv4SuperscopeStatistics|Get-DhcpServerv6Binding|Get-DhcpServerv6Class|Get-DhcpServerv6DnsSetting|Get-DhcpServerv6ExclusionRange|Get-DhcpServerv6FreeIPAddress|Get-DhcpServerv6Lease|Get-DhcpServerv6OptionDefinition|Get-DhcpServerv6OptionValue|Get-DhcpServerv6Reservation|Get-DhcpServerv6Scope|Get-DhcpServerv6ScopeStatistics|Get-DhcpServerv6StatelessStatistics|Get-DhcpServerv6StatelessStore|Get-DhcpServerv6Statistics|Get-DhcpServerVersion|Import-DhcpServer|Invoke-DhcpServerv4FailoverReplication|Remove-DhcpServerDnsCredential|Remove-DhcpServerInDC|Remove-DhcpServerv4Class|Remove-DhcpServerv4ExclusionRange|Remove-DhcpServerv4Failover|Remove-DhcpServerv4FailoverScope|Remove-DhcpServerv4Filter|Remove-DhcpServerv4Lease|Remove-DhcpServerv4MulticastExclusionRange|Remove-DhcpServerv4MulticastLease|Remove-DhcpServerv4MulticastScope|Remove-DhcpServerv4OptionDefinition|Remove-DhcpServerv4OptionValue|Remove-DhcpServerv4Policy|Remove-DhcpServerv4PolicyIPRange|Remove-DhcpServerv4Reservation|Remove-DhcpServerv4Scope|Remove-DhcpServerv4Superscope|Remove-DhcpServerv6Class|Remove-DhcpServerv6ExclusionRange|Remove-DhcpServerv6Lease|Remove-DhcpServerv6OptionDefinition|Remove-DhcpServerv6OptionValue|Remove-DhcpServerv6Reservation|Remove-DhcpServerv6Scope|Rename-DhcpServerv4Superscope|Repair-DhcpServerv4IPRecord|Restore-DhcpServer|Set-DhcpServerAuditLog|Set-DhcpServerDatabase|Set-DhcpServerDnsCredential|Set-DhcpServerSetting|Set-DhcpServerv4Binding|Set-DhcpServerv4Class|Set-DhcpServerv4DnsSetting|Set-DhcpServerv4Failover|Set-DhcpServerv4FilterList|Set-DhcpServerv4MulticastScope|Set-DhcpServerv4OptionDefinition|Set-DhcpServerv4OptionValue|Set-DhcpServerv4Policy|Set-DhcpServerv4Reservation|Set-DhcpServerv4Scope|Set-DhcpServerv6Binding|Set-DhcpServerv6Class|Set-DhcpServerv6DnsSetting|Set-DhcpServerv6OptionDefinition|Set-DhcpServerv6OptionValue|Set-DhcpServerv6Reservation|Set-DhcpServerv6Scope|Set-DhcpServerv6StatelessStore|" + + "Disable-DAManualEntryPointSelection|Enable-DAManualEntryPointSelection|Get-DAClientExperienceConfiguration|Get-DAEntryPointTableItem|New-DAEntryPointTableItem|Remove-DAEntryPointTableItem|Rename-DAEntryPointTableItem|Reset-DAClientExperienceConfiguration|Reset-DAEntryPointTableItem|Set-DAClientExperienceConfiguration|Set-DAEntryPointTableItem|" + + "Add-AppxProvisionedPackage|Add-WindowsCapability|Add-WindowsDriver|Add-WindowsImage|Add-WindowsPackage|Clear-WindowsCorruptMountPoint|Disable-WindowsOptionalFeature|Dismount-WindowsImage|Enable-WindowsOptionalFeature|Expand-WindowsCustomDataImage|Expand-WindowsImage|Export-WindowsCapabilitySource|Export-WindowsDriver|Export-WindowsImage|Get-AppxProvisionedPackage|Get-NonRemovableAppsPolicy|Get-WIMBootEntry|Get-WindowsCapability|Get-WindowsDriver|Get-WindowsEdition|Get-WindowsImage|Get-WindowsImageContent|Get-WindowsOptionalFeature|Get-WindowsPackage|Get-WindowsReservedStorageState|Mount-WindowsImage|New-WindowsCustomImage|New-WindowsImage|Optimize-AppXProvisionedPackages|Optimize-WindowsImage|Remove-AppxProvisionedPackage|Remove-WindowsCapability|Remove-WindowsDriver|Remove-WindowsImage|Remove-WindowsPackage|Repair-WindowsImage|Save-WindowsImage|Set-AppXProvisionedDataFile|Set-NonRemovableAppsPolicy|Set-WindowsEdition|Set-WindowsProductKey|Set-WindowsReservedStorageState|Split-WindowsImage|Start-OSUninstall|Update-WIMBootEntry|Use-WindowsUnattend|" + + "Add-DnsClientDohServerAddress|Add-DnsClientNrptRule|Clear-DnsClientCache|Get-DnsClient|Get-DnsClientCache|Get-DnsClientDohServerAddress|Get-DnsClientGlobalSetting|Get-DnsClientNrptGlobal|Get-DnsClientNrptPolicy|Get-DnsClientNrptRule|Get-DnsClientServerAddress|Register-DnsClient|Remove-DnsClientDohServerAddress|Remove-DnsClientNrptRule|Resolve-DnsName|Set-DnsClient|Set-DnsClientDohServerAddress|Set-DnsClientGlobalSetting|Set-DnsClientNrptGlobal|Set-DnsClientNrptRule|Set-DnsClientServerAddress|" + + "Add-DnsServerClientSubnet|Add-DnsServerConditionalForwarderZone|Add-DnsServerDirectoryPartition|Add-DnsServerForwarder|Add-DnsServerPrimaryZone|Add-DnsServerQueryResolutionPolicy|Add-DnsServerRecursionScope|Add-DnsServerResourceRecord|Add-DnsServerResourceRecordA|Add-DnsServerResourceRecordAAAA|Add-DnsServerResourceRecordCName|Add-DnsServerResourceRecordDnsKey|Add-DnsServerResourceRecordDS|Add-DnsServerResourceRecordMX|Add-DnsServerResourceRecordPtr|Add-DnsServerResponseRateLimitingExceptionlist|Add-DnsServerRootHint|Add-DnsServerSecondaryZone|Add-DnsServerSigningKey|Add-DnsServerStubZone|Add-DnsServerTrustAnchor|Add-DnsServerVirtualizationInstance|Add-DnsServerZoneDelegation|Add-DnsServerZoneScope|Add-DnsServerZoneTransferPolicy|Clear-DnsServerCache|Clear-DnsServerStatistics|ConvertTo-DnsServerPrimaryZone|ConvertTo-DnsServerSecondaryZone|Disable-DnsServerPolicy|Disable-DnsServerSigningKeyRollover|Enable-DnsServerPolicy|Enable-DnsServerSigningKeyRollover|Export-DnsServerDnsSecPublicKey|Export-DnsServerZone|Get-DnsServer|Get-DnsServerCache|Get-DnsServerClientSubnet|Get-DnsServerDiagnostics|Get-DnsServerDirectoryPartition|Get-DnsServerDnsSecZoneSetting|Get-DnsServerDsSetting|Get-DnsServerEDns|Get-DnsServerForwarder|Get-DnsServerGlobalNameZone|Get-DnsServerGlobalQueryBlockList|Get-DnsServerQueryResolutionPolicy|Get-DnsServerRecursion|Get-DnsServerRecursionScope|Get-DnsServerResourceRecord|Get-DnsServerResponseRateLimiting|Get-DnsServerResponseRateLimitingExceptionlist|Get-DnsServerRootHint|Get-DnsServerScavenging|Get-DnsServerSetting|Get-DnsServerSigningKey|Get-DnsServerStatistics|Get-DnsServerTrustAnchor|Get-DnsServerTrustPoint|Get-DnsServerVirtualizationInstance|Get-DnsServerZone|Get-DnsServerZoneAging|Get-DnsServerZoneDelegation|Get-DnsServerZoneScope|Get-DnsServerZoneTransferPolicy|Import-DnsServerResourceRecordDS|Import-DnsServerRootHint|Import-DnsServerTrustAnchor|Invoke-DnsServerSigningKeyRollover|Invoke-DnsServerZoneSign|Invoke-DnsServerZoneUnsign|Register-DnsServerDirectoryPartition|Remove-DnsServerClientSubnet|Remove-DnsServerDirectoryPartition|Remove-DnsServerForwarder|Remove-DnsServerQueryResolutionPolicy|Remove-DnsServerRecursionScope|Remove-DnsServerResourceRecord|Remove-DnsServerResponseRateLimitingExceptionlist|Remove-DnsServerRootHint|Remove-DnsServerSigningKey|Remove-DnsServerTrustAnchor|Remove-DnsServerVirtualizationInstance|Remove-DnsServerZone|Remove-DnsServerZoneDelegation|Remove-DnsServerZoneScope|Remove-DnsServerZoneTransferPolicy|Reset-DnsServerZoneKeyMasterRole|Restore-DnsServerPrimaryZone|Restore-DnsServerSecondaryZone|Resume-DnsServerZone|Set-DnsServer|Set-DnsServerCache|Set-DnsServerClientSubnet|Set-DnsServerConditionalForwarderZone|Set-DnsServerDiagnostics|Set-DnsServerDnsSecZoneSetting|Set-DnsServerDsSetting|Set-DnsServerEDns|Set-DnsServerForwarder|Set-DnsServerGlobalNameZone|Set-DnsServerGlobalQueryBlockList|Set-DnsServerPrimaryZone|Set-DnsServerQueryResolutionPolicy|Set-DnsServerRecursion|Set-DnsServerRecursionScope|Set-DnsServerResourceRecord|Set-DnsServerResourceRecordAging|Set-DnsServerResponseRateLimiting|Set-DnsServerResponseRateLimitingExceptionlist|Set-DnsServerRootHint|Set-DnsServerScavenging|Set-DnsServerSecondaryZone|Set-DnsServerSetting|Set-DnsServerSigningKey|Set-DnsServerStubZone|Set-DnsServerVirtualizationInstance|Set-DnsServerZoneAging|Set-DnsServerZoneDelegation|Set-DnsServerZoneTransferPolicy|Show-DnsServerCache|Show-DnsServerKeyStorageProvider|Start-DnsServerScavenging|Start-DnsServerZoneTransfer|Step-DnsServerSigningKeyRollover|Suspend-DnsServerZone|Sync-DnsServerZone|Test-DnsServer|Test-DnsServerDnsSecZoneSetting|Unregister-DnsServerDirectoryPartition|Update-DnsServerTrustPoint|" + + "Add-EtwTraceProvider|Get-AutologgerConfig|Get-EtwTraceProvider|Get-EtwTraceSession|New-AutologgerConfig|New-EtwTraceSession|Remove-AutologgerConfig|Remove-EtwTraceProvider|Save-EtwTraceSession|Send-EtwTraceSession|Set-EtwTraceProvider|Start-EtwTraceSession|Stop-EtwTraceSession|Update-AutologgerConfig|Update-EtwTraceSession|" + + "Add-ClusterCheckpoint|Add-ClusterDisk|Add-ClusterFileServerRole|Add-ClusterGenericApplicationRole|Add-ClusterGenericScriptRole|Add-ClusterGenericServiceRole|Add-ClusterGroup|Add-ClusterGroupSetDependency|Add-ClusterGroupToSet|Add-ClusteriSCSITargetServerRole|Add-ClusterNode|Add-ClusterResource|Add-ClusterResourceDependency|Add-ClusterResourceType|Add-ClusterScaleOutFileServerRole|Add-ClusterSharedVolume|Add-ClusterVirtualMachineRole|Add-ClusterVMMonitoredItem|Block-ClusterAccess|Clear-ClusterDiskReservation|Clear-ClusterNode|Disable-ClusterStorageSpacesDirect|Enable-ClusterStorageSpacesDirect|Get-Cluster|Get-ClusterAccess|Get-ClusterAvailableDisk|Get-ClusterCheckpoint|Get-ClusterDiagnosticInfo|Get-ClusterFaultDomain|Get-ClusterFaultDomainXML|Get-ClusterGroup|Get-ClusterGroupSet|Get-ClusterGroupSetDependency|Get-ClusterLog|Get-ClusterNetwork|Get-ClusterNetworkInterface|Get-ClusterNode|Get-ClusterOwnerNode|Get-ClusterParameter|Get-ClusterQuorum|Get-ClusterResource|Get-ClusterResourceDependency|Get-ClusterResourceDependencyReport|Get-ClusterResourceType|Get-ClusterSharedVolume|Get-ClusterSharedVolumeState|Get-ClusterStorageSpacesDirect|Get-ClusterVMMonitoredItem|Grant-ClusterAccess|Move-ClusterGroup|Move-ClusterResource|Move-ClusterSharedVolume|Move-ClusterVirtualMachineRole|New-Cluster|New-ClusterFaultDomain|New-ClusterGroupSet|New-ClusterNameAccount|Remove-Cluster|Remove-ClusterAccess|Remove-ClusterCheckpoint|Remove-ClusterFaultDomain|Remove-ClusterGroup|Remove-ClusterGroupFromSet|Remove-ClusterGroupSet|Remove-ClusterGroupSetDependency|Remove-ClusterNode|Remove-ClusterResource|Remove-ClusterResourceDependency|Remove-ClusterResourceType|Remove-ClusterSharedVolume|Remove-ClusterVMMonitoredItem|Repair-ClusterStorageSpacesDirect|Reset-ClusterVMMonitoredState|Resume-ClusterNode|Resume-ClusterResource|Set-ClusterFaultDomain|Set-ClusterFaultDomainXML|Set-ClusterGroupSet|Set-ClusterLog|Set-ClusterOwnerNode|Set-ClusterParameter|Set-ClusterQuorum|Set-ClusterResourceDependency|Set-ClusterStorageSpacesDirect|Set-ClusterStorageSpacesDirectDisk|Start-Cluster|Start-ClusterGroup|Start-ClusterNode|Start-ClusterResource|Stop-Cluster|Stop-ClusterGroup|Stop-ClusterNode|Stop-ClusterResource|Suspend-ClusterNode|Suspend-ClusterResource|Test-Cluster|Test-ClusterResourceFailure|Update-ClusterFunctionalLevel|Update-ClusterIPResource|Update-ClusterNetworkNameResource|Update-ClusterVirtualMachineConfiguration|" + + "Get-FsrmAdrSetting|Get-FsrmAutoQuota|Get-FsrmClassification|Get-FsrmClassificationPropertyDefinition|Get-FsrmClassificationRule|Get-FsrmEffectiveNamespace|Get-FsrmFileGroup|Get-FsrmFileManagementJob|Get-FsrmFileScreen|Get-FsrmFileScreenException|Get-FsrmFileScreenTemplate|Get-FsrmMacro|Get-FsrmMgmtProperty|Get-FsrmQuota|Get-FsrmQuotaTemplate|Get-FsrmRmsTemplate|Get-FsrmSetting|Get-FsrmStorageReport|New-FsrmAction|New-FsrmAutoQuota|New-FsrmClassificationPropertyDefinition|New-FsrmClassificationPropertyValue|New-FsrmClassificationRule|New-FsrmFileGroup|New-FsrmFileManagementJob|New-FsrmFileScreen|New-FsrmFileScreenException|New-FsrmFileScreenTemplate|New-FsrmFmjAction|New-FsrmFmjCondition|New-FsrmFMJNotification|New-FsrmFmjNotificationAction|New-FsrmQuota|New-FsrmQuotaTemplate|New-FsrmQuotaThreshold|New-FsrmScheduledTask|New-FsrmStorageReport|Remove-FsrmAutoQuota|Remove-FsrmClassificationPropertyDefinition|Remove-FsrmClassificationRule|Remove-FsrmFileGroup|Remove-FsrmFileManagementJob|Remove-FsrmFileScreen|Remove-FsrmFileScreenException|Remove-FsrmFileScreenTemplate|Remove-FsrmMgmtProperty|Remove-FsrmQuota|Remove-FsrmQuotaTemplate|Remove-FsrmStorageReport|Reset-FsrmFileScreen|Reset-FsrmQuota|Send-FsrmTestEmail|Set-FsrmAdrSetting|Set-FsrmAutoQuota|Set-FsrmClassification|Set-FsrmClassificationPropertyDefinition|Set-FsrmClassificationRule|Set-FsrmFileGroup|Set-FsrmFileManagementJob|Set-FsrmFileScreen|Set-FsrmFileScreenException|Set-FsrmFileScreenTemplate|Set-FsrmMgmtProperty|Set-FsrmQuota|Set-FsrmQuotaTemplate|Set-FsrmSetting|Set-FsrmStorageReport|Start-FsrmClassification|Start-FsrmFileManagementJob|Start-FsrmStorageReport|Stop-FsrmClassification|Stop-FsrmFileManagementJob|Stop-FsrmStorageReport|Update-FsrmAutoQuota|Update-FsrmClassificationPropertyDefinition|Update-FsrmQuota|Wait-FsrmClassification|Wait-FsrmFileManagementJob|Wait-FsrmStorageReport|" + + "Backup-GPO|Copy-GPO|Get-GPInheritance|Get-GPO|Get-GPOReport|Get-GPPermission|Get-GPPrefRegistryValue|Get-GPRegistryValue|Get-GPResultantSetOfPolicy|Get-GPStarterGPO|Import-GPO|Invoke-GPUpdate|New-GPLink|New-GPO|New-GPStarterGPO|Remove-GPLink|Remove-GPO|Remove-GPPrefRegistryValue|Remove-GPRegistryValue|Rename-GPO|Restore-GPO|Set-GPInheritance|Set-GPLink|Set-GPPermission|Set-GPPrefRegistryValue|Set-GPRegistryValue|" + + "Export-HwCertTestCollectionToXml|Import-HwCertTestCollectionFromXml|Merge-HwCertTestCollectionFromPackage|Merge-HwCertTestCollectionFromXml|New-HwCertProjectDefinitionFile|New-HwCertTestCollection|New-HwCertTestCollectionExcelReport|" + + "Add-HgsAttestationCIPolicy|Add-HgsAttestationDumpPolicy|Add-HgsAttestationHostGroup|Add-HgsAttestationTpmHost|Add-HgsAttestationTpmPolicy|Disable-HgsAttestationPolicy|Enable-HgsAttestationPolicy|Get-HgsAttestationHostGroup|Get-HgsAttestationPolicy|Get-HgsAttestationSignerCertificate|Get-HgsAttestationTpmHost|Remove-HgsAttestationHostGroup|Remove-HgsAttestationPolicy|Remove-HgsAttestationTpmHost|" + + "ConvertTo-HgsKeyProtector|Export-HgsGuardian|Get-HgsAttestationBaselinePolicy|Get-HgsClientConfiguration|Get-HgsGuardian|Grant-HgsKeyProtectorAccess|Import-HgsGuardian|New-HgsGuardian|New-HgsKeyProtector|Remove-HgsGuardian|Revoke-HgsKeyProtectorAccess|Set-HgsClientConfiguration|Test-HgsClientConfiguration|" + + "Get-HgsTrace|Get-HgsTraceFileData|New-HgsTraceTarget|Test-HgsTraceTarget|" + + "Add-HgsKeyProtectionAttestationSignerCertificate|Add-HgsKeyProtectionCertificate|Export-HgsKeyProtectionState|Get-HgsKeyProtectionAttestationSignerCertificate|Get-HgsKeyProtectionCertificate|Get-HgsKeyProtectionConfiguration|Import-HgsKeyProtectionState|Remove-HgsKeyProtectionAttestationSignerCertificate|Remove-HgsKeyProtectionCertificate|Set-HgsKeyProtectionAttestationSignerCertificatePolicy|Set-HgsKeyProtectionCertificate|Set-HgsKeyProtectionConfiguration|" + + "Clear-HgsServer|Export-HgsServerState|Get-HgsServer|Import-HgsServerState|Initialize-HgsServer|Install-HgsServer|Set-HgsServer|Test-HgsServer|Uninstall-HgsServer|" + + "Debug-SlbDatapath|Debug-VirtualMachineQueueOperation|Disable-MuxEchoResponder|Enable-MuxEchoResponder|Get-CustomerRoute|Get-NetworkControllerVipResource|Get-PACAMapping|Get-ProviderAddress|Get-VipHostMapping|Get-VMNetworkAdapterPortId|Get-VMSwitchExternalPortId|Test-DipHostReachability|Test-EncapOverheadSettings|Test-LogicalNetworkConnection|Test-LogicalNetworkSupportsJumboPacket|Test-VipReachability|Test-VirtualNetworkConnection|" + + "Get-ComputeProcess|Stop-ComputeProcess|" + + "Add-VMDvdDrive|Add-VMFibreChannelHba|Add-VMGpuPartitionAdapter|Add-VMGroupMember|Add-VMHardDiskDrive|Add-VMMigrationNetwork|Add-VMNetworkAdapter|Add-VMNetworkAdapterAcl|Add-VMNetworkAdapterExtendedAcl|Add-VmNetworkAdapterRoutingDomainMapping|Add-VMRemoteFx3dVideoAdapter|Add-VMScsiController|Add-VMStoragePath|Add-VMSwitch|Add-VMSwitchExtensionPortFeature|Add-VMSwitchExtensionSwitchFeature|Add-VMSwitchTeamMember|Checkpoint-VM|Compare-VM|Complete-VMFailover|Connect-VMNetworkAdapter|Connect-VMSan|Convert-VHD|Copy-VMFile|Debug-VM|Disable-VMConsoleSupport|Disable-VMEventing|Disable-VMIntegrationService|Disable-VMMigration|Disable-VMRemoteFXPhysicalVideoAdapter|Disable-VMResourceMetering|Disable-VMSwitchExtension|Disable-VMTPM|Disconnect-VMNetworkAdapter|Disconnect-VMSan|Dismount-VHD|Enable-VMConsoleSupport|Enable-VMEventing|Enable-VMIntegrationService|Enable-VMMigration|Enable-VMRemoteFXPhysicalVideoAdapter|Enable-VMReplication|Enable-VMResourceMetering|Enable-VMSwitchExtension|Enable-VMTPM|Export-VM|Export-VMSnapshot|Get-VHD|Get-VHDSet|Get-VHDSnapshot|Get-VM|Get-VMBios|Get-VMComPort|Get-VMConnectAccess|Get-VMDvdDrive|Get-VMFibreChannelHba|Get-VMFirmware|Get-VMFloppyDiskDrive|Get-VMGpuPartitionAdapter|Get-VMGroup|Get-VMHardDiskDrive|Get-VMHost|Get-VMHostCluster|Get-VMHostNumaNode|Get-VMHostNumaNodeStatus|Get-VMHostPartitionableGpu|Get-VMHostSupportedVersion|Get-VMIdeController|Get-VMIntegrationService|Get-VMKeyProtector|Get-VMMemory|Get-VMMigrationNetwork|Get-VMNetworkAdapter|Get-VMNetworkAdapterAcl|Get-VMNetworkAdapterExtendedAcl|Get-VMNetworkAdapterFailoverConfiguration|Get-VmNetworkAdapterIsolation|Get-VMNetworkAdapterRoutingDomainMapping|Get-VMNetworkAdapterTeamMapping|Get-VMNetworkAdapterVlan|Get-VMProcessor|Get-VMRemoteFx3dVideoAdapter|Get-VMRemoteFXPhysicalVideoAdapter|Get-VMReplication|Get-VMReplicationAuthorizationEntry|Get-VMReplicationServer|Get-VMResourcePool|Get-VMSan|Get-VMScsiController|Get-VMSecurity|Get-VMSnapshot|Get-VMStoragePath|Get-VMSwitch|Get-VMSwitchExtension|Get-VMSwitchExtensionPortData|Get-VMSwitchExtensionPortFeature|Get-VMSwitchExtensionSwitchData|Get-VMSwitchExtensionSwitchFeature|Get-VMSwitchTeam|Get-VMSystemSwitchExtension|Get-VMSystemSwitchExtensionPortFeature|Get-VMSystemSwitchExtensionSwitchFeature|Get-VMVideo|Grant-VMConnectAccess|Import-VM|Import-VMInitialReplication|Measure-VM|Measure-VMReplication|Measure-VMResourcePool|Merge-VHD|Mount-VHD|Move-VM|Move-VMStorage|New-VFD|New-VHD|New-VM|New-VMGroup|||New-VMReplicationAuthorizationEntry|New-VMResourcePool|New-VMSan|New-VMSwitch|Optimize-VHD|Optimize-VHDSet|Remove-VHDSnapshot|Remove-VM|Remove-VMDvdDrive|Remove-VMFibreChannelHba|Remove-VMGpuPartitionAdapter|Remove-VMGroup|Remove-VMGroupMember|Remove-VMHardDiskDrive|Remove-VMMigrationNetwork|Remove-VMNetworkAdapter|Remove-VMNetworkAdapterAcl|Remove-VMNetworkAdapterExtendedAcl|Remove-VMNetworkAdapterRoutingDomainMapping|Remove-VMNetworkAdapterTeamMapping|Remove-VMRemoteFx3dVideoAdapter|Remove-VMReplication|Remove-VMReplicationAuthorizationEntry|Remove-VMResourcePool|Remove-VMSan|Remove-VMSavedState|Remove-VMScsiController|Remove-VMSnapshot|Remove-VMStoragePath|Remove-VMSwitch|Remove-VMSwitchExtensionPortFeature|Remove-VMSwitchExtensionSwitchFeature|Remove-VMSwitchTeamMember|Rename-VM|Rename-VMGroup|Rename-VMNetworkAdapter|Rename-VMResourcePool|Rename-VMSan|Rename-VMSnapshot|Rename-VMSwitch|Repair-VM|Reset-VMReplicationStatistics|Reset-VMResourceMetering|Resize-VHD|Restart-VM|Restore-VMSnapshot|Resume-VM|Resume-VMReplication|Revoke-VMConnectAccess|Save-VM|Set-VHD|Set-VM|Set-VMBios|Set-VMComPort|Set-VMDvdDrive|Set-VMFibreChannelHba|Set-VMFirmware|Set-VMFloppyDiskDrive|Set-VMGpuPartitionAdapter|Set-VMHardDiskDrive|Set-VMHost|Set-VMHostCluster|Set-VMHostPartitionableGpu|Set-VMKeyProtector|Set-VMMemory|Set-VMMigrationNetwork|Set-VMNetworkAdapter|Set-VMNetworkAdapterFailoverConfiguration|Set-VmNetworkAdapterIsolation|Set-VmNetworkAdapterRoutingDomainMapping|Set-VMNetworkAdapterTeamMapping|Set-VMNetworkAdapterVlan|Set-VMProcessor|Set-VMRemoteFx3dVideoAdapter|Set-VMReplication|Set-VMReplicationAuthorizationEntry|Set-VMReplicationServer|Set-VMResourcePool|Set-VMSan|Set-VMSecurity|Set-VMSecurityPolicy|Set-VMSwitch|Set-VMSwitchExtensionPortFeature|Set-VMSwitchExtensionSwitchFeature|Set-VMSwitchTeam|Set-VMVideo|Start-VM|Start-VMFailover|Start-VMInitialReplication|Start-VMTrace|Stop-VM|Stop-VMFailover|Stop-VMInitialReplication|Stop-VMReplication|Stop-VMTrace|Suspend-VM|Suspend-VMReplication|Test-VHD|Test-VMNetworkAdapter|Test-VMReplicationConnection|Update-VMVersion|" + + "Clear-IISCentralCertProvider|Clear-IISConfigCollection|Disable-IISCentralCertProvider|Disable-IISSharedConfig|Enable-IISCentralCertProvider|Enable-IISSharedConfig|Export-IISConfiguration|Get-IISAppPool|Get-IISCentralCertProvider|Get-IISConfigAttributeValue|Get-IISConfigCollection|Get-IISConfigCollectionElement|Get-IISConfigElement|Get-IISConfigSection|Get-IISServerManager|Get-IISSharedConfig|Get-IISSite|Get-IISSiteBinding|New-IISConfigCollectionElement|New-IISSite|New-IISSiteBinding|Remove-IISConfigAttribute|Remove-IISConfigCollectionElement|Remove-IISConfigElement|Remove-IISSite|Remove-IISSiteBinding|Reset-IISServerManager|Set-IISCentralCertProvider|Set-IISCentralCertProviderCredential|Set-IISConfigAttributeValue|Start-IISCommitDelay|Start-IISSite|Stop-IISCommitDelay|Stop-IISSite|" + + "Copy-UserInternationalSettingsToSystem|Get-WinAcceptLanguageFromLanguageListOptOut|Get-WinCultureFromLanguageListOptOut|Get-WinDefaultInputMethodOverride|Get-WinHomeLocation|Get-WinLanguageBarOption|Get-WinSystemLocale|Get-WinUILanguageOverride|Get-WinUserLanguageList|New-WinUserLanguageList|Set-Culture|Set-WinAcceptLanguageFromLanguageListOptOut|Set-WinCultureFromLanguageListOptOut|Set-WinDefaultInputMethodOverride|Set-WinHomeLocation|Set-WinLanguageBarOption|Set-WinSystemLocale|Set-WinUILanguageOverride|Set-WinUserLanguageList|" + + "Add-IpamAddress|Add-IpamAddressSpace|Add-IpamBlock|Add-IpamCustomField|Add-IpamCustomFieldAssociation|Add-IpamCustomValue|Add-IpamDiscoveryDomain|" + + "Connect-IscsiTarget|Disconnect-IscsiTarget|Get-IscsiConnection|Get-IscsiSession|Get-IscsiTarget|Get-IscsiTargetPortal|New-IscsiTargetPortal|Register-IscsiSession|Remove-IscsiTargetPortal|Set-IscsiChapSecret|Unregister-IscsiSession|Update-IscsiTarget|Update-IscsiTargetPortal|" + + "Add-IscsiVirtualDiskTargetMapping|Checkpoint-IscsiVirtualDisk|Convert-IscsiVirtualDisk|Dismount-IscsiVirtualDiskSnapshot|Export-IscsiTargetServerConfiguration|Export-IscsiVirtualDiskSnapshot|Get-IscsiServerTarget|Get-IscsiTargetServerSetting|Get-IscsiVirtualDisk|Get-IscsiVirtualDiskSnapshot|Import-IscsiTargetServerConfiguration|Import-IscsiVirtualDisk|Mount-IscsiVirtualDiskSnapshot|New-IscsiServerTarget|New-IscsiVirtualDisk|Remove-IscsiServerTarget|Remove-IscsiVirtualDisk|Remove-IscsiVirtualDiskSnapshot|Remove-IscsiVirtualDiskTargetMapping|Resize-IscsiVirtualDisk|Restore-IscsiVirtualDisk|Set-IscsiServerTarget|Set-IscsiTargetServerSetting|Set-IscsiVirtualDisk|Set-IscsiVirtualDiskSnapshot|Stop-IscsiVirtualDiskOperation|" + + "Get-IseSnippet|Import-IseSnippet|New-IseSnippet|" + + "Add-KdsRootKey|Clear-KdsCache|Get-KdsConfiguration|Get-KdsRootKey|Set-KdsConfiguration|Test-KdsRootKey|" + + "Get-InstalledLanguage|Get-SystemPreferredUILanguage|Install-Language|Set-SystemPreferredUILanguage|Uninstall-Language|" + + "Find-LapsADExtendedRights|Get-LapsAADPassword|Get-LapsADPassword|Get-LapsDiagnostics|Invoke-LapsPolicyProcessing|Reset-LapsPassword|Set-LapsADAuditing|Set-LapsADComputerSelfPermission|Set-LapsADPasswordExpirationTime|Set-LapsADReadPasswordPermission|Set-LapsADResetPasswordPermission|Update-LapsADSchema|" + + "Disable-DiagnosticDataViewing|Enable-DiagnosticDataViewing|Get-DiagnosticData|Get-DiagnosticDataTypes|Get-DiagnosticDataViewingSetting|Get-DiagnosticStoreCapacity|Set-DiagnosticStoreCapacity|" + + "Compress-Archive|Expand-Archive|" + + "Export-Counter|Get-Counter|Get-WinEvent|Import-Counter|New-WinEvent|" + + "Start-Transcript|Stop-Transcript|" + + "Add-Computer|Add-Content|Checkpoint-Computer|Clear-Content|Clear-EventLog|Clear-Item|Clear-ItemProperty|Clear-RecycleBin|Complete-Transaction|Convert-Path|Copy-Item|Copy-ItemProperty|Debug-Process|Disable-ComputerRestore|Enable-ComputerRestore|Get-ChildItem|Get-Clipboard|Get-ComputerRestorePoint|Get-Content|Get-ControlPanelItem|Get-EventLog|Get-HotFix|Get-Item|Get-ItemProperty|Get-ItemPropertyValue|Get-Location|Get-Process|Get-PSDrive|Get-PSProvider|Get-Service|Get-Transaction|Get-WmiObject|Invoke-Item|Invoke-WmiMethod|Join-Path|Limit-EventLog|Move-Item|Move-ItemProperty|New-EventLog|New-Item|New-ItemProperty|New-PSDrive|New-Service|New-WebServiceProxy|Pop-Location|Push-Location|Register-WmiEvent|Remove-Computer|Remove-EventLog|Remove-Item|Remove-ItemProperty|Remove-PSDrive|Remove-WmiObject|Rename-Computer|Rename-Item|Rename-ItemProperty|Reset-ComputerMachinePassword|Resolve-Path|Restart-Computer|Restart-Service|Restore-Computer|Resume-Service|Set-Clipboard|Set-Content|Set-Item|Set-ItemProperty|Set-Location|Set-Service|Set-WmiInstance|Show-ControlPanelItem|Show-EventLog|Split-Path|Start-Process|Start-Service|Start-Transaction|Stop-Computer|Stop-Process|Stop-Service|Suspend-Service|Test-ComputerSecureChannel|Test-Connection|Test-Path|Undo-Transaction|Use-Transaction|Wait-Process|Write-EventLog|" + + "Export-ODataEndpointProxy|" + + "ConvertFrom-SecureString|ConvertTo-SecureString|Get-Acl|Get-AuthenticodeSignature|Get-CmsMessage|Get-Credential|Get-ExecutionPolicy|Get-PfxCertificate|Protect-CmsMessage|Set-Acl|Set-AuthenticodeSignature|Set-ExecutionPolicy|Unprotect-CmsMessage|" + + "ConvertFrom-SddlString|Format-Hex|Get-FileHash|Import-PowerShellDataFile|New-Guid|New-TemporaryFile|Add-Member|Add-Type|Clear-Variable|Compare-Object|ConvertFrom-Csv|ConvertFrom-Json|ConvertFrom-String|ConvertFrom-StringData|Convert-String|ConvertTo-Csv|ConvertTo-Html|ConvertTo-Json|ConvertTo-Xml|Debug-Runspace|Disable-PSBreakpoint|Disable-RunspaceDebug|Enable-PSBreakpoint|Enable-RunspaceDebug|Export-Alias|Export-Clixml|Export-Csv|Export-FormatData|Export-PSSession|Format-Custom|Format-List|Format-Table|Format-Wide|Get-Alias|Get-Culture|Get-Date|Get-Event|Get-EventSubscriber|Get-FormatData|Get-Host|Get-Member|Get-PSBreakpoint|Get-PSCallStack|Get-Random|Get-Runspace|Get-RunspaceDebug|Get-TraceSource|Get-TypeData|Get-UICulture|Get-Unique|Get-Variable|Group-Object|Import-Alias|Import-Clixml|Import-Csv|Import-LocalizedData|Import-PSSession|Invoke-Expression|Invoke-RestMethod|Invoke-WebRequest|Measure-Command|Measure-Object|New-Alias|New-Event|New-Object|New-TimeSpan|New-Variable|Out-File|Out-GridView|Out-Printer|Out-String|Read-Host|Register-EngineEvent|Register-ObjectEvent|Remove-Event|Remove-PSBreakpoint|Remove-TypeData|Remove-Variable|Select-Object|Select-String|Select-Xml|Send-MailMessage|Set-Alias|Set-Date|Set-PSBreakpoint|Set-TraceSource|Set-Variable|Show-Command|Sort-Object|Start-Sleep|Tee-Object|Trace-Command|Unblock-File|Unregister-Event|Update-FormatData|Update-List|Update-TypeData|Wait-Debugger|Wait-Event|Write-Debug|Write-Error|Write-Host|Write-Information|Write-Output|Write-Progress|Write-Verbose|Write-Warning|" + + "Connect-WSMan|Disable-WSManCredSSP|Disconnect-WSMan|Enable-WSManCredSSP|Get-WSManCredSSP|Get-WSManInstance|Invoke-WSManAction|New-WSManInstance|New-WSManSessionOption|Remove-WSManInstance|Set-WSManInstance|Set-WSManQuickConfig|Test-WSMan|" + + "Debug-MMAppPrelaunch|Disable-MMAgent|Enable-MMAgent|Get-MMAgent|Set-MMAgent|" + + "Clear-MSDSMSupportedHW|Disable-MSDSMAutomaticClaim|Enable-MSDSMAutomaticClaim|Get-MPIOAvailableHW|Get-MPIOSetting|Get-MSDSMAutomaticClaimSettings|Get-MSDSMGlobalDefaultLoadBalancePolicy|Get-MSDSMSupportedHW|New-MSDSMSupportedHW|Remove-MSDSMSupportedHW|Set-MPIOSetting|Set-MSDSMGlobalDefaultLoadBalancePolicy|Update-MPIOClaimedHW|" + + "Add-DtcClusterTMMapping|Complete-DtcDiagnosticTransaction|Get-Dtc|Get-DtcAdvancedHostSetting|Get-DtcAdvancedSetting|Get-DtcClusterDefault|Get-DtcClusterTMMapping|Get-DtcDefault|Get-DtcLog|Get-DtcNetworkSetting|Get-DtcTransaction|Get-DtcTransactionsStatistics|Get-DtcTransactionsTraceSession|Get-DtcTransactionsTraceSetting|Install-Dtc|Join-DtcDiagnosticResourceManager|New-DtcDiagnosticTransaction|Receive-DtcDiagnosticTransaction|Remove-DtcClusterTMMapping|Reset-DtcLog|Send-DtcDiagnosticTransaction|Set-DtcAdvancedHostSetting|Set-DtcAdvancedSetting|Set-DtcClusterDefault|Set-DtcClusterTMMapping|Set-DtcDefault|Set-DtcLog|Set-DtcNetworkSetting|Set-DtcTransaction|Set-DtcTransactionsTraceSession|Set-DtcTransactionsTraceSetting|Start-Dtc|Start-DtcDiagnosticResourceManager|Start-DtcTransactionsTraceSession|Stop-Dtc|Stop-DtcDiagnosticResourceManager|Stop-DtcTransactionsTraceSession|Test-Dtc|Undo-DtcDiagnosticTransaction|Uninstall-Dtc|Write-DtcTransactionsTraceSession|" + + "Clear-MSMQOutgoingQueue|Clear-MSMQQueue|Enable-MSMQCertificate|Get-MSMQCertificate|Get-MSMQOutgoingQueue|Get-MsmqQueue|Get-MsmqQueueACL|Get-MsmqQueueManager|Get-MsmqQueueManagerACL|Move-MsmqMessage|New-MsmqMessage|New-MsmqQueue|Receive-MsmqQueue|Remove-MsmqCertificate|Remove-MsmqQueue|Resume-MsmqOutgoingQueue|Send-MsmqQueue|Set-MsmqQueue|Set-MsmqQueueACL|Set-MsmqQueueManager|Set-MsmqQueueManagerACL|Suspend-MsmqOutgoingQueue|" + + "Add-WmsSystem|Clear-WmsStation|Close-WmsApp|Close-WmsSession|Disable-WmsDiskProtection|Disable-WmsScheduledUpdate|Disable-WmsWebLimiting|Disconnect-WmsSession|Enable-WmsDiskProtection|Enable-WmsScheduledUpdate|Enable-WmsWebLimiting|Get-WmsAlert|Get-WmsApp|Get-WmsDiskProtection|Get-WmsScheduledUpdate|Get-WmsSession|Get-WmsStation|Get-WmsSystem|Get-WmsUser|Get-WmsVersion|Get-WmsWebLimiting|Hide-WmsIdentifier|Join-WmsStation|Lock-WmsSession|Lock-WmsUsbStorage|New-WmsUser|Open-WmsApp|Publish-WmsDesktop|Remove-WmsSystem|Remove-WmsUser|Restart-WmsSystem|Resume-WmsDiskProtection|Search-WmsSystem|Set-WmsScheduledUpdate|Set-WmsStation|Set-WmsSystem|Set-WmsUser|Set-WmsWebLimiting|Show-WmsDesktop|Show-WmsIdentifier|Split-WmsStation|Stop-WmsSystem|Suspend-WmsDiskProtection|Unlock-WmsSession|Unlock-WmsUsbStorage|Unpublish-WmsDesktop|Update-WmsStation|" + + "Disable-WmsVirtualDesktopRole|Enable-WmsVirtualDesktopRole|Get-WmsVirtualDesktop|Import-WmsVirtualDesktop|New-WmsVirtualDesktop|New-WmsVirtualDesktopTemplate|Open-WmsVirtualDesktop|" + + "Edit-NanoServerImage|Get-NanoServerPackage|New-NanoServerImage|" + + "Disable-NetAdapter|Disable-NetAdapterBinding|Disable-NetAdapterChecksumOffload|Disable-NetAdapterEncapsulatedPacketTaskOffload|Disable-NetAdapterIPsecOffload|Disable-NetAdapterLso|Disable-NetAdapterPowerManagement|Disable-NetAdapterQos|Disable-NetAdapterRdma|Disable-NetAdapterRsc|Disable-NetAdapterRss|Disable-NetAdapterSriov|Disable-NetAdapterUso|Disable-NetAdapterVmq|Enable-NetAdapter|Enable-NetAdapterBinding|Enable-NetAdapterChecksumOffload|Enable-NetAdapterEncapsulatedPacketTaskOffload|Enable-NetAdapterIPsecOffload|Enable-NetAdapterLso|Enable-NetAdapterPowerManagement|Enable-NetAdapterQos|Enable-NetAdapterRdma|Enable-NetAdapterRsc|Enable-NetAdapterRss|Enable-NetAdapterSriov|Enable-NetAdapterUso|Enable-NetAdapterVmq|Get-NetAdapter|Get-NetAdapterAdvancedProperty|Get-NetAdapterBinding|Get-NetAdapterChecksumOffload|Get-NetAdapterDataPathConfiguration|Get-NetAdapterEncapsulatedPacketTaskOffload|Get-NetAdapterHardwareInfo|Get-NetAdapterIPsecOffload|Get-NetAdapterLso|Get-NetAdapterPowerManagement|Get-NetAdapterQos|Get-NetAdapterRdma|Get-NetAdapterRsc|Get-NetAdapterRss|Get-NetAdapterSriov|Get-NetAdapterSriovVf|Get-NetAdapterStatistics|Get-NetAdapterUso|Get-NetAdapterVmq|Get-NetAdapterVmqQueue|Get-NetAdapterVPort|New-NetAdapterAdvancedProperty|Remove-NetAdapterAdvancedProperty|Rename-NetAdapter|Reset-NetAdapterAdvancedProperty|Restart-NetAdapter|Set-NetAdapter|Set-NetAdapterAdvancedProperty|Set-NetAdapterBinding|Set-NetAdapterChecksumOffload|Set-NetAdapterDataPathConfiguration|Set-NetAdapterEncapsulatedPacketTaskOffload|Set-NetAdapterIPsecOffload|Set-NetAdapterLso|Set-NetAdapterPowerManagement|Set-NetAdapterQos|Set-NetAdapterRdma|Set-NetAdapterRsc|Set-NetAdapterRss|Set-NetAdapterSriov|Set-NetAdapterUso|Set-NetAdapterVmq|" + + "Get-NetConnectionProfile|Set-NetConnectionProfile|" + + "Add-NetEventNetworkAdapter|Add-NetEventPacketCaptureProvider|Add-NetEventProvider|Add-NetEventVFPProvider|Add-NetEventVmNetworkAdapter|Add-NetEventVmSwitch|Add-NetEventVmSwitchProvider|Add-NetEventWFPCaptureProvider|Get-NetEventNetworkAdapter|Get-NetEventPacketCaptureProvider|Get-NetEventProvider|Get-NetEventSession|Get-NetEventVFPProvider|Get-NetEventVmNetworkAdapter|Get-NetEventVmSwitch|Get-NetEventVmSwitchProvider|Get-NetEventWFPCaptureProvider|New-NetEventSession|Remove-NetEventNetworkAdapter|Remove-NetEventPacketCaptureProvider|Remove-NetEventProvider|Remove-NetEventSession|Remove-NetEventVFPProvider|Remove-NetEventVmNetworkAdapter|Remove-NetEventVmSwitch|Remove-NetEventVmSwitchProvider|Remove-NetEventWFPCaptureProvider|Set-NetEventPacketCaptureProvider|Set-NetEventProvider|Set-NetEventSession|Set-NetEventVFPProvider|Set-NetEventVmSwitchProvider|Set-NetEventWFPCaptureProvider|Start-NetEventSession|Stop-NetEventSession|" + + "Add-NetLbfoTeamMember|Add-NetLbfoTeamNic|Get-NetLbfoTeam|Get-NetLbfoTeamMember|Get-NetLbfoTeamNic|New-NetLbfoTeam|Remove-NetLbfoTeam|Remove-NetLbfoTeamMember|Remove-NetLbfoTeamNic|Rename-NetLbfoTeam|Set-NetLbfoTeam|Set-NetLbfoTeamMember|Set-NetLbfoTeamNic|" + + "Disable-NetLldpAgent|Enable-NetLldpAgent|Get-NetLldpAgent|" + + "Add-NetNatExternalAddress|Add-NetNatStaticMapping|Get-NetNat|Get-NetNatExternalAddress|Get-NetNatGlobal|Get-NetNatSession|Get-NetNatStaticMapping|New-NetNat|Remove-NetNat|Remove-NetNatExternalAddress|Remove-NetNatStaticMapping|Set-NetNat|Set-NetNatGlobal|" + + "Get-NetQosPolicy|New-NetQosPolicy|Remove-NetQosPolicy|Set-NetQosPolicy|" + + "Copy-NetFirewallRule|Copy-NetIPsecMainModeCryptoSet|Copy-NetIPsecMainModeRule|Copy-NetIPsecPhase1AuthSet|Copy-NetIPsecPhase2AuthSet|Copy-NetIPsecQuickModeCryptoSet|Copy-NetIPsecRule|Disable-NetFirewallRule|Disable-NetIPsecMainModeRule|Disable-NetIPsecRule|Enable-NetFirewallRule|Enable-NetIPsecMainModeRule|Enable-NetIPsecRule|Find-NetIPsecRule|Get-DAPolicyChange|Get-NetFirewallAddressFilter|Get-NetFirewallApplicationFilter|Get-NetFirewallDynamicKeywordAddress|Get-NetFirewallInterfaceFilter|Get-NetFirewallInterfaceTypeFilter|Get-NetFirewallPortFilter|Get-NetFirewallProfile|Get-NetFirewallRule|Get-NetFirewallSecurityFilter|Get-NetFirewallServiceFilter|Get-NetFirewallSetting|Get-NetIPsecDospSetting|Get-NetIPsecMainModeCryptoSet|Get-NetIPsecMainModeRule|Get-NetIPsecMainModeSA|Get-NetIPsecPhase1AuthSet|Get-NetIPsecPhase2AuthSet|Get-NetIPsecQuickModeCryptoSet|Get-NetIPsecQuickModeSA|Get-NetIPsecRule|New-NetFirewallDynamicKeywordAddress|New-NetFirewallRule|New-NetIPsecAuthProposal|New-NetIPsecDospSetting|New-NetIPsecMainModeCryptoProposal|New-NetIPsecMainModeCryptoSet|New-NetIPsecMainModeRule|New-NetIPsecPhase1AuthSet|New-NetIPsecPhase2AuthSet|New-NetIPsecQuickModeCryptoProposal|New-NetIPsecQuickModeCryptoSet|New-NetIPsecRule|Open-NetGPO|Remove-NetFirewallDynamicKeywordAddress|Remove-NetFirewallRule|Remove-NetIPsecDospSetting|Remove-NetIPsecMainModeCryptoSet|Remove-NetIPsecMainModeRule|Remove-NetIPsecMainModeSA|Remove-NetIPsecPhase1AuthSet|Remove-NetIPsecPhase2AuthSet|Remove-NetIPsecQuickModeCryptoSet|Remove-NetIPsecQuickModeSA|Remove-NetIPsecRule|Rename-NetFirewallRule|Rename-NetIPsecMainModeCryptoSet|Rename-NetIPsecMainModeRule|Rename-NetIPsecPhase1AuthSet|Rename-NetIPsecPhase2AuthSet|Rename-NetIPsecQuickModeCryptoSet|Rename-NetIPsecRule|Save-NetGPO|Set-NetFirewallAddressFilter|Set-NetFirewallApplicationFilter|Set-NetFirewallInterfaceFilter|Set-NetFirewallInterfaceTypeFilter|Set-NetFirewallPortFilter|Set-NetFirewallProfile|Set-NetFirewallRule|Set-NetFirewallSecurityFilter|Set-NetFirewallServiceFilter|Set-NetFirewallSetting|Set-NetIPsecDospSetting|Set-NetIPsecMainModeCryptoSet|Set-NetIPsecMainModeRule|Set-NetIPsecPhase1AuthSet|Set-NetIPsecPhase2AuthSet|Set-NetIPsecQuickModeCryptoSet|Set-NetIPsecRule|Show-NetFirewallRule|Show-NetIPsecRule|Sync-NetIPsecRule|Update-NetFirewallDynamicKeywordAddress|Update-NetIPsecRule|" + + "Add-NetSwitchTeamMember|Get-NetSwitchTeam|Get-NetSwitchTeamMember|New-NetSwitchTeam|Remove-NetSwitchTeam|Remove-NetSwitchTeamMember|Rename-NetSwitchTeam|" + + "Find-NetRoute|Get-NetCompartment|Get-NetIPAddress|Get-NetIPConfiguration|Get-NetIPInterface|Get-NetIPv4Protocol|Get-NetIPv6Protocol|Get-NetNeighbor|Get-NetOffloadGlobalSetting|Get-NetPrefixPolicy|Get-NetRoute|Get-NetTCPConnection|Get-NetTCPSetting|Get-NetTransportFilter|Get-NetUDPEndpoint|Get-NetUDPSetting|New-NetIPAddress|New-NetNeighbor|New-NetRoute|New-NetTransportFilter|Remove-NetIPAddress|Remove-NetNeighbor|Remove-NetRoute|Remove-NetTransportFilter|Set-NetIPAddress|Set-NetIPInterface|Set-NetIPv4Protocol|Set-NetIPv6Protocol|Set-NetNeighbor|Set-NetOffloadGlobalSetting|Set-NetRoute|Set-NetTCPSetting|Set-NetUDPSetting|Test-NetConnection|" + + "Get-NetVirtualizationCustomerRoute|Get-NetVirtualizationGlobal|Get-NetVirtualizationLookupRecord|Get-NetVirtualizationProviderAddress|Get-NetVirtualizationProviderRoute|New-NetVirtualizationCustomerRoute|New-NetVirtualizationLookupRecord|New-NetVirtualizationProviderAddress|New-NetVirtualizationProviderRoute|Remove-NetVirtualizationCustomerRoute|Remove-NetVirtualizationLookupRecord|Remove-NetVirtualizationProviderAddress|Remove-NetVirtualizationProviderRoute|Select-NetVirtualizationNextHop|Set-NetVirtualizationCustomerRoute|Set-NetVirtualizationGlobal|Set-NetVirtualizationLookupRecord|Set-NetVirtualizationProviderAddress|Set-NetVirtualizationProviderRoute|" + + "Get-DAConnectionStatus|Get-NCSIPolicyConfiguration|Reset-NCSIPolicyConfiguration|Set-NCSIPolicyConfiguration|" + + "Add-NetworkControllerNode|Clear-NetworkControllerNodeContent|Disable-NetworkControllerNode|Enable-NetworkControllerNode|Get-NetworkController|Get-NetworkControllerAccessControlList|Get-NetworkControllerAccessControlListRule|Get-NetworkControllerAuditingSettingsConfiguration|Get-NetworkControllerBackup|Get-NetworkControllerCluster|Get-NetworkControllerConnectivityCheck|Get-NetworkControllerConnectivityCheckResult|Get-NetworkControllerCredential|Get-NetworkControllerDiagnostic|Get-NetworkControllerDiscovery|Get-NetworkControllerFabricRoute|Get-NetworkControllerGateway|Get-NetworkControllerGatewayPool|Get-NetworkControllerIDnsServerConfiguration|Get-NetworkControllerInternalResourceInstances|Get-NetworkControllerIpPool|Get-NetworkControllerIpReservation|Get-NetworkControllerLoadBalancer|Get-NetworkControllerLoadBalancerBackendAddressPool|Get-NetworkControllerLoadBalancerConfiguration|Get-NetworkControllerLoadBalancerFrontendIpConfiguration|Get-NetworkControllerLoadBalancerInboundNatRule|Get-NetworkControllerLoadBalancerMux|Get-NetworkControllerLoadBalancerOutboundNatRule|Get-NetworkControllerLoadBalancerProbe|Get-NetworkControllerLoadBalancingRule|Get-NetworkControllerLogicalNetwork|Get-NetworkControllerLogicalSubnet|Get-NetworkControllerMacPool|Get-NetworkControllerNetworkInterface|Get-NetworkControllerNetworkInterfaceIpConfiguration|Get-NetworkControllerNode|Get-NetworkControllerPublicIpAddress|Get-NetworkControllerRestore|Get-NetworkControllerRoute|Get-NetworkControllerRouteTable|Get-NetworkControllerServer|Get-NetworkControllerServerInterface|Get-NetworkControllerServiceInsertion|Get-NetworkControllerState|Get-NetworkControllerStatistics|Get-NetworkControllerSubnetEgressReset|Get-NetworkControllerVirtualGateway|Get-NetworkControllerVirtualGatewayBgpPeer|Get-NetworkControllerVirtualGatewayBgpRouter|Get-NetworkControllerVirtualGatewayNetworkConnection|Get-NetworkControllerVirtualGatewayPolicyMap|Get-NetworkControllerVirtualNetwork|Get-NetworkControllerVirtualNetworkConfiguration|Get-NetworkControllerVirtualNetworkPeering|Get-NetworkControllerVirtualServer|Get-NetworkControllerVirtualSubnet|Get-NetworkControllerVirtualSwitchConfiguration|Install-NetworkController|Install-NetworkControllerCluster|Invoke-NetworkControllerConnectivityCheck|Invoke-NetworkControllerState|Invoke-NetworkControllerSubnetEgressReset|New-NetworkControllerAccessControlList|New-NetworkControllerAccessControlListRule|New-NetworkControllerBackup|New-NetworkControllerCredential|New-NetworkControllerFabricRoute|New-NetworkControllerGateway|New-NetworkControllerGatewayPool|New-NetworkControllerIDnsServerConfiguration|New-NetworkControllerIpPool|New-NetworkControllerIpReservation|New-NetworkControllerLoadBalancer|New-NetworkControllerLoadBalancerBackendAddressPool|New-NetworkControllerLoadBalancerConfiguration|New-NetworkControllerLoadBalancerFrontendIpConfiguration|New-NetworkControllerLoadBalancerInboundNatRule|New-NetworkControllerLoadBalancerMux|New-NetworkControllerLoadBalancerOutboundNatRule|New-NetworkControllerLoadBalancerProbe|New-NetworkControllerLoadBalancingRule|New-NetworkControllerLogicalNetwork|New-NetworkControllerLogicalSubnet|New-NetworkControllerMacPool|New-NetworkControllerNetworkInterface|New-NetworkControllerNetworkInterfaceIpConfiguration|New-NetworkControllerNodeObject|New-NetworkControllerPublicIpAddress|New-NetworkControllerRestore|New-NetworkControllerRoute|New-NetworkControllerRouteTable|New-NetworkControllerServer|New-NetworkControllerServerInterface|New-NetworkControllerServiceInsertion|New-NetworkControllerVirtualGateway|New-NetworkControllerVirtualGatewayBgpPeer|New-NetworkControllerVirtualGatewayBgpRouter|New-NetworkControllerVirtualGatewayNetworkConnection|New-NetworkControllerVirtualGatewayPolicyMap|New-NetworkControllerVirtualNetwork|New-NetworkControllerVirtualNetworkPeering|New-NetworkControllerVirtualServer|New-NetworkControllerVirtualSubnet|Remove-NetworkControllerAccessControlList|Remove-NetworkControllerAccessControlListRule|Remove-NetworkControllerBackup|Remove-NetworkControllerCredential|Remove-NetworkControllerFabricRoute|Remove-NetworkControllerGateway|Remove-NetworkControllerGatewayPool|Remove-NetworkControllerIpPool|Remove-NetworkControllerIpReservation|Remove-NetworkControllerLoadBalancer|Remove-NetworkControllerLoadBalancerBackendAddressPool|Remove-NetworkControllerLoadBalancerConfiguration|Remove-NetworkControllerLoadBalancerFrontendIpConfiguration|Remove-NetworkControllerLoadBalancerInboundNatRule|Remove-NetworkControllerLoadBalancerMux|Remove-NetworkControllerLoadBalancerOutboundNatRule|Remove-NetworkControllerLoadBalancerProbe|Remove-NetworkControllerLoadBalancingRule|Remove-NetworkControllerLogicalNetwork|Remove-NetworkControllerLogicalSubnet|Remove-NetworkControllerMacPool|Remove-NetworkControllerNetworkInterface|Remove-NetworkControllerNetworkInterfaceIpConfiguration|Remove-NetworkControllerNode|Remove-NetworkControllerPublicIpAddress|Remove-NetworkControllerRestore|Remove-NetworkControllerRoute|Remove-NetworkControllerRouteTable|Remove-NetworkControllerServer|Remove-NetworkControllerServerInterface|Remove-NetworkControllerServiceInsertion|Remove-NetworkControllerVirtualGateway|Remove-NetworkControllerVirtualGatewayBgpPeer|Remove-NetworkControllerVirtualGatewayBgpRouter|Remove-NetworkControllerVirtualGatewayNetworkConnection|Remove-NetworkControllerVirtualGatewayPolicyMap|Remove-NetworkControllerVirtualNetwork|Remove-NetworkControllerVirtualNetworkPeering|Remove-NetworkControllerVirtualServer|Remove-NetworkControllerVirtualSubnet|Repair-NetworkControllerCluster|Set-NetworkController|Set-NetworkControllerAuditingSettingsConfiguration|Set-NetworkControllerCluster|Set-NetworkControllerDiagnostic|Set-NetworkControllerNode|Set-NetworkControllerVirtualNetworkConfiguration|Set-NetworkControllerVirtualSwitchConfiguration|Uninstall-NetworkController|Uninstall-NetworkControllerCluster|Update-NetworkController|" + + "Debug-NetworkController|Debug-NetworkControllerConfigurationState|Debug-ServiceFabricNodeStatus|Get-NetworkControllerDeploymentInfo|Get-NetworkControllerManagedDevices|Get-NetworkControllerReplica|" + + "Add-NlbClusterNode|Add-NlbClusterNodeDip|Add-NlbClusterPortRule|Add-NlbClusterVip|Disable-NlbClusterPortRule|Enable-NlbClusterPortRule|Get-NlbCluster|Get-NlbClusterDriverInfo|Get-NlbClusterNode|Get-NlbClusterNodeDip|Get-NlbClusterNodeNetworkInterface|Get-NlbClusterPortRule|Get-NlbClusterVip|New-NlbCluster|New-NlbClusterIpv6Address|Remove-NlbCluster|Remove-NlbClusterNode|Remove-NlbClusterNodeDip|Remove-NlbClusterPortRule|Remove-NlbClusterVip|Resume-NlbCluster|Resume-NlbClusterNode|Set-NlbCluster|Set-NlbClusterNode|Set-NlbClusterNodeDip|Set-NlbClusterPortRule|Set-NlbClusterPortRuleNodeHandlingPriority|Set-NlbClusterPortRuleNodeWeight|Set-NlbClusterVip|Start-NlbCluster|Start-NlbClusterNode|Stop-NlbCluster|Stop-NlbClusterNode|Suspend-NlbCluster|Suspend-NlbClusterNode|" + + "Disable-NetworkSwitchEthernetPort|Disable-NetworkSwitchFeature|Disable-NetworkSwitchVlan|Enable-NetworkSwitchEthernetPort|Enable-NetworkSwitchFeature|Enable-NetworkSwitchVlan|Get-NetworkSwitchEthernetPort|Get-NetworkSwitchFeature|Get-NetworkSwitchGlobalData|Get-NetworkSwitchVlan|New-NetworkSwitchVlan|Remove-NetworkSwitchEthernetPortIPAddress|Remove-NetworkSwitchVlan|Restore-NetworkSwitchConfiguration|Save-NetworkSwitchConfiguration|Set-NetworkSwitchEthernetPortIPAddress|Set-NetworkSwitchPortMode|Set-NetworkSwitchPortProperty|Set-NetworkSwitchVlanProperty|" + + "Add-NetIPHttpsCertBinding|Disable-NetDnsTransitionConfiguration|Disable-NetIPHttpsProfile|Disable-NetNatTransitionConfiguration|Enable-NetDnsTransitionConfiguration|Enable-NetIPHttpsProfile|Enable-NetNatTransitionConfiguration|Get-Net6to4Configuration|Get-NetDnsTransitionConfiguration|Get-NetDnsTransitionMonitoring|Get-NetIPHttpsConfiguration|Get-NetIPHttpsState|Get-NetIsatapConfiguration|Get-NetNatTransitionConfiguration|Get-NetNatTransitionMonitoring|Get-NetTeredoConfiguration|Get-NetTeredoState|New-NetIPHttpsConfiguration|New-NetNatTransitionConfiguration|Remove-NetIPHttpsCertBinding|Remove-NetIPHttpsConfiguration|Remove-NetNatTransitionConfiguration|Rename-NetIPHttpsConfiguration|Reset-Net6to4Configuration|Reset-NetDnsTransitionConfiguration|Reset-NetIPHttpsConfiguration|Reset-NetIsatapConfiguration|Reset-NetTeredoConfiguration|Set-Net6to4Configuration|Set-NetDnsTransitionConfiguration|Set-NetIPHttpsConfiguration|Set-NetIsatapConfiguration|Set-NetNatTransitionConfiguration|Set-NetTeredoConfiguration|" + + "Disconnect-NfsSession|Get-NfsClientConfiguration|Get-NfsClientgroup|Get-NfsClientLock|Get-NfsMappedIdentity|Get-NfsMappingStore|Get-NfsMountedClient|Get-NfsNetgroup|Get-NfsNetgroupStore|Get-NfsOpenFile|Get-NfsServerConfiguration|Get-NfsSession|Get-NfsShare|Get-NfsSharePermission|Get-NfsStatistics|Grant-NfsSharePermission|Install-NfsMappingStore|New-NfsClientgroup|New-NfsMappedIdentity|New-NfsNetgroup|New-NfsShare|Remove-NfsClientgroup|Remove-NfsMappedIdentity|Remove-NfsNetgroup|Remove-NfsShare|Rename-NfsClientgroup|Reset-NfsStatistics|Resolve-NfsMappedIdentity|Revoke-NfsClientLock|Revoke-NfsMountedClient|Revoke-NfsOpenFile|Revoke-NfsSharePermission|Set-NfsClientConfiguration|Set-NfsClientgroup|Set-NfsMappedIdentity|Set-NfsMappingStore|Set-NfsNetgroup|Set-NfsNetgroupStore|Set-NfsServerConfiguration|Set-NfsShare|Test-NfsMappedIdentity|Test-NfsMappingStore|" + + "Export-NpsConfiguration|Get-NpsRadiusClient|Get-NpsSharedSecretTemplate|Import-NpsConfiguration|New-NpsRadiusClient|Remove-NpsRadiusClient|Set-NpsRadiusClient|" + + "Find-Package|Find-PackageProvider|Get-Package|Get-PackageProvider|Get-PackageSource|Import-PackageProvider|Install-Package|Install-PackageProvider|Register-PackageSource|Save-Package|Set-PackageSource|Uninstall-Package|Unregister-PackageSource|" + + "Clear-PcsvDeviceLog|Get-PcsvDevice|Get-PcsvDeviceLog|Restart-PcsvDevice|Set-PcsvDeviceBootConfiguration|Set-PcsvDeviceNetworkConfiguration|Set-PcsvDeviceUserPassword|Start-PcsvDevice|Stop-PcsvDevice|" + + "Get-PmemDedicatedMemory|Get-PmemDisk|Get-PmemPhysicalDevice|Get-PmemUnusedRegion|Initialize-PmemPhysicalDevice|New-PmemDedicatedMemory|New-PmemDisk|Remove-PmemDedicatedMemory|Remove-PmemDisk|" + + "AfterAll|AfterEach|Assert-MockCalled|Assert-VerifiableMocks|BeforeAll|BeforeEach|Context|Describe|Get-MockDynamicParameters|Get-TestDriveItem|In|InModuleScope|Invoke-Mock|Invoke-Pester|It|Mock|New-Fixture|Set-DynamicParameterVariables|Setup|Should|" + + "Add-CertificateEnrollmentPolicyServer|Export-Certificate|Export-PfxCertificate|Get-Certificate|Get-CertificateAutoEnrollmentPolicy|Get-CertificateEnrollmentPolicyServer|Get-CertificateNotificationTask|Get-PfxData|Import-Certificate|Import-PfxCertificate|New-CertificateNotificationTask|New-SelfSignedCertificate|Remove-CertificateEnrollmentPolicyServer|Remove-CertificateNotificationTask|Set-CertificateAutoEnrollmentPolicy|Switch-Certificate|Test-Certificate|" + + "Get-PlatformIdentifier|" + + "Disable-PnpDevice|Enable-PnpDevice|Get-PnpDevice|Get-PnpDeviceProperty|" + + "Find-DscResource|Find-Module|Find-Script|Get-InstalledModule|Get-InstalledScript|Get-PSRepository|Install-Module|Install-Script|New-ScriptFileInfo|Publish-Module|Publish-Script|Register-PSRepository|Save-Module|Save-Script|Set-PSRepository|Test-ScriptFileInfo|Uninstall-Module|Uninstall-Script|Unregister-PSRepository|Update-Module|Update-ModuleManifest|Update-Script|Update-ScriptFileInfo|" + + "Add-Printer|Add-PrinterDriver|Add-PrinterPort|Get-PrintConfiguration|Get-Printer|Get-PrinterDriver|Get-PrinterPort|Get-PrinterProperty|Get-PrintJob|Read-PrinterNfcTag|Remove-Printer|Remove-PrinterDriver|Remove-PrinterPort|Remove-PrintJob|Rename-Printer|Restart-PrintJob|Resume-PrintJob|Set-PrintConfiguration|Set-Printer|Set-PrinterProperty|Suspend-PrintJob|Write-PrinterNfcTag|" + + "ConvertTo-ProcessMitigationPolicy|Get-ProcessMitigation|Set-ProcessMitigation|" + + "Export-ProvisioningPackage|Export-Trace|Get-ProvisioningPackage|Get-TrustedProvisioningCertificate|Install-ProvisioningPackage|Install-TrustedProvisioningCertificate|Uninstall-ProvisioningPackage|Uninstall-TrustedProvisioningCertificate|" + + "Configuration|Disable-DscDebug|Enable-DscDebug|Get-DscConfiguration|Get-DscConfigurationStatus|Get-DscLocalConfigurationManager|Get-DscResource|New-DscChecksum|Remove-DscConfigurationDocument|Restore-DscConfiguration|Stop-DscConfiguration|Invoke-DscResource|Publish-DscConfiguration|Set-DscLocalConfigurationManager|Start-DscConfiguration|Test-DscConfiguration|Update-DscConfiguration|" + + "Disable-PSTrace|Disable-PSWSManCombinedTrace|Disable-WSManTrace|Enable-PSTrace|Enable-PSWSManCombinedTrace|Enable-WSManTrace|Get-LogProperties|Set-LogProperties|Start-Trace|Stop-Trace|" + + "PSConsoleHostReadline|Get-PSReadlineKeyHandler|Get-PSReadlineOption|Remove-PSReadlineKeyHandler|Set-PSReadlineKeyHandler|Set-PSReadlineOption|" + + "Add-JobTrigger|Disable-JobTrigger|Disable-ScheduledJob|Enable-JobTrigger|Enable-ScheduledJob|Get-JobTrigger|Get-ScheduledJob|Get-ScheduledJobOption|New-JobTrigger|New-ScheduledJobOption|Register-ScheduledJob|Remove-JobTrigger|Set-JobTrigger|Set-ScheduledJob|Set-ScheduledJobOption|Unregister-ScheduledJob|" + + "New-PSWorkflowSession|New-PSWorkflowExecutionOption|" + + "Invoke-AsWorkflow|" + + "Add-RDServer|Add-RDSessionHost|Add-RDVirtualDesktopToCollection|Disable-RDVirtualDesktopADMachineAccountReuse|Disconnect-RDUser|Enable-RDVirtualDesktopADMachineAccountReuse|Export-RDPersonalSessionDesktopAssignment|Export-RDPersonalVirtualDesktopAssignment|Get-RDAvailableApp|Get-RDCertificate|Get-RDConnectionBrokerHighAvailability|Get-RDDeploymentGatewayConfiguration|Get-RDFileTypeAssociation|Get-RDLicenseConfiguration|Get-RDPersonalSessionDesktopAssignment|Get-RDPersonalVirtualDesktopAssignment|Get-RDPersonalVirtualDesktopPatchSchedule|Get-RDRemoteApp|Get-RDRemoteDesktop|Get-RDServer|Get-RDSessionCollection|Get-RDSessionCollectionConfiguration|Get-RDSessionHost|Get-RDUserSession|Get-RDVirtualDesktop|Get-RDVirtualDesktopCollection|Get-RDVirtualDesktopCollectionConfiguration|Get-RDVirtualDesktopCollectionJobStatus|Get-RDVirtualDesktopConcurrency|Get-RDVirtualDesktopIdleCount|Get-RDVirtualDesktopTemplateExportPath|Get-RDWorkspace|Grant-RDOUAccess|Import-RDPersonalSessionDesktopAssignment|Import-RDPersonalVirtualDesktopAssignment|Invoke-RDUserLogoff|Move-RDVirtualDesktop|New-RDCertificate|New-RDPersonalVirtualDesktopPatchSchedule|New-RDRemoteApp|New-RDSessionCollection|New-RDSessionDeployment|New-RDVirtualDesktopCollection|New-RDVirtualDesktopDeployment|Remove-RDDatabaseConnectionString|Remove-RDPersonalSessionDesktopAssignment|Remove-RDPersonalVirtualDesktopAssignment|Remove-RDPersonalVirtualDesktopPatchSchedule|Remove-RDRemoteApp|Remove-RDServer|Remove-RDSessionCollection|Remove-RDSessionHost|Remove-RDVirtualDesktopCollection|Remove-RDVirtualDesktopFromCollection|Send-RDUserMessage|Set-RDActiveManagementServer|Set-RDCertificate|Set-RDClientAccessName|Set-RDConnectionBrokerHighAvailability|Set-RDDatabaseConnectionString|Set-RDDeploymentGatewayConfiguration|Set-RDFileTypeAssociation|Set-RDLicenseConfiguration|Set-RDPersonalSessionDesktopAssignment|Set-RDPersonalVirtualDesktopAssignment|Set-RDPersonalVirtualDesktopPatchSchedule|Set-RDRemoteApp|Set-RDRemoteDesktop|Set-RDSessionCollectionConfiguration|Set-RDSessionHost|Set-RDVirtualDesktopCollectionConfiguration|Set-RDVirtualDesktopConcurrency|Set-RDVirtualDesktopIdleCount|Set-RDVirtualDesktopTemplateExportPath|Set-RDWorkspace|Stop-RDVirtualDesktopCollectionJob|Test-RDOUAccess|Test-RDVirtualDesktopADMachineAccountReuse|Update-RDVirtualDesktopCollection|" + + "Add-BgpCustomRoute|Add-BgpPeer|Add-BgpRouteAggregate|Add-BgpRouter|Add-BgpRoutingPolicy|Add-BgpRoutingPolicyForPeer|Add-DAAppServer|Add-DAClient|Add-DAClientDnsConfiguration|Add-DAEntryPoint|Add-DAMgmtServer|Add-RemoteAccessIpFilter|Add-RemoteAccessLoadBalancerNode|Add-RemoteAccessRadius|Add-VpnIPAddressRange|Add-VpnS2SInterface|Add-VpnSstpProxyRule|Clear-BgpRouteFlapDampening|Clear-RemoteAccessInboxAccountingStore|Clear-VpnS2SInterfaceStatistics|Connect-VpnS2SInterface|Disable-BgpRouteFlapDampening|Disable-DAMultiSite|Disable-DAOtpAuthentication|Disable-RemoteAccessRoutingDomain|Disconnect-VpnS2SInterface|Disconnect-VpnUser|Enable-BgpRouteFlapDampening|Enable-DAMultiSite|Enable-DAOtpAuthentication|Enable-RemoteAccessRoutingDomain|Get-BgpCustomRoute|Get-BgpPeer|Get-BgpRouteAggregate|Get-BgpRouteFlapDampening|Get-BgpRouteInformation|Get-BgpRouter|Get-BgpRoutingPolicy|Get-BgpStatistics|Get-DAAppServer|Get-DAClient|Get-DAClientDnsConfiguration|Get-DAEntryPoint|Get-DAEntryPointDC|Get-DAMgmtServer|Get-DAMultiSite|Get-DANetworkLocationServer|Get-DAOtpAuthentication|Get-DAServer|Get-RemoteAccess|Get-RemoteAccessAccounting|Get-RemoteAccessConfiguration|Get-RemoteAccessConnectionStatistics|Get-RemoteAccessConnectionStatisticsSummary|Get-RemoteAccessHealth|Get-RemoteAccessIpFilter|Get-RemoteAccessLoadBalancer|Get-RemoteAccessRadius|Get-RemoteAccessRoutingDomain|Get-RemoteAccessUserActivity|Get-RoutingProtocolPreference|Get-VpnAuthProtocol|Get-VpnS2SInterface|Get-VpnS2SInterfaceStatistics|Get-VpnServerConfiguration|Get-VpnSstpProxyRule|Install-RemoteAccess|New-VpnSstpProxyRule|New-VpnTrafficSelector|Remove-BgpCustomRoute|Remove-BgpPeer|Remove-BgpRouteAggregate|Remove-BgpRouter|Remove-BgpRoutingPolicy|Remove-BgpRoutingPolicyForPeer|Remove-DAAppServer|Remove-DAClient|Remove-DAClientDnsConfiguration|Remove-DAEntryPoint|Remove-DAMgmtServer|Remove-RemoteAccessIpFilter|Remove-RemoteAccessLoadBalancerNode|Remove-RemoteAccessRadius|Remove-VpnIPAddressRange|Remove-VpnS2SInterface|Remove-VpnSstpProxyRule|Set-BgpPeer|Set-BgpRouteAggregate|Set-BgpRouteFlapDampening|Set-BgpRouter|Set-BgpRoutingPolicy|Set-BgpRoutingPolicyForPeer|Set-DAAppServerConnection|Set-DAClient|Set-DAClientDnsConfiguration|Set-DAEntryPoint|Set-DAEntryPointDC|Set-DAMultiSite|Set-DANetworkLocationServer|Set-DAOtpAuthentication|Set-DAServer|Set-RemoteAccess|Set-RemoteAccessAccounting|Set-RemoteAccessConfiguration|Set-RemoteAccessInboxAccountingStore|Set-RemoteAccessIpFilter|Set-RemoteAccessLoadBalancer|Set-RemoteAccessRadius|Set-RemoteAccessRoutingDomain|Set-RoutingProtocolPreference|Set-VpnAuthProtocol|Set-VpnAuthType|Set-VpnIPAddressAssignment|Set-VpnS2SInterface|Set-VpnServerConfiguration|Set-VpnSstpProxyRule|Start-BgpPeer|Stop-BgpPeer|Uninstall-RemoteAccess|Update-DAMgmtServer|" + + "Convert-License|" + + "Disable-ScheduledTask|Enable-ScheduledTask|Export-ScheduledTask|Get-ClusteredScheduledTask|Get-ScheduledTask|Get-ScheduledTaskInfo|New-ScheduledTask|New-ScheduledTaskAction|New-ScheduledTaskPrincipal|New-ScheduledTaskSettingsSet|New-ScheduledTaskTrigger|Register-ClusteredScheduledTask|Register-ScheduledTask|Set-ClusteredScheduledTask|Set-ScheduledTask|Start-ScheduledTask|Stop-ScheduledTask|Unregister-ClusteredScheduledTask|Unregister-ScheduledTask|" + + "Confirm-SecureBootUEFI|Format-SecureBootUEFI|Get-SecureBootPolicy|Get-SecureBootUEFI|Set-SecureBootUEFI|" + + "Get-DisplayResolution|Set-DisplayResolution|" + + "Disable-ServerManagerStandardUserRemoting|Enable-ServerManagerStandardUserRemoting|Get-WindowsFeature|Install-WindowsFeature|Uninstall-WindowsFeature|" + + "Get-SMCounterSample|Get-SMPerformanceCollector|Get-SMServerBpaResult|Get-SMServerClusterName|Get-SMServerEvent|Get-SMServerFeature|Get-SMServerInventory|Get-SMServerService|Remove-SMServerPerformanceLog|Start-SMPerformanceCollector|Stop-SMPerformanceCollector|" + + "Get-KeyProtectorFromShieldingDataFile|Get-ShieldedVMProvisioningStatus|Initialize-ShieldedVM|New-ShieldedVMSpecializationDataFile|Test-ShieldingDataApplicability|" + + "Import-ShieldingDataFile|New-ShieldingDataFile|New-VolumeIDQualifier|Save-ShieldedVMRecoveryKey|Save-VolumeSignatureCatalog|Unprotect-ShieldedVMRecoveryKey|" + + "Initialize-VMShieldingHelperVHD|Protect-TemplateDisk|" + + "Block-SmbShareAccess|Close-SmbOpenFile|Close-SmbSession|Disable-SmbDelegation|Enable-SmbDelegation|Get-SmbBandwidthLimit|Get-SmbClientConfiguration|Get-SmbClientNetworkInterface|Get-SmbConnection|Get-SmbDelegation|Get-SmbGlobalMapping|Get-SmbMapping|Get-SmbMultichannelConnection|Get-SmbMultichannelConstraint|Get-SmbOpenFile|Get-SmbServerCertificateMapping|Get-SmbServerCertProps|Get-SmbServerConfiguration|Get-SmbServerNetworkInterface|Get-SmbSession|Get-SmbShare|Get-SmbShareAccess|Grant-SmbShareAccess|New-SmbGlobalMapping|New-SmbMapping|New-SmbMultichannelConstraint|New-SmbServerCertificateMapping|New-SmbShare|Remove-SmbBandwidthLimit|Remove-SmbComponent|Remove-SmbGlobalMapping|Remove-SmbMapping|Remove-SmbMultichannelConstraint|Remove-SmbServerCertificateMapping|Remove-SmbShare|Reset-SmbClientConfiguration|Reset-SmbServerConfiguration|Revoke-SmbShareAccess|Set-SmbBandwidthLimit|Set-SmbClientConfiguration|Set-SmbPathAcl|Set-SmbServerCertificateMapping|Set-SmbServerConfiguration|Set-SmbShare|Unblock-SmbShareAccess|Update-SmbMultichannelConnection|" + + "Move-SmbClient|Get-SmbWitnessClient|Move-SmbWitnessClient|" + + "Register-SmisProvider|Search-SmisProvider|Unregister-SmisProvider|" + + "Get-SilComputer|Get-SilComputerIdentity|Get-SilData|Get-SilLogging|Get-SilSoftware|Get-SilUalAccess|Get-SilWindowsUpdate|Publish-SilData|Set-SilLogging|Start-SilLogging|Stop-SilLogging|" + + "Get-StartApps|Export-StartLayout|Import-StartLayout|Export-StartLayoutEdgeAssets|" + + "Add-InitiatorIdToMaskingSet|Add-PartitionAccessPath|Add-PhysicalDisk|Add-TargetPortToMaskingSet|Add-VirtualDiskToMaskingSet|Block-FileShareAccess|Clear-Disk|Clear-FileStorageTier|Connect-VirtualDisk|Debug-FileShare|Debug-StorageSubSystem|Debug-Volume|Disable-PhysicalDiskIdentification|Disable-StorageEnclosureIdentification|Disable-StorageHighAvailability|Disable-StorageMaintenanceMode|Disconnect-VirtualDisk|Dismount-DiskImage|Enable-PhysicalDiskIdentification|Enable-StorageEnclosureIdentification|Enable-StorageHighAvailability|Enable-StorageMaintenanceMode|Format-Volume|Get-DedupProperties|Get-Disk|||||Get-DiskImage|Get-DiskStorageNodeView|Get-FileIntegrity|Get-FileShare|Get-FileShareAccessControlEntry|Get-FileStorageTier|Get-InitiatorId|Get-InitiatorPort|Get-MaskingSet|Get-OffloadDataTransferSetting|Get-Partition|Get-PartitionSupportedSize|Get-PhysicalDisk|Get-PhysicalDiskStorageNodeView|Get-PhysicalExtent|Get-PhysicalExtentAssociation|Get-ResiliencySetting|Get-StorageAdvancedProperty|Get-StorageDiagnosticInfo|Get-StorageEnclosure|Get-StorageEnclosureStorageNodeView|Get-StorageEnclosureVendorData|Get-StorageFaultDomain|Get-StorageFileServer|Get-StorageFirmwareInformation|Get-StorageHealthAction|Get-StorageHealthReport|Get-StorageHealthSetting|Get-StorageJob|Get-StorageNode|Get-StoragePool|Get-StorageProvider|Get-StorageReliabilityCounter|Get-StorageSetting|Get-StorageSubSystem|Get-StorageTier|Get-StorageTierSupportedSize|Get-SupportedClusterSizes|Get-SupportedFileSystems|Get-TargetPort|Get-TargetPortal|Get-VirtualDisk|Get-VirtualDiskSupportedSize|Get-Volume|Get-VolumeCorruptionCount|Get-VolumeScrubPolicy|Grant-FileShareAccess|Hide-VirtualDisk|Initialize-Disk|Mount-DiskImage|New-FileShare|New-MaskingSet|New-Partition|New-StorageFileServer|New-StoragePool|New-StorageSubsystemVirtualDisk|New-StorageTier|New-VirtualDisk|New-VirtualDiskClone|New-VirtualDiskSnapshot|New-Volume|Optimize-StoragePool|Optimize-Volume|Register-StorageSubsystem|Remove-FileShare|Remove-InitiatorId|Remove-InitiatorIdFromMaskingSet|Remove-MaskingSet|Remove-Partition|Remove-PartitionAccessPath|Remove-PhysicalDisk|Remove-StorageFileServer|Remove-StorageHealthSetting|Remove-StoragePool|Remove-StorageTier|Remove-TargetPortFromMaskingSet|Remove-VirtualDisk|Remove-VirtualDiskFromMaskingSet|Rename-MaskingSet|Repair-FileIntegrity|Repair-VirtualDisk|Repair-Volume|Reset-PhysicalDisk|Reset-StorageReliabilityCounter|Resize-Partition|Resize-StorageTier|Resize-VirtualDisk|Revoke-FileShareAccess|Set-Disk|Set-FileIntegrity|Set-FileShare|Set-FileStorageTier|Set-InitiatorPort|Set-Partition|Set-PhysicalDisk|Set-ResiliencySetting|Set-StorageFileServer|Set-StorageHealthSetting|Set-StoragePool|Set-StorageProvider|Set-StorageSetting|Set-StorageSubSystem|Set-StorageTier|Set-VirtualDisk|Set-Volume|Set-VolumeScrubPolicy|Show-VirtualDisk|Start-StorageDiagnosticLog|Stop-StorageDiagnosticLog|Stop-StorageJob|Unblock-FileShareAccess|Unregister-StorageSubsystem|Update-Disk|Update-HostStorageCache|Update-StorageFirmware|Update-StoragePool|Update-StorageProviderCache|Write-VolumeCache|" + + "Get-StorageQoSFlow|Get-StorageQosPolicy|Get-StorageQosPolicyStore|Get-StorageQosVolume|New-StorageQosPolicy|Remove-StorageQosPolicy|Set-StorageQosPolicy|Set-StorageQosPolicyStore|" + + "Clear-SRMetadata|Dismount-SRDestination|Export-SRConfiguration|Get-SRAccess|Get-SRDelegation|Get-SRGroup|Get-SRNetworkConstraint|Get-SRPartnership|Grant-SRAccess|Grant-SRDelegation|Mount-SRDestination|New-SRGroup|New-SRPartnership|Remove-SRGroup|Remove-SRNetworkConstraint|Remove-SRPartnership|Revoke-SRAccess|Revoke-SRDelegation|Set-SRGroup|Set-SRNetworkConstraint|Set-SRPartnership|Suspend-SRGroup|Sync-SRGroup|Test-SRTopology|" + + "Disable-SyncShare|Enable-SyncShare|Get-SyncServerSetting|Get-SyncShare|Get-SyncUserStatus|New-SyncShare|Remove-SyncShare|Repair-SyncShare|Set-SyncServerSetting|Set-SyncShare|" + + "Add-InsightsCapability|Disable-InsightsCapability|Disable-InsightsCapabilitySchedule|Enable-InsightsCapability|Enable-InsightsCapabilitySchedule|Get-InsightsCapability|Get-InsightsCapabilityAction|Get-InsightsCapabilityResult|Get-InsightsCapabilitySchedule|Invoke-InsightsCapability|Remove-InsightsCapability|Remove-InsightsCapabilityAction|Set-InsightsCapabilityAction|Set-InsightsCapabilitySchedule|Update-InsightsCapability|" + + "Disable-TlsCipherSuite|Disable-TlsEccCurve|Disable-TlsSessionTicketKey|Enable-TlsCipherSuite|Enable-TlsEccCurve|Enable-TlsSessionTicketKey|Export-TlsSessionTicketKey|Get-TlsCipherSuite|Get-TlsEccCurve|New-TlsSessionTicketKey|" + + "Get-TroubleshootingPack|Invoke-TroubleshootingPack|" + + "Clear-Tpm|ConvertTo-TpmOwnerAuth|Disable-TpmAutoProvisioning|Enable-TpmAutoProvisioning|Get-Tpm|Get-TpmEndorsementKeyInfo|Get-TpmSupportedFeature|Import-TpmOwnerAuth|Initialize-Tpm|Set-TpmOwnerAuth|Unblock-Tpm|" + + "Clear-UevAppxPackage|Clear-UevConfiguration|Disable-Uev|Disable-UevAppxPackage|Disable-UevTemplate|Enable-Uev|Enable-UevAppxPackage|Enable-UevTemplate|Export-UevConfiguration|Export-UevPackage|Get-UevAppxPackage|Get-UevConfiguration|Get-UevStatus|Get-UevTemplate|Get-UevTemplateProgram|Import-UevConfiguration|Register-UevTemplate|Repair-UevTemplateIndex|Restore-UevBackup|Restore-UevUserSetting|Set-UevConfiguration|Set-UevTemplateProfile|Test-UevTemplate|Unregister-UevTemplate|Update-UevTemplate|" + + "Add-WsusComputer|Add-WsusDynamicCategory|Approve-WsusUpdate|Deny-WsusUpdate|Get-WsusClassification|Get-WsusComputer|Get-WsusDynamicCategory|Get-WsusProduct|Get-WsusServer|Get-WsusUpdate|Invoke-WsusServerCleanup|Remove-WsusDynamicCategory|Set-WsusClassification|Set-WsusDynamicCategory|Set-WsusProduct|Set-WsusServerSynchronization|" + + "Disable-Ual|Enable-Ual|Get-Ual|Get-UalDailyAccess|Get-UalDailyDeviceAccess|Get-UalDailyUserAccess|Get-UalDeviceAccess|Get-UalDns|Get-UalHyperV|Get-UalOverview|Get-UalServerDevice|Get-UalServerUser|Get-UalSystemId|Get-UalUserAccess|" + + "Add-VamtProductKey|Export-VamtData|Find-VamtManagedMachine|Get-VamtConfirmationId|Get-VamtProduct|Get-VamtProductKey|Import-VamtData|Initialize-VamtData|Install-VamtConfirmationId|Install-VamtProductActivation|Install-VamtProductKey|Update-VamtProduct|" + + "Add-VpnConnection|Add-VpnConnectionRoute|Add-VpnConnectionTriggerApplication|Add-VpnConnectionTriggerDnsConfiguration|Add-VpnConnectionTriggerTrustedNetwork|Get-VpnConnection|Get-VpnConnectionTrigger|New-EapConfiguration|New-VpnServerAddress|Remove-VpnConnection|Remove-VpnConnectionRoute|Remove-VpnConnectionTriggerApplication|Remove-VpnConnectionTriggerDnsConfiguration|Remove-VpnConnectionTriggerTrustedNetwork|Set-VpnConnection|Set-VpnConnectionIPsecConfiguration|Set-VpnConnectionProxy|Set-VpnConnectionTriggerDnsConfiguration|Set-VpnConnectionTriggerTrustedNetwork|" + + "Add-WdsDriverPackage|Approve-WdsClient|Copy-WdsInstallImage|Deny-WdsClient|Disable-WdsBootImage|Disable-WdsDriverPackage|Disable-WdsInstallImage|Disconnect-WdsMulticastClient|Enable-WdsBootImage|Enable-WdsDriverPackage|Enable-WdsInstallImage|Export-WdsBootImage|Export-WdsInstallImage|Get-WdsBootImage|Get-WdsClient|Get-WdsDriverPackage|Get-WdsInstallImage|Get-WdsInstallImageGroup|Get-WdsMulticastClient|Import-WdsBootImage|Import-WdsDriverPackage|Import-WdsInstallImage|New-WdsClient|New-WdsInstallImageGroup|Remove-WdsBootImage|Remove-WdsClient|Remove-WdsDriverPackage|Remove-WdsInstallImage|Remove-WdsInstallImageGroup|Set-WdsBootImage|Set-WdsClient|Set-WdsInstallImage|Set-WdsInstallImageGroup|" + + "Add-WebConfiguration|Add-WebConfigurationLock|Add-WebConfigurationProperty|Backup-WebConfiguration|Clear-WebCentralCertProvider|Clear-WebConfiguration|Clear-WebRequestTracingSetting|Clear-WebRequestTracingSettings|ConvertTo-WebApplication|Disable-WebCentralCertProvider|Disable-WebGlobalModule|Disable-WebRequestTracing|Enable-WebCentralCertProvider|Enable-WebGlobalModule|Enable-WebRequestTracing|Get-WebAppDomain|Get-WebApplication|Get-WebAppPoolState|Get-WebBinding|Get-WebCentralCertProvider|Get-WebConfigFile|Get-WebConfiguration|Get-WebConfigurationBackup|Get-WebConfigurationLocation|Get-WebConfigurationLock|Get-WebConfigurationProperty|Get-WebFilePath|Get-WebGlobalModule|Get-WebHandler|Get-WebItemState|Get-WebManagedModule|Get-WebRequest|Get-Website|Get-WebsiteState|Get-WebURL|Get-WebVirtualDirectory|New-WebApplication|New-WebAppPool|New-WebBinding|New-WebFtpSite|New-WebGlobalModule|New-WebHandler|New-WebManagedModule|New-Website|New-WebVirtualDirectory|Remove-WebApplication|Remove-WebAppPool|Remove-WebBinding|Remove-WebConfigurationBackup|Remove-WebConfigurationLocation|Remove-WebConfigurationLock|Remove-WebConfigurationProperty|Remove-WebGlobalModule|Remove-WebHandler|Remove-WebManagedModule|Remove-Website|Remove-WebVirtualDirectory|Rename-WebConfigurationLocation|Restart-WebAppPool|Restart-WebItem|Restore-WebConfiguration|Select-WebConfiguration|Set-WebBinding|Set-WebCentralCertProvider|Set-WebCentralCertProviderCredential|Set-WebConfiguration|Set-WebConfigurationProperty|Set-WebGlobalModule|Set-WebHandler|Set-WebManagedModule|Start-WebAppPool|Start-WebCommitDelay|Start-WebItem|Start-Website|Stop-WebAppPool|Stop-WebCommitDelay|Stop-WebItem|Stop-Website|" + + "Add-WebApplicationProxyApplication|Get-WebApplicationProxyApplication|Get-WebApplicationProxyAvailableADFSRelyingParty|Get-WebApplicationProxyConfiguration|Get-WebApplicationProxyHealth|Get-WebApplicationProxySslCertificate|Install-WebApplicationProxy|Remove-WebApplicationProxyApplication|Set-WebApplicationProxyApplication|Set-WebApplicationProxyConfiguration|Set-WebApplicationProxySslCertificate|Update-WebApplicationProxyDeviceRegistration|" + + "Get-WheaMemoryPolicy|Set-WheaMemoryPolicy|" + + "Get-WindowsDeveloperLicense|Show-WindowsDeveloperLicenseRegistration|Unregister-WindowsDeveloperLicense|" + + "Clear-WindowsDiagnosticData|" + + "Disable-WindowsErrorReporting|Enable-WindowsErrorReporting|Get-WindowsErrorReporting|" + + "Get-WindowsSearchSetting|Set-WindowsSearchSetting|" + + "Add-WBBackupTarget|Add-WBBareMetalRecovery|Add-WBFileSpec|Add-WBSystemState|Add-WBVirtualMachine|Add-WBVolume|Backup-ACL|Get-WBBackupSet|Get-WBBackupTarget|Get-WBBackupVolumeBrowsePath|Get-WBBareMetalRecovery|Get-WBDisk|Get-WBFileSpec|Get-WBJob|Get-WBPerformanceConfiguration|Get-WBPolicy|Get-WBSchedule|Get-WBSummary|Get-WBSystemState|Get-WBVirtualMachine|Get-WBVolume|Get-WBVssBackupOption|New-WBBackupTarget|New-WBFileSpec|New-WBPolicy|Remove-WBBackupSet|Remove-WBBackupTarget|Remove-WBBareMetalRecovery|Remove-WBCatalog|Remove-WBFileSpec|Remove-WBPolicy|Remove-WBSystemState|Remove-WBVirtualMachine|Remove-WBVolume|Restore-ACL|Restore-WBCatalog|Resume-WBBackup|Resume-WBVolumeRecovery|Set-WBPerformanceConfiguration|Set-WBPolicy|Set-WBSchedule|Set-WBVssBackupOption|Start-WBApplicationRecovery|Start-WBBackup|Start-WBFileRecovery|Start-WBHyperVRecovery|Start-WBSystemStateRecovery|Start-WBVolumeRecovery|Stop-WBJob|" + + "Get-WindowsUpdateLog"); + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords + }, "identifier"); + var binaryOperatorsRe = ( + "eq|ne|gt|lt|le|ge|like|notlike|match|notmatch|contains|notcontains|in|notin|band|bor|bxor|bnot|" + + "ceq|cne|cgt|clt|cle|cge|clike|cnotlike|cmatch|cnotmatch|ccontains|cnotcontains|cin|cnotin|" + + "ieq|ine|igt|ilt|ile|ige|ilike|inotlike|imatch|inotmatch|icontains|inotcontains|iin|inotin|" + + "and|or|xor|not|" + + "split|join|replace|f|" + + "csplit|creplace|" + + "isplit|ireplace|" + + "is|isnot|as|" + + "shl|shr"); + this.$rules = { + "start": [ + { + token: "comment", + regex: "#.*$" + }, { + token: "comment.start", + regex: "<#", + next: "comment" + }, { + token: "string", // multi line + regex: /@'$/, + push: [ + { + token: "string", + regex: /^'@/, + next: "pop" + }, + { + defaultToken: "string" + } + ] + }, { + token: "string", // multi line + regex: /@"$/, + push: [ + { + token: "string", + regex: /^"@/, + next: "pop" + }, + { include: "expressions" }, + { include: "expandable-strings" }, + { + defaultToken: "string" + } + ] + }, + { include: "strings" }, + { include: "variables" }, + { include: "statements" }, + { include: "expressions" }, + { + token: "lparen", + regex: "[[({]" + }, { + token: "rparen", + regex: "[\\])}]" + }, + { + token: "text", + regex: "\\s+" + } + ], + "comment": [ + { + token: "comment.end", + regex: "#>", + next: "start" + }, { + token: "doc.comment.tag", + regex: "^\\.\\w+" + }, { + defaultToken: "comment" + } + ], + "expandable-strings": [ + { + token: "constant.language.escape", + regex: /`./ + }, + { include: "variables" } + ], + "variables": [ + { + token: "variable.instance", + regex: "[$]" + identifierRe + "\\b" + }, + { + token: "variable.braced", + regex: /\$\{/, + push: [ + { + token: "variable.braced", + regex: /\}/, + next: "pop" + }, + { + token: "constant.language.escape", + regex: /`./ + }, + { defaultToken: "variable.braced" } + ] + } + ], + "statements": [ + { + token: "punctuation", + regex: ";" + }, + { + token: "keyword.operator", + regex: "\\-(?:" + binaryOperatorsRe + ")" + }, { + token: "keyword.operator", + regex: "&|\\+|\\-|\\*|\\/|\\%|\\=|\\>|\\&|\\!|\\|" + }, + { include: "constants" }, + { + token: keywordMapper, + regex: "[a-zA-Z_$][a-zA-Z0-9_$\\-]*\\b" + } + ], + "constants": [ + { + token: "constant.numeric", // hex + regex: "0[xX][0-9a-fA-F]+\\b" + }, { + token: "constant.numeric", // float + regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token: "constant.language.boolean", + regex: "[$](?:[Tt]rue|[Ff]alse)\\b" + }, { + token: "constant.language", + regex: "[$][Nn]ull\\b" + } + ], + "strings": [ + { + token: "string", // single line + regex: "['][^']*[']" + }, + { + token: "string", // single line + regex: /"/, + push: [ + { + token: "string", + regex: /"|$/, + next: "pop" + }, + { include: "expressions" }, + { include: "expandable-strings" }, + { + defaultToken: "string" + } + ] + } + ], + "expressions": [ + { + token: "keyword.operator", + regex: /[$@]\(/, + push: [ + { + token: "keyword.operator", + regex: /\)/, + next: "pop" + }, + { include: "parens-block" }, + { include: "expressions" }, + { include: "strings" }, + { include: "variables" }, + { include: "statements" } + ] + }, + { + token: "keyword.operator", + regex: /@\{/, + push: [ + { + token: "keyword.operator", + regex: /\}/, + next: "pop" + }, + { include: "parens-block" }, + { include: "strings" }, + { include: "variables" }, + { include: "statements" } + ] + } + ], + "parens-block": [ + { + token: "paren.lparen", + regex: /\(/, + push: [ + { + token: "paren.rparen", + regex: /\)/, + next: "pop" + }, + { include: "parens-block" }, + { include: "strings" }, + { include: "variables" }, + { include: "statements" } + ] + } + ] + }; + this.normalizeRules(); +}; +oop.inherits(PowershellHighlightRules, TextHighlightRules); +exports.PowershellHighlightRules = PowershellHighlightRules; + +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("../range").Range; +var MatchingBraceOutdent = function () { }; +(function () { + this.checkOutdent = function (line, input) { + if (!/^\s+$/.test(line)) + return false; + return /^\s*\}/.test(input); + }; + this.autoOutdent = function (doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + if (!match) + return 0; + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({ row: row, column: column }); + if (!openBracePos || openBracePos.row == row) + return 0; + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column - 1), indent); + }; + this.$getIndent = function (line) { + return line.match(/^\s*/)[0]; + }; +}).call(MatchingBraceOutdent.prototype); +exports.MatchingBraceOutdent = MatchingBraceOutdent; + +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module){"use strict"; +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; +var FoldMode = exports.FoldMode = function (commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)); + this.foldingStopMarker = new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)); + } +}; +oop.inherits(FoldMode, BaseFoldMode); +(function () { + this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe = /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function (session, foldStyle, row) { + var line = session.getLine(row); + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + var fw = this._getFoldWidgetBase(session, foldStyle, row); + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + return fw; + }; + this.getFoldWidgetRange = function (session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } + else if (foldStyle != "all") + range = null; + } + return range; + } + if (foldStyle === "markbegin") + return; + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + return session.getCommentFoldRange(row, i, -1); + } + }; + this.getSectionRange = function (session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } + else if (subRange.isMultiLine()) { + row = subRange.end.row; + } + else if (startIndent == indent) { + break; + } + } + endRow = row; + } + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function (session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) + continue; + if (m[1]) + depth--; + else + depth++; + if (!depth) + break; + } + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/powershell",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/powershell_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/cstyle"], function(require, exports, module){"use strict"; +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PowershellHighlightRules = require("./powershell_highlight_rules").PowershellHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var Mode = function () { + this.HighlightRules = PowershellHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = this.$defaultBehaviour; + this.foldingRules = new CStyleFoldMode({ start: "^\\s*(<#)", end: "^[#\\s]>\\s*$" }); +}; +oop.inherits(Mode, TextMode); +(function () { + this.lineCommentStart = "#"; + this.blockComment = { start: "<#", end: "#>" }; + this.getNextLineIndent = function (state, line, tab) { + var indent = this.$getIndent(line); + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + if (tokens.length && tokens[tokens.length - 1].type == "comment") { + return indent; + } + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + return indent; + }; + this.checkOutdent = function (state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + this.autoOutdent = function (state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + this.createWorker = function (session) { + return null; + }; + this.$id = "ace/mode/powershell"; +}).call(Mode.prototype); +exports.Mode = Mode; + +}); (function() { + ace.require(["ace/mode/powershell"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-sh.js b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-sh.js new file mode 100644 index 0000000000..c2c8caa804 --- /dev/null +++ b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-sh.js @@ -0,0 +1,387 @@ +ace.define("ace/mode/sh_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module){"use strict"; +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var reservedKeywords = exports.reservedKeywords = ('!|{|}|case|do|done|elif|else|' + + 'esac|fi|for|if|in|then|until|while|' + + '&|;|export|local|read|typeset|unset|' + + 'elif|select|set|function|declare|readonly'); +var languageConstructs = exports.languageConstructs = ('[|]|alias|bg|bind|break|builtin|' + + 'cd|command|compgen|complete|continue|' + + 'dirs|disown|echo|enable|eval|exec|' + + 'exit|fc|fg|getopts|hash|help|history|' + + 'jobs|kill|let|logout|popd|printf|pushd|' + + 'pwd|return|set|shift|shopt|source|' + + 'suspend|test|times|trap|type|ulimit|' + + 'umask|unalias|wait'); +var ShHighlightRules = function () { + var keywordMapper = this.createKeywordMapper({ + "keyword": reservedKeywords, + "support.function.builtin": languageConstructs, + "invalid.deprecated": "debugger" + }, "identifier"); + var integer = "(?:(?:[1-9]\\d*)|(?:0))"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + var fileDescriptor = "(?:&" + intPart + ")"; + var variableName = "[a-zA-Z_][a-zA-Z0-9_]*"; + var variable = "(?:" + variableName + "(?==))"; + var builtinVariable = "(?:\\$(?:SHLVL|\\$|\\!|\\?))"; + var func = "(?:" + variableName + "\\s*\\(\\))"; + this.$rules = { + "start": [{ + token: "constant", + regex: /\\./ + }, { + token: ["text", "comment"], + regex: /(^|\s)(#.*)$/ + }, { + token: "string.start", + regex: '"', + push: [{ + token: "constant.language.escape", + regex: /\\(?:[$`"\\]|$)/ + }, { + include: "variables" + }, { + token: "keyword.operator", + regex: /`/ // TODO highlight ` + }, { + token: "string.end", + regex: '"', + next: "pop" + }, { + defaultToken: "string" + }] + }, { + token: "string", + regex: "\\$'", + push: [{ + token: "constant.language.escape", + regex: /\\(?:[abeEfnrtv\\'"]|x[a-fA-F\d]{1,2}|u[a-fA-F\d]{4}([a-fA-F\d]{4})?|c.|\d{1,3})/ + }, { + token: "string", + regex: "'", + next: "pop" + }, { + defaultToken: "string" + }] + }, { + regex: "<<<", + token: "keyword.operator" + }, { + stateName: "heredoc", + regex: "(<<-?)(\\s*)(['\"`]?)([\\w\\-]+)(['\"`]?)", + onMatch: function (value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[4]); + return [ + { type: "constant", value: tokens[1] }, + { type: "text", value: tokens[2] }, + { type: "string", value: tokens[3] }, + { type: "support.class", value: tokens[4] }, + { type: "string", value: tokens[5] } + ]; + }, + rules: { + heredoc: [{ + onMatch: function (value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^\t+" + }, { + onMatch: function (value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + regex: "$", + token: "empty", + next: function (currentState, stack) { + if (stack[0] === "heredoc" || stack[0] === "indentedHeredoc") + return stack[0]; + return currentState; + } + }, { + token: ["keyword", "text", "text", "text", "variable"], + regex: /(declare|local|readonly)(\s+)(?:(-[fixar]+)(\s+))?([a-zA-Z_][a-zA-Z0-9_]*\b)/ + }, { + token: "variable.language", + regex: builtinVariable + }, { + token: "variable", + regex: variable + }, { + include: "variables" + }, { + token: "support.function", + regex: func + }, { + token: "support.function", + regex: fileDescriptor + }, { + token: "string", // ' string + start: "'", end: "'" + }, { + token: "constant.numeric", // float + regex: floatNumber + }, { + token: "constant.numeric", // integer + regex: integer + "\\b" + }, { + token: keywordMapper, + regex: "[a-zA-Z_][a-zA-Z0-9_]*\\b" + }, { + token: "keyword.operator", + regex: "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|~|<|>|<=|=>|=|!=|[%&|`]" + }, { + token: "punctuation.operator", + regex: ";" + }, { + token: "paren.lparen", + regex: "[\\[\\(\\{]" + }, { + token: "paren.rparen", + regex: "[\\]]" + }, { + token: "paren.rparen", + regex: "[\\)\\}]", + next: "pop" + }], + variables: [{ + token: "variable", + regex: /(\$)(\w+)/ + }, { + token: ["variable", "paren.lparen"], + regex: /(\$)(\()/, + push: "start" + }, { + token: ["variable", "paren.lparen", "keyword.operator", "variable", "keyword.operator"], + regex: /(\$)(\{)([#!]?)(\w+|[*@#?\-$!0_])(:[?+\-=]?|##?|%%?|,,?\/|\^\^?)?/, + push: "start" + }, { + token: "variable", + regex: /\$[*@#?\-$!0_]/ + }, { + token: ["variable", "paren.lparen"], + regex: /(\$)(\{)/, + push: "start" + }] + }; + this.normalizeRules(); +}; +oop.inherits(ShHighlightRules, TextHighlightRules); +exports.ShHighlightRules = ShHighlightRules; + +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module){"use strict"; +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; +var FoldMode = exports.FoldMode = function (commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)); + this.foldingStopMarker = new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)); + } +}; +oop.inherits(FoldMode, BaseFoldMode); +(function () { + this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe = /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function (session, foldStyle, row) { + var line = session.getLine(row); + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + var fw = this._getFoldWidgetBase(session, foldStyle, row); + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + return fw; + }; + this.getFoldWidgetRange = function (session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } + else if (foldStyle != "all") + range = null; + } + return range; + } + if (foldStyle === "markbegin") + return; + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + return session.getCommentFoldRange(row, i, -1); + } + }; + this.getSectionRange = function (session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } + else if (subRange.isMultiLine()) { + row = subRange.end.row; + } + else if (startIndent == indent) { + break; + } + } + endRow = row; + } + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function (session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) + continue; + if (m[1]) + depth--; + else + depth++; + if (!depth) + break; + } + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/sh",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sh_highlight_rules","ace/range","ace/mode/folding/cstyle"], function(require, exports, module){"use strict"; +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ShHighlightRules = require("./sh_highlight_rules").ShHighlightRules; +var Range = require("../range").Range; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var Mode = function () { + this.HighlightRules = ShHighlightRules; + this.foldingRules = new CStyleFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); +(function () { + this.lineCommentStart = "#"; + this.getNextLineIndent = function (state, line, tab) { + var indent = this.$getIndent(line); + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + if (tokens.length && tokens[tokens.length - 1].type == "comment") { + return indent; + } + if (state == "start") { + var match = line.match(/^.*[\{\(\[:]\s*$/); + if (match) { + indent += tab; + } + } + return indent; + }; + var outdents = { + "pass": 1, + "return": 1, + "raise": 1, + "break": 1, + "continue": 1 + }; + this.checkOutdent = function (state, line, input) { + if (input !== "\r\n" && input !== "\r" && input !== "\n") + return false; + var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens; + if (!tokens) + return false; + do { + var last = tokens.pop(); + } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/)))); + if (!last) + return false; + return (last.type == "keyword" && outdents[last.value]); + }; + this.autoOutdent = function (state, doc, row) { + row += 1; + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length - tab.length, row, indent.length)); + }; + this.$id = "ace/mode/sh"; + this.snippetFileId = "ace/snippets/sh"; +}).call(Mode.prototype); +exports.Mode = Mode; + +}); (function() { + ace.require(["ace/mode/sh"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-sql.js b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-sql.js new file mode 100644 index 0000000000..5f71386feb --- /dev/null +++ b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/mode-sql.js @@ -0,0 +1,221 @@ +ace.define("ace/mode/sql_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module){"use strict"; +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var SqlHighlightRules = function () { + var keywords = ("select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|" + + "when|then|else|end|type|left|right|join|on|outer|desc|asc|union|create|table|primary|key|if|" + + "foreign|not|references|default|null|inner|cross|natural|database|drop|grant|distinct|is|in|" + + "all|alter|any|array|at|authorization|between|both|cast|check|collate|column|commit|constraint|" + + "cube|current|current_date|current_time|current_timestamp|current_user|describe|escape|except|" + + "exists|external|extract|fetch|filter|for|full|function|global|grouping|intersect|interval|" + + "into|leading|like|local|no|of|only|out|overlaps|partition|position|range|revoke|rollback|rollup|" + + "row|rows|session_user|set|some|start|tablesample|time|to|trailing|truncate|unique|unknown|" + + "user|using|values|window|with"); + var builtinConstants = ("true|false"); + var builtinFunctions = ("avg|count|first|last|max|min|sum|ucase|lcase|mid|len|round|rank|now|format|" + + "coalesce|ifnull|isnull|nvl"); + var dataTypes = ("int|numeric|decimal|date|varchar|char|bigint|float|double|bit|binary|text|set|timestamp|" + + "money|real|number|integer|string"); + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants, + "storage.type": dataTypes + }, "identifier", true); + this.$rules = { + "start": [{ + token: "comment", + regex: "--.*$" + }, { + token: "comment", + start: "/\\*", + end: "\\*/" + }, { + token: "string", // " string + regex: '".*?"' + }, { + token: "string", // ' string + regex: "'.*?'" + }, { + token: "string", // ` string (apache drill) + regex: "`.*?`" + }, { + token: "constant.numeric", // float + regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token: keywordMapper, + regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token: "keyword.operator", + regex: "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token: "paren.lparen", + regex: "[\\(]" + }, { + token: "paren.rparen", + regex: "[\\)]" + }, { + token: "text", + regex: "\\s+" + }] + }; + this.normalizeRules(); +}; +oop.inherits(SqlHighlightRules, TextHighlightRules); +exports.SqlHighlightRules = SqlHighlightRules; + +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module){"use strict"; +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; +var FoldMode = exports.FoldMode = function (commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)); + this.foldingStopMarker = new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)); + } +}; +oop.inherits(FoldMode, BaseFoldMode); +(function () { + this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe = /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function (session, foldStyle, row) { + var line = session.getLine(row); + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + var fw = this._getFoldWidgetBase(session, foldStyle, row); + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + return fw; + }; + this.getFoldWidgetRange = function (session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } + else if (foldStyle != "all") + range = null; + } + return range; + } + if (foldStyle === "markbegin") + return; + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + return session.getCommentFoldRange(row, i, -1); + } + }; + this.getSectionRange = function (session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } + else if (subRange.isMultiLine()) { + row = subRange.end.row; + } + else if (startIndent == indent) { + break; + } + } + endRow = row; + } + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function (session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) + continue; + if (m[1]) + depth--; + else + depth++; + if (!depth) + break; + } + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/sql",["require","exports","module","ace/lib/oop","ace/mode/folding/cstyle"], function(require, exports, module){"use strict"; +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./cstyle").FoldMode; +var FoldMode = exports.FoldMode = function () { }; +oop.inherits(FoldMode, BaseFoldMode); +(function () { +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/sql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sql_highlight_rules","ace/mode/folding/sql"], function(require, exports, module){"use strict"; +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var SqlHighlightRules = require("./sql_highlight_rules").SqlHighlightRules; +var SqlFoldMode = require("./folding/sql").FoldMode; +var Mode = function () { + this.HighlightRules = SqlHighlightRules; + this.foldingRules = new SqlFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); +(function () { + this.lineCommentStart = "--"; + this.blockComment = { start: "/*", end: "*/" }; + this.$id = "ace/mode/sql"; + this.snippetFileId = "ace/snippets/sql"; +}).call(Mode.prototype); +exports.Mode = Mode; + +}); (function() { + ace.require(["ace/mode/sql"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); + \ No newline at end of file diff --git a/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/theme-fleet.js b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/theme-fleet.js new file mode 100644 index 0000000000..4f0816aac5 --- /dev/null +++ b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/theme-fleet.js @@ -0,0 +1,195 @@ +ace.define( + "ace/theme/fleet", + ["require", "exports", "module", "ace/lib/dom"], + function (acequire, exports, module) { + // The CSS is inlined and backslashes are used to escape newlines + var cssText = ".ace_editor.ace-fleet {\ + font-size: 14px;\ + background-color: #fafafa;\ + color: #66696f;\ + border-radius: 4px;\ + border: solid 1px #dbe3e5;\ + line-height: 24px;\ +}\ +\ +.ace_editor.ace-fleet.ace_focus {\ + box-shadow: inset 0 0 6px 0 rgba(0, 0, 0, 0.16);\ + background: white;\ +}\ +\ +.ace_editor.ace-fleet.ace_focus .ace_gutter {\ + box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.16);\ +}\ +.ace_editor.ace-fleet.ace_focus .ace_scroller {\ + border-bottom: solid 1px #c38dec;\ +}\ +\ +.ace-fleet.ace_autocomplete .ace_content {\ + padding-left: 0px;\ +}\ +\ +.ace_editor.ace-fleet.ace_autocomplete {\ + width: 350px;\ +}\ +\ +.ace-fleet .ace_content {\ + height: 100% !important;\ +}\ +\ +.ace-fleet .ace_gutter {\ + background: #fff;\ + color: #c38dec;\ + z-index: 1;\ + border-right: solid 1px #e3e3e3;\ +}\ +\ +.ace-fleet .ace_gutter-active-line {\ + background-color: rgba(174, 109, 223, 0.15);\ + border-radius: 2px;\ +}\ +\ +.ace-fleet .ace_print-margin {\ + width: 1px;\ + background: #f6f6f6;\ +}\ +\ +.ace-fleet .ace_scrollbar {\ + z-index: 1;\ +}\ +\ +.ace-fleet .ace_cursor {\ + color: #aeafad;\ +}\ +\ +/* Hide cursor in read-only mode */\ +.ace-fleet .ace_hidden-cursors {\ + opacity: 0;\ +}\ +\ +.ace-fleet .ace_marker-layer .ace_selection {\ + background: rgba(74, 144, 226, 0.13);\ +}\ +\ +.ace-fleet.ace_multiselect .ace_selection.ace_start {\ + box-shadow: 0 0 3px 0px #ffffff;\ +}\ +\ +.ace-fleet .ace_marker-layer .ace_step {\ + background: rgb(255, 255, 0);\ +}\ +\ +.ace-fleet .ace_marker-layer .ace_bracket {\ + margin: -1px 0 0 -1px;\ + border: 1px solid #d1d1d1;\ +}\ +\ +.ace-fleet .ace_marker-layer .ace_selected-word {\ + border: 1px solid #d6d6d6;\ +}\ +\ +.ace-fleet .ace_invisible {\ + color: #d1d1d1;\ +}\ +\ +.ace-fleet .ace_keyword {\ + color: #ae6ddf;\ + font-weight: $bold;\ +}\ +\ +.ace-fleet .ace_osquery-token {\ + border-radius: 3px;\ + background-color: #ae6ddf;\ + color: #ffffff;\ +}\ +\ +.ace-fleet .ace_identifier {\ + color: #ff5850;\ +}\ +\ +.ace-fleet .ace_string,\ +.ace-fleet .ace_osquery-column {\ + color: #4fd061;\ +}\ +\ +.ace-fleet .ace_meta,\ +.ace-fleet .ace_storage,\ +.ace-fleet .ace_storage.ace_type,\ +.ace-fleet .ace_support.ace_type {\ + color: #8959a8;\ +}\ +\ +.ace-fleet .ace_keyword.ace_operator {\ + color: #3e999f;\ +}\ +\ +.ace-fleet .ace_constant.ace_character,\ +.ace-fleet .ace_constant.ace_language,\ +.ace-fleet .ace_constant.ace_numeric,\ +.ace-fleet .ace_keyword.ace_other.ace_unit,\ +.ace-fleet .ace_support.ace_constant,\ +.ace-fleet .ace_variable.ace_parameter {\ + color: #f5871f;\ +}\ +\ +.ace-fleet .ace_constant.ace_other {\ + color: #666969;\ +}\ +\ +.ace-fleet .ace_invalid {\ + color: #ffffff;\ + background-color: #c82829;\ +}\ +\ +.ace-fleet .ace_invalid.ace_deprecated {\ + color: #ffffff;\ + background-color: #ae6ddf;\ +}\ +\ +.ace-fleet .ace_fold {\ + background-color: #4271ae;\ + border-color: #4d4d4c;\ +}\ +\ +.ace-fleet .ace_entity.ace_name.ace_function,\ +.ace-fleet .ace_support.ace_function,\ +.ace-fleet .ace_variable {\ + color: #4271ae;\ +}\ +\ +.ace-fleet .ace_support.ace_class,\ +.ace-fleet .ace_support.ace_type {\ + color: #c99e00;\ +}\ +\ +.ace-fleet .ace_heading,\ +.ace-fleet .ace_markup.ace_heading,\ +.ace-fleet .ace_string {\ + color: #4fd061;\ +}\ +\ +.ace-fleet .ace_entity.ace_name.ace_tag,\ +.ace-fleet .ace_entity.ace_other.ace_attribute-name,\ +.ace-fleet .ace_meta.ace_tag,\ +.ace-fleet .ace_string.ace_regexp,\ +.ace-fleet .ace_variable {\ + color: #c82829;\ +}\ +\ +.ace-fleet .ace_comment {\ + color: #8e908c;\ +}\ +\ +.ace-fleet .ace_indent-guide {\ + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==)\ + right repeat-y;\ +}\ +"; + + exports.isDark = false; + exports.cssClass = "ace-fleet"; + exports.cssText = cssText; + + var dom = acequire("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass); + } +); diff --git a/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/worker-base.js b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/worker-base.js new file mode 100644 index 0000000000..5c1bc09c80 --- /dev/null +++ b/ee/bulk-operations-dashboard/assets/dependencies/ace-editor/worker-base.js @@ -0,0 +1,1332 @@ +"no use strict"; +!(function(window) { +if (typeof window.window != "undefined" && window.document) + return; +if (window.require && window.define) + return; + +if (!window.console) { + window.console = function() { + var msgs = Array.prototype.slice.call(arguments, 0); + postMessage({type: "log", data: msgs}); + }; + window.console.error = + window.console.warn = + window.console.log = + window.console.trace = window.console; +} +window.window = window; +window.ace = window; + +window.onerror = function(message, file, line, col, err) { + postMessage({type: "error", data: { + message: message, + data: err && err.data, + file: file, + line: line, + col: col, + stack: err && err.stack + }}); +}; + +window.normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + moduleName = (base ? base + "/" : "") + moduleName; + + while (moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + + return moduleName; +}; + +window.require = function require(parentId, id) { + if (!id) { + id = parentId; + parentId = null; + } + if (!id.charAt) + throw new Error("worker.js require() accepts only (parentId, id) as arguments"); + + id = window.normalizeModule(parentId, id); + + var module = window.require.modules[id]; + if (module) { + if (!module.initialized) { + module.initialized = true; + module.exports = module.factory().exports; + } + return module.exports; + } + + if (!window.require.tlns) + return console.log("unable to load " + id); + + var path = resolveModuleId(id, window.require.tlns); + if (path.slice(-3) != ".js") path += ".js"; + + window.require.id = id; + window.require.modules[id] = {}; // prevent infinite loop on broken modules + importScripts(path); + return window.require(parentId, id); +}; +function resolveModuleId(id, paths) { + var testPath = id, tail = ""; + while (testPath) { + var alias = paths[testPath]; + if (typeof alias == "string") { + return alias + tail; + } else if (alias) { + return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name); + } else if (alias === false) { + return ""; + } + var i = testPath.lastIndexOf("/"); + if (i === -1) break; + tail = testPath.substr(i) + tail; + testPath = testPath.slice(0, i); + } + return id; +} +window.require.modules = {}; +window.require.tlns = {}; + +window.define = function(id, deps, factory) { + if (arguments.length == 2) { + factory = deps; + if (typeof id != "string") { + deps = id; + id = window.require.id; + } + } else if (arguments.length == 1) { + factory = id; + deps = []; + id = window.require.id; + } + + if (typeof factory != "function") { + window.require.modules[id] = { + exports: factory, + initialized: true + }; + return; + } + + if (!deps.length) + // If there is no dependencies, we inject "require", "exports" and + // "module" as dependencies, to provide CommonJS compatibility. + deps = ["require", "exports", "module"]; + + var req = function(childId) { + return window.require(id, childId); + }; + + window.require.modules[id] = { + exports: {}, + factory: function() { + var module = this; + var returnExports = factory.apply(this, deps.slice(0, factory.length).map(function(dep) { + switch (dep) { + // Because "require", "exports" and "module" aren't actual + // dependencies, we must handle them seperately. + case "require": return req; + case "exports": return module.exports; + case "module": return module; + // But for all other dependencies, we can just go ahead and + // require them. + default: return req(dep); + } + })); + if (returnExports) + module.exports = returnExports; + return module; + } + }; +}; +window.define.amd = {}; +window.require.tlns = {}; +window.initBaseUrls = function initBaseUrls(topLevelNamespaces) { + for (var i in topLevelNamespaces) + this.require.tlns[i] = topLevelNamespaces[i]; +}; + +window.initSender = function initSender() { + + var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter; + var oop = window.require("ace/lib/oop"); + + var Sender = function() {}; + + (function() { + + oop.implement(this, EventEmitter); + + this.callback = function(data, callbackId) { + postMessage({ + type: "call", + id: callbackId, + data: data + }); + }; + + this.emit = function(name, data) { + postMessage({ + type: "event", + name: name, + data: data + }); + }; + + }).call(Sender.prototype); + + return new Sender(); +}; + +var main = window.main = null; +var sender = window.sender = null; + +window.onmessage = function(e) { + var msg = e.data; + if (msg.event && sender) { + sender._signal(msg.event, msg.data); + } + else if (msg.command) { + if (main[msg.command]) + main[msg.command].apply(main, msg.args); + else if (window[msg.command]) + window[msg.command].apply(window, msg.args); + else + throw new Error("Unknown command:" + msg.command); + } + else if (msg.init) { + window.initBaseUrls(msg.tlns); + sender = window.sender = window.initSender(); + var clazz = this.require(msg.module)[msg.classname]; + main = window.main = new clazz(sender); + } +}; +})(this); + +ace.define("ace/lib/oop",[], function(require, exports, module){"use strict"; +exports.inherits = function (ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; +exports.mixin = function (obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; +exports.implement = function (proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +ace.define("ace/apply_delta",[], function(require, exports, module){"use strict"; +function throwDeltaError(delta, errorText) { + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} +exports.applyDelta = function (docLines, delta, doNotValidate) { + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } + else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } + else { + docLines.splice(row, endRow - row + 1, line.substring(0, startColumn) + docLines[endRow].substring(endColumn)); + } + break; + } +}; + +}); + +ace.define("ace/lib/event_emitter",[], function(require, exports, module){"use strict"; +var EventEmitter = {}; +var stopPropagation = function () { this.propagationStopped = true; }; +var preventDefault = function () { this.defaultPrevented = true; }; +EventEmitter._emit = + EventEmitter._dispatchEvent = function (eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + if (typeof e != "object" || !e) + e = {}; + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + listeners = listeners.slice(); + for (var i = 0; i < listeners.length; i++) { + listeners[i](e, this); + if (e.propagationStopped) + break; + } + if (defaultHandler && !e.defaultPrevented) + return defaultHandler(e, this); + }; +EventEmitter._signal = function (eventName, e) { + var listeners = (this._eventRegistry || {})[eventName]; + if (!listeners) + return; + listeners = listeners.slice(); + for (var i = 0; i < listeners.length; i++) + listeners[i](e, this); +}; +EventEmitter.once = function (eventName, callback) { + var _self = this; + this.on(eventName, function newCallback() { + _self.off(eventName, newCallback); + callback.apply(null, arguments); + }); + if (!callback) { + return new Promise(function (resolve) { + callback = resolve; + }); + } +}; +EventEmitter.setDefaultHandler = function (eventName, callback) { + var handlers = this._defaultHandlers; + if (!handlers) + handlers = this._defaultHandlers = { _disabled_: {} }; + if (handlers[eventName]) { + var old = handlers[eventName]; + var disabled = handlers._disabled_[eventName]; + if (!disabled) + handlers._disabled_[eventName] = disabled = []; + disabled.push(old); + var i = disabled.indexOf(callback); + if (i != -1) + disabled.splice(i, 1); + } + handlers[eventName] = callback; +}; +EventEmitter.removeDefaultHandler = function (eventName, callback) { + var handlers = this._defaultHandlers; + if (!handlers) + return; + var disabled = handlers._disabled_[eventName]; + if (handlers[eventName] == callback) { + if (disabled) + this.setDefaultHandler(eventName, disabled.pop()); + } + else if (disabled) { + var i = disabled.indexOf(callback); + if (i != -1) + disabled.splice(i, 1); + } +}; +EventEmitter.on = + EventEmitter.addEventListener = function (eventName, callback, capturing) { + this._eventRegistry = this._eventRegistry || {}; + var listeners = this._eventRegistry[eventName]; + if (!listeners) + listeners = this._eventRegistry[eventName] = []; + if (listeners.indexOf(callback) == -1) + listeners[capturing ? "unshift" : "push"](callback); + return callback; + }; +EventEmitter.off = + EventEmitter.removeListener = + EventEmitter.removeEventListener = function (eventName, callback) { + this._eventRegistry = this._eventRegistry || {}; + var listeners = this._eventRegistry[eventName]; + if (!listeners) + return; + var index = listeners.indexOf(callback); + if (index !== -1) + listeners.splice(index, 1); + }; +EventEmitter.removeAllListeners = function (eventName) { + if (!eventName) + this._eventRegistry = this._defaultHandlers = undefined; + if (this._eventRegistry) + this._eventRegistry[eventName] = undefined; + if (this._defaultHandlers) + this._defaultHandlers[eventName] = undefined; +}; +exports.EventEmitter = EventEmitter; + +}); + +ace.define("ace/range",[], function(require, exports, module){"use strict"; +var Range = /** @class */ (function () { + function Range(startRow, startColumn, endRow, endColumn) { + this.start = { + row: startRow, + column: startColumn + }; + this.end = { + row: endRow, + column: endColumn + }; + } + Range.prototype.isEqual = function (range) { + return this.start.row === range.start.row && + this.end.row === range.end.row && + this.start.column === range.start.column && + this.end.column === range.end.column; + }; + Range.prototype.toString = function () { + return ("Range: [" + this.start.row + "/" + this.start.column + + "] -> [" + this.end.row + "/" + this.end.column + "]"); + }; + Range.prototype.contains = function (row, column) { + return this.compare(row, column) == 0; + }; + Range.prototype.compareRange = function (range) { + var cmp, end = range.end, start = range.start; + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } + else if (cmp == 0) { + return 1; + } + else { + return 0; + } + } + else if (cmp == -1) { + return -2; + } + else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } + else if (cmp == 1) { + return 42; + } + else { + return 0; + } + } + }; + Range.prototype.comparePoint = function (p) { + return this.compare(p.row, p.column); + }; + Range.prototype.containsRange = function (range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + Range.prototype.intersects = function (range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + Range.prototype.isEnd = function (row, column) { + return this.end.row == row && this.end.column == column; + }; + Range.prototype.isStart = function (row, column) { + return this.start.row == row && this.start.column == column; + }; + Range.prototype.setStart = function (row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } + else { + this.start.row = row; + this.start.column = column; + } + }; + Range.prototype.setEnd = function (row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } + else { + this.end.row = row; + this.end.column = column; + } + }; + Range.prototype.inside = function (row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } + else { + return true; + } + } + return false; + }; + Range.prototype.insideStart = function (row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } + else { + return true; + } + } + return false; + }; + Range.prototype.insideEnd = function (row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } + else { + return true; + } + } + return false; + }; + Range.prototype.compare = function (row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + if (row < this.start.row) + return -1; + if (row > this.end.row) + return 1; + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + return 0; + }; + Range.prototype.compareStart = function (row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } + else { + return this.compare(row, column); + } + }; + Range.prototype.compareEnd = function (row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } + else { + return this.compare(row, column); + } + }; + Range.prototype.compareInside = function (row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } + else if (this.start.row == row && this.start.column == column) { + return -1; + } + else { + return this.compare(row, column); + } + }; + Range.prototype.clipRows = function (firstRow, lastRow) { + if (this.end.row > lastRow) + var end = { row: lastRow + 1, column: 0 }; + else if (this.end.row < firstRow) + var end = { row: firstRow, column: 0 }; + if (this.start.row > lastRow) + var start = { row: lastRow + 1, column: 0 }; + else if (this.start.row < firstRow) + var start = { row: firstRow, column: 0 }; + return Range.fromPoints(start || this.start, end || this.end); + }; + Range.prototype.extend = function (row, column) { + var cmp = this.compare(row, column); + if (cmp == 0) + return this; + else if (cmp == -1) + var start = { row: row, column: column }; + else + var end = { row: row, column: column }; + return Range.fromPoints(start || this.start, end || this.end); + }; + Range.prototype.isEmpty = function () { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + Range.prototype.isMultiLine = function () { + return (this.start.row !== this.end.row); + }; + Range.prototype.clone = function () { + return Range.fromPoints(this.start, this.end); + }; + Range.prototype.collapseRows = function () { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0); + else + return new Range(this.start.row, 0, this.end.row, 0); + }; + Range.prototype.toScreenRange = function (session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + return new Range(screenPosStart.row, screenPosStart.column, screenPosEnd.row, screenPosEnd.column); + }; + Range.prototype.moveBy = function (row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + return Range; +}()); +Range.fromPoints = function (start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = function (p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; +exports.Range = Range; + +}); + +ace.define("ace/anchor",[], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Anchor = /** @class */ (function () { + function Anchor(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + if (typeof row != "number") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); + } + Anchor.prototype.getPosition = function () { + return this.$clipPositionToDocument(this.row, this.column); + }; + Anchor.prototype.getDocument = function () { + return this.document; + }; + Anchor.prototype.onChange = function (delta) { + if (delta.start.row == delta.end.row && delta.start.row != this.row) + return; + if (delta.start.row > this.row) + return; + var point = $getTransformedPoint(delta, { row: this.row, column: this.column }, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + Anchor.prototype.setPosition = function (row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } + else { + pos = this.$clipPositionToDocument(row, column); + } + if (this.row == pos.row && this.column == pos.column) + return; + var old = { + row: this.row, + column: this.column + }; + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + Anchor.prototype.detach = function () { + this.document.off("change", this.$onChange); + }; + Anchor.prototype.attach = function (doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + Anchor.prototype.$clipPositionToDocument = function (row, column) { + var pos = {}; + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + if (column < 0) + pos.column = 0; + return pos; + }; + return Anchor; +}()); +Anchor.prototype.$insertRight = false; +oop.implement(Anchor.prototype, EventEmitter); +function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); +} +function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + return { + row: deltaStart.row, + column: deltaStart.column + }; +} +exports.Anchor = Anchor; + +}); + +ace.define("ace/document",[], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; +var Document = /** @class */ (function () { + function Document(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } + else if (Array.isArray(textOrLines)) { + this.insertMergedLines({ row: 0, column: 0 }, textOrLines); + } + else { + this.insert({ row: 0, column: 0 }, textOrLines); + } + } + Document.prototype.setValue = function (text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({ row: 0, column: 0 }, text || ""); + }; + Document.prototype.getValue = function () { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + Document.prototype.createAnchor = function (row, column) { + return new Anchor(this, row, column); + }; + Document.prototype.$detectNewLine = function (text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + Document.prototype.getNewLineCharacter = function () { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + Document.prototype.setNewLineMode = function (newLineMode) { + if (this.$newLineMode === newLineMode) + return; + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + Document.prototype.getNewLineMode = function () { + return this.$newLineMode; + }; + Document.prototype.isNewLine = function (text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + Document.prototype.getLine = function (row) { + return this.$lines[row] || ""; + }; + Document.prototype.getLines = function (firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + Document.prototype.getAllLines = function () { + return this.getLines(0, this.getLength()); + }; + Document.prototype.getLength = function () { + return this.$lines.length; + }; + Document.prototype.getTextRange = function (range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + Document.prototype.getLinesForRange = function (range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } + else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + Document.prototype.insertLines = function (row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + Document.prototype.removeLines = function (firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + Document.prototype.insertNewLine = function (position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + Document.prototype.insert = function (position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + return this.insertMergedLines(position, this.$split(text)); + }; + Document.prototype.insertInLine = function (position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + return this.clonePos(end); + }; + Document.prototype.clippedPos = function (row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } + else if (row < 0) { + row = 0; + } + else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return { row: row, column: column }; + }; + Document.prototype.clonePos = function (pos) { + return { row: pos.row, column: pos.column }; + }; + Document.prototype.pos = function (row, column) { + return { row: row, column: column }; + }; + Document.prototype.$clipPosition = function (position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } + else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + Document.prototype.insertFullLines = function (row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } + else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({ row: row, column: column }, lines); + }; + Document.prototype.insertMergedLines = function (position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + return this.clonePos(end); + }; + Document.prototype.remove = function (range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({ start: start, end: end }) + }); + return this.clonePos(start); + }; + Document.prototype.removeInLine = function (row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({ start: start, end: end }) + }, true); + return this.clonePos(start); + }; + Document.prototype.removeFullLines = function (firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = (deleteFirstNewLine ? firstRow - 1 : firstRow); + var startCol = (deleteFirstNewLine ? this.getLine(startRow).length : 0); + var endRow = (deleteLastNewLine ? lastRow + 1 : lastRow); + var endCol = (deleteLastNewLine ? 0 : this.getLine(endRow).length); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + Document.prototype.removeNewLine = function (row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + Document.prototype.replace = function (range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + return end; + }; + Document.prototype.applyDeltas = function (deltas) { + for (var i = 0; i < deltas.length; i++) { + this.applyDelta(deltas[i]); + } + }; + Document.prototype.revertDeltas = function (deltas) { + for (var i = deltas.length - 1; i >= 0; i--) { + this.revertDelta(deltas[i]); + } + }; + Document.prototype.applyDelta = function (delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + if (isInsert && delta.lines.length > 20000) { + this.$splitAndapplyLargeDelta(delta, 20000); + } + else { + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + } + }; + Document.prototype.$safeApplyDelta = function (delta) { + var docLength = this.$lines.length; + if (delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength + || delta.action == "insert" && delta.start.row <= docLength) { + this.applyDelta(delta); + } + }; + Document.prototype.$splitAndapplyLargeDelta = function (delta, MAX) { + var lines = delta.lines; + var l = lines.length - MAX + 1; + var row = delta.start.row; + var column = delta.start.column; + for (var from = 0, to = 0; from < l; from = to) { + to += MAX - 1; + var chunk = lines.slice(from, to); + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } + delta.lines = lines.slice(from); + delta.start.row = row + from; + delta.start.column = column; + this.applyDelta(delta, true); + }; + Document.prototype.revertDelta = function (delta) { + this.$safeApplyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + Document.prototype.indexToPosition = function (index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return { row: i, column: index + lines[i].length + newlineLength }; + } + return { row: l - 1, column: index + lines[l - 1].length + newlineLength }; + }; + Document.prototype.positionToIndex = function (pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + return index + pos.column; + }; + Document.prototype.$split = function (text) { + return text.split(/\r\n|\r|\n/); + }; + return Document; +}()); +Document.prototype.$autoNewLine = ""; +Document.prototype.$newLineMode = "auto"; +oop.implement(Document.prototype, EventEmitter); +exports.Document = Document; + +}); + +ace.define("ace/lib/deep_copy",[], function(require, exports, module){exports.deepCopy = function deepCopy(obj) { + if (typeof obj !== "object" || !obj) + return obj; + var copy; + if (Array.isArray(obj)) { + copy = []; + for (var key = 0; key < obj.length; key++) { + copy[key] = deepCopy(obj[key]); + } + return copy; + } + if (Object.prototype.toString.call(obj) !== "[object Object]") + return obj; + copy = {}; + for (var key in obj) + copy[key] = deepCopy(obj[key]); + return copy; +}; + +}); + +ace.define("ace/lib/lang",[], function(require, exports, module){"use strict"; +exports.last = function (a) { + return a[a.length - 1]; +}; +exports.stringReverse = function (string) { + return string.split("").reverse().join(""); +}; +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + if (count >>= 1) + string += string; + } + return result; +}; +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; +exports.copyObject = function (obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; +exports.copyArray = function (array) { + var copy = []; + for (var i = 0, l = array.length; i < l; i++) { + if (array[i] && typeof array[i] == "object") + copy[i] = this.copyObject(array[i]); + else + copy[i] = array[i]; + } + return copy; +}; +exports.deepCopy = require("./deep_copy").deepCopy; +exports.arrayToMap = function (arr) { + var map = {}; + for (var i = 0; i < arr.length; i++) { + map[arr[i]] = 1; + } + return map; +}; +exports.createMap = function (props) { + var map = Object.create(null); + for (var i in props) { + map[i] = props[i]; + } + return map; +}; +exports.arrayRemove = function (array, value) { + for (var i = 0; i <= array.length; i++) { + if (value === array[i]) { + array.splice(i, 1); + } + } +}; +exports.escapeRegExp = function (str) { + return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1'); +}; +exports.escapeHTML = function (str) { + return ("" + str).replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/ 0xffff ? 2 : 1; +}; + +}); + +ace.define("ace/worker/mirror",[], function(require, exports, module) { +"use strict"; + +var Document = require("../document").Document; +var lang = require("../lib/lang"); + +var Mirror = exports.Mirror = function(sender) { + this.sender = sender; + var doc = this.doc = new Document(""); + + var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this)); + + var _self = this; + sender.on("change", function(e) { + var data = e.data; + if (data[0].start) { + doc.applyDeltas(data); + } else { + for (var i = 0; i < data.length; i += 2) { + var d, err; + if (Array.isArray(data[i+1])) { + d = {action: "insert", start: data[i], lines: data[i+1]}; + } else { + d = {action: "remove", start: data[i], end: data[i+1]}; + } + + if ((d.action == "insert" ? d.start : d.end).row >= doc.$lines.length) { + err = new Error("Invalid delta"); + err.data = { + path: _self.$path, + linesLength: doc.$lines.length, + start: d.start, + end: d.end + }; + throw err; + } + + doc.applyDelta(d, true); + } + } + if (_self.$timeout) + return deferredUpdate.schedule(_self.$timeout); + _self.onUpdate(); + }); +}; + +(function() { + + this.$timeout = 500; + + this.setTimeout = function(timeout) { + this.$timeout = timeout; + }; + + this.setValue = function(value) { + this.doc.setValue(value); + this.deferredUpdate.schedule(this.$timeout); + }; + + this.getValue = function(callbackId) { + this.sender.callback(this.doc.getValue(), callbackId); + }; + + this.onUpdate = function() { + }; + + this.isPending = function() { + return this.deferredUpdate.isPending(); + }; + +}).call(Mirror.prototype); + +}); diff --git a/ee/bulk-operations-dashboard/assets/images/icon-chevron-down-32x32@2x.png b/ee/bulk-operations-dashboard/assets/images/icon-chevron-down-32x32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c60f830a4dd6e48818570c24252c81a0d66796 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yL!3HFEsI3eHQk(@Ik;M!QVyYm_=ozH)0Vv2= z9OUlAuv3}wO#Q@R#r{t zy!f6*##}p3<`v5)9rlh}S8?}QV}j=MGYavZ)vk;S!YeeEOsbe(f2lE2;bGyQEI%iW z=gsf@gWUeG8~xVJZFuoZ)N6<2{Fg43f#%&}HcU~R`8&N5{FLnXKFw;>?7Sab`c#c^ zYshZ4Vd>05`UXKDRIwo5fC`Y<=!hsn;te{X!hrk+Z5QS)h>^Yl3`|JP zak1K{P$#t$JN!fC#<9LnceY{#$2n-7hf{(p9)>_TMi1_v``zAr-Uo--KRi2*0R;~O z`2b;)f1|DK9e8_v895b@aKxT+5+R&RAUH@Ab?UhO_0Ge3-g^vhI}wl)M;8s8(jZ>~ zCmvW#Que5I86;!z&>fSHO&)$`ub{x1z`W;3(}BJOp9-*$?{*4SRe~@+5l=UwR0VR6nvA*<3~!76om^K~U^P5Lf{&;WowO2#1oYu*iNzT2 z0dsf~3LuUfs+k%Xq!@g*;T~^=YEHWarQov-S6ILmTuZWXLokdDcq$O{HQ8j5EqE%xo!He~U=uFM zCjGY!PvYtJ-vwL>==9$eJV`C1|6_hWB8rFby)j(8!?_UPyE;_{{F@(`ZV<-txc0UH O0000co9g*XMwf#u&W}e(Z?F% zrr=5FH3qkINs=a6cDhE(y3Vx^?wZ;_Sih;`(ErkhL~jy5+I_YkhQ<1 z9zu-3!&BAJ?ge7o1;TRLbwPkL;6_?NW$&XS2JNkpy1>r*H>(jiiv7q85-}wHF!bpr zY=NV8Arx;$I(5~BzQAHQtYYqcDbRR=bC7s(Kv>M{jmNm{;6DKJ!fpTX9#;SW002ov JPDHLkV1i<*-n#$* literal 0 HcmV?d00001 diff --git a/ee/bulk-operations-dashboard/assets/images/icon-software-34x40@2x.png b/ee/bulk-operations-dashboard/assets/images/icon-software-34x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3ac42f95ec2e58b73791a60a29596842b2ca59 GIT binary patch literal 3184 zcmV-$43G1PP)DTcp=8w#<;O_mIen0Z(gx%9_S*M z%WxyA=)^C`+fm4^C&Wi#)u&r)1*~x1<=TH2!$S%98={jklHy{cHy7^v9GNdKxnW`S z7KK6Yb^F(UOOl5M9*#?TGz}ig0f<1rW@Wy#guBRa(~P@+g}kpm2=xYv0}!y7JDr?( zxN7R;v0g!O073)kaI}uz@&<|kH>o^@a?=8#@&w9F4TNf-P;Po4R0Dx>O8}vA7s@RI zgvuQ#!ybrCCWT6+b$fpbWy3$;4z)4X!!#@Bzdx*jh(to%Ic+NT9XN(d4b5&JM>ATI z>W4A{_7#V7Vi+qZNQ%f&VR&ZoBY1qlN=PID13I2$p-+;(c2FF8yD?)PW*e*XF&tzx znsBz{A}kgw_gc}?F_6RY`-ZNR>K+y6@`*A zVKjWDTdLW0M}8nY`GN4{2f~vd2v64qNa^|N?#z;=-L!h{Y@h3)A#HZ)hhOz+4svt% zBP2YWtCW+W11ObkNJvP;mus`Sh7*vtZ4V$0;`UjzU^a$ILuMiLL#EGq7Shg(IJD|< zOpFo{Fzc{7I}~L{ejX(Nuh$J>S!y$DaG$8aFr6B4ntMLAcbfl+5a@zyKnjw_8a8MYMWinE6 zHxRH4SW_^09RyaF4Av0SeZB^T8Xtdi8Ye20K64{yKz!~pG)`pwWi4iBEXVz0g~UA` z<6sD+8b}k$APT+0!JuMIX0SH4`&iZzNdAyp5*WY)pXV03P8Clq=Hr*{L*CmD;K24B zxNFu@?7Q!b zv%%z_#q7t zB1j^GP|%OjQZVYtV9h;UeNW?y&w$W4v3}DoE}xh;J(jq}M96~zxHut>XapnH_j$aP zxQdp5Fk7zyV|6s3aH~O58G^)tr19w+47C($F%(djD46B%6+&eeVk60ErcO@o^Bm5A zc$ApYyg+7Z!|ts6IS`Cc3vpyU2c*vrK|mNR7U<1pZrz!51}%&x17|H#vDD?cXndgy zYnTF76U}X-@g;xte6E>Z_?wluP_hRDl}AB!`dwFN2T&N?&4DzfqFVB;N?aaeBp^EU zdgx3hmoU0ywOOIotI)1)BkMMo`&mp9bk=|7uwA7!AtcPRNlzXDS+Q&`E+{NGS*GZ9 z7X?7uCNQSU#Eg4}1!$a584O&k=nn*66imCimB3Nkfw2-dQB@y-vV1FS##Xyy4xX&V z#)H*#@(etYM?mEAU}V4fJpTH%lbK7JqhNGr$X$1G5L5Yt=4t{x*kwD2zpK?nCCvW!zwtr}C<|`wp>^g^OOnG{jaP>7=3}ypF#GS+e5}dgxNByZ1Z2YeD zYA&+SyOiE5AoQC^OiIL82ij0nnv4arYY-RdBu;34M4&JPR%t5Ck}0s6Tl+mXBMgIC zaSo=|Gfv+xtCwIy{&=KB#K9u0gM8#DE(h^eUIC#~BHOMsV%_U^psFSio3@RCCZGa; zSlB?o8143Dtx5>AKR~QM4NKrOSOm^}oV8hCRW`%Yag2cLba-E_CuM^pV_;B?$BQ#% zkVzOYA+b2Hri9CwXLvb3&Z|t7cCg-fA|9!UQfS(nxNXf!3v!NkKsK`4DVXjH2j2~| zI1OfVTX$k6u#JH3QXy;x=N7c_;AoUpC1d%_a74<5-P=b*C84-Rh4nv~P_SgrcY3Wem7&=C<88Qqd<5n_B6hk@+88-RhssC>y_-u5Je5ZlLi;e(I(EM~6S3ie z9FQ&x;fq?#ccqQEJ+&P3?`v_mywPAp2gzw{q*f%A29SWRPd&yOL70D0`r7`Ki|O^}jh912RK@N|A7ewT3$_oXT9_EGCZ*m)=cTJrWWbR#Q8-pQ6%R~^z-@72*Eh(M$!x;MM;X+q14#D#0!bL%hcPHMRT^A(Z21DO zJ!C~f+(bwv&dl3&A13E`CzSdIB!|b~!9HArf1_MKr{fA*I}~{BKrAj4?-=ld3WHKp z?dtg|S}viqtcd&HBNlzZpnB@p65JE5>=Oq6OlnOBs_M=`(bhp2=qx z!gc6a*wsAfhowtm!bC)kN+fxPy<1dN{;zx8N=gKZmdl8VO0?UDf@*DV?skpt>vauZ zFut`FuPubuEv>=H*i#;d4ukW`IdzMYbH@psp7=u7l}h^*ow^Nm3o81*yy`3mgb$-j zH62o{`){Pz{g>YI+CpftsF3s@Xv(~1%@(A`w&C7H$8iz^i7(V5D4a8K-d#+jNF zb)@nxB0y9wuW7Idu&+D}7d27%GihqQ?eh1QPlqyTN>7{Ng8ln3D^Y>eNcW~mib<7S zB(`m}TBOtftG$%mOJBI6=-yyk34HJ+HzfKZ7E-io@% zx91`-DfJHQ-JCgS&jb$2{1EEXCrJk@Z+juv?+G_w;4H=yFpX+4_7nFAikX7-8=v=S zyl|#LoiIavn?BIEfedQpY|G=~%U!YkSIelVdwgFNf|AY{QVDy;t1kUOH0Tp%sA*@v z^#TqSY(wbn&*C4aCgQB3?-|F(>*e_1SR5ulxRi9||21SVsD^AxRabn;BdI=hqq>WZ zZqz$Y9Q{w`b$NDp$ftHwH=@h>FLz_Z=3R)jox{{kS3uddnFQ|HNIM{6Ki}1L4UJgeN}`p8P;~@&nQ_5T5)%c=7|`$q$4l2Oy;4+BuM)pBS#X_5_8)oGoWR+f_{GvES_a>EthDjEmXL z-|h&6WwPlQ%TPVzc0JTJTw=2!oBy7}j1*00Woa77tIYJgHQ?a(cBLX+zg_j z;Ip-Pc!dm+C={K`uGHoq;qT*eV3htGjex;B#Acox20tI_mS}ur!4#9>=WJ&%sQwRS Wqc)J?x4$R=0000DTcp=8w#<;O_mIen0Z(gx%9_S*M z%WxyA=)^C`+fm4^C&Wi#)u&r)1*~x1<=TH2!$S%98={jklHy{cHy7^v9GNdKxnW`S z7KK6Yb^F(UOOl5M9*#?TGz}ig0f<1rW@Wy#guBRa(~P@+g}kpm2=xYv0}!y7JDr?( zxN7R;v0g!O073)kaI}uz@&<|kH>o^@a?=8#@&w9F4TNf-P;Po4R0Dx>O8}vA7s@RI zgvuQ#!ybrCCWT6+b$fpbWy3$;4z)4X!!#@Bzdx*jh(to%Ic+NT9XN(d4b5&JM>ATI z>W4A{_7#V7Vi+qZNQ%f&VR&ZoBY1qlN=PID13I2$p-+;(c2FF8yD?)PW*e*XF&tzx znsBz{A}kgw_gc}?F_6RY`-ZNR>K+y6@`*A zVKjWDTdLW0M}8nY`GN4{2f~vd2v64qNa^|N?#z;=-L!h{Y@h3)A#HZ)hhOz+4svt% zBP2YWtCW+W11ObkNJvP;mus`Sh7*vtZ4V$0;`UjzU^a$ILuMiLL#EGq7Shg(IJD|< zOpFo{Fzc{7I}~L{ejX(Nuh$J>S!y$DaG$8aFr6B4ntMLAcbfl+5a@zyKnjw_8a8MYMWinE6 zHxRH4SW_^09RyaF4Av0SeZB^T8Xtdi8Ye20K64{yKz!~pG)`pwWi4iBEXVz0g~UA` z<6sD+8b}k$APT+0!JuMIX0SH4`&iZzNdAyp5*WY)pXV03P8Clq=Hr*{L*CmD;K24B zxNFu@?7Q!b zv%%z_#q7t zB1j^GP|%OjQZVYtV9h;UeNW?y&w$W4v3}DoE}xh;J(jq}M96~zxHut>XapnH_j$aP zxQdp5Fk7zyV|6s3aH~O58G^)tr19w+47C($F%(djD46B%6+&eeVk60ErcO@o^Bm5A zc$ApYyg+7Z!|ts6IS`Cc3vpyU2c*vrK|mNR7U<1pZrz!51}%&x17|H#vDD?cXndgy zYnTF76U}X-@g;xte6E>Z_?wluP_hRDl}AB!`dwFN2T&N?&4DzfqFVB;N?aaeBp^EU zdgx3hmoU0ywOOIotI)1)BkMMo`&mp9bk=|7uwA7!AtcPRNlzXDS+Q&`E+{NGS*GZ9 z7X?7uCNQSU#Eg4}1!$a584O&k=nn*66imCimB3Nkfw2-dQB@y-vV1FS##Xyy4xX&V z#)H*#@(etYM?mEAU}V4fJpTH%lbK7JqhNGr$X$1G5L5Yt=4t{x*kwD2zpK?nCCvW!zwtr}C<|`wp>^g^OOnG{jaP>7=3}ypF#GS+e5}dgxNByZ1Z2YeD zYA&+SyOiE5AoQC^OiIL82ij0nnv4arYY-RdBu;34M4&JPR%t5Ck}0s6Tl+mXBMgIC zaSo=|Gfv+xtCwIy{&=KB#K9u0gM8#DE(h^eUIC#~BHOMsV%_U^psFSio3@RCCZGa; zSlB?o8143Dtx5>AKR~QM4NKrOSOm^}oV8hCRW`%Yag2cLba-E_CuM^pV_;B?$BQ#% zkVzOYA+b2Hri9CwXLvb3&Z|t7cCg-fA|9!UQfS(nxNXf!3v!NkKsK`4DVXjH2j2~| zI1OfVTX$k6u#JH3QXy;x=N7c_;AoUpC1d%_a74<5-P=b*C84-Rh4nv~P_SgrcY3Wem7&=C<88Qqd<5n_B6hk@+88-RhssC>y_-u5Je5ZlLi;e(I(EM~6S3ie z9FQ&x;fq?#ccqQEJ+&P3?`v_mywPAp2gzw{q*f%A29SWRPd&yOL70D0`r7`Ki|O^}jh912RK@N|A7ewT3$_oXT9_EGCZ*m)=cTJrWWbR#Q8-pQ6%R~^z-@72*Eh(M$!x;MM;X+q14#D#0!bL%hcPHMRT^A(Z21DO zJ!C~f+(bwv&dl3&A13E`CzSdIB!|b~!9HArf1_MKr{fA*I}~{BKrAj4?-=ld3WHKp z?dtg|S}viqtcd&HBNlzZpnB@p65JE5>=Oq6OlnOBs_M=`(bhp2=qx z!gc6a*wsAfhowtm!bC)kN+fxPy<1dN{;zx8N=gKZmdl8VO0?UDf@*DV?skpt>vauZ zFut`FuPubuEv>=H*i#;d4ukW`IdzMYbH@psp7=u7l}h^*ow^Nm3o81*yy`3mgb$-j zH62o{`){Pz{g>YI+CpftsF3s@Xv(~1%@(A`w&C7H$8iz^i7(V5D4a8K-d#+jNF zb)@nxB0y9wuW7Idu&+D}7d27%GihqQ?eh1QPlqyTN>7{Ng8ln3D^Y>eNcW~mib<7S zB(`m}TBOtftG$%mOJBI6=-yyk34HJ+HzfKZ7E-io@% zx91`-DfJHQ-JCgS&jb$2{1EEXCrJk@Z+juv?+G_w;4H=yFpX+4_7nFAikX7-8=v=S zyl|#LoiIavn?BIEfedQpY|G=~%U!YkSIelVdwgFNf|AY{QVDy;t1kUOH0Tp%sA*@v z^#TqSY(wbn&*C4aCgQB3?-|F(>*e_1SR5ulxRi9||21SVsD^AxRabn;BdI=hqq>WZ zZqz$Y9Q{w`b$NDp$ftHwH=@h>FLz_Z=3R)jox{{kS3uddnFQ|HNIM{6Ki}1L4UJgeN}`p8P;~@&nQ_5T5)%c=7|`$q$4l2Oy;4+BuM)pBS#X_5_8)oGoWR+f_{GvES_a>EthDjEmXL z-|h&6WwPlQ%TPVzc0JTJTw=2!oBy7}j1*00Woa77tIYJgHQ?a(cBLX+zg_j z;Ip-Pc!dm+C={K`uGHoq;qT*eV3htGjex;B#Acox20tI_mS}ur!4#9>=WJ&%sQwRS Wqc)J?x4$R=0000 + * ----------------------------------------------------------------------------- + * + * @type {Component} + * + * --- SLOTS: --- + * @slot item-field + * The template to use for each field. + * > Also note: + * > If this slot contains exactly one element with `role="focusable"` or + * > `focus-first`, that element will be focused automatically on add/remove. + * @param {Ref} item + * @param {Function} doSet + * @param {Array} allItems + * @param {Number} idx + * + * --- EVENTS EMITTED: --- + * @event input + * + * ----------------------------------------------------------------------------- + */ + +parasails.registerComponent('aceEditor', { + + // ╔═╗╦═╗╔═╗╔═╗╔═╗ + // ╠═╝╠╦╝║ ║╠═╝╚═╗ + // ╩ ╩╚═╚═╝╩ ╚═╝ + props: [ + 'value',// « 2-way (for v-model) + 'mode',// For customizing the type of editor + 'maxLines', + 'minLines', + ], + + // ╦╔╗╔╦╔╦╗╦╔═╗╦ ╔═╗╔╦╗╔═╗╔╦╗╔═╗ + // ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣ + // ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝ + data: function () { + return { + currentValue: undefined, //« will be initialized to a string in beforeMount + uniqueId: crypto.randomUUID(),// Used to create a unique ID for the ace editor component. + }; + }, + // ╦ ╦╔╦╗╔╦╗╦ + // ╠═╣ ║ ║║║║ + // ╩ ╩ ╩ ╩ ╩╩═╝ + template: ` +
+
{{value}}
+
+ `, + + // ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗ + // ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣ + // ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝ + beforeMount: function() { + if (this.value === undefined) { + this.currentValue = undefined; + } else { + this.currentValue = _.clone(this.value); + // ^^ The clone is to prevent entanglement risk. + } + if(this.mode){ + if(!['sh', 'fleet', 'powershell'].includes(this.mode)){ + throw new Error(`Invalid mode passed into component, currently, only 'sh' and 'fleet' are supported.`, this.mode); + } + } + }, + + mounted: async function () { + this._setUpAceEditor(this.mode); + }, + + beforeDestroy: function() { + + }, + + watch: { + + currentValue: function() { + this.currentValue = ace.edit('editor'+this.uniqueId).getValue(); + } + + }, + + // ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗ + // ║║║║ ║ ║╣ ╠╦╝╠═╣║ ║ ║║ ║║║║╚═╗ + // ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝ + methods: { + + // ╔═╗╦ ╦╔═╗╔╗╔╔╦╗ ╦ ╦╔═╗╔╗╔╔╦╗╦ ╔═╗╦═╗╔═╗ + // ║╣ ╚╗╔╝║╣ ║║║ ║ ╠═╣╠═╣║║║ ║║║ ║╣ ╠╦╝╚═╗ + // ╚═╝ ╚╝ ╚═╝╝╚╝ ╩ ╩ ╩╩ ╩╝╚╝═╩╝╩═╝╚═╝╩╚═╚═╝ + inputDefaultItemField: async function($event) { + var parsedValue = $event.target.value || undefined; + this.currentValue = parsedValue; + await this.forceRender(); + this._handleChangingFieldValues(); + }, + + + // ╔═╗╦ ╦╔╗ ╦ ╦╔═╗ ╔╦╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗╔═╗ + // ╠═╝║ ║╠╩╗║ ║║ ║║║║╣ ║ ╠═╣║ ║ ║║╚═╗ + // ╩ ╚═╝╚═╝╩═╝╩╚═╝ ╩ ╩╚═╝ ╩ ╩ ╩╚═╝═╩╝╚═╝ + + //… + + // ╔═╗╦═╗╦╦ ╦╔═╗╔╦╗╔═╗ ╔╦╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗╔═╗ + // ╠═╝╠╦╝║╚╗╔╝╠═╣ ║ ║╣ ║║║║╣ ║ ╠═╣║ ║ ║║╚═╗ + // ╩ ╩╚═╩ ╚╝ ╩ ╩ ╩ ╚═╝ ╩ ╩╚═╝ ╩ ╩ ╩╚═╝═╩╝╚═╝ + _getCurriedDoSetFn: function() { + return async (newVal)=>{ + // Note that it is the responsibility of the userland contents of the + // slot to make sure this incoming value is proper. For example, if + // the slot contains an ``, then when invoking doSet, you should + // do so like: + // ``` + // + // ``` + // + // The `||undefined` is because otherwise, you get `null`, and you + // probably want blank fields to be treated as undefined so we can + // automatically splice them out of the array before emitting our input + // event. + // + // The reason this is left as a userland concern is because the `null` + // value itself, just like `''`, `0`, `false`, `NaN` or other similar + // values, is technically a valid thing that might be relevant under + // unusual circumstances. + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // console.log('FIRED DOSET for idx',idx,'and newVal', newVal); + this.currentValue = newVal; + await this.forceRender(); + this._handleChangingFieldValues(); + }; + }, + + _handleChangingFieldValues: function() { + // > Note that we do a `_.clone()`. This is to prevent an entanglement + // > issue caused by emitting the same reference if we were to simply emit + // > `this.currentValue` directly. + this.$emit('input', _.clone(this.currentValue)); + // console.log('emitting in …', _.cloneDeep(this.currentValue)); + }, + + _setUpAceEditor: function(mode) { + var editor = ace.edit('editor'+ this.uniqueId); + ace.config.setModuleUrl('ace/mode/fleet', '/dependencies/src-min/mode-fleet.js'); + editor.setTheme('ace/theme/fleet'); + editor.session.setMode('ace/mode/'+mode); + editor.setOptions({ + minLines: this.minLines ? this.minLines : 4 , + maxLines: this.maxLines ? this.maxLines : 11 , + }); + }, + + } + +}); diff --git a/ee/bulk-operations-dashboard/assets/js/components/file-upload.component.js b/ee/bulk-operations-dashboard/assets/js/components/file-upload.component.js index d10816e7ab..ba8cad8077 100644 --- a/ee/bulk-operations-dashboard/assets/js/components/file-upload.component.js +++ b/ee/bulk-operations-dashboard/assets/js/components/file-upload.component.js @@ -76,6 +76,7 @@ parasails.registerComponent('fileUpload', { selectedFileMimeType: undefined, selectedFileIconClass: undefined, selectedFileSize: undefined, + uploadedFilename: undefined, }; }, @@ -141,6 +142,41 @@ parasails.registerComponent('fileUpload', { +
+
+
+
+ +
+

.pkg, .msi, .exe, or .deb

+
+ + +
+
+
+
+
+ +
+

{{selectedFileName}}

+

Windows

+

macOS

+

Linux

+
+
+
+
+
+
+ + +
+
`, @@ -187,6 +223,10 @@ parasails.registerComponent('fileUpload', { value: function(newFile, unusedOldVal) { this._absorbValue(newFile); }, + selectedFileName: function(newFileName) { + // Emit the update to the parent component + this.$emit('update:uploadedFilename', newFileName); + } }, // ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗ @@ -235,7 +275,6 @@ parasails.registerComponent('fileUpload', { // Emit an event so the v-model can update with our selected file. this.$emit('input', selectedFile); - }, // ╔═╗╦ ╦╔╗ ╦ ╦╔═╗ ╔╦╗╔═╗╔╦╗╦ ╦╔═╗╔╦╗╔═╗ diff --git a/ee/bulk-operations-dashboard/assets/js/pages/software/software.page.js b/ee/bulk-operations-dashboard/assets/js/pages/software/software.page.js new file mode 100644 index 0000000000..83d2950e4b --- /dev/null +++ b/ee/bulk-operations-dashboard/assets/js/pages/software/software.page.js @@ -0,0 +1,143 @@ +parasails.registerPage('software', { + // ╦╔╗╔╦╔╦╗╦╔═╗╦ ╔═╗╔╦╗╔═╗╔╦╗╔═╗ + // ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣ + // ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝ + data: { + sortDirection: 'ASC', + teamFilter: undefined, + softwareToDisplay: [], + platformFriendlyNames: { + 'darwin': 'macOS, iOS, ipadOS', + 'windows': 'Windows', + 'linux': 'Linux' + }, + selectedTeam: {}, + modal: '', + syncing: false, + formData: {}, + formErrors: {}, + addSoftwareFormRules: { + newSoftware: {required: true}, + }, + editSoftwareFormRules: {}, + profileToEdit: {}, + cloudError: '', + newSoftware: undefined, + showAdvancedOptions: false, + newSoftwareFilename: undefined, + + }, + + // ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗ + // ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣ + // ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝ + beforeMount: function() { + this.softwareToDisplay = this.software; + }, + mounted: async function() { + //… + }, + + // ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗ + // ║║║║ ║ ║╣ ╠╦╝╠═╣║ ║ ║║ ║║║║╚═╗ + // ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝ + methods: { + clickChangeSortDirection: async function() { + if(this.sortDirection === 'ASC') { + this.sortDirection = 'DESC'; + this.softwareToDisplay = _.sortByOrder(this.software, 'name', 'desc'); + } else { + this.sortDirection = 'ASC'; + this.softwareToDisplay = _.sortByOrder(this.software, 'name', 'asc'); + } + await this.forceRender(); + }, + clickDownloadSoftware: async function(software) { + if(!software.teams){ + window.open('/download-software?id='+encodeURIComponent(software.id)); + } else { + window.open('/download-software?fleetApid='+encodeURIComponent(software.teams[0].softwareFleetApid)+'&teamApid='+software.teams[0].fleetApid); + } + }, + clickOpenEditModal: async function(software) { + this.softwareToEdit = _.clone(software); + this.formData.newTeamIds = _.pluck(this.softwareToEdit.teams, 'fleetApid'); + this.formData.software = software; + this.formData.preInstallQuery = software.preInstallQuery; + this.formData.installScript = software.installScript; + this.formData.postInstallScript = software.postInstallScript; + this.formData.uninstallScript = software.uninstallScript; + this.modal = 'edit-software'; + }, + clickOpenDeleteModal: async function(software) { + this.formData.software = _.clone(software); + this.modal = 'delete-software'; + }, + clickOpenAddSoftwareModal: async function() { + this.modal = 'add-software'; + }, + changeTeamFilter: async function() { + if(this.teamFilter !== undefined){ + this.selectedTeam = _.find(this.teams, {fleetApid: this.teamFilter}); + let softwareOnThisTeam = _.filter(this.software, (software)=>{ + return _.where(software.teams, {'fleetApid': this.selectedTeam.fleetApid}).length > 0; + }); + this.softwareToDisplay = softwareOnThisTeam; + } else { + this.softwareToDisplay = this.software; + } + }, + submittedForm: async function() { + this.syncing = false; + this.closeModal(); + }, + closeModal: async function() { + this.modal = ''; + this.formErrors = {}; + this.formData = {}; + this.showAdvancedOptions = false; + await this.forceRender(); + }, + clickChangeTeamFilter: async function(teamApid) { + this.teamFilter = teamApid; + this.selectedTeam = _.find(this.teams, {'fleetApid': teamApid}); + let softwareOnThisTeam = _.filter(this.software, (software)=>{ + return _.where(software.teams, {'fleetApid': this.selectedTeam.fleetApid}).length > 0; + }); + this.softwareToDisplay = softwareOnThisTeam; + }, + handleSubmittingEditSoftwareForm: async function() { + let argins = _.clone(this.formData); + if(argins.newTeamIds === [undefined]){ + argins.newTeamIds = []; + } + await Cloud.editSoftware.with(argins); + if(!this.cloudError) { + this.syncing = false; + this.closeModal(); + await this._getSoftware(); + } + }, + handleSubmittingAddSoftwareForm: async function() { + let argins = _.clone(this.formData); + await Cloud.uploadSoftware.with({newSoftware: argins.newSoftware, teams: argins.teams}); + await this._getSoftware(); + }, + handleSubmittingDeleteSoftwareForm: async function() { + let argins = _.clone(this.formData); + await Cloud.deleteSoftware.with({software: argins.software}); + if(!this.cloudError) { + this.syncing = false; + this.closeModal(); + await this._getSoftware(); + } + }, + _getSoftware: async function() { + this.syncing = true; + let newSoftwareInformation = await Cloud.getSoftware(); + this.software = newSoftwareInformation; + this.syncing = false; + await this.changeTeamFilter(); + } + } +}); diff --git a/ee/bulk-operations-dashboard/assets/styles/components/file-upload.component.less b/ee/bulk-operations-dashboard/assets/styles/components/file-upload.component.less index d2ab275134..96a441da5f 100644 --- a/ee/bulk-operations-dashboard/assets/styles/components/file-upload.component.less +++ b/ee/bulk-operations-dashboard/assets/styles/components/file-upload.component.less @@ -30,7 +30,6 @@ } } - &.file-mode { .btn-and-tips-if-relevant { display: inline-block; diff --git a/ee/bulk-operations-dashboard/assets/styles/importer.less b/ee/bulk-operations-dashboard/assets/styles/importer.less index 2b812422ff..1129e9e617 100644 --- a/ee/bulk-operations-dashboard/assets/styles/importer.less +++ b/ee/bulk-operations-dashboard/assets/styles/importer.less @@ -27,6 +27,7 @@ // Per-page styles @import 'pages/scripts.less'; @import 'pages/profiles.less'; +@import 'pages/software/software.less'; @import 'pages/entrance/confirmed-email.less'; @import 'pages/entrance/login.less'; @import 'pages/entrance/forgot-password.less'; diff --git a/ee/bulk-operations-dashboard/assets/styles/pages/software/software.less b/ee/bulk-operations-dashboard/assets/styles/pages/software/software.less new file mode 100644 index 0000000000..3c0d09ca0b --- /dev/null +++ b/ee/bulk-operations-dashboard/assets/styles/pages/software/software.less @@ -0,0 +1,271 @@ +#software { + + [purpose='page-content'] { + padding: 24px 32px 64px 32px; + } + p { + margin-block-end: 0px; + font-size: 14px; + line-height: 150%; + } + small { + font-size: 12px; + line-height: 150%; + } + a { + color: @core-vibrant-blue; + font-weight: 700; + border-bottom: none; + } + .table td { + font-size: 14px; + line-height: 150%; + a { + cursor: pointer; + display: block; + } + } + .table thead th { + border-top: none; + border-bottom: none; + border-right: 1px solid #e2e4ea; + vertical-align: middle; + } + th.sortable { + cursor: pointer; + } + .table th, .table td { + padding: 0.5rem 1rem; + white-space: nowrap; + } + .table thead { + tr:first-child { + th { + border-top: none; + background-color: rgba(0, 43, 128, 0.0235294); + border-right: none; + } + th:first-child { + border-top-left-radius: 8px; + } + th:last-child { + border-top-right-radius: 8px; + } + } + } + .table tbody { + color: #515774; + border-radius: 8px; + td { + max-height: 48px; + height: 48px; + padding-left: 16px; + padding-right: 16px; + border-top: 1px solid @border-lt-gray; + position: relative; + } + tr { + td:last-child { + border-right: none; + } + } + tr:last-child { + td:first-child { + border-bottom-left-radius: 8px; + } + td:last-child { + border-bottom-right-radius: 8px; + } + } + } + .sort-arrows { + height: 14px; + padding-left: 0.5rem; + display: inline-flex; + flex-direction: column; + justify-content: space-between; + span { + display: flex; + align-items: center; + gap: 3px; + } + .ascending-arrow { + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 6px solid #c5c7d1; + } + .descending-arrow { + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 6px solid #c5c7d1; + } + } + .ascending .ascending-arrow { + border-bottom-color: #6a67fe; + } + .descending .descending-arrow { + border-top-color: #6a67fe; + } + .table td { + white-space: nowrap; + vertical-align: middle; + } + + .affected-teams-link { + color: #515774; + cursor: pointer; + font-weight: 400; + } + .truncated-affected-teams { + color: @core-vibrant-blue; + cursor: pointer; + position: relative; + font-weight: 400; + .teams-tooltip { + display: none; + } + } + .truncated-affected-teams:hover { + text-decoration: underline; + .teams-tooltip { + z-index: 3; + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + padding: 6px; + width: 250px; + background: #515774; + border-radius: 4px; + position: absolute; + top: 15px; + left: -30px; + color: #FFF; + p { + white-space: normal; + margin-bottom: 4px; + cursor: pointer; + color: #FFF; + &:hover { + text-decoration: underline; + } + } + } + } + + .pointer { + cursor: pointer; + } + .advanced-options-btn { + color: #6A67FE; + font-family: Inter; + font-size: 14px; + font-weight: 700; + line-height: 21px; + cursor: pointer; + img { + height: 16px; + } + } + .rotate { + transform: rotate(180deg); + } + [purpose='software-upload-input'] { + display: flex; + padding: 32px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 16px; + align-self: stretch; + border-radius: 4px; + border: 1px solid #E2E4EA; + background: #F9FAFC; + } + [parasails-component='file-upload'] { + &.is-invalid { + border: 1px solid #dc3545; + } + } + .is-invalid ~ .invalid-feedback { + display: block; + } + + [purpose='software-information'] { + [purpose='edited-software-information'] { + width: 100%; + } + display: flex; + // flex-direction: column; + // justify-content: center; + // align-items: start; + align-items: center; + gap: 16px; + position: relative; + border-radius: 4px; + padding: 16px 24px; + height: 72px; + border: 1px solid #E2E4EA; + background: #F9FAFC; + margin-bottom: 24px; + img { + margin-right: 16px; + } + [purpose='edit-upload-btn'] { + position: absolute; + right: 24px; + bottom: 28%; + } + [purpose='file-selected-edit-upload-btn'] { + position: absolute; + right: -144px; + bottom: 28%; + } + } + [purpose='teams-picker'] { + padding: 16px 24px; + gap: 8px; + border-radius: 4px; + border: 1px solid #E2E4EA; + background: #F9FAFC; + margin-bottom: 24px; + &.is-invalid { + border: 1px solid #dc3545; + } + } + [purpose='delete-button'] { + border-radius: 6px; + background: #D66C7B; + border-color: #D66C7B; + color: #FFF; + } + [purpose='file-upload'] { + color: @core-vibrant-blue; + display: flex; + font-weight: 700; + font-size: 14px; + line-height: 150%; + margin-top: 24px; + cursor: pointer; + img { + margin-right: 8px; + } + } + [purpose='modal-button'] { + border-radius: 6px; + background: #6A67FE; + color: #FFF; + border-color: #6A67FE; + } + [purpose='modal-buttons'] { + [purpose='cancel-button'] { + color: @core-vibrant-blue; + margin-right: 16px; + cursor: pointer; + } + } +} diff --git a/ee/bulk-operations-dashboard/config/env/production.js b/ee/bulk-operations-dashboard/config/env/production.js index 8d28a4d013..64f152a19c 100644 --- a/ee/bulk-operations-dashboard/config/env/production.js +++ b/ee/bulk-operations-dashboard/config/env/production.js @@ -190,9 +190,9 @@ module.exports = { ***************************************************************************/ adapter: '@sailshq/connect-redis', url: process.env.REDIS_TLS_URL, - tls: { - rejectUnauthorized: false - }, + // tls: { + // rejectUnauthorized: false + // }, //-------------------------------------------------------------------------- // /\ OR, to avoid checking it in to version control, you might opt to // || set sensitive credentials like this using an environment variable. @@ -414,6 +414,10 @@ module.exports = { }, + uploads: { + adapter: require('skipper-s3'), + } + }; diff --git a/ee/bulk-operations-dashboard/config/routes.js b/ee/bulk-operations-dashboard/config/routes.js index 0b106dc6f1..c9991d774a 100644 --- a/ee/bulk-operations-dashboard/config/routes.js +++ b/ee/bulk-operations-dashboard/config/routes.js @@ -15,7 +15,7 @@ module.exports.routes = { // ╚╩╝╚═╝╚═╝╩ ╩ ╩╚═╝╚═╝╚═╝ 'GET /profiles': { action: 'profiles/view-profiles' }, 'GET /scripts': { action: 'scripts/view-scripts' }, - + 'GET /software': { action: 'software/view-software' }, 'GET /email/confirm': { action: 'entrance/confirm-email' }, 'GET /email/confirmed': { action: 'entrance/view-confirmed-email' }, @@ -62,4 +62,9 @@ module.exports.routes = { 'GET /download-script': { action: 'scripts/download-script' }, 'POST /api/v1/upload-script': { action: 'scripts/upload-script' }, 'POST /api/v1/edit-script': { action: 'scripts/edit-script' }, + 'GET /api/v1/get-software': { action: 'get-software' }, + 'GET /download-software': { action: 'software/download-software' }, + 'POST /api/v1/software/delete-software': { action: 'software/delete-software' }, + 'POST /api/v1/software/edit-software': { action: 'software/edit-software' }, + 'POST /api/v1/software/upload-software': { action: 'software/upload-software' }, }; diff --git a/ee/bulk-operations-dashboard/package.json b/ee/bulk-operations-dashboard/package.json index 01df4711c4..b19e2f9a18 100644 --- a/ee/bulk-operations-dashboard/package.json +++ b/ee/bulk-operations-dashboard/package.json @@ -8,13 +8,15 @@ "@sailshq/connect-redis": "^6.1.3", "@sailshq/lodash": "^3.10.6", "@sailshq/socket.io-redis": "^6.1.2", + "axios": "1.7.7", "sails": "^1.5.11", "sails-hook-apianalytics": "^2.0.6", "sails-hook-organics": "^2.2.2", "sails-hook-orm": "^4.0.3", "sails-hook-sockets": "^3.0.0", "sails-hook-uploads": "^0.4.3", - "sails-postgresql": "^5.0.1" + "sails-postgresql": "^5.0.1", + "skipper-s3": "^0.6.0" }, "devDependencies": { "eslint": "5.16.0", diff --git a/ee/bulk-operations-dashboard/scripts/test-file-upload.js b/ee/bulk-operations-dashboard/scripts/test-file-upload.js new file mode 100644 index 0000000000..7b3a0f157a --- /dev/null +++ b/ee/bulk-operations-dashboard/scripts/test-file-upload.js @@ -0,0 +1,464 @@ +module.exports = { + + + friendlyName: 'Test file transfers', + + + description: '', + + + fn: async function () { + var WritableStream = require('stream').Writable; + let { Readable } = require('stream'); + let axios = require('axios'); + + sails.log('copying file Fleet instance » Fleet instance (other team)'); + let softwareApiUrl = `${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/titles/7/package?alt=media&team_id=2`; + await sails.cp(softwareApiUrl, { + adapter: () => { + return { + ls: undefined, + rm: undefined, + receive: undefined, + read: (softwareApiUrl) => { + // Create a readable stream + const readable = new Readable({ + read() { + // Empty _read method; we'll handle data pushing with events below + } + }); + + // Now we'll fetch the data asynchronously and pipe it into the readable stream + (async () => { + try { + const streamResponse = await axios({ + url: softwareApiUrl, + method: 'GET', + responseType: 'stream', + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + }, + }); + + console.log('Received stream from API, piping data...'); + + // Pipe data from the response stream into the readable stream + streamResponse.data.on('data', (chunk) => { + const canContinue = readable.push(chunk); + if (!canContinue) { + streamResponse.data.pause(); // Pause if we can't push more data + } + }); + + // Resume the stream when readable is ready + readable.on('drain', () => { + streamResponse.data.resume(); + }); + + // When the source stream ends, we signal end of the readable stream + streamResponse.data.on('end', () => { + readable.push(null); // Signal end of stream + }); + + // Handle any errors from the source stream + streamResponse.data.on('error', (err) => { + readable.emit('error', err); // Propagate the error to the readable stream + }); + + } catch (error) { + console.error('Error during read operation:', error); + readable.emit('error', new Error('Failed to download file: ' + error.message)); + } + })(); + + return readable; + }, + }; + }, + }, + { + adapter: ()=>{ + return { + ls: undefined, + rm: undefined, + read: undefined, + receive: (unusedOpts)=>{ + // This `_write` method is invoked each time a new file is received + // from the Readable stream (Upstream) which is pumping filestreams + // into this receiver. (filename === `__newFile.filename`). + var receiver__ = WritableStream({ objectMode: true }); + // Create a new drain (writable stream) to send through the individual bytes of this file. + receiver__._write = (__newFile, encoding, doneWithThisFile)=>{ + let axios = require('axios'); + let FormData = require('form-data'); + let form = new FormData(); + form.append('team_id', 0); + form.append('software', __newFile, { + filename: 'test.exe', + contentType: 'application/octet-stream' + }); + (async ()=>{ + try { + await axios.post(`${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/package`, form, { + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + ...form.getHeaders() + }, + }); + } catch(error){ + throw new Error('Failed to upload file:'+ require('util').inspect(error, {depth: null})); + } + })() + .then(()=>{ + console.log('ok supposedly a file is finished uploading'); + doneWithThisFile(); + }) + .catch((err)=>{ + doneWithThisFile(err); + }); + };//ƒ + return receiver__; + } + }; + }, + }); + + let software = await UndeployedSoftware.find(); + let uploadedSoftware = software[0]; + sails.log(`Uploading file S3 » Fleet instance`); + await sails.cp(uploadedSoftware.fd, {}, { + adapter: ()=>{ + return { + ls: undefined, + rm: undefined, + read: undefined, + receive: (unusedOpts)=>{ + // This `_write` method is invoked each time a new file is received + // from the Readable stream (Upstream) which is pumping filestreams + // into this receiver. (filename === `__newFile.filename`). + var receiver__ = WritableStream({ objectMode: true }); + // Create a new drain (writable stream) to send through the individual bytes of this file. + receiver__._write = (__newFile, encoding, doneWithThisFile)=>{ + let axios = require('axios'); + let FormData = require('form-data'); + let form = new FormData(); + form.append('team_id', 0); + form.append('software', __newFile, { + filename: uploadedSoftware.filename, + contentType: 'application/octet-stream' + }); + (async ()=>{ + try { + await axios.post(`${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/package`, form, { + headers: { + Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + ...form.getHeaders() + }, + }); + } catch(error){ + throw new Error('Failed to upload file:'+ require('util').inspect(error, {depth: null})); + } + })() + .then(()=>{ + console.log('ok supposedly a file is finished uploading'); + doneWithThisFile(); + }) + .catch((err)=>{ + doneWithThisFile(err); + }); + };//ƒ + return receiver__; + } + }; + } + }); + + + + + // Uses both things + // await sails.cp(uploadedFile.fd, { + // adapter: ()=>{ + // return { + // ls: undefined, + // rm: undefined, + // receive: undefined, + // read: (dowloadApiUrl) => { + // let stream = new require('stream').PassThrough(); // Create a PassThrough stream (readable) + + // (async () => { + // try { + // let response = await sails.helpers.http.getStream.with({ + // url: dowloadApiUrl, + // headers: { + // Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + // }, + // }); + + // if (response && typeof response.pipe === 'function') { + // console.log('piping this response') + // response.pipe(stream); // Pipe the response stream to the PassThrough stream + // } else { + // // stream.emit('error', new Error('No valid stream returned from the API.')); + // } + // } catch (error) { + // throw new Error(error); + // // stream.emit('error', new Error('Failed to download file: ' + require('util').inspect(error, { depth: null }))); + // } + // })(); + + // return stream; // Return the PassThrough readable stream immediately to `sails.cp()` + // } + // } + // }, + // }, + // { + // adapter: ()=>{ + // return { + // ls: undefined, + // rm: undefined, + // read: undefined, + // receive: (unusedOpts)=>{ + // // This `_write` method is invoked each time a new file is received + // // from the Readable stream (Upstream) which is pumping filestreams + // // into this receiver. (filename === `__newFile.filename`). + // var receiver__ = new WritableStream({ objectMode: true }); + // // Create a new drain (writable stream) to send through the individual bytes of this file. + // receiver__._write = (__newFile, encoding, doneWithThisFile)=>{ + // let axios = require('axios'); + // let FormData = require('form-data'); + // let form = new FormData(); + // form.append('team_id', team); + // form.append('software', __newFile, { + // filename: software.name, + // contentType: 'application/octet-stream' + // }); + // (async ()=>{ + // try { + // await axios.post(`${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/package`, form, { + // headers: { + // Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + // ...form.getHeaders() + // }, + // }) + // } catch(error){ + // throw new Error('Failed to upload file:'+ require('util').inspect(error, {depth: null})); + // } + // })() + // .then(()=>{ + // console.log('ok supposedly a file is finished uploading'); + // doneWithThisFile(); + // }) + // .catch((err)=>{ + // doneWithThisFile(err); + // }); + // };//ƒ + // return receiver__; + // } + // } + // }, + // }); + + + // await sails.cp(softwareApiUrl, { + // adapter: ()=>{ + // return { + // ls: undefined, + // rm: undefined, + // receive: undefined, + // read: (softwareApiUrl) => { + // (async ()=>{ + // try { + // return await sails.helpers.http.getStream.with({ + // url: softwareApiUrl, + // headers: { + // Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + // }, + // }); + // } catch(error){ + // throw new Error('Failed to download file:'+ require('util').inspect(error, {depth: null})); + // } + // })() + // .then(()=>{ + // console.log('ok supposedly a file is finished downloading'); + // }) + // .catch((err)=>{ + // throw new Error(err) + // }); + // }, + // } + // }, + // }, + // { + // adapter: ()=>{ + // return { + // ls: undefined, + // rm: undefined, + // read: undefined, + // receive: (unusedOpts)=>{ + // // This `_write` method is invoked each time a new file is received + // // from the Readable stream (Upstream) which is pumping filestreams + // // into this receiver. (filename === `__newFile.filename`). + // var receiver__ = WritableStream({ objectMode: true }); + // // Create a new drain (writable stream) to send through the individual bytes of this file. + // receiver__._write = (__newFile, encoding, doneWithThisFile)=>{ + // let axios = require('axios'); + // let FormData = require('form-data'); + // let form = new FormData(); + // form.append('team_id', 0); + // form.append('software', __newFile, { + // filename: 'test.exe', + // contentType: 'application/octet-stream' + // }); + // (async ()=>{ + // try { + // await axios.post(`${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/package`, form, { + // headers: { + // Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + // ...form.getHeaders() + // }, + // }) + // } catch(error){ + // throw new Error('Failed to upload file:'+ require('util').inspect(error, {depth: null})); + // } + // })() + // .then(()=>{ + // console.log('ok supposedly a file is finished uploading'); + // doneWithThisFile(); + // }) + // .catch((err)=>{ + // doneWithThisFile(err); + // }); + // };//ƒ + // return receiver__; + // } + // } + // }, + // }); + + + + + + // // from Fleet instance to s3: + // let fi = await sails.cp(softwareApiUrl, { + // adapter: ()=>{ + // return { + // ls: undefined, + // rm: undefined, + // read: (softwareApiUrl) => { + // // Create a Readable stream + // let readableStream = new Readable({ + // read(size) { + // // Make an async call to get data from the software API + // (async () => { + // try { + // let response = await axios.get(softwareApiUrl, { + // responseType: 'stream', // Ensure the response is a stream + // headers: { + // Authorization: `Bearer ${sails.config.custom.fleetApiToken}` + // } + // }); + + // // Pipe the response data into this stream + // response.data.on('data', (chunk) => { + // this.push(chunk); // Push each chunk into the readable stream + // }); + + // response.data.on('end', () => { + // this.push(null); // Signal end of stream + // }); + + // } catch (error) { + // } + // })(); + // } + // }); + + // return readableStream; // Return the readable stream + // }, + // } + // }, + // }) + // console.log(fi); + + + // let downloading = await sails.helpers.http.getStream.with({ + // url: `${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/titles/4/package?alt=media&team_id=3`, + // headers: { + // Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + // }, + // }); + // await sails.upload(downloading, { + // adapter: ()=>{ + // return { + // ls: undefined, + // rm: undefined, + // read: undefined, + // receive: (unusedOpts)=>{ + // // This `_write` method is invoked each time a new file is received + // // from the Readable stream (Upstream) which is pumping filestreams + // // into this receiver. (filename === `__newFile.filename`). + // var receiver__ = WritableStream({ objectMode: true }); + // // Create a new drain (writable stream) to send through the individual bytes of this file. + // receiver__._write = (__newFile, encoding, doneWithThisFile)=>{ + // // var newFileDrain__ = fsx.createWriteStream(`${sails.config.appPath}/assets/foobar.fake`, encoding); + // let axios = require('axios'); + // let FormData = require('form-data'); + // let form = new FormData(); + // form.append('team_id', 1); + // form.append('software', __newFile, { + // filename: 'foo.exe', + // contentType: 'application/octet-stream' + // }); + + // (async ()=>{ + // try { + + // // await sails.helpers.http.sendHttpRequest.with({ + // // method: 'POST', + // // baseUrl: sails.config.custom.fleetBaseUrl, + // // url: `/api/v1/fleet/software/package?team_id=2`, + // // enctype: 'multipart/form-data', + // // body: form, + // // headers: { + // // Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + // // ...form.getHeaders() + // // }, + // // }); + // await axios.post(`${sails.config.custom.fleetBaseUrl}/api/v1/fleet/software/package`, form, { + // headers: { + // Authorization: `Bearer ${sails.config.custom.fleetApiToken}`, + // ...form.getHeaders() + // }, + // }) + // } catch(error){ + // throw new Error('Failed to upload file:'+ require('util').inspect(error, {depth: null})); + // } + // })() + // .then(()=>{ + // console.log('ok supposedly a file is finished uploading'); + // doneWithThisFile(); + // // newFileDrain__.on('finish', ()=>{ + // // receiver__.emit('writefile', __newFile);// Indicate that a file was persisted. + // // console.log('ok supposedly a file is finished uploading'); + // // doneWithThisFile(); + // // }); + // // __newFile.pipe(newFileDrain__); + // }) + // .catch((err)=>{ + // doneWithThisFile(err); + // }); + + // };//ƒ + + // return receiver__; + // } + // } + // } + // }); + + // console.log('ok supposedly everything is now uploaded'); + } +}; + diff --git a/ee/bulk-operations-dashboard/views/layouts/layout.ejs b/ee/bulk-operations-dashboard/views/layouts/layout.ejs index 462cf4f582..f9b2c68b8b 100644 --- a/ee/bulk-operations-dashboard/views/layouts/layout.ejs +++ b/ee/bulk-operations-dashboard/views/layouts/layout.ejs @@ -55,6 +55,7 @@ Configuration profiles Scripts + Software <% if(me) { %> Sign out <% } else { %> @@ -125,12 +126,21 @@ + + + + + + + + + @@ -157,6 +167,7 @@ + <% /* Display an overlay if the current browser is not supported. diff --git a/ee/bulk-operations-dashboard/views/pages/software/software.ejs b/ee/bulk-operations-dashboard/views/pages/software/software.ejs new file mode 100644 index 0000000000..a4282aae04 --- /dev/null +++ b/ee/bulk-operations-dashboard/views/pages/software/software.ejs @@ -0,0 +1,200 @@ +
+
+
+
+
+

Software

+
+
+

Team:

+ +
+
+
+
+
+

Software

+
+
+

+ Add software

+
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+ Name +
+ + +
+
+
+ Platform + + Team + + Upload date +
{{software.name}}{{software.platform}} + + + {{software.teams.length}} teams +
+

{{team.teamName}}

+
+
+ + {{software.teams[0].teamName}} + +
+ --- +
+ + +
+ download + edit + delete +
+
+
+
+

No software matching the selected filters were found.

+
+
+ +
+
+

Edit software

+
×
+
+ +
+
+
+ macOs and Linux software +
+

{{softwareToEdit.name}}

+

{{newSoftwareFilename}}

+

{{softwareToEdit.platform}}

+
+
+ +
+
+ Advanced options chevron +
+
+

Pre-install query

+ +

Software will be installed only if the query returns results external link

+
+
+

Install script

+ +

Use the $INSTALLER_PATH variable to point to the installer. Currently, Shell scripts are supported.

+
+
+

Install script

+ +

Use the $INSTALLER_PATH variable to point to the installer. Currently, Powershell scripts are supported.

+
+
+

Post-install script

+ +

Currently, Shell scripts are supported.

+
+
+

Post-install script

+ +

Currently, Powershell scripts are supported.

+
+
+

Uninstall script

+ +

Currently, Shell scripts are supported.

+
+
+

Uninstall script

+ +

Currently, Powershell scripts are supported.

+
+
+
+

Teams

+ +
+ {{cloudError.responseInfo.body}} + +
+ Save +
+
+
+
+ <%// ╔╦╗╔═╗╦ ╔═╗╔╦╗╔═╗ + // ║║║╣ ║ ║╣ ║ ║╣ + // ═╩╝╚═╝╩═╝╚═╝ ╩ ╚═╝ %> + +
+

Delete software

+
×
+
+

{{formData.software.name}} will be removed from your library.

+ + +
+ Cancel + Delete +
+
+
+ <%// ╔═╗╔╦╗╔╦╗ + // ╠═╣ ║║ ║║ + // ╩ ╩═╩╝═╩╝ %> + +
+
+

Add software

+
×
+
+ + +
Please upload a new software.
+
+

Teams

+ +
+
Please select the teams you want to deploy this software to.
+ A software with the same name as the uploaded software already exists on one or more of the selected teams. + +
+ Cancel + Add +
+
+
+
+
+<%- /* Expose server-rendered data as window.SAILS_LOCALS :: */ exposeLocalsToBrowser() %>