diff --git a/frontend/index.html b/frontend/index.html index d55fb77..fe0bca0 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -75,42 +75,6 @@ - - - - - This server is not configured with either OAuth, or local users, so you cannot login. - - - OAuth Login - - - - - - Local Login - - - - Username: - - - - - - Password: - - - - - Login - - - - - - - diff --git a/frontend/js/OutputTerminal.js b/frontend/js/OutputTerminal.js index f88a9cc..7bd31a3 100644 --- a/frontend/js/OutputTerminal.js +++ b/frontend/js/OutputTerminal.js @@ -66,6 +66,10 @@ export class OutputTerminal { this.terminal.open(el) } + close () { + this.terminal.dispose() + } + resize (cols, rows) { this.terminal.resize(cols, rows) } diff --git a/frontend/js/marshaller.js b/frontend/js/marshaller.js index 5c375e6..f3b94a0 100644 --- a/frontend/js/marshaller.js +++ b/frontend/js/marshaller.js @@ -1,117 +1,14 @@ -function checkAndTriggerActionFromQueryParam () { - const params = getQueryParams() - - const action = params.get('action') - if (action && window.actionButtons) { - // Look for an action button with matching title - const actionButton = window.actionButtons[action] - - if (actionButton) { - // Only trigger actions that have arguments - const jsonButton = window.actionButtonsJson[action] - if (jsonButton && jsonButton.arguments && jsonButton.arguments.length > 0) { - // Trigger the action button click - setTimeout(() => { - actionButton.btn.click() - }, 500) // Small delay to ensure UI is fully loaded - return true - } - } - } - return false -} - -function createElement (tag, attributes) { - const el = document.createElement(tag) - - if (attributes !== null) { - if (attributes.classNames !== undefined) { - el.classList.add(...attributes.classNames) - } - - if (attributes.innerText !== undefined) { - el.innerText = attributes.innerText - } - } - - return el -} - -function createTag (val) { - const domTag = createElement('span', { - innerText: val, - classNames: ['tag'] - }) - - return domTag -} - -function createAnnotation (key, val) { - const domAnnotation = createElement('span', { - classNames: ['annotation'] - }) - - domAnnotation.appendChild(createElement('span', { - innerText: key, - classNames: ['annotation-key'] - })) - - domAnnotation.appendChild(createElement('span', { - innerText: val, - classNames: ['annotation-value'] - })) - - return domAnnotation -} - /** * This is a weird function that just sets some globals. */ export function initMarshaller () { window.logEntries = new Map() - window.addEventListener('EventExecutionStarted', onExecutionStarted) window.addEventListener('EventExecutionFinished', onExecutionFinished) window.addEventListener('EventOutputChunk', onOutputChunk) } -function setUsername (username, provider) { - document.getElementById('username').innerText = username - document.getElementById('username').setAttribute('title', provider) - - if (window.settings.AuthLocalLogin || window.settings.AuthOAuth2Providers !== null) { - if (username === 'guest') { - document.getElementById('link-login').hidden = false - document.getElementById('link-logout').hidden = true - } else { - document.getElementById('link-login').hidden = true - - if (provider === 'local' || provider === 'oauth2') { - document.getElementById('link-logout').hidden = false - } - } - } -} - -export function marshalDashboardComponentsJsonToHtml (json) { - if (json == null) { // eg: HTTP 403 - setUsername('guest', 'system') - - if (window.settings.AuthLoginUrl !== '') { - window.location = window.settings.AuthLoginUrl - } else { - showSection('/login') - } - } else { - setUsername(json.authenticatedUser, json.authenticatedUserProvider) - - marshalDashboardStructureToHtml(json) - } - - document.body.setAttribute('initial-marshal-complete', 'true') -} - function onOutputChunk (evt) { const chunk = evt.payload @@ -172,319 +69,3 @@ function onExecutionFinished (evt) { }) } } - -function convertPathToBreadcrumb (path) { - const parts = path.split('/') - - const result = [] - - for (let i = 0; i < parts.length; i++) { - if (parts[i] === '') { - continue - } - - result.push(parts.slice(0, i + 1).join('/')) - } - - return result -} - -function showExecutionResult (pathName) { - const executionTrackingId = pathName.split('/')[2] - window.executionDialog.fetchExecutionResult(executionTrackingId) - window.executionDialog.show() -} - -function setSectionNavigationVisible (visible) { - const nav = document.querySelector('nav') - const btn = document.getElementById('sidebar-toggler-button') - - nav.removeAttribute('hidden') - - if (document.body.classList.contains('has-sidebar')) { - if (visible) { - btn.setAttribute('aria-pressed', false) - btn.setAttribute('aria-label', 'Open sidebar navigation') - btn.innerHTML = '«' - - nav.classList.add('shown') - } else { - btn.setAttribute('aria-pressed', true) - btn.setAttribute('aria-label', 'Close sidebar navigation') - btn.innerHTML = '☰' - - nav.classList.remove('shown') - } - } else { - btn.disabled = true - } -} - -export function setupSectionNavigation (style) { - const nav = document.querySelector('nav') - const btn = document.getElementById('sidebar-toggler-button') - - if (style === 'sidebar') { - nav.classList.add('sidebar') - - document.body.classList.add('has-sidebar') - - btn.onclick = () => { - if (nav.classList.contains('shown')) { - setSectionNavigationVisible(false) - } else { - setSectionNavigationVisible(true) - } - } - } else { - nav.classList.add('topbar') - - document.body.classList.add('has-topbar') - } -} - -function marshalSingleDashboard (dashboard, nav) { - const oldsection = document.querySelector('section[title="' + getSystemTitle(dashboard.title) + '"]') - - if (oldsection != null) { - oldsection.remove() - } - - const section = document.createElement('section') - section.setAttribute('system-title', getSystemTitle(dashboard.title)) - section.title = section.getAttribute('system-title') - - const def = createFieldset('default', section) - section.appendChild(def) - - document.getElementsByTagName('main')[0].appendChild(section) - marshalContainerContents(dashboard, section, def, dashboard.title) - - const oldLi = nav.querySelector('li[title="' + dashboard.title + '"]') - - if (oldLi != null) { - oldLi.remove() - } - - const systemTitleUrl = '/' + getSystemTitle(dashboard.title) - - window.navbar.createLink(dashboard.title, systemTitleUrl, false) - -} - -function marshalDashboardStructureToHtml (json) { - return - const nav = document.getElementById('navigation-links') - - for (const dashboard of json.dashboards) { - marshalSingleDashboard(dashboard, nav) - } - - const rootGroup = document.querySelector('#root-group') - - for (const btn of Object.values(window.actionButtons)) { - if (btn.parentElement === null) { - rootGroup.appendChild(btn) - } - } - - const shouldHideActions = rootGroup.querySelectorAll('action-button').length === 0 && json.dashboards.length > 0 - - if (shouldHideActions) { - nav.querySelector('li[title="Actions"]').style.display = 'none' - } - - if (window.currentPath !== '') { - showSection(window.currentPath) - } else if (window.location.pathname !== '/' && document.body.getAttribute('initial-marshal-complete') === null) { - showSection(window.location.pathname) - } else { - if (shouldHideActions) { - showSection('/' + getSystemTitle(json.dashboards[0].title)) - } else { - showSection('/') - } - } -} - -function marshalLink (item, fieldset) { - return - let btn = window.actionButtons[item.title] - - if (typeof btn === 'undefined') { - btn = document.createElement('button') - btn.innerText = 'Action not found: ' + item.title - btn.classList.add('error') - } - - if (item.cssClass !== '') { - btn.classList.add(item.cssClass) - } - - fieldset.appendChild(btn) -} - -function marshalMreOutput (dashboardComponent, fieldset) { - const pre = document.createElement('pre') - pre.classList.add('mre-output') - pre.innerHTML = 'Waiting...' - - const args = { - actionId: dashboardComponent.title - } - - try { - const status = window.client.executionStatus(args) - - updateMre(pre, status.logEntry) - } catch (err) { - pre.innerHTML = 'error' - - throw new Error(res.statusText) - } - - const updateMre = (pre, json) => { - pre.innerHTML = json.output - } - - window.addEventListener('ExecutionFinished', (e) => { - // The dashboard component "title" field is used for lots of things - // and in this context for MreOutput it's just to refer an an actionId. - // - // So this is not a typo. - if (e.payload.actionId === dashboardComponent.title) { - updateMre(pre, e.payload) - } - }) - - fieldset.appendChild(pre) -} - -function marshalContainerContents (json, section, fieldset, parentDashboard) { - for (const item of json.contents) { - switch (item.type) { - case 'fieldset': - marshalFieldset(item, section, parentDashboard) - break - case 'directory': { - const directoryPath = marshalDirectory(item, section) - marshalDirectoryButton(item, fieldset, directoryPath) - } - break - case 'display': - marshalDisplay(item, fieldset) - break - case 'stdout-most-recent-execution': - marshalMreOutput(item, fieldset) - break - case 'link': - marshalLink(item, fieldset) - break - default: - } - } -} - -function createFieldset (title, parentDashboard) { - const legend = document.createElement('legend') - legend.innerText = title - - const fs = document.createElement('fieldset') - fs.title = title - fs.appendChild(legend) - - if (typeof parentDashboard === 'undefined') { - fs.setAttribute('parent-dashboard', '') - } else { - fs.setAttribute('parent-dashboard', parentDashboard) - } - - return fs -} - -function marshalFieldset (item, section, parentDashboard) { - const fs = createFieldset(item.title, parentDashboard) - - marshalContainerContents(item, section, fs, parentDashboard) - - section.appendChild(fs) -} - -function createNavigationBreadcrumbDisplay (path) { - const a = document.createElement('a') - a.href = 'javascript:void(0)' - - if (path.view === null) { - a.title = path.section - a.innerText = path.section - } else { - a.innerText = path.view - a.title = path.view - } - - a.onclick = () => { - showSectionView(path.view) - } - - return a -} - -function marshalDisplay (item, fieldset) { - const display = document.createElement('div') - display.innerHTML = item.title - display.classList.add('display') - - if (item.cssClass !== '') { - display.classList.add(item.cssClass) - } - - fieldset.appendChild(display) -} - -function marshalDirectoryButton (item, fieldset, path) { - const directoryButton = document.createElement('button') - directoryButton.innerHTML = '' + item.icon + ' ' + item.title - directoryButton.onclick = () => { - showSection(path) - } - - fieldset.appendChild(directoryButton) -} - -function marshalDirectory (item, section) { - const fs = createFieldset(item.title) - fs.style.display = 'none' - - const directoryBackButton = document.createElement('button') - directoryBackButton.innerHTML = window.settings.DefaultIconForBack - directoryBackButton.title = 'Go back one directory' - directoryBackButton.onclick = () => { - showSection('/' + section.title) - } - - fs.appendChild(directoryBackButton) - - marshalContainerContents(item, section, fs) - - section.appendChild(fs) - - const path = '/' + section.title + '/' + getSystemTitle(item.title) - - return path -} - -export function refreshServerConnectionLabel () { - if (window.restAvailable) { - document.querySelector('#serverConnectionRest').classList.remove('error') - } else { - document.querySelector('#serverConnectionRest').classList.add('error') - } - - if (window.websocketAvailable) { - document.querySelector('#serverConnectionWebSocket').classList.remove('error') - document.querySelector('#serverConnectionWebSocket').innerText = 'WebSocket' - } else { - document.querySelector('#serverConnectionWebSocket').classList.add('error') - document.querySelector('#serverConnectionWebSocket').innerText = 'WebSocket Error' - } -} diff --git a/frontend/js/websocket.js b/frontend/js/websocket.js index 9836881..b2878c6 100644 --- a/frontend/js/websocket.js +++ b/frontend/js/websocket.js @@ -1,6 +1,4 @@ -import { - refreshServerConnectionLabel -} from './marshaller.js' +import { buttonResults } from '../resources/vue/stores/buttonResults.js' export function checkWebsocketConnection () { reconnectWebsocket() @@ -29,8 +27,6 @@ async function reconnectWebsocket () { function handleEvent (msg) { const typeName = msg.event.value.$typeName.replace('olivetin.api.v1.', '') - console.log("Websocket event receved: ", typeName) - const j = new Event(typeName) j.payload = msg.event.value @@ -38,9 +34,12 @@ function handleEvent (msg) { case 'EventOutputChunk': case 'EventConfigChanged': case 'EventEntityChanged': + window.dispatchEvent(j) + break case 'EventExecutionFinished': case 'EventExecutionStarted': - window.dispatchEvent(j) + console.log('EventExecutionStarted', msg.event.value.logEntry.executionTrackingId) + buttonResults[msg.event.value.logEntry.executionTrackingId] = msg.event.value.logEntry break default: console.warn('Unhandled websocket message type from server: ', typeName) diff --git a/frontend/main.js b/frontend/main.js index d502837..36c36d3 100644 --- a/frontend/main.js +++ b/frontend/main.js @@ -11,121 +11,10 @@ import App from './resources/vue/App.vue'; import { initMarshaller, - setupSectionNavigation, - marshalDashboardComponentsJsonToHtml, - refreshServerConnectionLabel } from './js/marshaller.js' import { checkWebsocketConnection } from './js/websocket.js' -function searchLogs (e) { - document.getElementById('searchLogsClear').disabled = false - - const searchText = e.target.value.toLowerCase() - - for (const row of document.querySelectorAll('tr.log-row')) { - const actionTitle = row.getAttribute('title').toLowerCase() - - row.hidden = !actionTitle.includes(searchText) - } -} - -function searchLogsClear () { - for (const row of document.querySelectorAll('tr.log-row')) { - row.hidden = false - } - - document.getElementById('searchLogsClear').disabled = true - document.getElementById('logSearchBox').value = '' -} - - -function refreshLoop () { - checkWebsocketConnection() -// fetchGetDashboardComponents() -// fetchGetLogs() - refreshServerConnectionLabel() -} - -async function fetchGetDashboardComponents () { - try { - const res = await window.client.getDashboardComponents() - - marshalDashboardComponentsJsonToHtml(res) - - refreshServerConnectionLabel() // in-case it changed, update the label quicker - } catch(err) { - window.showBigError('fetch-buttons', 'getting buttons', err, false) - } -} - -function processWebuiSettingsJson (settings) { - setupSectionNavigation(settings.SectionNavigationStyle) - - window.restBaseUrl = settings.Rest - - document.querySelector('#currentVersion').innerText = settings.CurrentVersion - - if (settings.ShowNewVersions && settings.AvailableVersion !== 'none') { - document.querySelector('#available-version').innerText = 'New Version Available: ' + settings.AvailableVersion - document.querySelector('#available-version').hidden = false - } - - if (!settings.ShowNavigation) { - document.querySelector('header').style.display = 'none' - } - - if (!settings.ShowFooter) { - document.querySelector('footer[title="footer"]').style.display = 'none' - } - - if (settings.EnableCustomJs) { - const script = document.createElement('script') - script.src = './custom-webui/custom.js' - document.head.appendChild(script) - } - - window.pageTitle = 'OliveTin' - - if (settings.PageTitle) { - window.pageTitle = settings.PageTitle - - document.title = window.pageTitle - - const titleElem = document.querySelector('#page-title') - if (titleElem) titleElem.innerText = window.pageTitle - } - - processAdditionalLinks(settings.AdditionalLinks) - - window.settings = settings -} - -function processAdditionalLinks (links) { - if (links === null) { - return - } - - if (links.length > 0) { - for (const link of links) { - const linkA = document.createElement('a') - linkA.href = link.Url - linkA.innerText = link.Title - - if (link.Target === '') { - linkA.target = '_blank' - } else { - linkA.target = link.Target - } - - const linkLi = document.createElement('li') - linkLi.appendChild(linkA) - - document.getElementById('supplemental-links').prepend(linkLi) - } - } -} - function initClient () { const transport = createConnectTransport({ baseUrl: window.location.protocol + '//' + window.location.host + '/api/', @@ -143,30 +32,16 @@ function setupVue () { } function main () { - setupVue(); - initClient() + checkWebsocketConnection() + + setupVue(); + initMarshaller() - window.addEventListener('EventConfigChanged', fetchGetDashboardComponents) - window.addEventListener('EventEntityChanged', fetchGetDashboardComponents) - - window.fetch('webUiSettings.json').then(res => { - return res.json() - }).then(res => { - processWebuiSettingsJson(res) - - fetchGetDashboardComponents() - - window.restAvailable = true - window.refreshLoop = refreshLoop - window.refreshLoop() - - setInterval(refreshLoop, 3000) - }).catch(err => { - window.showBigError('fetch-webui-settings', 'getting webui settings', err) - }) +// window.addEventListener('EventConfigChanged', fetchGetDashboardComponents) +// window.addEventListener('EventEntityChanged', fetchGetDashboardComponents) } main() // call self diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 180c401..763e120 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -11,6 +11,8 @@ "dependencies": { "@connectrpc/connect": "^2.0.3", "@connectrpc/connect-web": "^2.0.3", + "@hugeicons/core-free-icons": "^1.0.16", + "@hugeicons/vue": "^1.0.3", "@vitejs/plugin-vue": "^6.0.1", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", @@ -722,6 +724,20 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/@hugeicons/core-free-icons": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@hugeicons/core-free-icons/-/core-free-icons-1.0.16.tgz", + "integrity": "sha512-rm48rjUN8a58yOZ7mpk3HkMvZPmOMTkMtNdXXq9m0Af6BsRQWJZl+4zd6ssj52y+A9Zn4Yg/TptobNtNpx3GCg==", + "license": "MIT" + }, + "node_modules/@hugeicons/vue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@hugeicons/vue/-/vue-1.0.3.tgz", + "integrity": "sha512-DF9A277Ej4Eahu11Hkd3v6V0eZ1NHWZWs9OOByJaxGekgG8q7DAbkhltIo3bqsoxVprxaKSX3Mmn5a2dyzLsHA==", + "peerDependencies": { + "vue": "^2.6.0 || ^3.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -2589,9 +2605,9 @@ } }, "node_modules/femtocrank": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/femtocrank/-/femtocrank-1.2.2.tgz", - "integrity": "sha512-tXvXllBCZ1Wt5QRHr07+cSjsRr/lBqDWow7WhVn67zg7BE8MZ1Niv8BzSbx9c7JKYaso7OIVm02Yo/9wJYzhGw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/femtocrank/-/femtocrank-1.2.4.tgz", + "integrity": "sha512-OAyowQ45LOwl7xWaOFyXlmP9MzdV9sQrTz1130vgqF2TxDkOx6y2uP8QK/+12MGMP0v7KkiTO8fE/TN6orb9fg==", "license": "AGPL-3.0", "dependencies": { "vite": "^6.3.5" diff --git a/frontend/package.json b/frontend/package.json index 2cf8d0a..a66a740 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -29,10 +29,12 @@ "dependencies": { "@connectrpc/connect": "^2.0.3", "@connectrpc/connect-web": "^2.0.3", + "@hugeicons/core-free-icons": "^1.0.16", + "@hugeicons/vue": "^1.0.3", "@vitejs/plugin-vue": "^6.0.1", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", - "femtocrank": "^1.2.2", + "femtocrank": "^1.2.4", "unplugin-vue-components": "^28.8.0", "vite": "^7.0.6", "vue-router": "^4.5.1" diff --git a/frontend/resources/scripts/gen/olivetin/api/v1/olivetin_pb.d.ts b/frontend/resources/scripts/gen/olivetin/api/v1/olivetin_pb.d.ts index cd59655..0daaf57 100644 --- a/frontend/resources/scripts/gen/olivetin/api/v1/olivetin_pb.d.ts +++ b/frontend/resources/scripts/gen/olivetin/api/v1/olivetin_pb.d.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v2.6.2 +// @generated by protoc-gen-es v2.6.3 // @generated from file olivetin/api/v1/olivetin.proto (package olivetin.api.v1, syntax proto3) /* eslint-disable */ @@ -15,9 +15,9 @@ export declare const file_olivetin_api_v1_olivetin: GenFile; */ export declare type Action = Message<"olivetin.api.v1.Action"> & { /** - * @generated from field: string id = 1; + * @generated from field: string binding_id = 1; */ - id: string; + bindingId: string; /** * @generated from field: string title = 2; @@ -133,14 +133,14 @@ export declare type Entity = Message<"olivetin.api.v1.Entity"> & { title: string; /** - * @generated from field: string icon = 2; + * @generated from field: string unique_key = 2; */ - icon: string; + uniqueKey: string; /** - * @generated from field: repeated olivetin.api.v1.Action actions = 3; + * @generated from field: string type = 3; */ - actions: Action[]; + type: string; }; /** @@ -150,40 +150,25 @@ export declare type Entity = Message<"olivetin.api.v1.Entity"> & { export declare const EntitySchema: GenMessage; /** - * @generated from message olivetin.api.v1.GetDashboardComponentsResponse + * @generated from message olivetin.api.v1.GetDashboardResponse */ -export declare type GetDashboardComponentsResponse = Message<"olivetin.api.v1.GetDashboardComponentsResponse"> & { +export declare type GetDashboardResponse = Message<"olivetin.api.v1.GetDashboardResponse"> & { /** * @generated from field: string title = 1; */ title: string; /** - * @generated from field: repeated olivetin.api.v1.Dashboard dashboards = 4; + * @generated from field: olivetin.api.v1.Dashboard dashboard = 4; */ - dashboards: Dashboard[]; - - /** - * @generated from field: string authenticated_user = 5; - */ - authenticatedUser: string; - - /** - * @generated from field: string authenticated_user_provider = 6; - */ - authenticatedUserProvider: string; - - /** - * @generated from field: olivetin.api.v1.EffectivePolicy effective_policy = 7; - */ - effectivePolicy?: EffectivePolicy; + dashboard?: Dashboard; }; /** - * Describes the message olivetin.api.v1.GetDashboardComponentsResponse. - * Use `create(GetDashboardComponentsResponseSchema)` to create a new message. + * Describes the message olivetin.api.v1.GetDashboardResponse. + * Use `create(GetDashboardResponseSchema)` to create a new message. */ -export declare const GetDashboardComponentsResponseSchema: GenMessage; +export declare const GetDashboardResponseSchema: GenMessage; /** * @generated from message olivetin.api.v1.EffectivePolicy @@ -207,16 +192,20 @@ export declare type EffectivePolicy = Message<"olivetin.api.v1.EffectivePolicy"> export declare const EffectivePolicySchema: GenMessage; /** - * @generated from message olivetin.api.v1.GetDashboardComponentsRequest + * @generated from message olivetin.api.v1.GetDashboardRequest */ -export declare type GetDashboardComponentsRequest = Message<"olivetin.api.v1.GetDashboardComponentsRequest"> & { +export declare type GetDashboardRequest = Message<"olivetin.api.v1.GetDashboardRequest"> & { + /** + * @generated from field: string title = 1; + */ + title: string; }; /** - * Describes the message olivetin.api.v1.GetDashboardComponentsRequest. - * Use `create(GetDashboardComponentsRequestSchema)` to create a new message. + * Describes the message olivetin.api.v1.GetDashboardRequest. + * Use `create(GetDashboardRequestSchema)` to create a new message. */ -export declare const GetDashboardComponentsRequestSchema: GenMessage; +export declare const GetDashboardRequestSchema: GenMessage; /** * @generated from message olivetin.api.v1.Dashboard @@ -267,6 +256,11 @@ export declare type DashboardComponent = Message<"olivetin.api.v1.DashboardCompo * @generated from field: string css_class = 5; */ cssClass: string; + + /** + * @generated from field: olivetin.api.v1.Action action = 6; + */ + action?: Action; }; /** @@ -280,9 +274,9 @@ export declare const DashboardComponentSchema: GenMessage; */ export declare type StartActionRequest = Message<"olivetin.api.v1.StartActionRequest"> & { /** - * @generated from field: string action_id = 1; + * @generated from field: string binding_id = 1; */ - actionId: string; + bindingId: string; /** * @generated from field: repeated olivetin.api.v1.StartActionArgument arguments = 2; @@ -569,6 +563,16 @@ export declare type GetLogsResponse = Message<"olivetin.api.v1.GetLogsResponse"> * @generated from field: int64 page_size = 3; */ pageSize: bigint; + + /** + * @generated from field: int64 total_count = 4; + */ + totalCount: bigint; + + /** + * @generated from field: int64 start_offset = 5; + */ + startOffset: bigint; }; /** @@ -1187,17 +1191,294 @@ export declare type GetDiagnosticsResponse = Message<"olivetin.api.v1.GetDiagnos */ export declare const GetDiagnosticsResponseSchema: GenMessage; +/** + * @generated from message olivetin.api.v1.InitRequest + */ +export declare type InitRequest = Message<"olivetin.api.v1.InitRequest"> & { +}; + +/** + * Describes the message olivetin.api.v1.InitRequest. + * Use `create(InitRequestSchema)` to create a new message. + */ +export declare const InitRequestSchema: GenMessage; + +/** + * @generated from message olivetin.api.v1.InitResponse + */ +export declare type InitResponse = Message<"olivetin.api.v1.InitResponse"> & { + /** + * @generated from field: bool showFooter = 1; + */ + showFooter: boolean; + + /** + * @generated from field: bool showNavigation = 2; + */ + showNavigation: boolean; + + /** + * @generated from field: bool showNewVersions = 3; + */ + showNewVersions: boolean; + + /** + * @generated from field: string availableVersion = 4; + */ + availableVersion: string; + + /** + * @generated from field: string currentVersion = 5; + */ + currentVersion: string; + + /** + * @generated from field: string pageTitle = 6; + */ + pageTitle: string; + + /** + * @generated from field: string sectionNavigationStyle = 7; + */ + sectionNavigationStyle: string; + + /** + * @generated from field: string defaultIconForBack = 8; + */ + defaultIconForBack: string; + + /** + * @generated from field: bool enableCustomJs = 9; + */ + enableCustomJs: boolean; + + /** + * @generated from field: string authLoginUrl = 10; + */ + authLoginUrl: string; + + /** + * @generated from field: bool authLocalLogin = 11; + */ + authLocalLogin: boolean; + + /** + * @generated from field: repeated string styleMods = 12; + */ + styleMods: string[]; + + /** + * @generated from field: repeated olivetin.api.v1.OAuth2Provider oAuth2Providers = 13; + */ + oAuth2Providers: OAuth2Provider[]; + + /** + * @generated from field: repeated olivetin.api.v1.AdditionalLink additionalLinks = 14; + */ + additionalLinks: AdditionalLink[]; + + /** + * @generated from field: repeated string rootDashboards = 15; + */ + rootDashboards: string[]; + + /** + * @generated from field: string authenticated_user = 16; + */ + authenticatedUser: string; + + /** + * @generated from field: string authenticated_user_provider = 17; + */ + authenticatedUserProvider: string; + + /** + * @generated from field: olivetin.api.v1.EffectivePolicy effective_policy = 18; + */ + effectivePolicy?: EffectivePolicy; + + /** + * @generated from field: string banner_message = 19; + */ + bannerMessage: string; + + /** + * @generated from field: string banner_css = 20; + */ + bannerCss: string; +}; + +/** + * Describes the message olivetin.api.v1.InitResponse. + * Use `create(InitResponseSchema)` to create a new message. + */ +export declare const InitResponseSchema: GenMessage; + +/** + * @generated from message olivetin.api.v1.AdditionalLink + */ +export declare type AdditionalLink = Message<"olivetin.api.v1.AdditionalLink"> & { + /** + * @generated from field: string title = 1; + */ + title: string; + + /** + * @generated from field: string url = 2; + */ + url: string; +}; + +/** + * Describes the message olivetin.api.v1.AdditionalLink. + * Use `create(AdditionalLinkSchema)` to create a new message. + */ +export declare const AdditionalLinkSchema: GenMessage; + +/** + * @generated from message olivetin.api.v1.OAuth2Provider + */ +export declare type OAuth2Provider = Message<"olivetin.api.v1.OAuth2Provider"> & { + /** + * @generated from field: string title = 1; + */ + title: string; + + /** + * @generated from field: string url = 2; + */ + url: string; + + /** + * @generated from field: string icon = 3; + */ + icon: string; +}; + +/** + * Describes the message olivetin.api.v1.OAuth2Provider. + * Use `create(OAuth2ProviderSchema)` to create a new message. + */ +export declare const OAuth2ProviderSchema: GenMessage; + +/** + * @generated from message olivetin.api.v1.GetActionBindingRequest + */ +export declare type GetActionBindingRequest = Message<"olivetin.api.v1.GetActionBindingRequest"> & { + /** + * @generated from field: string binding_id = 1; + */ + bindingId: string; +}; + +/** + * Describes the message olivetin.api.v1.GetActionBindingRequest. + * Use `create(GetActionBindingRequestSchema)` to create a new message. + */ +export declare const GetActionBindingRequestSchema: GenMessage; + +/** + * @generated from message olivetin.api.v1.GetActionBindingResponse + */ +export declare type GetActionBindingResponse = Message<"olivetin.api.v1.GetActionBindingResponse"> & { + /** + * @generated from field: olivetin.api.v1.Action action = 1; + */ + action?: Action; +}; + +/** + * Describes the message olivetin.api.v1.GetActionBindingResponse. + * Use `create(GetActionBindingResponseSchema)` to create a new message. + */ +export declare const GetActionBindingResponseSchema: GenMessage; + +/** + * @generated from message olivetin.api.v1.GetEntitiesRequest + */ +export declare type GetEntitiesRequest = Message<"olivetin.api.v1.GetEntitiesRequest"> & { +}; + +/** + * Describes the message olivetin.api.v1.GetEntitiesRequest. + * Use `create(GetEntitiesRequestSchema)` to create a new message. + */ +export declare const GetEntitiesRequestSchema: GenMessage; + +/** + * @generated from message olivetin.api.v1.GetEntitiesResponse + */ +export declare type GetEntitiesResponse = Message<"olivetin.api.v1.GetEntitiesResponse"> & { + /** + * @generated from field: repeated olivetin.api.v1.EntityDefinition entity_definitions = 1; + */ + entityDefinitions: EntityDefinition[]; +}; + +/** + * Describes the message olivetin.api.v1.GetEntitiesResponse. + * Use `create(GetEntitiesResponseSchema)` to create a new message. + */ +export declare const GetEntitiesResponseSchema: GenMessage; + +/** + * @generated from message olivetin.api.v1.EntityDefinition + */ +export declare type EntityDefinition = Message<"olivetin.api.v1.EntityDefinition"> & { + /** + * @generated from field: string title = 1; + */ + title: string; + + /** + * @generated from field: repeated olivetin.api.v1.Entity instances = 2; + */ + instances: Entity[]; + + /** + * @generated from field: repeated string used_on_dashboards = 3; + */ + usedOnDashboards: string[]; +}; + +/** + * Describes the message olivetin.api.v1.EntityDefinition. + * Use `create(EntityDefinitionSchema)` to create a new message. + */ +export declare const EntityDefinitionSchema: GenMessage; + +/** + * @generated from message olivetin.api.v1.GetEntityRequest + */ +export declare type GetEntityRequest = Message<"olivetin.api.v1.GetEntityRequest"> & { + /** + * @generated from field: string unique_key = 1; + */ + uniqueKey: string; + + /** + * @generated from field: string type = 2; + */ + type: string; +}; + +/** + * Describes the message olivetin.api.v1.GetEntityRequest. + * Use `create(GetEntityRequestSchema)` to create a new message. + */ +export declare const GetEntityRequestSchema: GenMessage; + /** * @generated from service olivetin.api.v1.OliveTinApiService */ export declare const OliveTinApiService: GenService<{ /** - * @generated from rpc olivetin.api.v1.OliveTinApiService.GetDashboardComponents + * @generated from rpc olivetin.api.v1.OliveTinApiService.GetDashboard */ - getDashboardComponents: { + getDashboard: { methodKind: "unary"; - input: typeof GetDashboardComponentsRequestSchema; - output: typeof GetDashboardComponentsResponseSchema; + input: typeof GetDashboardRequestSchema; + output: typeof GetDashboardResponseSchema; }, /** * @generated from rpc olivetin.api.v1.OliveTinApiService.StartAction @@ -1343,5 +1624,37 @@ export declare const OliveTinApiService: GenService<{ input: typeof GetDiagnosticsRequestSchema; output: typeof GetDiagnosticsResponseSchema; }, + /** + * @generated from rpc olivetin.api.v1.OliveTinApiService.Init + */ + init: { + methodKind: "unary"; + input: typeof InitRequestSchema; + output: typeof InitResponseSchema; + }, + /** + * @generated from rpc olivetin.api.v1.OliveTinApiService.GetActionBinding + */ + getActionBinding: { + methodKind: "unary"; + input: typeof GetActionBindingRequestSchema; + output: typeof GetActionBindingResponseSchema; + }, + /** + * @generated from rpc olivetin.api.v1.OliveTinApiService.GetEntities + */ + getEntities: { + methodKind: "unary"; + input: typeof GetEntitiesRequestSchema; + output: typeof GetEntitiesResponseSchema; + }, + /** + * @generated from rpc olivetin.api.v1.OliveTinApiService.GetEntity + */ + getEntity: { + methodKind: "unary"; + input: typeof GetEntityRequestSchema; + output: typeof EntitySchema; + }, }>; diff --git a/frontend/resources/scripts/gen/olivetin/api/v1/olivetin_pb.js b/frontend/resources/scripts/gen/olivetin/api/v1/olivetin_pb.js index d4f4471..694adf3 100644 --- a/frontend/resources/scripts/gen/olivetin/api/v1/olivetin_pb.js +++ b/frontend/resources/scripts/gen/olivetin/api/v1/olivetin_pb.js @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v2.6.2 +// @generated by protoc-gen-es v2.6.3 // @generated from file olivetin/api/v1/olivetin.proto (package olivetin.api.v1, syntax proto3) /* eslint-disable */ @@ -8,7 +8,7 @@ import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2 * Describes the file olivetin/api/v1/olivetin.proto. */ export const file_olivetin_api_v1_olivetin = /*@__PURE__*/ - fileDesc("Ch5vbGl2ZXRpbi9hcGkvdjEvb2xpdmV0aW4ucHJvdG8SD29saXZldGluLmFwaS52MSKeAQoGQWN0aW9uEgoKAmlkGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBGljb24YAyABKAkSEAoIY2FuX2V4ZWMYBCABKAgSMgoJYXJndW1lbnRzGAUgAygLMh8ub2xpdmV0aW4uYXBpLnYxLkFjdGlvbkFyZ3VtZW50EhYKDnBvcHVwX29uX3N0YXJ0GAYgASgJEg0KBW9yZGVyGAcgASgFIpoCCg5BY3Rpb25Bcmd1bWVudBIMCgRuYW1lGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBHR5cGUYAyABKAkSFQoNZGVmYXVsdF92YWx1ZRgEIAEoCRI2CgdjaG9pY2VzGAUgAygLMiUub2xpdmV0aW4uYXBpLnYxLkFjdGlvbkFyZ3VtZW50Q2hvaWNlEhMKC2Rlc2NyaXB0aW9uGAYgASgJEkUKC3N1Z2dlc3Rpb25zGAcgAygLMjAub2xpdmV0aW4uYXBpLnYxLkFjdGlvbkFyZ3VtZW50LlN1Z2dlc3Rpb25zRW50cnkaMgoQU3VnZ2VzdGlvbnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIjQKFEFjdGlvbkFyZ3VtZW50Q2hvaWNlEg0KBXZhbHVlGAEgASgJEg0KBXRpdGxlGAIgASgJIk8KBkVudGl0eRINCgV0aXRsZRgBIAEoCRIMCgRpY29uGAIgASgJEigKB2FjdGlvbnMYAyADKAsyFy5vbGl2ZXRpbi5hcGkudjEuQWN0aW9uItwBCh5HZXREYXNoYm9hcmRDb21wb25lbnRzUmVzcG9uc2USDQoFdGl0bGUYASABKAkSLgoKZGFzaGJvYXJkcxgEIAMoCzIaLm9saXZldGluLmFwaS52MS5EYXNoYm9hcmQSGgoSYXV0aGVudGljYXRlZF91c2VyGAUgASgJEiMKG2F1dGhlbnRpY2F0ZWRfdXNlcl9wcm92aWRlchgGIAEoCRI6ChBlZmZlY3RpdmVfcG9saWN5GAcgASgLMiAub2xpdmV0aW4uYXBpLnYxLkVmZmVjdGl2ZVBvbGljeSJCCg9FZmZlY3RpdmVQb2xpY3kSGAoQc2hvd19kaWFnbm9zdGljcxgBIAEoCBIVCg1zaG93X2xvZ19saXN0GAIgASgIIh8KHUdldERhc2hib2FyZENvbXBvbmVudHNSZXF1ZXN0IlEKCURhc2hib2FyZBINCgV0aXRsZRgBIAEoCRI1Cghjb250ZW50cxgCIAMoCzIjLm9saXZldGluLmFwaS52MS5EYXNoYm9hcmRDb21wb25lbnQiiQEKEkRhc2hib2FyZENvbXBvbmVudBINCgV0aXRsZRgBIAEoCRIMCgR0eXBlGAIgASgJEjUKCGNvbnRlbnRzGAMgAygLMiMub2xpdmV0aW4uYXBpLnYxLkRhc2hib2FyZENvbXBvbmVudBIMCgRpY29uGAQgASgJEhEKCWNzc19jbGFzcxgFIAEoCSJ8ChJTdGFydEFjdGlvblJlcXVlc3QSEQoJYWN0aW9uX2lkGAEgASgJEjcKCWFyZ3VtZW50cxgCIAMoCzIkLm9saXZldGluLmFwaS52MS5TdGFydEFjdGlvbkFyZ3VtZW50EhoKEnVuaXF1ZV90cmFja2luZ19pZBgDIAEoCSIyChNTdGFydEFjdGlvbkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkiNAoTU3RhcnRBY3Rpb25SZXNwb25zZRIdChVleGVjdXRpb25fdHJhY2tpbmdfaWQYAiABKAkiZwoZU3RhcnRBY3Rpb25BbmRXYWl0UmVxdWVzdBIRCglhY3Rpb25faWQYASABKAkSNwoJYXJndW1lbnRzGAIgAygLMiQub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uQXJndW1lbnQiSgoaU3RhcnRBY3Rpb25BbmRXYWl0UmVzcG9uc2USLAoJbG9nX2VudHJ5GAEgASgLMhkub2xpdmV0aW4uYXBpLnYxLkxvZ0VudHJ5IiwKF1N0YXJ0QWN0aW9uQnlHZXRSZXF1ZXN0EhEKCWFjdGlvbl9pZBgBIAEoCSI5ChhTdGFydEFjdGlvbkJ5R2V0UmVzcG9uc2USHQoVZXhlY3V0aW9uX3RyYWNraW5nX2lkGAIgASgJIjMKHlN0YXJ0QWN0aW9uQnlHZXRBbmRXYWl0UmVxdWVzdBIRCglhY3Rpb25faWQYASABKAkiTwofU3RhcnRBY3Rpb25CeUdldEFuZFdhaXRSZXNwb25zZRIsCglsb2dfZW50cnkYASABKAsyGS5vbGl2ZXRpbi5hcGkudjEuTG9nRW50cnkiJgoOR2V0TG9nc1JlcXVlc3QSFAoMc3RhcnRfb2Zmc2V0GAEgASgDIvQCCghMb2dFbnRyeRIYChBkYXRldGltZV9zdGFydGVkGAEgASgJEhQKDGFjdGlvbl90aXRsZRgCIAEoCRIOCgZvdXRwdXQYAyABKAkSEQoJdGltZWRfb3V0GAUgASgIEhEKCWV4aXRfY29kZRgGIAEoBRIMCgR1c2VyGAcgASgJEhIKCnVzZXJfY2xhc3MYCCABKAkSEwoLYWN0aW9uX2ljb24YCSABKAkSDAoEdGFncxgKIAMoCRIdChVleGVjdXRpb25fdHJhY2tpbmdfaWQYCyABKAkSGQoRZGF0ZXRpbWVfZmluaXNoZWQYDCABKAkSEQoJYWN0aW9uX2lkGA0gASgJEhkKEWV4ZWN1dGlvbl9zdGFydGVkGA4gASgIEhoKEmV4ZWN1dGlvbl9maW5pc2hlZBgPIAEoCBIPCgdibG9ja2VkGBAgASgIEhYKDmRhdGV0aW1lX2luZGV4GBEgASgDEhAKCGNhbl9raWxsGBIgASgIImYKD0dldExvZ3NSZXNwb25zZRInCgRsb2dzGAEgAygLMhkub2xpdmV0aW4uYXBpLnYxLkxvZ0VudHJ5EhcKD2NvdW50X3JlbWFpbmluZxgCIAEoAxIRCglwYWdlX3NpemUYAyABKAMiOgobVmFsaWRhdGVBcmd1bWVudFR5cGVSZXF1ZXN0Eg0KBXZhbHVlGAEgASgJEgwKBHR5cGUYAiABKAkiQgocVmFsaWRhdGVBcmd1bWVudFR5cGVSZXNwb25zZRINCgV2YWxpZBgBIAEoCBITCgtkZXNjcmlwdGlvbhgCIAEoCSI2ChVXYXRjaEV4ZWN1dGlvblJlcXVlc3QSHQoVZXhlY3V0aW9uX3RyYWNraW5nX2lkGAEgASgJIiYKFFdhdGNoRXhlY3V0aW9uVXBkYXRlEg4KBnVwZGF0ZRgBIAEoCSJKChZFeGVjdXRpb25TdGF0dXNSZXF1ZXN0Eh0KFWV4ZWN1dGlvbl90cmFja2luZ19pZBgBIAEoCRIRCglhY3Rpb25faWQYAiABKAkiRwoXRXhlY3V0aW9uU3RhdHVzUmVzcG9uc2USLAoJbG9nX2VudHJ5GAEgASgLMhkub2xpdmV0aW4uYXBpLnYxLkxvZ0VudHJ5Ig8KDVdob0FtSVJlcXVlc3QibAoOV2hvQW1JUmVzcG9uc2USGgoSYXV0aGVudGljYXRlZF91c2VyGAEgASgJEhEKCXVzZXJncm91cBgCIAEoCRIQCghwcm92aWRlchgDIAEoCRIMCgRhY2xzGAQgAygJEgsKA3NpZBgFIAEoCSISChBTb3NSZXBvcnRSZXF1ZXN0IiIKEVNvc1JlcG9ydFJlc3BvbnNlEg0KBWFsZXJ0GAEgASgJIhEKD0R1bXBWYXJzUmVxdWVzdCKVAQoQRHVtcFZhcnNSZXNwb25zZRINCgVhbGVydBgBIAEoCRJBCghjb250ZW50cxgCIAMoCzIvLm9saXZldGluLmFwaS52MS5EdW1wVmFyc1Jlc3BvbnNlLkNvbnRlbnRzRW50cnkaLwoNQ29udGVudHNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIj8KEEFjdGlvbkVudGl0eVBhaXISFAoMYWN0aW9uX3RpdGxlGAEgASgJEhUKDWVudGl0eV9wcmVmaXgYAiABKAkiHgocRHVtcFB1YmxpY0lkQWN0aW9uTWFwUmVxdWVzdCLSAQodRHVtcFB1YmxpY0lkQWN0aW9uTWFwUmVzcG9uc2USDQoFYWxlcnQYASABKAkSTgoIY29udGVudHMYAiADKAsyPC5vbGl2ZXRpbi5hcGkudjEuRHVtcFB1YmxpY0lkQWN0aW9uTWFwUmVzcG9uc2UuQ29udGVudHNFbnRyeRpSCg1Db250ZW50c0VudHJ5EgsKA2tleRgBIAEoCRIwCgV2YWx1ZRgCIAEoCzIhLm9saXZldGluLmFwaS52MS5BY3Rpb25FbnRpdHlQYWlyOgI4ASISChBHZXRSZWFkeXpSZXF1ZXN0IiMKEUdldFJlYWR5elJlc3BvbnNlEg4KBnN0YXR1cxgBIAEoCSIUChJFdmVudFN0cmVhbVJlcXVlc3Qi4wIKE0V2ZW50U3RyZWFtUmVzcG9uc2USPQoOZW50aXR5X2NoYW5nZWQYAiABKAsyIy5vbGl2ZXRpbi5hcGkudjEuRXZlbnRFbnRpdHlDaGFuZ2VkSAASPQoOY29uZmlnX2NoYW5nZWQYAyABKAsyIy5vbGl2ZXRpbi5hcGkudjEuRXZlbnRDb25maWdDaGFuZ2VkSAASRQoSZXhlY3V0aW9uX2ZpbmlzaGVkGAQgASgLMicub2xpdmV0aW4uYXBpLnYxLkV2ZW50RXhlY3V0aW9uRmluaXNoZWRIABJDChFleGVjdXRpb25fc3RhcnRlZBgFIAEoCzImLm9saXZldGluLmFwaS52MS5FdmVudEV4ZWN1dGlvblN0YXJ0ZWRIABI5CgxvdXRwdXRfY2h1bmsYBiABKAsyIS5vbGl2ZXRpbi5hcGkudjEuRXZlbnRPdXRwdXRDaHVua0gAQgcKBWV2ZW50IkEKEEV2ZW50T3V0cHV0Q2h1bmsSHQoVZXhlY3V0aW9uX3RyYWNraW5nX2lkGAEgASgJEg4KBm91dHB1dBgCIAEoCSIUChJFdmVudEVudGl0eUNoYW5nZWQiFAoSRXZlbnRDb25maWdDaGFuZ2VkIkYKFkV2ZW50RXhlY3V0aW9uRmluaXNoZWQSLAoJbG9nX2VudHJ5GAEgASgLMhkub2xpdmV0aW4uYXBpLnYxLkxvZ0VudHJ5IkUKFUV2ZW50RXhlY3V0aW9uU3RhcnRlZBIsCglsb2dfZW50cnkYASABKAsyGS5vbGl2ZXRpbi5hcGkudjEuTG9nRW50cnkiMgoRS2lsbEFjdGlvblJlcXVlc3QSHQoVZXhlY3V0aW9uX3RyYWNraW5nX2lkGAEgASgJIm0KEktpbGxBY3Rpb25SZXNwb25zZRIdChVleGVjdXRpb25fdHJhY2tpbmdfaWQYASABKAkSDgoGa2lsbGVkGAIgASgIEhkKEWFscmVhZHlfY29tcGxldGVkGAMgASgIEg0KBWZvdW5kGAQgASgIIjsKFUxvY2FsVXNlckxvZ2luUmVxdWVzdBIQCgh1c2VybmFtZRgBIAEoCRIQCghwYXNzd29yZBgCIAEoCSIpChZMb2NhbFVzZXJMb2dpblJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgiJwoTUGFzc3dvcmRIYXNoUmVxdWVzdBIQCghwYXNzd29yZBgBIAEoCSIkChRQYXNzd29yZEhhc2hSZXNwb25zZRIMCgRoYXNoGAEgASgJIg8KDUxvZ291dFJlcXVlc3QiEAoOTG9nb3V0UmVzcG9uc2UiFwoVR2V0RGlhZ25vc3RpY3NSZXF1ZXN0IkUKFkdldERpYWdub3N0aWNzUmVzcG9uc2USEwoLU3NoRm91bmRLZXkYASABKAkSFgoOU3NoRm91bmRDb25maWcYAiABKAky6w4KEk9saXZlVGluQXBpU2VydmljZRJ7ChZHZXREYXNoYm9hcmRDb21wb25lbnRzEi4ub2xpdmV0aW4uYXBpLnYxLkdldERhc2hib2FyZENvbXBvbmVudHNSZXF1ZXN0Gi8ub2xpdmV0aW4uYXBpLnYxLkdldERhc2hib2FyZENvbXBvbmVudHNSZXNwb25zZSIAEloKC1N0YXJ0QWN0aW9uEiMub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uUmVxdWVzdBokLm9saXZldGluLmFwaS52MS5TdGFydEFjdGlvblJlc3BvbnNlIgASbwoSU3RhcnRBY3Rpb25BbmRXYWl0Eioub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uQW5kV2FpdFJlcXVlc3QaKy5vbGl2ZXRpbi5hcGkudjEuU3RhcnRBY3Rpb25BbmRXYWl0UmVzcG9uc2UiABJpChBTdGFydEFjdGlvbkJ5R2V0Eigub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uQnlHZXRSZXF1ZXN0Gikub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uQnlHZXRSZXNwb25zZSIAEn4KF1N0YXJ0QWN0aW9uQnlHZXRBbmRXYWl0Ei8ub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uQnlHZXRBbmRXYWl0UmVxdWVzdBowLm9saXZldGluLmFwaS52MS5TdGFydEFjdGlvbkJ5R2V0QW5kV2FpdFJlc3BvbnNlIgASVwoKS2lsbEFjdGlvbhIiLm9saXZldGluLmFwaS52MS5LaWxsQWN0aW9uUmVxdWVzdBojLm9saXZldGluLmFwaS52MS5LaWxsQWN0aW9uUmVzcG9uc2UiABJmCg9FeGVjdXRpb25TdGF0dXMSJy5vbGl2ZXRpbi5hcGkudjEuRXhlY3V0aW9uU3RhdHVzUmVxdWVzdBooLm9saXZldGluLmFwaS52MS5FeGVjdXRpb25TdGF0dXNSZXNwb25zZSIAEk4KB0dldExvZ3MSHy5vbGl2ZXRpbi5hcGkudjEuR2V0TG9nc1JlcXVlc3QaIC5vbGl2ZXRpbi5hcGkudjEuR2V0TG9nc1Jlc3BvbnNlIgASdQoUVmFsaWRhdGVBcmd1bWVudFR5cGUSLC5vbGl2ZXRpbi5hcGkudjEuVmFsaWRhdGVBcmd1bWVudFR5cGVSZXF1ZXN0Gi0ub2xpdmV0aW4uYXBpLnYxLlZhbGlkYXRlQXJndW1lbnRUeXBlUmVzcG9uc2UiABJLCgZXaG9BbUkSHi5vbGl2ZXRpbi5hcGkudjEuV2hvQW1JUmVxdWVzdBofLm9saXZldGluLmFwaS52MS5XaG9BbUlSZXNwb25zZSIAElQKCVNvc1JlcG9ydBIhLm9saXZldGluLmFwaS52MS5Tb3NSZXBvcnRSZXF1ZXN0GiIub2xpdmV0aW4uYXBpLnYxLlNvc1JlcG9ydFJlc3BvbnNlIgASUQoIRHVtcFZhcnMSIC5vbGl2ZXRpbi5hcGkudjEuRHVtcFZhcnNSZXF1ZXN0GiEub2xpdmV0aW4uYXBpLnYxLkR1bXBWYXJzUmVzcG9uc2UiABJ4ChVEdW1wUHVibGljSWRBY3Rpb25NYXASLS5vbGl2ZXRpbi5hcGkudjEuRHVtcFB1YmxpY0lkQWN0aW9uTWFwUmVxdWVzdBouLm9saXZldGluLmFwaS52MS5EdW1wUHVibGljSWRBY3Rpb25NYXBSZXNwb25zZSIAElQKCUdldFJlYWR5ehIhLm9saXZldGluLmFwaS52MS5HZXRSZWFkeXpSZXF1ZXN0GiIub2xpdmV0aW4uYXBpLnYxLkdldFJlYWR5elJlc3BvbnNlIgASYwoOTG9jYWxVc2VyTG9naW4SJi5vbGl2ZXRpbi5hcGkudjEuTG9jYWxVc2VyTG9naW5SZXF1ZXN0Gicub2xpdmV0aW4uYXBpLnYxLkxvY2FsVXNlckxvZ2luUmVzcG9uc2UiABJdCgxQYXNzd29yZEhhc2gSJC5vbGl2ZXRpbi5hcGkudjEuUGFzc3dvcmRIYXNoUmVxdWVzdBolLm9saXZldGluLmFwaS52MS5QYXNzd29yZEhhc2hSZXNwb25zZSIAEksKBkxvZ291dBIeLm9saXZldGluLmFwaS52MS5Mb2dvdXRSZXF1ZXN0Gh8ub2xpdmV0aW4uYXBpLnYxLkxvZ291dFJlc3BvbnNlIgASXAoLRXZlbnRTdHJlYW0SIy5vbGl2ZXRpbi5hcGkudjEuRXZlbnRTdHJlYW1SZXF1ZXN0GiQub2xpdmV0aW4uYXBpLnYxLkV2ZW50U3RyZWFtUmVzcG9uc2UiADABEmMKDkdldERpYWdub3N0aWNzEiYub2xpdmV0aW4uYXBpLnYxLkdldERpYWdub3N0aWNzUmVxdWVzdBonLm9saXZldGluLmFwaS52MS5HZXREaWFnbm9zdGljc1Jlc3BvbnNlIgBCOFo2Z2l0aHViLmNvbS9PbGl2ZVRpbi9PbGl2ZVRpbi9nZW4vb2xpdmV0aW4vYXBpL3YxO2FwaXYxYgZwcm90bzM"); + fileDesc("Ch5vbGl2ZXRpbi9hcGkvdjEvb2xpdmV0aW4ucHJvdG8SD29saXZldGluLmFwaS52MSKmAQoGQWN0aW9uEhIKCmJpbmRpbmdfaWQYASABKAkSDQoFdGl0bGUYAiABKAkSDAoEaWNvbhgDIAEoCRIQCghjYW5fZXhlYxgEIAEoCBIyCglhcmd1bWVudHMYBSADKAsyHy5vbGl2ZXRpbi5hcGkudjEuQWN0aW9uQXJndW1lbnQSFgoOcG9wdXBfb25fc3RhcnQYBiABKAkSDQoFb3JkZXIYByABKAUimgIKDkFjdGlvbkFyZ3VtZW50EgwKBG5hbWUYASABKAkSDQoFdGl0bGUYAiABKAkSDAoEdHlwZRgDIAEoCRIVCg1kZWZhdWx0X3ZhbHVlGAQgASgJEjYKB2Nob2ljZXMYBSADKAsyJS5vbGl2ZXRpbi5hcGkudjEuQWN0aW9uQXJndW1lbnRDaG9pY2USEwoLZGVzY3JpcHRpb24YBiABKAkSRQoLc3VnZ2VzdGlvbnMYByADKAsyMC5vbGl2ZXRpbi5hcGkudjEuQWN0aW9uQXJndW1lbnQuU3VnZ2VzdGlvbnNFbnRyeRoyChBTdWdnZXN0aW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoUQWN0aW9uQXJndW1lbnRDaG9pY2USDQoFdmFsdWUYASABKAkSDQoFdGl0bGUYAiABKAkiOQoGRW50aXR5Eg0KBXRpdGxlGAEgASgJEhIKCnVuaXF1ZV9rZXkYAiABKAkSDAoEdHlwZRgDIAEoCSJUChRHZXREYXNoYm9hcmRSZXNwb25zZRINCgV0aXRsZRgBIAEoCRItCglkYXNoYm9hcmQYBCABKAsyGi5vbGl2ZXRpbi5hcGkudjEuRGFzaGJvYXJkIkIKD0VmZmVjdGl2ZVBvbGljeRIYChBzaG93X2RpYWdub3N0aWNzGAEgASgIEhUKDXNob3dfbG9nX2xpc3QYAiABKAgiJAoTR2V0RGFzaGJvYXJkUmVxdWVzdBINCgV0aXRsZRgBIAEoCSJRCglEYXNoYm9hcmQSDQoFdGl0bGUYASABKAkSNQoIY29udGVudHMYAiADKAsyIy5vbGl2ZXRpbi5hcGkudjEuRGFzaGJvYXJkQ29tcG9uZW50IrIBChJEYXNoYm9hcmRDb21wb25lbnQSDQoFdGl0bGUYASABKAkSDAoEdHlwZRgCIAEoCRI1Cghjb250ZW50cxgDIAMoCzIjLm9saXZldGluLmFwaS52MS5EYXNoYm9hcmRDb21wb25lbnQSDAoEaWNvbhgEIAEoCRIRCgljc3NfY2xhc3MYBSABKAkSJwoGYWN0aW9uGAYgASgLMhcub2xpdmV0aW4uYXBpLnYxLkFjdGlvbiJ9ChJTdGFydEFjdGlvblJlcXVlc3QSEgoKYmluZGluZ19pZBgBIAEoCRI3Cglhcmd1bWVudHMYAiADKAsyJC5vbGl2ZXRpbi5hcGkudjEuU3RhcnRBY3Rpb25Bcmd1bWVudBIaChJ1bmlxdWVfdHJhY2tpbmdfaWQYAyABKAkiMgoTU3RhcnRBY3Rpb25Bcmd1bWVudBIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIjQKE1N0YXJ0QWN0aW9uUmVzcG9uc2USHQoVZXhlY3V0aW9uX3RyYWNraW5nX2lkGAIgASgJImcKGVN0YXJ0QWN0aW9uQW5kV2FpdFJlcXVlc3QSEQoJYWN0aW9uX2lkGAEgASgJEjcKCWFyZ3VtZW50cxgCIAMoCzIkLm9saXZldGluLmFwaS52MS5TdGFydEFjdGlvbkFyZ3VtZW50IkoKGlN0YXJ0QWN0aW9uQW5kV2FpdFJlc3BvbnNlEiwKCWxvZ19lbnRyeRgBIAEoCzIZLm9saXZldGluLmFwaS52MS5Mb2dFbnRyeSIsChdTdGFydEFjdGlvbkJ5R2V0UmVxdWVzdBIRCglhY3Rpb25faWQYASABKAkiOQoYU3RhcnRBY3Rpb25CeUdldFJlc3BvbnNlEh0KFWV4ZWN1dGlvbl90cmFja2luZ19pZBgCIAEoCSIzCh5TdGFydEFjdGlvbkJ5R2V0QW5kV2FpdFJlcXVlc3QSEQoJYWN0aW9uX2lkGAEgASgJIk8KH1N0YXJ0QWN0aW9uQnlHZXRBbmRXYWl0UmVzcG9uc2USLAoJbG9nX2VudHJ5GAEgASgLMhkub2xpdmV0aW4uYXBpLnYxLkxvZ0VudHJ5IiYKDkdldExvZ3NSZXF1ZXN0EhQKDHN0YXJ0X29mZnNldBgBIAEoAyL0AgoITG9nRW50cnkSGAoQZGF0ZXRpbWVfc3RhcnRlZBgBIAEoCRIUCgxhY3Rpb25fdGl0bGUYAiABKAkSDgoGb3V0cHV0GAMgASgJEhEKCXRpbWVkX291dBgFIAEoCBIRCglleGl0X2NvZGUYBiABKAUSDAoEdXNlchgHIAEoCRISCgp1c2VyX2NsYXNzGAggASgJEhMKC2FjdGlvbl9pY29uGAkgASgJEgwKBHRhZ3MYCiADKAkSHQoVZXhlY3V0aW9uX3RyYWNraW5nX2lkGAsgASgJEhkKEWRhdGV0aW1lX2ZpbmlzaGVkGAwgASgJEhEKCWFjdGlvbl9pZBgNIAEoCRIZChFleGVjdXRpb25fc3RhcnRlZBgOIAEoCBIaChJleGVjdXRpb25fZmluaXNoZWQYDyABKAgSDwoHYmxvY2tlZBgQIAEoCBIWCg5kYXRldGltZV9pbmRleBgRIAEoAxIQCghjYW5fa2lsbBgSIAEoCCKRAQoPR2V0TG9nc1Jlc3BvbnNlEicKBGxvZ3MYASADKAsyGS5vbGl2ZXRpbi5hcGkudjEuTG9nRW50cnkSFwoPY291bnRfcmVtYWluaW5nGAIgASgDEhEKCXBhZ2Vfc2l6ZRgDIAEoAxITCgt0b3RhbF9jb3VudBgEIAEoAxIUCgxzdGFydF9vZmZzZXQYBSABKAMiOgobVmFsaWRhdGVBcmd1bWVudFR5cGVSZXF1ZXN0Eg0KBXZhbHVlGAEgASgJEgwKBHR5cGUYAiABKAkiQgocVmFsaWRhdGVBcmd1bWVudFR5cGVSZXNwb25zZRINCgV2YWxpZBgBIAEoCBITCgtkZXNjcmlwdGlvbhgCIAEoCSI2ChVXYXRjaEV4ZWN1dGlvblJlcXVlc3QSHQoVZXhlY3V0aW9uX3RyYWNraW5nX2lkGAEgASgJIiYKFFdhdGNoRXhlY3V0aW9uVXBkYXRlEg4KBnVwZGF0ZRgBIAEoCSJKChZFeGVjdXRpb25TdGF0dXNSZXF1ZXN0Eh0KFWV4ZWN1dGlvbl90cmFja2luZ19pZBgBIAEoCRIRCglhY3Rpb25faWQYAiABKAkiRwoXRXhlY3V0aW9uU3RhdHVzUmVzcG9uc2USLAoJbG9nX2VudHJ5GAEgASgLMhkub2xpdmV0aW4uYXBpLnYxLkxvZ0VudHJ5Ig8KDVdob0FtSVJlcXVlc3QibAoOV2hvQW1JUmVzcG9uc2USGgoSYXV0aGVudGljYXRlZF91c2VyGAEgASgJEhEKCXVzZXJncm91cBgCIAEoCRIQCghwcm92aWRlchgDIAEoCRIMCgRhY2xzGAQgAygJEgsKA3NpZBgFIAEoCSISChBTb3NSZXBvcnRSZXF1ZXN0IiIKEVNvc1JlcG9ydFJlc3BvbnNlEg0KBWFsZXJ0GAEgASgJIhEKD0R1bXBWYXJzUmVxdWVzdCKVAQoQRHVtcFZhcnNSZXNwb25zZRINCgVhbGVydBgBIAEoCRJBCghjb250ZW50cxgCIAMoCzIvLm9saXZldGluLmFwaS52MS5EdW1wVmFyc1Jlc3BvbnNlLkNvbnRlbnRzRW50cnkaLwoNQ29udGVudHNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIj8KEEFjdGlvbkVudGl0eVBhaXISFAoMYWN0aW9uX3RpdGxlGAEgASgJEhUKDWVudGl0eV9wcmVmaXgYAiABKAkiHgocRHVtcFB1YmxpY0lkQWN0aW9uTWFwUmVxdWVzdCLSAQodRHVtcFB1YmxpY0lkQWN0aW9uTWFwUmVzcG9uc2USDQoFYWxlcnQYASABKAkSTgoIY29udGVudHMYAiADKAsyPC5vbGl2ZXRpbi5hcGkudjEuRHVtcFB1YmxpY0lkQWN0aW9uTWFwUmVzcG9uc2UuQ29udGVudHNFbnRyeRpSCg1Db250ZW50c0VudHJ5EgsKA2tleRgBIAEoCRIwCgV2YWx1ZRgCIAEoCzIhLm9saXZldGluLmFwaS52MS5BY3Rpb25FbnRpdHlQYWlyOgI4ASISChBHZXRSZWFkeXpSZXF1ZXN0IiMKEUdldFJlYWR5elJlc3BvbnNlEg4KBnN0YXR1cxgBIAEoCSIUChJFdmVudFN0cmVhbVJlcXVlc3Qi4wIKE0V2ZW50U3RyZWFtUmVzcG9uc2USPQoOZW50aXR5X2NoYW5nZWQYAiABKAsyIy5vbGl2ZXRpbi5hcGkudjEuRXZlbnRFbnRpdHlDaGFuZ2VkSAASPQoOY29uZmlnX2NoYW5nZWQYAyABKAsyIy5vbGl2ZXRpbi5hcGkudjEuRXZlbnRDb25maWdDaGFuZ2VkSAASRQoSZXhlY3V0aW9uX2ZpbmlzaGVkGAQgASgLMicub2xpdmV0aW4uYXBpLnYxLkV2ZW50RXhlY3V0aW9uRmluaXNoZWRIABJDChFleGVjdXRpb25fc3RhcnRlZBgFIAEoCzImLm9saXZldGluLmFwaS52MS5FdmVudEV4ZWN1dGlvblN0YXJ0ZWRIABI5CgxvdXRwdXRfY2h1bmsYBiABKAsyIS5vbGl2ZXRpbi5hcGkudjEuRXZlbnRPdXRwdXRDaHVua0gAQgcKBWV2ZW50IkEKEEV2ZW50T3V0cHV0Q2h1bmsSHQoVZXhlY3V0aW9uX3RyYWNraW5nX2lkGAEgASgJEg4KBm91dHB1dBgCIAEoCSIUChJFdmVudEVudGl0eUNoYW5nZWQiFAoSRXZlbnRDb25maWdDaGFuZ2VkIkYKFkV2ZW50RXhlY3V0aW9uRmluaXNoZWQSLAoJbG9nX2VudHJ5GAEgASgLMhkub2xpdmV0aW4uYXBpLnYxLkxvZ0VudHJ5IkUKFUV2ZW50RXhlY3V0aW9uU3RhcnRlZBIsCglsb2dfZW50cnkYASABKAsyGS5vbGl2ZXRpbi5hcGkudjEuTG9nRW50cnkiMgoRS2lsbEFjdGlvblJlcXVlc3QSHQoVZXhlY3V0aW9uX3RyYWNraW5nX2lkGAEgASgJIm0KEktpbGxBY3Rpb25SZXNwb25zZRIdChVleGVjdXRpb25fdHJhY2tpbmdfaWQYASABKAkSDgoGa2lsbGVkGAIgASgIEhkKEWFscmVhZHlfY29tcGxldGVkGAMgASgIEg0KBWZvdW5kGAQgASgIIjsKFUxvY2FsVXNlckxvZ2luUmVxdWVzdBIQCgh1c2VybmFtZRgBIAEoCRIQCghwYXNzd29yZBgCIAEoCSIpChZMb2NhbFVzZXJMb2dpblJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgiJwoTUGFzc3dvcmRIYXNoUmVxdWVzdBIQCghwYXNzd29yZBgBIAEoCSIkChRQYXNzd29yZEhhc2hSZXNwb25zZRIMCgRoYXNoGAEgASgJIg8KDUxvZ291dFJlcXVlc3QiEAoOTG9nb3V0UmVzcG9uc2UiFwoVR2V0RGlhZ25vc3RpY3NSZXF1ZXN0IkUKFkdldERpYWdub3N0aWNzUmVzcG9uc2USEwoLU3NoRm91bmRLZXkYASABKAkSFgoOU3NoRm91bmRDb25maWcYAiABKAkiDQoLSW5pdFJlcXVlc3Qi4gQKDEluaXRSZXNwb25zZRISCgpzaG93Rm9vdGVyGAEgASgIEhYKDnNob3dOYXZpZ2F0aW9uGAIgASgIEhcKD3Nob3dOZXdWZXJzaW9ucxgDIAEoCBIYChBhdmFpbGFibGVWZXJzaW9uGAQgASgJEhYKDmN1cnJlbnRWZXJzaW9uGAUgASgJEhEKCXBhZ2VUaXRsZRgGIAEoCRIeChZzZWN0aW9uTmF2aWdhdGlvblN0eWxlGAcgASgJEhoKEmRlZmF1bHRJY29uRm9yQmFjaxgIIAEoCRIWCg5lbmFibGVDdXN0b21KcxgJIAEoCBIUCgxhdXRoTG9naW5VcmwYCiABKAkSFgoOYXV0aExvY2FsTG9naW4YCyABKAgSEQoJc3R5bGVNb2RzGAwgAygJEjgKD29BdXRoMlByb3ZpZGVycxgNIAMoCzIfLm9saXZldGluLmFwaS52MS5PQXV0aDJQcm92aWRlchI4Cg9hZGRpdGlvbmFsTGlua3MYDiADKAsyHy5vbGl2ZXRpbi5hcGkudjEuQWRkaXRpb25hbExpbmsSFgoOcm9vdERhc2hib2FyZHMYDyADKAkSGgoSYXV0aGVudGljYXRlZF91c2VyGBAgASgJEiMKG2F1dGhlbnRpY2F0ZWRfdXNlcl9wcm92aWRlchgRIAEoCRI6ChBlZmZlY3RpdmVfcG9saWN5GBIgASgLMiAub2xpdmV0aW4uYXBpLnYxLkVmZmVjdGl2ZVBvbGljeRIWCg5iYW5uZXJfbWVzc2FnZRgTIAEoCRISCgpiYW5uZXJfY3NzGBQgASgJIiwKDkFkZGl0aW9uYWxMaW5rEg0KBXRpdGxlGAEgASgJEgsKA3VybBgCIAEoCSI6Cg5PQXV0aDJQcm92aWRlchINCgV0aXRsZRgBIAEoCRILCgN1cmwYAiABKAkSDAoEaWNvbhgDIAEoCSItChdHZXRBY3Rpb25CaW5kaW5nUmVxdWVzdBISCgpiaW5kaW5nX2lkGAEgASgJIkMKGEdldEFjdGlvbkJpbmRpbmdSZXNwb25zZRInCgZhY3Rpb24YASABKAsyFy5vbGl2ZXRpbi5hcGkudjEuQWN0aW9uIhQKEkdldEVudGl0aWVzUmVxdWVzdCJUChNHZXRFbnRpdGllc1Jlc3BvbnNlEj0KEmVudGl0eV9kZWZpbml0aW9ucxgBIAMoCzIhLm9saXZldGluLmFwaS52MS5FbnRpdHlEZWZpbml0aW9uImkKEEVudGl0eURlZmluaXRpb24SDQoFdGl0bGUYASABKAkSKgoJaW5zdGFuY2VzGAIgAygLMhcub2xpdmV0aW4uYXBpLnYxLkVudGl0eRIaChJ1c2VkX29uX2Rhc2hib2FyZHMYAyADKAkiNAoQR2V0RW50aXR5UmVxdWVzdBISCgp1bmlxdWVfa2V5GAEgASgJEgwKBHR5cGUYAiABKAkyphEKEk9saXZlVGluQXBpU2VydmljZRJdCgxHZXREYXNoYm9hcmQSJC5vbGl2ZXRpbi5hcGkudjEuR2V0RGFzaGJvYXJkUmVxdWVzdBolLm9saXZldGluLmFwaS52MS5HZXREYXNoYm9hcmRSZXNwb25zZSIAEloKC1N0YXJ0QWN0aW9uEiMub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uUmVxdWVzdBokLm9saXZldGluLmFwaS52MS5TdGFydEFjdGlvblJlc3BvbnNlIgASbwoSU3RhcnRBY3Rpb25BbmRXYWl0Eioub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uQW5kV2FpdFJlcXVlc3QaKy5vbGl2ZXRpbi5hcGkudjEuU3RhcnRBY3Rpb25BbmRXYWl0UmVzcG9uc2UiABJpChBTdGFydEFjdGlvbkJ5R2V0Eigub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uQnlHZXRSZXF1ZXN0Gikub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uQnlHZXRSZXNwb25zZSIAEn4KF1N0YXJ0QWN0aW9uQnlHZXRBbmRXYWl0Ei8ub2xpdmV0aW4uYXBpLnYxLlN0YXJ0QWN0aW9uQnlHZXRBbmRXYWl0UmVxdWVzdBowLm9saXZldGluLmFwaS52MS5TdGFydEFjdGlvbkJ5R2V0QW5kV2FpdFJlc3BvbnNlIgASVwoKS2lsbEFjdGlvbhIiLm9saXZldGluLmFwaS52MS5LaWxsQWN0aW9uUmVxdWVzdBojLm9saXZldGluLmFwaS52MS5LaWxsQWN0aW9uUmVzcG9uc2UiABJmCg9FeGVjdXRpb25TdGF0dXMSJy5vbGl2ZXRpbi5hcGkudjEuRXhlY3V0aW9uU3RhdHVzUmVxdWVzdBooLm9saXZldGluLmFwaS52MS5FeGVjdXRpb25TdGF0dXNSZXNwb25zZSIAEk4KB0dldExvZ3MSHy5vbGl2ZXRpbi5hcGkudjEuR2V0TG9nc1JlcXVlc3QaIC5vbGl2ZXRpbi5hcGkudjEuR2V0TG9nc1Jlc3BvbnNlIgASdQoUVmFsaWRhdGVBcmd1bWVudFR5cGUSLC5vbGl2ZXRpbi5hcGkudjEuVmFsaWRhdGVBcmd1bWVudFR5cGVSZXF1ZXN0Gi0ub2xpdmV0aW4uYXBpLnYxLlZhbGlkYXRlQXJndW1lbnRUeXBlUmVzcG9uc2UiABJLCgZXaG9BbUkSHi5vbGl2ZXRpbi5hcGkudjEuV2hvQW1JUmVxdWVzdBofLm9saXZldGluLmFwaS52MS5XaG9BbUlSZXNwb25zZSIAElQKCVNvc1JlcG9ydBIhLm9saXZldGluLmFwaS52MS5Tb3NSZXBvcnRSZXF1ZXN0GiIub2xpdmV0aW4uYXBpLnYxLlNvc1JlcG9ydFJlc3BvbnNlIgASUQoIRHVtcFZhcnMSIC5vbGl2ZXRpbi5hcGkudjEuRHVtcFZhcnNSZXF1ZXN0GiEub2xpdmV0aW4uYXBpLnYxLkR1bXBWYXJzUmVzcG9uc2UiABJ4ChVEdW1wUHVibGljSWRBY3Rpb25NYXASLS5vbGl2ZXRpbi5hcGkudjEuRHVtcFB1YmxpY0lkQWN0aW9uTWFwUmVxdWVzdBouLm9saXZldGluLmFwaS52MS5EdW1wUHVibGljSWRBY3Rpb25NYXBSZXNwb25zZSIAElQKCUdldFJlYWR5ehIhLm9saXZldGluLmFwaS52MS5HZXRSZWFkeXpSZXF1ZXN0GiIub2xpdmV0aW4uYXBpLnYxLkdldFJlYWR5elJlc3BvbnNlIgASYwoOTG9jYWxVc2VyTG9naW4SJi5vbGl2ZXRpbi5hcGkudjEuTG9jYWxVc2VyTG9naW5SZXF1ZXN0Gicub2xpdmV0aW4uYXBpLnYxLkxvY2FsVXNlckxvZ2luUmVzcG9uc2UiABJdCgxQYXNzd29yZEhhc2gSJC5vbGl2ZXRpbi5hcGkudjEuUGFzc3dvcmRIYXNoUmVxdWVzdBolLm9saXZldGluLmFwaS52MS5QYXNzd29yZEhhc2hSZXNwb25zZSIAEksKBkxvZ291dBIeLm9saXZldGluLmFwaS52MS5Mb2dvdXRSZXF1ZXN0Gh8ub2xpdmV0aW4uYXBpLnYxLkxvZ291dFJlc3BvbnNlIgASXAoLRXZlbnRTdHJlYW0SIy5vbGl2ZXRpbi5hcGkudjEuRXZlbnRTdHJlYW1SZXF1ZXN0GiQub2xpdmV0aW4uYXBpLnYxLkV2ZW50U3RyZWFtUmVzcG9uc2UiADABEmMKDkdldERpYWdub3N0aWNzEiYub2xpdmV0aW4uYXBpLnYxLkdldERpYWdub3N0aWNzUmVxdWVzdBonLm9saXZldGluLmFwaS52MS5HZXREaWFnbm9zdGljc1Jlc3BvbnNlIgASRQoESW5pdBIcLm9saXZldGluLmFwaS52MS5Jbml0UmVxdWVzdBodLm9saXZldGluLmFwaS52MS5Jbml0UmVzcG9uc2UiABJpChBHZXRBY3Rpb25CaW5kaW5nEigub2xpdmV0aW4uYXBpLnYxLkdldEFjdGlvbkJpbmRpbmdSZXF1ZXN0Gikub2xpdmV0aW4uYXBpLnYxLkdldEFjdGlvbkJpbmRpbmdSZXNwb25zZSIAEloKC0dldEVudGl0aWVzEiMub2xpdmV0aW4uYXBpLnYxLkdldEVudGl0aWVzUmVxdWVzdBokLm9saXZldGluLmFwaS52MS5HZXRFbnRpdGllc1Jlc3BvbnNlIgASSQoJR2V0RW50aXR5EiEub2xpdmV0aW4uYXBpLnYxLkdldEVudGl0eVJlcXVlc3QaFy5vbGl2ZXRpbi5hcGkudjEuRW50aXR5IgBCOFo2Z2l0aHViLmNvbS9PbGl2ZVRpbi9PbGl2ZVRpbi9nZW4vb2xpdmV0aW4vYXBpL3YxO2FwaXYxYgZwcm90bzM"); /** * Describes the message olivetin.api.v1.Action. @@ -39,10 +39,10 @@ export const EntitySchema = /*@__PURE__*/ messageDesc(file_olivetin_api_v1_olivetin, 3); /** - * Describes the message olivetin.api.v1.GetDashboardComponentsResponse. - * Use `create(GetDashboardComponentsResponseSchema)` to create a new message. + * Describes the message olivetin.api.v1.GetDashboardResponse. + * Use `create(GetDashboardResponseSchema)` to create a new message. */ -export const GetDashboardComponentsResponseSchema = /*@__PURE__*/ +export const GetDashboardResponseSchema = /*@__PURE__*/ messageDesc(file_olivetin_api_v1_olivetin, 4); /** @@ -53,10 +53,10 @@ export const EffectivePolicySchema = /*@__PURE__*/ messageDesc(file_olivetin_api_v1_olivetin, 5); /** - * Describes the message olivetin.api.v1.GetDashboardComponentsRequest. - * Use `create(GetDashboardComponentsRequestSchema)` to create a new message. + * Describes the message olivetin.api.v1.GetDashboardRequest. + * Use `create(GetDashboardRequestSchema)` to create a new message. */ -export const GetDashboardComponentsRequestSchema = /*@__PURE__*/ +export const GetDashboardRequestSchema = /*@__PURE__*/ messageDesc(file_olivetin_api_v1_olivetin, 6); /** @@ -395,6 +395,76 @@ export const GetDiagnosticsRequestSchema = /*@__PURE__*/ export const GetDiagnosticsResponseSchema = /*@__PURE__*/ messageDesc(file_olivetin_api_v1_olivetin, 54); +/** + * Describes the message olivetin.api.v1.InitRequest. + * Use `create(InitRequestSchema)` to create a new message. + */ +export const InitRequestSchema = /*@__PURE__*/ + messageDesc(file_olivetin_api_v1_olivetin, 55); + +/** + * Describes the message olivetin.api.v1.InitResponse. + * Use `create(InitResponseSchema)` to create a new message. + */ +export const InitResponseSchema = /*@__PURE__*/ + messageDesc(file_olivetin_api_v1_olivetin, 56); + +/** + * Describes the message olivetin.api.v1.AdditionalLink. + * Use `create(AdditionalLinkSchema)` to create a new message. + */ +export const AdditionalLinkSchema = /*@__PURE__*/ + messageDesc(file_olivetin_api_v1_olivetin, 57); + +/** + * Describes the message olivetin.api.v1.OAuth2Provider. + * Use `create(OAuth2ProviderSchema)` to create a new message. + */ +export const OAuth2ProviderSchema = /*@__PURE__*/ + messageDesc(file_olivetin_api_v1_olivetin, 58); + +/** + * Describes the message olivetin.api.v1.GetActionBindingRequest. + * Use `create(GetActionBindingRequestSchema)` to create a new message. + */ +export const GetActionBindingRequestSchema = /*@__PURE__*/ + messageDesc(file_olivetin_api_v1_olivetin, 59); + +/** + * Describes the message olivetin.api.v1.GetActionBindingResponse. + * Use `create(GetActionBindingResponseSchema)` to create a new message. + */ +export const GetActionBindingResponseSchema = /*@__PURE__*/ + messageDesc(file_olivetin_api_v1_olivetin, 60); + +/** + * Describes the message olivetin.api.v1.GetEntitiesRequest. + * Use `create(GetEntitiesRequestSchema)` to create a new message. + */ +export const GetEntitiesRequestSchema = /*@__PURE__*/ + messageDesc(file_olivetin_api_v1_olivetin, 61); + +/** + * Describes the message olivetin.api.v1.GetEntitiesResponse. + * Use `create(GetEntitiesResponseSchema)` to create a new message. + */ +export const GetEntitiesResponseSchema = /*@__PURE__*/ + messageDesc(file_olivetin_api_v1_olivetin, 62); + +/** + * Describes the message olivetin.api.v1.EntityDefinition. + * Use `create(EntityDefinitionSchema)` to create a new message. + */ +export const EntityDefinitionSchema = /*@__PURE__*/ + messageDesc(file_olivetin_api_v1_olivetin, 63); + +/** + * Describes the message olivetin.api.v1.GetEntityRequest. + * Use `create(GetEntityRequestSchema)` to create a new message. + */ +export const GetEntityRequestSchema = /*@__PURE__*/ + messageDesc(file_olivetin_api_v1_olivetin, 64); + /** * @generated from service olivetin.api.v1.OliveTinApiService */ diff --git a/frontend/resources/vue/ActionButton.vue b/frontend/resources/vue/ActionButton.vue index e4fa773..93b2fcb 100644 --- a/frontend/resources/vue/ActionButton.vue +++ b/frontend/resources/vue/ActionButton.vue @@ -1,27 +1,43 @@ - - - - {{ displayTitle }} - + + - - + + + + + + + + + + + + + + {{ displayTitle }} + + + \ No newline at end of file + +.navigate-on-start-container { + position: relative; + margin-left: auto; + height: 0; + right: 0; + top: 0; +} + + diff --git a/frontend/resources/vue/App.vue b/frontend/resources/vue/App.vue index b4986a5..ad0df39 100644 --- a/frontend/resources/vue/App.vue +++ b/frontend/resources/vue/App.vue @@ -1,29 +1,29 @@ - + + - - OliveTin - + OliveTin - ☰ + + + + + + + + - + + {{ bannerMessage }} + - - Login | - Logout | - - - - - - - + + Login + Logout + {{ username }} + @@ -32,15 +32,15 @@ - + - -
This server is not configured with either OAuth, or local users, so you cannot login.
{{ bannerMessage }}