UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

554 lines (549 loc) 138 kB
import * as _c8y_ngx_components from '@c8y/ngx-components'; import { TabsService, ExtensionFactory, Tab, ViewContext, ContextData, DynamicComponentDefinition, Route, Widget, WidgetSettings, WidgetDisplaySettings, TabWithTemplate, ModalService, NavigatorService, Permissions, AlertService, DynamicComponentService, GroupService, OptionsService, AppStateService, ContextRouteService, GainsightService, BreadcrumbItem, WidgetsDashboardComponent, DashboardCopyPermission, BottomDrawerService, ActionBarService, DashboardChildChange, DashboardChange, RevertChangeType, WidgetChange, GenericHookType, GenericHookOptions, ExtensionPointForPlugins, PluginsResolveService, DynamicComponentComponent, WIDGET_CONFIGURATION_GRID_SIZE, BottomDrawerRef, ActionBarFactory, PreviewService } from '@c8y/ngx-components'; import * as i8 from '@angular/router'; import { Router, ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; import * as i0 from '@angular/core'; import { InjectionToken, OnInit, OnChanges, OnDestroy, EventEmitter, Renderer2, DestroyRef, Type, Injector, TemplateRef, AfterContentInit, ViewContainerRef, ModuleWithProviders, AfterViewInit } from '@angular/core'; import { ContextDashboardStateService } from '@c8y/ngx-components/context-dashboard-state'; import { TranslateService } from '@ngx-translate/core'; import * as _c8y_client from '@c8y/client'; import { IManagedObject, QueriesUtil, InventoryService, IResultList } from '@c8y/client'; import { Observable } from 'rxjs/internal/Observable'; import { SupportedIconsSuggestions } from '@c8y/ngx-components/icon-selector/icons'; import * as rxjs from 'rxjs'; import { Observable as Observable$1, BehaviorSubject, Subject, Subscription } from 'rxjs'; import * as _angular_forms from '@angular/forms'; import { FormBuilder, NgForm } from '@angular/forms'; import * as i2 from 'ngx-bootstrap/tooltip'; import * as i3 from 'ngx-bootstrap/popover'; import * as i4 from '@c8y/ngx-components/assets-navigator'; import { AssetSelectorOptions, AssetSelectionChangeEvent } from '@c8y/ngx-components/assets-navigator'; import * as i5 from '@c8y/ngx-components/icon-selector'; import * as i6 from 'ngx-bootstrap/dropdown'; import * as i7 from 'ngx-bootstrap/collapse'; import * as i1 from '@angular/common'; import { WidgetControlsPresetConfig, WidgetControls, PresetName, PresetDefinition, GlobalContextEvent, GlobalContextState } from '@c8y/ngx-components/global-context'; declare class AddDashboardComponent { private tabsService; private router; constructor(tabsService: TabsService, router: Router); addDashboard(): void; static ɵfac: i0.ɵɵFactoryDeclaration<AddDashboardComponent, never>; static ɵcmp: i0.ɵɵComponentDeclaration<AddDashboardComponent, "[c8y-add-dashboard]", never, {}, {}, never, never, true, never>; } declare abstract class AddDashboardFactory implements ExtensionFactory<Tab> { protected abstract targetContext: ViewContext.Device | ViewContext.Group; currentContext: ContextData; private permissions; private contextRoute; get(activatedRoute?: ActivatedRoute): Promise<Tab | Tab[]>; private hasPermission; } declare const CONTEXT_DASHBOARD_CONFIG: InjectionToken<any>; declare const DASHBOARD_SETTINGS_CHANGES: { readonly classes: "theme"; readonly globalRolesIds: "global roles"; readonly widgetClasses: "widget header style"; readonly widgetMargin: "widget margin"; readonly icon: "icon"; readonly name: "name"; readonly priority: "priority"; readonly c8y_IsNavigatorNode: "navigator item"; readonly translateWidgetTitle: "translate widget title"; readonly translateDashboardTitle: "translate dashboard title"; readonly children: "widgets"; }; interface ContextDashboardConfig { widgetFilter?: (component: DynamicComponentDefinition) => boolean; allowFullscreen?: boolean; /** * @deprecated */ routes?: Route[]; } interface ContextWidgetConfig { /** * Settings that define how the default config component is * displayed. They are static and will not be saved. */ settings?: WidgetSettings; /** * Settings that are injected in any displaying component. */ displaySettings?: WidgetDisplaySettings; /** * Whatever should be added to the configuration when a widget is created. */ config?: { /** * Any other information that should be stored here. */ [key: string]: any; }; /** * The selected device or group (note: naming is inconsistent as group was added later * but must stay for already implemented widgets) */ device?: { id?: string | number; name?: string; [key: string]: any; }; /** * Method to export the widget configuration during dashboard export to a json file. It enhances the configuration with * additional data that can be used later by the `import` method to restore the widget configuration in a new context. * @param config Widget configuration * @return Enhanced widget configuration */ export?: (config: any) => any | Promise<any>; /** * Method to import the widget configuration during dashboard import from a json file. It restores the widget configuration * with data exported by the `export` method. * @param config Widget configuration enhanced with export method * @param dashboardData Dashboard metadata * @return Restored widget configuration */ import?: (config: any, dashboardData: DashboardMetadata) => any | Promise<any>; /** * Any other information that should be stored here. */ [key: string]: any; } interface ContextDashboardManagedObject extends IManagedObject { c8y_Dashboard?: ContextDashboard; name?: string; c8y_DashboardHistory?: ContextDashboard[]; } interface ContextDashboard { icon?: SupportedIconsSuggestions | null; name?: string | null; priority?: number | null; deviceType?: boolean | null; deviceTypeValue?: string | null; isFrozen?: boolean | null; classes?: { [key: string]: boolean; } | null; widgetClasses?: { [key: string]: boolean; } | null; widgetMargin?: number | null; translateWidgetTitle?: boolean | null; translateDashboardTitle?: boolean | null; global?: boolean | null; /** * The amount of columns on that dashboard. * Can be freely chosen, but product uses either 12 or 24. */ columns?: number | null; children?: { [id: string]: Widget; }; globalRolesIds?: DashboardGlobalRoles | null; c8y_IsNavigatorNode?: object | null; description?: string | null; historyDescription?: DashboardHistoryDescription | null; created?: string | null; author?: string | null; dashboardState?: { [key: string]: any; }; } /** * Object describing changes applied to dashboard settings and its widgets. Used to display user-friendly change log. */ interface DashboardHistoryDescription { /** * Indicates type of dashboard change (or creation). */ changeType?: 'reset' | 'create' | 'update' | null; /** * List of dashboard settings that has been changed. */ dashboardSettingChanges?: (typeof DASHBOARD_SETTINGS_CHANGES)[keyof typeof DASHBOARD_SETTINGS_CHANGES][]; /** * True if dashboard is typed dashboard, false if it's not. */ deviceType?: boolean | null; /** * Object containing lists of widgets (by title) that has been changed, grouped by change type, e.g.: * ```ts * widgetChanges: { * removed: ['Applications'], * config?: ['Data points graph', 'Events list'], * }, * ``` */ widgetChanges?: { removed?: string[]; added?: string[]; config?: string[]; arrangement?: string[]; } | null; /** * String used to display the date from which the state was restored. */ restored?: string; } declare const DASHBOARD_CHILDREN_STATE_NAME: { readonly initial: "Initial state"; readonly config: "Widget configuration changed"; readonly removed: "Widget removed"; readonly added: "Widget added"; readonly arrangement: "Widgets rearranged"; }; /** * Object representing state of dashboard widgets. Its main purpose is to allow to undo and redo changes * applied to dashboard children. */ type DashboardChildrenState = { /** * Name of the change applied to dashboard that results in current state, e.g. 'widget removed' */ name: (typeof DASHBOARD_CHILDREN_STATE_NAME)[keyof typeof DASHBOARD_CHILDREN_STATE_NAME]; /** * Dashboard children in particular, immutable state. */ children: ContextDashboard['children']; /** * Object describing changes applied to dashboard widgets that can be easily mapped to DashboardHistoryDescription widgetChanges. * ```ts * { * removed: { * 0969692617637703: { componentId: "Data points graph", config: {...}, classes: {...} ...} * }, * config: { * 6347567345767653: { componentId: "Applications", config: {...}, classes: {...} ...}, * 6456345634564566: { componentId: "Events list", config: {...}, classes: {...} ...}, * } * } * ``` */ changeHistory: Partial<Record<keyof DashboardHistoryDescription['widgetChanges'], { [id: string]: Widget; }>>; }; declare enum ContextDashboardType { Device = "device", Type = "type", Group = "group", Named = "name", Report = "report" } declare enum DashboardDetailsTabId { GENERAL = "general", APPEARANCE = "appearance", VERSIONHISTORY = "versionHistory" } type DashboardDetailsTabs = Record<DashboardDetailsTabId, TabWithTemplate<string> & { featureId: DashboardDetailsTabId; }>; interface DashboardAndWidgetThemeDefinition { label: string; class: string; description: string; } declare const WIDGET_HEADER_CLASSES: [{ readonly label: "Regular`style`"; readonly class: "panel-title-regular"; readonly description: "The widget has no border between header and content."; }, { readonly label: "Border`style`"; readonly class: "panel-title-border"; readonly description: "The widget has a small separation border between header and content."; }, { readonly label: "Overlay`style`"; readonly class: "panel-title-overlay"; readonly description: "The widget content overlays the header."; }, { readonly label: "Hidden`style`"; readonly class: "panel-title-hidden"; readonly description: "The widget header is not shown."; }]; declare const WIDGET_CONTENT_CLASSES: [{ readonly label: "Branded`style`"; readonly class: "panel-content-branded"; readonly description: "The widget is styled with the main brand color."; }, { readonly label: "Match dashboard`style`"; readonly class: "panel-content-light"; readonly description: "The widget appearance matches the dashboard appearance."; }, { readonly label: "Light`style`"; readonly class: "panel-content-white"; readonly description: "The widget has light appearance, that is, dark text on light background."; }, { readonly label: "Dark`style`"; readonly class: "panel-content-dark"; readonly description: "The widget has dark appearance, that is, light text on dark background."; }, { readonly label: "Transparent`style`"; readonly class: "panel-content-transparent"; readonly description: "The widget has no background."; }]; declare const DASHBOARD_THEME_CLASSES: [{ readonly label: "Match UI`theme`"; readonly class: "dashboard-theme-light"; readonly description: "The dashboard appearance matches the UI appearance."; }, { readonly label: "Light`theme`"; readonly class: "dashboard-theme-white"; readonly description: "The dashboard has light appearance, that is, dark text on light background."; }, { readonly label: "Dark`theme`"; readonly class: "dashboard-theme-dark"; readonly description: "The dashboard has dark appearance, that is, light text on dark background."; }, { readonly label: "Branded`theme`"; readonly class: "dashboard-theme-branded"; readonly description: "The dashboard is styled using the brand palette."; }]; declare const STYLING_CLASS_PREFIXES: readonly ["dashboard-theme-", "panel-title-", "panel-content-"]; interface DashboardCopyClipboard { dashboardId: string; dashboard: ContextDashboard; context: DashboardContext; } interface DashboardContext { context: ViewContext; contextData: Partial<IManagedObject>; } declare const ALL_GLOBAL_ROLES_SELECTED: "all"; type DashboardGlobalRoles = number[] | typeof ALL_GLOBAL_ROLES_SELECTED; declare const PRODUCT_EXPERIENCE: { readonly DASHBOARD: { readonly EVENTS: { readonly DASHBOARDS: "dashboards"; readonly REPORTS: "reports"; readonly DASHBOARD_TEMPLATE: "dashboardTemplate"; }; readonly COMPONENTS: { readonly DASHBOARD_VIEW: "context-dashboard"; readonly DASHBOARD_AVAILABILITY: "dashboard-availability"; readonly REPORTS_LIST: "report-dashboard-list"; readonly ADD_REPORT: "report-dashboard-list"; readonly ADD_DASHBOARD: "add-dashboard"; readonly DELETE_DASHBOARD: "context-dashboard"; readonly TYPED_DASHBOARD_SETTINGS: "typed-dashboard-settings"; }; readonly CONTEXT: { readonly REPORT: "report"; readonly DEVICE: "device"; readonly ASSET: "asset"; readonly GROUP: "group"; }; readonly ACTIONS: { readonly APPLY_GLOBAL_ROLES_CHANGES: "applyGlobalRolesChanges"; readonly DELETE: "delete"; readonly LOAD: "load"; readonly CREATE: "create"; readonly ADD_REPORT: "addReport"; readonly DUPLICATE_AS_REGULAR_DASHBOARD: "duplicateAsRegularDashboard"; }; }; }; interface CanDeactivateComponent { canDeactivate: () => boolean | Observable<boolean> | Promise<boolean>; } declare const REPORT_DEFAULT_NAVIGATION_NODE_PRIORITY = 30; type AllowTypeDashboard = 'allow' | 'disallow' | 'allow_if_type_filled'; declare const DASHBOARD_DETAILS_OUTLET: "dashboard-details"; declare const DASHBOARD_DETAILS_TABS_OUTLET_NAME: "dashboardTabs"; interface DashboardMetadata { isReport: boolean; isNamedDashboard: boolean; hideAvailability: boolean; dashboard: ContextDashboard; deviceTypeValue: string; displayDeviceTypeValue: string; mo: ContextDashboardManagedObject; allowTypeDashboard: AllowTypeDashboard; isDevice: boolean; context: any; } declare class ContextDashboardService { private inventory; private tabs; private modal; private translateService; private router; private navigator; private permissions; private alert; private dynamicComponent; private groupService; private optionsService; private appStateService; private contextRouteService; dashboardTabs$: Observable$1<Tab[]>; formDisabled$: Observable$1<boolean>; readonly REPORT_PARTIAL_NAME = "report_"; copyClipboard: DashboardCopyClipboard; queriesUtil: QueriesUtil; readonly VERSION_HISTORY_SIZE_LIMIT = 10; private readonly INVENTORY_ROLES; private cache; private readonly DEFAULT_PAGESIZE; private readonly FRAGMENT_NAME; private readonly APPLIED_TO_FRAGMENT; private readonly DASHBOARD_ROUTE_PATH; private readonly INDEX_SPLIT; private readonly CACHE_TIMEOUT; private _formDisabled; private formDisabledSubject; private contextDashboardsCache; private appName; private readonly HIDE_TYPE_DASHBOARD_FOR_ASSETS; get formDisabled(): boolean; set formDisabled(value: boolean); constructor(inventory: InventoryService, tabs: TabsService, modal: ModalService, translateService: TranslateService, router: Router, navigator: NavigatorService, permissions: Permissions, alert: AlertService, dynamicComponent: DynamicComponentService, groupService: GroupService, optionsService: OptionsService, appStateService: AppStateService, contextRouteService: ContextRouteService); create(dashboardCfg: ContextDashboard, context?: ContextData, name?: string): Promise<ContextDashboardManagedObject>; detail(dashboardMO: ContextDashboardManagedObject): Promise<IManagedObject>; update(dashboard: ContextDashboardManagedObject, context?: ContextData): Promise<ContextDashboardManagedObject>; delete(dashboard: ContextDashboardManagedObject, withConfirmation?: boolean): Promise<void>; updateDashboardHistory(dashboard: Partial<ContextDashboardManagedObject>, dashboardCfg: ContextDashboard): Partial<ContextDashboardManagedObject>; activateDashboards(route: ActivatedRouteSnapshot, types: ContextDashboardType[]): Observable$1<boolean | Tab[]>; getDashboard(name: string, defaultWidgets: Widget[]): Observable$1<ContextDashboardManagedObject>; updateNavigatorItem(mo: IManagedObject): void; navigateToDashboard(dashboardMO: ContextDashboardManagedObject, isNewDashboard?: boolean): Promise<void>; /** * Checks if user is able to edit dashboard according to his roles and dashboard ownership. * * @param mo - Dashboard managed object. * @returns True if user is able to edit dashboard, false if he cannot. */ canEditDashboard(mo: ContextDashboardManagedObject): Promise<boolean>; /** * Checks if user has permissions to copy dashboard according to his roles. * * @returns True if user has permissions to copy dashboard, false if he cannot. */ hasPermissionsToCopyDashboard(): boolean; isNamed(dashboard: Partial<ContextDashboardManagedObject>): any; isReport(dashboard: Partial<ContextDashboardManagedObject>): any; isDeviceType(dashboard: Partial<ContextDashboardManagedObject>): any; isDeviceDashboard(dashboard: Partial<ContextDashboardManagedObject>): boolean; isGroupDashboard(dashboard: Partial<ContextDashboardManagedObject>): boolean; getFilteredDashboardStyles(styleList: string[]): string[]; getStyling(styleList: any, styleName: any, defaultValue: any): any; mapWidgets(widgets: Widget[]): any; getDashboard$(dashboardIdOrName: any, dashboardType: ContextDashboardType[], mo?: IManagedObject): Observable$1<ContextDashboardManagedObject>; pasteDashboard(newContext: DashboardContext): Promise<void>; /** * Creates fragment that associates dashboards with device/asset. It consists of three elements: * - FRAGMENT_NAME - static string * - dashboard type (e.g. 'group', 'device') * - fragment value ( id of device/asset if it is not typed dashboard; deviceTypeValue property of dashboard if it is type dashboard) * Example fragment for device dashboard: 'c8y_Dashboard!device!773200' * Example fragment for group dashboard: 'c8y_Dashboard!group!84129208' * Example fragment for typed device dashboard: 'c8y_Dashboard!type!c8y_lwm2m_connector_device' * * @param contextDashboardType Type of dashboard * @param value Fragment value * @returns Fragment for dashboard */ createFragmentKey<T extends ContextDashboardType, V extends string>(contextDashboardType: T, value: V): `c8y_Dashboard!${T}!${V}`; /** * Indicates if dashboard can be set to type dashboard. * First, it checks if deviceTypeValue exists and if user has permission to set dashboard type. * Then, case from sensor app is checked- dashboard created with sensor app has deviceType set to true but * type fragment is missing- we do not support this combination. * @param mo Dashboard managed object * @param context {ContextData} Current context * @returns True if dashboard can be set to type dashboard, false if it is forbidden. */ shouldAllowToSetDashboardType(mo: ContextDashboardManagedObject, context: ContextData): AllowTypeDashboard; createReport(reportCfg: Partial<IManagedObject>): Promise<_c8y_client.IResult<IManagedObject>>; addReportNavigatorNode(report: IManagedObject): void; getContextForGS(mo: IManagedObject): string | null; getContextDashboards(mo: IManagedObject, dashboardType: ContextDashboardType[]): Promise<IResultList<IManagedObject>>; appliedToFilter(): { __or?: undefined; } | { __or: ({ __not: { __has: string; }; c8y_AppliedToApplications?: undefined; } | { c8y_AppliedToApplications: { __in: string[]; }; __not?: undefined; })[]; }; /** * Creates a tuple describing the dashboard type and its fragments. For assets like devices and groups, it's possible * to have two fragments: one indicating this particular device/asset with its ID, and the second indicating * the device/asset type (if the dashboard is meant to be applied to all assets of this type). * * @param dashboardMO - Dashboard managed object. * @param context - Context data of asset. * @param name - Name of the dashboard. * @param isEdit - True if existing dashboard is updated, false when it's creation of new dashboard. * @returns Tuple of dashboard type and object containing dashboard fragments. */ private getDashboardFragments; /** * Clears fragments that originates from other managed object. * E.g. typed dashboard is created for device A of type c8y_MQTTDevice and id 1, so it gets fragments object * ```ts * { * c8y_Dashboard!device!1: {}, * c8y_Dashboard!type!c8y_MQTTDevice: {} * } *``` * then, on device B of type c8y_MQTTDevice and id 2, which also has access to this dashboard, deviceType is set to * false, so dashboard is not typed dashboard anymore and now belongs to device B, therefore fragments should look like * ```ts * { * c8y_Dashboard!device!1: null, // this value is cleared because dashboard is doesn't belong to device A anymore * c8y_Dashboard!device!2: {}, // assign dashboard to device B * c8y_Dashboard!type!c8y_MQTTDevice: null // this value is cleared in getDashboardFragments method as it's not typed dashboard anymore * } * ``` * * @param dashboardMO - Dashboard managed object. * @param type - Context dashboard type. * @param fragments - Fragments object. */ private clearRedundantFragment; /** * Used to migrate dashboards from previous 12 columns layout to 24 columns. */ private adjustDashboardFor24Columns; private serializeWidgetConfigs; private createContextDashboardCopy; private copyProperties; private replaceContextInDataPoints; private replaceContextInObj; private getTabs$; private verifyDashboardAvailability$; private getContextDashboards$; /** * Cleans already corrupted dashboards from dashboardMo property. * Added to fix dashboards on the cloud instance (eu-latest). * @deprecated This is going to be removed after 1007.7.0. */ private removeDashboardMoProperty; private cacheDashboard; private createDashboardTab; private clean; private getNamedDashboard; private createDashboardFragment; private shouldSetGlobal; private getDefaultDashboard; static ɵfac: i0.ɵɵFactoryDeclaration<ContextDashboardService, never>; static ɵprov: i0.ɵɵInjectableDeclaration<ContextDashboardService>; } declare class DashboardDetailService { private fb; private translateService; private tabsService; dashboardDetailsForm: ReturnType<DashboardDetailService['createDashboardDetailsForm']>; details: DashboardMetadata; detailsTabs: Tab[]; saveButtonDisabled: boolean; get generalSettingsForm(): _angular_forms.AbstractControl<{ deviceType: boolean; icon: "string" | "columns" | "settings" | "export" | "import" | "collapse-arrow" | "angle-up" | "chevron-up" | "forward" | "angle-right" | "chevron-right" | "chevron-breadcrumb" | "expand-arrow" | "angle-down" | "chevron-down" | "caret-back" | "angle-left" | "chevron-left" | "chevron-double-left" | "chevron-double-right" | "chevron-double-up" | "chevron-double-down" | "chevron-circle-up" | "chevron-circle-right" | "chevron-circle-down" | "chevron-circle-left" | "arrow-up" | "arrow-right" | "arrow-down" | "arrow-left" | "panel-control-up" | "angle-double-up" | "panel-control-right" | "angle-double-right" | "panel-control-down" | "angle-double-down" | "panel-control-left" | "angle-double-left" | "download" | "upload" | "internal" | "external" | "undo" | "redo" | "signout" | "signin" | "login" | "sign-in" | "logout" | "sign-out" | "arrow-circle-up" | "arrow-circle-o-up" | "arrow-circle-right" | "arrow-circle-o-right" | "arrow-circle-down" | "arrow-circle-o-down" | "arrow-circle-left" | "arrow-circle-o-left" | "arrow-circle-up-left" | "arrow-circle-down-left" | "arrow-circle-up-right" | "arrow-circle-bottom-right" | "arrow-circle-diameter" | "arrow-circle-divide-horizontal" | "arrow-circle-minimize-horizontal" | "caret-square-o-up" | "toggle-up" | "caret-square-o-down" | "toggle-down" | "caret-square-o-left" | "toggle-left" | "caret-square-o-right" | "toggle-right" | "enter-bottom" | "enter-right" | "enter-top" | "enter-left" | "exit-top" | "exit-right" | "exit-bottom" | "exit-left" | "input-output" | "rotate-right" | "rotate" | "repeat" | "reset" | "rotate-left" | "restore" | "refresh" | "process" | "recycle" | "refresh-exception" | "lock-orientation" | "arrow-dotted-up" | "arrow-dotted-right" | "arrow-advance" | "arrow-dotted-down" | "arrow-dotted-left" | "arrows-dotted-left-right" | "arrows-dotted-up-down" | "up-down-arrows" | "collect" | "merge-horizontal" | "split-horizontal" | "merge-vertical" | "divider" | "split-vertical" | "drag" | "arrows" | "move-step" | "resize-expand" | "arrows-alt" | "expand" | "compress" | "resize-collapse" | "collapse" | "fullscreen" | "fullscreen-exit" | "long-arrow-up" | "long-arrow-right" | "long-arrow-down" | "long-arrow-left" | "arrows-v" | "arrows-h" | "enlarge" | "data-transfer" | "exchange" | "sort-arrow" | "arrows-left-right-diagonal" | "level-up" | "level-down" | "u-turn" | "u-turn-right" | "u-turn-left" | "undo1" | "redo1" | "sort" | "unsorted" | "sort-down" | "sort-desc" | "sort-up" | "sort-asc" | "caret-up" | "caret-right" | "caret-down" | "caret-left" | "squiggly-arrow" | "curly-arrow" | "swap" | "environment" | "shuffle" | "random" | "swipe-up" | "swipe-right" | "swipe-down" | "swipe-left" | "two-finger-swipe-up" | "two-finger-swipe-right" | "two-finger-swipe-down" | "two-finger-swipe-left" | "pinch" | "hospital-o" | "h-square" | "university" | "institution" | "bank" | "ios-themes" | "building" | "building-o" | "apartment" | "department1" | "organization" | "office" | "building-with-rooftop-terrace" | "company" | "warehouse" | "shop" | "work-from-home" | "house" | "dog-house" | "home-automation" | "garage-door" | "depot" | "garage" | "open-garage-door" | "close-garage-door" | "barn" | "bungalow" | "exterior" | "equal-housing-opportunity" | "heating-room" | "mortgage" | "home-safety" | "enterprise-resource-planning" | "travel-agency" | "department-shop" | "book-shelf" | "emergency-exit" | "stairs" | "stairs-down" | "stairs-up" | "temperature-inside" | "treehouse" | "tree" | "water-heater" | "clean" | "magic" | "storage" | "60-degrees" | "120-degrees" | "225-degrees" | "300-degrees" | "360-degrees" | "pie-chart" | "bar-chart" | "bar-chart-o" | "data-account" | "data-decline" | "increase" | "neutral-trading" | "decrease" | "timeline" | "increase-profits" | "combo-chart" | "line-chart" | "graph" | "area-chart" | "sorting-slider" | "sliders" | "hierarchy" | "b2b" | "flow-chart" | "sitemap" | "tree-structure" | "flow" | "stacked-organizational-chart" | "multicast" | "unicast" | "broadcasting" | "genealogy" | "filter" | "conversion" | "clear-filters" | "descending-sorting" | "sort-amount-desc" | "ascending-sorting" | "sort-amount-asc" | "alphabetical-sorting" | "sort-alpha-asc" | "alphabetical-sorting-2" | "sort-alpha-desc" | "data-exchange" | "filing-cabinet" | "database" | "database-administrator" | "data-export" | "data-import" | "grid-off" | "gantt-chart" | "data-grid" | "grid-view" | "grid-on" | "row" | "rows" | "column" | "grid" | "table" | "split-table" | "data-sheet" | "blockchain-technology" | "workflow" | "parallel-workflow" | "mind-map" | "query-inner-join-left" | "sankey" | "creating" | "creativity" | "financial-growth-analysis" | "input" | "omnichannel" | "variable" | "variable-on" | "future" | "time-machine" | "history" | "delivery-time" | "schedule" | "clock" | "clock-o" | "watches-front-view" | "clock1" | "clock11" | "alarm1" | "timer" | "wall-clock" | "alarm-add" | "alarm-on" | "alarm-off" | "calendar" | "calendar-o" | "today" | "calendar-check-o" | "calendar-1" | "calendar-31" | "monday" | "sunday" | "january" | "december" | "edit-calendar" | "view-schedule" | "calendar-add" | "calendar-plus" | "calendar-plus-o" | "calendar-remove" | "calendar-minus" | "calendar-times" | "calendar-minus-o" | "calendar-times-o" | "important-month" | "schedule1" | "sand-watch" | "hourglass-start" | "hourglass-o" | "hourglass-half" | "hourglass-end" | "hourglass" | "hourglass-1" | "hourglass-2" | "hourglass-3" | "timezone-globe" | "timezone" | "timetable" | "day-view" | "month-view" | "week-view" | "year-view" | "thermometer-0" | "thermometer-empty" | "thermometer-3" | "thermometer-three-quarters" | "thermometer-2" | "thermometer-half" | "thermometer-1" | "thermometer-quarter" | "thermometer" | "thermometer-4" | "thermometer-full" | "sensor" | "package" | "packages" | "blockly" | "objects" | "monitoring" | "qr-code" | "online" | "temperature" | "air-conditioner" | "air-shaft" | "fan" | "light" | "light-automation" | "light-off" | "reflector-bulb" | "spiral-bulb" | "mirrored-reflector-bulb" | "light-bulb" | "lightbulb-o" | "light-on" | "plumbing" | "wi-fi-router" | "gas-bottle" | "grater" | "air-quality" | "central-heating" | "light-dimmer" | "radio-station" | "relay-home-automation" | "remote-control" | "tv-off" | "wall-socket" | "washing-machine" | "light-dimming-100-percent" | "light-dimming-10-percent" | "work-light" | "plug" | "electrical" | "water-pipe" | "thermometer-automation" | "fire-extinguisher" | "temperature-sensitive" | "calculator" | "humidity" | "system-information" | "system-report" | "system-task" | "imac-clock" | "imac-exit" | "imac-settings" | "macbook-settings" | "connected" | "disconnected" | "mobile" | "multiple-devices" | "client-management" | "nfc" | "mobile-email" | "empty-battery" | "battery-empty" | "battery-0" | "low-battery" | "battery-quarter" | "battery-1" | "battery-level" | "battery-2" | "battery-half" | "charged-battery" | "battery-3" | "battery-three-quarters" | "full-battery" | "battery-full" | "battery-4" | "battery" | "no-battery" | "charging-battery" | "no-connection" | "low-connection" | "signal" | "factory" | "industry" | "robot" | "bot" | "fork-lift" | "gear-complex" | "cog-complex" | "gears" | "cogs" | "automation" | "automatic" | "electronics" | "gas" | "water" | "tint" | "greentech" | "radio-tower" | "industrial-scales" | "balance-scale" | "iphone" | "mobile-phone" | "smartphone" | "smartphone-approve" | "smartphone-decline" | "phonelink-lock" | "tablet-mac" | "tablet" | "devices" | "imac" | "desktop" | "desktop1" | "monitor" | "tv" | "television" | "laptop" | "checked-laptop" | "laptop-alert" | "laptop-error" | "computer-support" | "programming" | "keyboard" | "keyboard-o" | "video-conference" | "remote-desktop" | "workspace" | "workstation" | "microchip" | "processor" | "smartphone-ram" | "bios" | "micro-sd" | "hdd" | "hdd-o" | "financial-dynamic-presentation" | "presentation" | "room-finder" | "statistics" | "server" | "stack" | "critical-thinking" | "environment1" | "network-card" | "network-cable" | "usb-on" | "ssd" | "asterisk-key" | "asterisk" | "end-button" | "hub" | "individual-server" | "data-center" | "root-server" | "switch" | "nas" | "shutdown" | "power-off" | "hibernate" | "phone-square" | "phone" | "no-idea" | "network" | "centralized-network" | "customer-insights-manager" | "gift" | "small-business" | "pricing" | "free-trial" | "buy1" | "cart-plus" | "cart-arrow-down" | "return-purchase" | "shopping-cart-with-money" | "buying" | "shopping-cart" | "procurement" | "delivery-handcart" | "cheap-21" | "average-2" | "stripe1" | "loyalty-card" | "shopping-check" | "shopping-bag" | "atm" | "bank-card-dollar" | "bank-card-euro" | "contactless-payment" | "qrcode" | "data-matrix-code" | "barcode" | "no-barcode" | "refresh-barcode" | "touch-id" | "redeem" | "card-exchange" | "card-security" | "cash-register" | "cost" | "create-order" | "online-payment1" | "rent1" | "package-settings" | "product-loading" | "purchase-order" | "receipt1" | "scan-stock" | "shipment-logistic" | "shipping-center" | "shipping-centre-loading-belt" | "shopaholic" | "basket" | "shopping-basket" | "add-basket" | "paid" | "text-width" | "text-height" | "paragraph" | "pilcrow" | "text-input" | "unavailable" | "save" | "save-commit" | "delete" | "copy" | "paste" | "more-menu" | "password-hide" | "password-show" | "zoom-in" | "zoom-out" | "buy" | "list" | "list-alt" | "list-ul" | "format-align-justify" | "align-justify" | "format-align-left" | "align-left" | "format-align-center" | "align-center" | "format-align-right" | "align-right" | "radio-button-on" | "dot-circle-o" | "colorize" | "eyedropper" | "brush" | "paint-brush" | "file-create" | "edit" | "email-sign" | "at" | "get-quote" | "quote-right" | "quote-left" | "format-bold" | "bold" | "format-underlined" | "underline" | "strikethrough-s" | "strikethrough" | "title" | "header" | "subscript" | "superscript" | "format-italic" | "italic" | "font-download" | "font" | "questionnaire" | "th-list" | "tasklist" | "communication-sorting" | "todo-list" | "tasks" | "numbered-list" | "list-ol" | "search-in-list" | "table-of-content" | "index" | "tiles" | "edit1" | "pencil" | "pencil-square" | "pencil-square-o" | "edit11" | "no-edit" | "cut" | "scissors" | "coupon" | "crop" | "erase" | "eraser" | "add-white-space" | "blur" | "paint-palette" | "contrast" | "adjust" | "bring-forward" | "snap-background-to-white" | "rename" | "text-cursor" | "i-cursor" | "large-icons" | "comma" | "compare" | "content" | "document-body" | "merge-docunemts" | "unit" | "group" | "group-objects" | "object-group" | "object-ungroup" | "ungroup" | "hexagonal-pattern" | "diagonal-lines" | "line-width" | "long-words" | "indent" | "indent-left" | "indent-decrease" | "dedent" | "dedent-left" | "outdent" | "indent-right" | "dedent-right" | "drag-reorder" | "drag-list-up" | "pull-down" | "page" | "rearrange" | "resize-file" | "resize" | "rich-text-converter" | "select-all" | "select-none" | "ruler" | "length" | "send-backward" | "send-to-back" | "replace" | "separated-lists" | "short-words" | "mix-words" | "line-style" | "design" | "view-stream" | "four-squares" | "th-large" | "thumbnails" | "th" | "view-module" | "top-view" | "orthogonal-view" | "rectangular" | "square" | "view-column" | "file-archive-o" | "file-zip-o" | "file-video-o" | "file-movie-o" | "file-audio-o" | "file-sound-o" | "microsoft-access" | "microsoft-onenote" | "microsoft-outlook" | "microsoft-project" | "microsoft-publisher" | "microsoft-sharepoint" | "microsoft-visio" | "word" | "file-word-o" | "excel" | "file-excel-o" | "ppt" | "file-powerpoint-o" | "create-archive" | "save-archive" | "delete-archive" | "gif" | "gis" | "gpx" | "heic-filetype" | "dmg" | "jpg" | "kmz" | "kml" | "mp3" | "dng" | "nef" | "nmea" | "tar" | "ttf" | "tif" | "obj" | "webp" | "ogg" | "woff" | "xls" | "xps" | "zip" | "wma" | "osm" | "otf" | "dwg" | "png" | "eps" | "ps" | "rar" | "raw" | "psd" | "exe" | "fbx" | "pdf-2" | "3fr" | "aac" | "7zip" | "cr2" | "ai" | "apk" | "wav" | "jp2" | "java-file" | "fff" | "folder-aggregate" | "book" | "package-delivery-logistics" | "cube" | "resume" | "insert-drive-file" | "file" | "file-o" | "sheet-of-paper" | "edit-file" | "documents" | "file-copy" | "files" | "files-o" | "profile" | "pdf" | "file-pdf-o" | "export-pdf" | "file-type-document" | "file-text-o" | "file-text" | "document" | "submit-document1" | "privacy-policy" | "selective-highlighting1" | "brief" | "document-with-code" | "image-file" | "file-image-o" | "file-picture-o" | "file-photo-o" | "image-file-add" | "image-file-checked" | "image-file-remove" | "check-document" | "document-with-a-check-mark" | "delete-file" | "file-delete" | "file-settings" | "file-preview" | "open-document" | "submit-document" | "restore-page1" | "document-exchange" | "import-file" | "share-document" | "idea" | "mark-as-favorite" | "email-document" | "file-view" | "policy-document" | "business-report" | "graph-report" | "edit-graph-report" | "download-graph-report" | "agreement" | "estimates" | "winking-document" | "insert-page" | "note" | "brochure" | "read" | "cashbook" | "price-tag" | "tag" | "add-tag" | "tag1" | "tags" | "open-folder" | "opened-folder" | "folder-open" | "folder-open-o" | "folder" | "folder-o" | "folder-open1" | "add-folder" | "delete-folder" | "search-folder" | "folder-settings" | "extensions-folder" | "private-folder" | "edit-folder" | "e-mail-folder" | "documents-folder" | "downloads-folder" | "favorite-folder" | "user-folder" | "download-from-ftp" | "upload-to-ftp" | "ftp" | "big-parcel" | "open-parcel" | "packing" | "unpacking" | "cardboard-box" | "archive" | "archive-o" | "file-archive-o1" | "box" | "case" | "empty-box" | "box-settings" | "secured-delivery" | "remove-delivery" | "out-of-stock" | "new-product" | "product" | "product-management" | "stacking" | "cv" | "unarchive" | "upload-archive" | "archive-file" | "download-archive" | "cc-stripe" | "google-wallet" | "paypal" | "cc-paypal" | "cc-amex" | "cc-discover" | "cc-visa" | "cc-mastercard" | "try" | "turkish-lira" | "rouble" | "rub" | "ruble" | "krw" | "won" | "inr" | "rupee" | "ils" | "shekel" | "sheqel" | "gbp" | "eur" | "euro" | "cny" | "jpy" | "rmb" | "yen" | "bitcoin" | "btc" | "dollar" | "usd" | "calculator1" | "accounting" | "contract" | "sales-performance" | "bank-safe" | "mobile-payment" | "money-yours" | "online-payment" | "us-dollar-circled" | "credit-card" | "credit-card-alt" | "only-cash" | "credit-control" | "bank-cards" | "check-for-payment" | "paper-money" | "money" | "cash-euro" | "stack-of-money" | "wallet" | "certificate" | "card-security1" | "bill" | "paid-bill" | "token-card-code1" | "receipt" | "add-receipt" | "sign-language" | "signing" | "hand-o-down" | "hand-o-left" | "hand-o-up" | "hand-o-right" | "hand-peace-o" | "hand-pointer-o" | "hand-spock-o" | "hand-lizard-o" | "hand-scissors-o" | "hand-paper-o" | "hand-stop-o" | "hand-grab-o" | "hand-rock-o" | "thumbs-up" | "thumbs-o-up" | "thumbs-down" | "thumbs-o-down" | "do-not-touch" | "hand" | "disclaimer" | "touchpad" | "holding-box" | "recieve" | "sell" | "get-revenue" | "handshake" | "handshake-o" | "partners" | "wearable-technology" | "america" | "globe" | "location" | "globe1" | "compass-north" | "compass" | "marker" | "marker-off" | "find-clinic" | "tesla-supercharger-pin" | "address" | "cab-stand" | "map" | "map-o" | "map-editing" | "map-marker" | "quest" | "waypoint-map" | "anchor-nodes" | "map-pin" | "signpost-tourist" | "map-signs" | "gps" | "near-me" | "location-arrow" | "navigation" | "target1" | "hunt" | "location-off" | "location-update" | "layers" | "journey" | "here" | "street-view" | "parking" | "reply" | "mail-reply" | "forward1" | "mail-forward" | "reply-all" | "mail-reply-all" | "communication" | "multichannel" | "chat" | "topic" | "comment" | "comment-o" | "typing" | "quote" | "delete-message" | "poll" | "popular" | "speaker-notes" | "audio-description" | "comment1" | "comments" | "comments-o" | "speaker-notes-off" | "new-topic" | "ask-question" | "chat-bubble" | "commenting" | "commenting-o" | "mail" | "important-mail" | "envelope" | "envelope-o" | "envelope-open-o" | "envelope-open" | "edit-message" | "received" | "deleted-message" | "group-message" | "subscription" | "unsubscribe" | "send-email" | "read-message" | "inbox" | "add-to-inbox" | "check-inbox" | "remove-from-inbox" | "outbox" | "post" | "envelope-square" | "sheet" | "sticky-note" | "sticky-note-o" | "note1" | "secure" | "retweet" | "rss" | "rss-square" | "feed" | "cancel-subscription" | "link" | "chain" | "link-off" | "chain-broken" | "unlink" | "sent" | "send" | "email-send" | "send-o" | "paper-plane" | "paper-plane-o" | "hashtag" | "podcast" | "headphones" | "volume-control-phone" | "volume-off" | "volume-mute" | "volume-zero" | "volume-low" | "volume-down" | "volume" | "speaker" | "volume-up" | "volume-high" | "sound" | "headset" | "play-circle" | "pause-circle" | "stop-circle" | "skip-previous" | "step-backward" | "fast-rewind" | "rewind" | "fast-rewind1" | "fast-backward" | "backward" | "play-arrow" | "play" | "play-circle1" | "play-circle-o" | "pause" | "stop" | "forward11" | "fast-forward" | "forward111" | "fast-forward1" | "skip-next" | "step-forward" | "no-image" | "local-movies" | "theaters" | "film" | "mic" | "microphone" | "block-microphone" | "microphone-slash" | "music-note" | "music" | "photo-camera-front" | "video-camera" | "camera" | "camera-retro" | "cam" | "image" | "picture" | "picture-o" | "photo" | "photo-gallery" | "albums" | "cubes" | "slides" | "bursts" | "exposure" | "gallery" | "insert-clip" | "memories" | "overwrite-clip" | "selfies" | "facebook" | "instagram" | "linkedin" | "pinterest" | "twitter" | "youtube" | "youtube-play" | "google" | "github" | "cloud" | "cloud-search" | "search-in-cloud" | "cloud-settings" | "cloud-checked" | "cloud-restricted" | "cloud-plus" | "cloud-minus" | "cloud-error" | "cloud-unavailable" | "cloud-upload" | "backup" | "cloud-download" | "cloud-backup-restore" | "cloud-remote-working" | "cloud-bar-chart" | "cloud-binary-code" | "cloud-broadcasting" | "secure-cloud" | "error-cloud" | "cloud-cross" | "dashed-cloud" | "cloud-connection" | "cloud-firewall" | "cloud-link" | "cloud-waiting" | "public-cloud" | "delete-from-cloud" | "cloud-refresh" | "cloud-right-u-arrow" | "cloud-share-symbol" | "cloud-development" | "cloud-sync" | "cloud-user" | "cloud-computing" | "cloud-storage" | "cloud-network" | "computer" | "connected-people" | "connection-sync" | "network-2" | "incoming-data" | "outgoing-data" | "remote-desktop1" | "security-wi-fi" | "server1" | "server-shutdown1" | "ftp-server" | "thin-client" | "wi-fi" | "wifi" | "wireless-network" | "wi-fi-off" | "wi-fi-connected" | "wi-fi-disconnected" | "wi-fi-lock" | "scan-wi-fi" | "bluetooth" | "bluetooth-b" | "bluetooth-symbol" | "decentralized-network" | "light-bulb-outline" | "medkit" | "fax" | "beer" | "department" | "tty" | "target" | "crosshairs" | "accuracy" | "goal" | "bullseye" | "address-book" | "address-book-o" | "contacts-book" | "attract-customers" | "magnet" | "guarantee" | "commercial" | "bullhorn" | "announcement" | "podium" | "time-card" | "change" | "applicant" | "download-resume" | "submit-resume" | "briefcase" | "suitcase" | "new-job" | "job-seeker" | "business-building" | "dossier" | "alarms" | "project" | "important-book" | "important-note" | "name-tag" | "id-badge" | "assignment-return" | "note-taking" | "audit" | "badge" | "vcard" | "vcard-o" | "id-card" | "id-card-o" | "address-card-o" | "address-card" | "drivers-license" | "drivers-license-o" | "new-contact" | "contact-details" | "phone-contact" | "inspection" | "clipboard-with-a-tick" | "survey" | "no-data-available" | "task-planning" | "invoice" | "summary-list" | "study" | "card" | "job" | "print" | "communication-internet" | "language-skill" | "language" | "close-program" | "window-close" | "window-close-o" | "new-slide" | "web-analytics" | "planner" | "rescheduling-a-task" | "resume-website" | "product-documents" | "resume-template" | "rubber-stamp" | "stamp" | "video-projector" | "management1" | "gavel" | "legal" | "user-md" | "wheelchair-alt" | "wheelchair" | "child" | "workspace1" | "male-user" | "user-circle-o" | "user-circle" | "user-plus" | "add-user" | "remove-user" | "user-minus" | "user-times" | "user-account" | "user" | "user-o" | "manager" | "businessman" | "male" | "document-writer" | "supplier" | "search-client" | "account-enable" | "account-disable" | "insurance-agent" | "payroll" | "lawyer" | "complaint" | "appointment-scheduling" | "caretaker" | "guardian" | "batch-assign" | "people" | "users" | "group1" | "management" | "team" | "people-working-together" | "group-task" | "accessibility" | "universal-access" | "pregnant-woman" | "female" | "business-conference-female-speaker" | "organization-chart-people" | "meeting-room" | "permanent-job" | "contact-us" | "voice-recognition" | "collaboration" | "technical-support" | "online-support" | "student-male" | "devops" | "exhibitor" | "env-permission" | "bathtub" | "bath" | "s15" | "hotel" | "local-hotel" | "bed" | "intelligence" | "c8y-aab-icon-model" | "c8y-aab-icon-template-model" | "c8y-accounts" | "c8y-add-user" | "c8y-administration" | "c8y-alarm" | "c8y-alert-idle" | "c8y-alfabet" | "c8y-analytic-model" | "c8y-analytics-builder" | "c8y-apama-epl" | "c8y-apama-machine-learning-workbench" | "c8y-apama-machine-learning" | "c8y-archive" | "c8y-aris" | "c8y-atom" | "c8y-book" | "c8y-bookmark" | "c8y-bulb" | "c8y-business-rules" | "c8y-c8y-c" | "c8y-c8y-data" | "c8y-c8y-support" | "c8y-c8y" | "c8y-calendar" | "c8y-chart" | "c8y-circle-star" | "c8y-cloud-container" | "c8y-cockpit" | "c8y-component" | "c8y-connector-in" | "c8y-connector-out" | "c8y-css" | "c8y-cumulocity-iot" | "c8y-data-broker" | "c8y-data-explorer" | "c8y-data-hub" | "c8y-data-points" | "c8y-design" | "c8y-device-connect" | "c8y-device-control" | "c8y-device-management" | "c8y-device-profile" | "c8y-device-protocols" | "c8y-device" | "c8y-dynamic-mapper" | "c8y-e2e-monitoring" | "c8y-energy" | "c8y-enterprise" | "c8y-event-processing" | "online1" | "c8y-fieldbus" | "c8y-find-map" | "c8y-firmware" | "c8y-grid-off" | "c8y-grid-on" | "c8y-group-add" | "c8y-group-open" | "c8y-group-remote-inactive" | "c8y-group-remote-open" | "c8y-group-remote" | "c8y-group-smart-open" | "c8y-group-smart" | "c8y-group" | "c8y-java" | "c8y-layers" | "c8y-layout" | "c8y-location" | "c8y-machine-portal" | "c8y-management" | "c8y-metering" | "c8y-mft" | "c8y-mobile-add" | "c8y-mobile-config" | "c8y-modules" | "c8y-mycloud" | "c8y-notification" | "c8y-oee" | "c8y-onnx" | "c8y-overviews" | "c8y-parameters-on" | "c8y-parameters" | "c8y-parking" | "c8y-report" | "c8y-reports" | "c8y-rocket" | "c8y-saas" | "c8y-security" | "c8y-shield" | "c8y-simulator" | "c8y-smart-rest" | "c8y-smart-rules" | "c8y-analytics-smart-rules" | "c8y-solution-accelerator" | "c8y-streaming-analytics" | "c8y-sub-tenants" | "c8y-tenant-policies" | "c8y-tools" | "c8y-tracking" | "c8y-usage-statistics" | "c8y-user" | "c8y-users" | "c8y-waste-bin" | "c8y-wm-api" | "c8y-wm-b2b" | "c8y-wm-dynamicapps" | "c8y-wm-integration" | "source-code" | "code" | "html-code" | "code1" | "file-code-o" | "console" | "terminal" | "add-property" | "delete-document" | "urgent-property" | "remove-property" | "edit-property" | "template" | "test" | "property-script" | "show-property" | "search-property" | "timesheet" | "important-property" | "new-property" | "navigation-toolbar-top" | "window-maximize" | "web-application-firewall" | "website-bug" | "bug" | "web-design" | "navigation-toolbar-bottom" | "more-details" | "navigation-pane" | "pin" | "thumb-tack" | "unpin" | "commit-git" | "codefork" | "code-fork" | "merge-git" | "pull-request" | "compare-git" | "share" | "share-alt" | "share-alt-square" | "activity-history" | "rules" | "create-document" | "product-architecture" | "registry-editor" | "rest-api" | "true-false" | "uninstall-programs" | "sheets" | "stages" | "add-stage" | "api" | "blockly-turquoise" | "blockly-blue" | "blockly-pink" | "plugin" | "base-64" | "xml-transformer" | "shield" | "protect" | "warning-shield" | "free-forever" | "identification-documents" | "id-verified" | "fingerprint" | "pin-code" | "password" | "lock" | "unlock" | "privacy" | "lock-outline" | "lock1" | "lock-open" | "unlock1" | "unlock-alt" | "key" | "access" | "lock11" | "realtime" | "smart-home-connection" | "smart-home-checked" | "smart-home-error" | "smart-home-remove" | "smart-home-shield" | "voice-id" | "web-application-firewall1" | "copyright" | "spy" | "user-secret" | "bug1" | "health-examine" | "stethoscope" | "space-shuttle" | "ambulance" | "car" | "automobile" | "local-taxi" | "taxi" | "cab" | "truck" | "file-delivery" | "in-transit" | "bus" | "train" | "directions-subway" | "directions-transit" | "tram" | "delivery-dining" | "scooter" | "pedal-bike" | "bicycle" | "motorcycle" | "airport" | "plane" | "fighter-jet" | "directions-ferry" | "ship" | "deploy" | "rocket" | "wrench1" | "road" | "flag-outline" | "software" | "newspaper-o" | "creative-commons" | "spinner" | "loading" | "busy" | "wheel" | "trademark" | "toggle-on" | "toggle-off" | "ticket" | "spoon" | "sort-numeric-desc" | "sort-numeric-asc" | "snowflake-o" | "shower" | "percent" | "paw" | "mouse-pointer" | "lemon-o" | "leaf" | "diamond" | "braille" | "bomb" | "binoculars" | "eject" | "touch-app" | "soccer" | "football" | "futbol-o" | "soccer-ball-o" | "mood" | "meh-o" | "frown-o" | "smile-o" | "deaf" | "deafness" | "hard-of-hearing" | "assistive-listening-systems" | "american-sign-language-interpreting" | "asl-interpreting" | "cc" | "closed-caption" | "anchor" | "accessibility-settings" | "info" | "info-circle" | "warning" | "report-problem" | "exclamation-triangle" | "exclamation-circle" | "error" | "high-priority" | "spam" | "help" | "question-circle" | "question" | "help-outline" | "question-circle-o" | "approval" | "trophy" | "unverified-account" | "automatic-gea