{"version":3,"file":"app-20227912.981ca8458d389c9a476a.bundle.js","mappings":";;;;;;;;;;;;;;;;;;;AAAA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AAAA;;AAIA;AACA;AAOA;AAJA;AAAA;AACA;AAIA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AChFA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAKA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAGA;AACA;AAIA;AAAA;AACA;AAAA;AACA;AAAA;AAEA;AAAA;AAUA;AAfA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AACA;AACA;AACA;AACA;AAIA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AAGA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AAGA;AAGA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AAEA;;AAGA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AApLA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;;;;;;;;;;;;;;;;;;;;;;;AClCA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAGA;AACA;AAOA;AAAA;AACA;AAAA;AAKA;AAPA;AAAA;AAAA;AAIA;AAAA;AAOA;AACA;AACA;;AAGA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAjDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;;;;;ACvBA;;AAEA;AACA;AACA;;AAOA;AACA;AACA;;AAGA;AACA;AAKA;AAAA;AAEA;AAAA;AAEA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AAKA;AAdA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA;AAAA;AAIA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AA5CA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;;AC9BA;;AAEA;AACA;;AAEA;AACA;;AAGA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;AAhBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AChBA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAKA;;AAOA;AACA;AACA;;AAKA;AACA;AAcA;AANA;AAAA;AACA;AACA;AACA;AASA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAGA;AACA;AAMA;AAEA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC3MA;;AAEA;AACA;;AAEA;AACA;AACA;AAIA;;AAKA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAGA;AACA;AAIA;AAAA;AACA;AAAA;AACA;AAAA;AAEA;AAAA;AAUA;AAfA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AACA;AACA;AACA;AACA;AAIA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AAGA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AAGA;AAGA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AAEA;;AAGA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;;;;;;;;;;;;;;;;;;;ACtCA;;AAEA;AACA;;AAGA;AACA;AAGA;AAAA;AACA;AAAA;AACA;AAAA;AAEA;AAAA;AAPA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AANA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;ACdA;;AAEA;AACA;;AAEA;AACA;AAGA;AAAA;AACA;AAAA;AAJA;AAEA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;;;;;;;;;;;;;;;;;;ACXA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAGA;AACA;AAOA;AAJA;AAAA;AACA;AAIA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAAA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnCA;;AAEA;AACA;AACA;AACA;;AAOA;AACA;AACA;AACA;;AAMA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAQA;AAAA;AAEA;AAAA;AAEA;AAAA;AAEA;AAAA;AAEA;AAAA;AASA;AAlBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AAAA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AADA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9IA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA;AAAA;;;;;;;;;;;ACvDA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA","sources":["webpack://latinera/./sources/components/etc/privacy-policy.js","webpack://latinera/./sources/components/etc/remove-tonic-accent.js","webpack://latinera/./sources/components/etc/run-mode-selector.js","webpack://latinera/./sources/components/etc/screen-title.js","webpack://latinera/./sources/components/etc/server-errors.js","webpack://latinera/./sources/components/etc/session-status.js","webpack://latinera/./sources/components/etc/short-tonic-accent.js","webpack://latinera/./sources/components/etc/spinner.js","webpack://latinera/./sources/components/etc/split-card-icon.js","webpack://latinera/./sources/components/etc/system-notifications.js","webpack://latinera/./sources/components/etc/time-stamp.js","webpack://latinera/./sources/components/etc/privacy-policy.html","webpack://latinera/./sources/components/etc/remove-tonic-accent.html","webpack://latinera/./sources/components/etc/run-mode-selector.html","webpack://latinera/./sources/components/etc/screen-title.html","webpack://latinera/./sources/components/etc/server-errors.html","webpack://latinera/./sources/components/etc/session-status.html","webpack://latinera/./sources/components/etc/short-tonic-accent.html","webpack://latinera/./sources/components/etc/spinner.html","webpack://latinera/./sources/components/etc/split-card-icon.html","webpack://latinera/./sources/components/etc/system-notifications.html","webpack://latinera/./sources/components/etc/time-stamp.html"],"sourcesContent":["// Define the view-model for the \"privacy-ppolicy\" component\n\n// Import library modules\nimport { inject } from \"aurelia-framework\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n// Import service modules\nimport EventService from \"services/event\";\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst eventsData = [\n { name: \"acceptPrivacyPolicyToggled\" }\n];\n\n\n// Export PrivacyPolicy class\n@inject(EventService, UserService)\nexport class PrivacyPolicy {\n\n // Local attributes\n showAcceptPrivacyPolicyAlert = false;\n i18nParams = i18nParams;\n\n constructor(eventService, userService) {\n this.eventService = eventService;\n this.userService = userService;\n }\n\n\n // Life-cycle methods\n bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"privacyPolicy\",\n eventService: this.eventService,\n eventsData\n });\n\n this.updateShowAcceptPrivacyPolicy();\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Core methods\n updateShowAcceptPrivacyPolicy() {\n this.showAcceptPrivacyPolicyAlert = !this.userService.acceptPrivacyPolicy;\n }\n acceptPrivacyPolicy() {\n this.userService.acceptPrivacyPolicy = true;\n this.publishAcceptPrivacyNoticeToggledEvent();\n }\n\n\n // Event handlers\n handleAcceptPrivacyPolicyToggledEvent() {\n this.updateShowAcceptPrivacyPolicy();\n }\n\n\n // Event publishers\n publishAcceptPrivacyNoticeToggledEvent(eventData) {\n this.eventService.publish({\n eventName: \"acceptPrivacyPolicyToggled\",\n eventData: {\n acceptPrivacyPolicy: this.userService.acceptPrivacyPolicy,\n ...(eventData || {})\n }\n });\n }\n\n}\n","// Define the view-model for the \"remove-tonic-accent\" component\n\n// Import library modules\nimport { bindable, bindingMode, computedFrom, inject } from \"aurelia-framework\";\n\n// Import utility modules\nimport { removeTonicAccents } from \"utilities/latin\";\nimport { unsetEventHandlers } from \"utilities/event\";\nimport {\n getCaretPosition,\n setCaretPosition\n} from \"utilities/dom\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n// Import service modules\nimport EventService from \"services/event\";\n\n// Define internal parameters\nconst isAnyVowelRegExp = /[aeiouăĕĭŏŭāēīōū]/g;\nconst isShortOrLongAccentedVowelRegExp = /[ăĕĭŏŭāēīōū]/;\n\n\n// Export RemoveTonicAccent class\n@inject(EventService)\nexport class RemoveTonicAccent {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) inputElement = null\n @bindable({ defaultBindingMode: bindingMode.toView }) uniqueId = \"\";\n @bindable({ defaultBindingMode: bindingMode.toView })\n linkClasses = \"uk-link uk-link-heading\";\n @bindable({ defaultBindingMode: bindingMode.toView })\n spanClasses = \"uk-text uk-text-bold uk-text-medium\";\n\n // Local attributes\n isInputElementFocused = document.activeElement === this.inputElement;\n refreshShowButtonToggle = true;\n caretPosition = 0;\n eventsSubscriptions = [];\n i18nParams = i18nParams;\n\n constructor(eventService) {\n this.eventService = eventService;\n }\n\n\n // Lifecycle methods\n bind() {\n if (!this.uniqueId) {\n throw new Error(`Missing required attribute \"uniqueId\"`);\n } else {\n this.inputChangedEventName = `${this.uniqueId}Changed`;\n }\n this.setEventHandlers();\n }\n\n attached() {\n if (this.inputElement) {\n this.inputElement.addEventListener(\n \"focus\", this.handleInputElementFocusEvent.bind(this)\n );\n this.inputElement.addEventListener(\n \"click\", this.handleInputElementClickEvent.bind(this)\n );\n this.inputElement.addEventListener(\n \"keyup\", this.handleInputElementKeyupEvent.bind(this)\n );\n this.inputElement.addEventListener(\n \"blur\", this.handleInputElementBlurEvent.bind(this)\n );\n }\n }\n\n detached() {\n if (this.inputElement) {\n this.inputElement.removeEventListener(\n \"focus\", this.handleInputElementFocusEvent.bind(this)\n );\n this.inputElement.removeEventListener(\n \"click\", this.handleInputElementClickEvent.bind(this)\n );\n this.inputElement.removeEventListener(\n \"keyup\", this.handleInputElementKeyupEvent.bind(this)\n );\n this.inputElement.removeEventListener(\n \"blur\", this.handleInputElementBlurEvent.bind(this)\n );\n }\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"inputElement.value\", \"caretPosition\", \"refreshShowButtonToggle\")\n get targetInputCharacter() {\n return this.inputElement ?\n this.inputElement.value[this.caretPosition-1] || \"\" : \"\";\n }\n\n @computedFrom(\"targetInputCharacter\")\n get plainTargetInputCharacter() {\n return removeTonicAccents(this.targetInputCharacter);\n }\n\n @computedFrom(\"plainTargetInputCharacter\")\n get tooltipI18nParams() {\n return { ...this.i18nParams, vowel: this.plainTargetInputCharacter };\n }\n\n @computedFrom(\"targetInputCharacter\")\n get showRemoveTonicAccentButton() {\n return this.isInputElementFocused &&\n isShortOrLongAccentedVowelRegExp.test(this.targetInputCharacter);\n }\n\n\n // Core methods\n updateCaretPosition() {\n this.caretPosition = this.inputElement ?\n getCaretPosition(this.inputElement) : 0;\n }\n\n removeTonicAccent() {\n this.inputElement.value = this.inputElement.value\n .replaceAll(isAnyVowelRegExp, (match, position) => {\n return position === this.caretPosition-1 ?\n this.plainTargetInputCharacter : match;\n });\n setCaretPosition(this.inputElement, this.caretPosition);\n this.publishInputElementChangedEvent();\n }\n\n\n // Event filters\n filterEventsByUniqueId({ uniqueId = \"\" }) {\n return uniqueId === this.uniqueId;\n }\n\n\n // Event handlers\n setEventHandlers() {\n this.eventsSubscriptions = [\n this.eventService.subscribe({\n eventName: this.inputChangedEventName,\n eventHandler: this.handleInputChangedEvent.bind(this),\n eventFilter: this.filterEventsByUniqueId.bind(this)\n }),\n this.eventService.subscribe({\n eventName: \"updateTonicAccentsButtons\",\n eventHandler: this.handleUpdateTonicAccentsButtonsEvent.bind(this),\n eventFilter: this.filterEventsByUniqueId.bind(this)\n })\n ];\n }\n\n handleInputChangedEvent() {\n this.updateCaretPosition();\n }\n handleUpdateTonicAccentsButtonsEvent({ uniqueId }) {\n if (uniqueId === this.uniqueId) {\n this.updateCaretPosition();\n this.refreshShowButtonToggle = !this.refreshShowButtonToggle;\n }\n }\n\n handleInputElementFocusEvent() {\n this.isInputElementFocused = true;\n this.updateCaretPosition();\n }\n handleInputElementClickEvent() {\n this.updateCaretPosition();\n }\n handleInputElementKeyupEvent() {\n this.updateCaretPosition();\n }\n handleLinkElementClickEvent() {\n this.removeTonicAccent();\n this.publishUpdateTonicAccentsButtonsEvent();\n }\n handleInputElementBlurEvent() {\n this.isInputElementFocused = false;\n }\n\n\n // Event publishers\n publishInputElementChangedEvent() {\n this.eventService.publish({\n eventName: this.inputChangedEventName,\n eventData: {\n newValue: this.inputElement.value\n }\n });\n }\n publishUpdateTonicAccentsButtonsEvent() {\n this.eventService.publish({\n eventName: \"updateTonicAccentsButtons\",\n eventData: {\n uniqueId: this.uniqueId\n }\n });\n }\n\n}\n","// Define the view-model for the \"run-mode-selector\" component\n\n// Import library modules\nimport { bindable, bindingMode, inject } from \"aurelia-framework\";\n\n// Import parameter modules\nimport { runMode as defaultRunMode } from \"parameters/environment\";\nimport { runModes } from \"parameters/application\";\n\n// Import service modules\nimport ApplicationService from \"services/application\";\nimport EventService from \"services/event\";\n\n\n// Export RunModeSelector class\n@inject(\n ApplicationService,\n EventService\n)\nexport class RunModeSelector {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.twoWay }) runMode = defaultRunMode;\n @bindable({ defaultBindingMode: bindingMode.toView }) uniqueId = \"\";\n\n // Local attributes\n runModes = runModes;\n\n constructor(\n applicationService,\n eventService\n ) {\n this.applicationService = applicationService;\n this.eventService = eventService;\n }\n\n\n // Lifecycle methods\n bind() {\n this.selectId = `select-${this.uniqueId || this.generateRandomId()}`;\n }\n\n\n // Core methods\n generateRandomId() {\n return Math.round(1e12*Math.random()).toString();\n }\n\n\n // Event handlers\n async handleRunModeChangedEvent() {\n try {\n await this.applicationService.setRunMode(this.runMode);\n } catch(error) {\n console.warn(`Error setting run-mode to \"${this.runMode}\" on index`);\n return;\n }\n this.publishRunModeChangedEvent();\n }\n\n\n // Event publishers\n publishRunModeChangedEvent() {\n this.eventService.publish({\n eventName: \"runModeChanged\",\n eventData: {\n runMode: this.runMode\n }\n });\n }\n\n}\n","// Define the view-model for the \"screen-title\" component\n\n// Import library modules\nimport { Router } from \"aurelia-router\";\nimport { \n bindable, \n bindingMode, \n containerless, \n inject \n} from \"aurelia-framework\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport UIkit from \"uikit\";\n\n\n// Export the \"ScreenTitle\" class\n@inject(Router)\n@containerless()\nexport class ScreenTitle {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) backIconClasses =\n \"fas fa-arrow-left\";\n @bindable({ defaultBindingMode: bindingMode.toView }) extraDivClasses = \n \"uk-margin-top\";\n @bindable({ defaultBindingMode: bindingMode.toView }) backIconSize = \"1.5em\";\n @bindable({ defaultBindingMode: bindingMode.toView }) showBackIcon = true;\n @bindable({ defaultBindingMode: bindingMode.toView }) autofocus = true;\n @bindable({ defaultBindingMode: bindingMode.toView }) sticky = false;\n @bindable({ defaultBindingMode: bindingMode.toView }) stickyOptions = {};\n\n // Local attributes\n i18nParams = i18nParams;\n\n constructor(router) {\n this.router = router;\n }\n\n\n // Lifecycle methods\n attached() {\n if (this.headerElement) {\n if (this.autofocus) {\n this.headerElement.scrollIntoView({\n behavior: \"smooth\",\n block: \"start\"\n });\n }\n if (this.sticky) {\n UIkit.sticky(this.headerElement, this.stickyOptions);\n }\n }\n }\n\n\n // Core methods\n navigateBack() {\n try {\n this.router.navigateBack();\n } catch(error) {\n console.warn(`Error while navigating to previous screen`, error);\n return;\n }\n console.info(\"Navigating to previous screen\");\n }\n\n}\n","// Define the view-model for the \"server-errors\" component\n\n// Import library modules\nimport { inject, bindable } from \"aurelia-framework\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n\n// Export the \"ServerErrors\" class\n@inject()\nexport class ServerErrors {\n\n @bindable errorsData = [];\n @bindable divClasses = \"\";\n @bindable titleI18nKey = \"errors:serverErrors\";\n @bindable titleI18nParams = i18nParams;\n\n bind() {\n this.i18nErrorsData = this.errorsData\n .map(({ i18nKey, i18nParams = {} }, errorIndex) => {\n if (!i18nKey) {\n console.error(`Invalid server error data at index ${errorIndex}: ` +\n `missing i18nKey`);\n }\n return { key: i18nKey, params: i18nParams };\n });\n }\n\n}\n","// Define the view-model for the \"session-status\" element\n\n// Import library modules\nimport { computedFrom, inject } from \"aurelia-framework\";\nimport { I18N } from \"aurelia-i18n\";\n\n// Import utility modules\nimport { computeDistanceTimeString } from \"utilities/time\";\nimport { capitalizeFirst } from \"utilities/string\";\nimport { pause } from \"utilities/promise\";\n\n// Import service modules\nimport EventService from \"services/event\";\nimport NotificationService from \"services/notification\";\nimport UserService from \"services/user\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport {\n projectName,\n runContext,\n runMode\n} from \"parameters/environment\";\nimport {\n expiryNotificationDeadlinesMs,\n expiryAlertingThresholdMs,\n expiryPollingIntervalMs,\n expiryMarginMs\n} from \"parameters/session\";\n\n// Define internal parameters\nconst sessionClosingEventPropagationTimeMs = 500;\nconst notificationTitle = `${capitalizeFirst(projectName)}` +\n `${runContext === \"ionos\" && runMode === \"live\" ? \n \"\" : ` (${runContext}/${runMode})`}`;\n\n\n// Export SessionStatus class\n@inject(\n EventService,\n I18N,\n NotificationService,\n UserService\n)\nexport class SessionStatus {\n\n // Attributes\n expiryAlertingThresholdMs = expiryAlertingThresholdMs;\n lastSessionExpiresInMs;\n sessionExpiresInString = \"\";\n i18nParams = i18nParams;\n\n constructor(\n eventService,\n i18n,\n notificationService,\n userService\n ) {\n this.eventService = eventService;\n this.i18n = i18n;\n this.notificationService = notificationService;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n bind() {\n this.lastSessionExpiresInMs = this.userService.sessionExpiresInMs;\n this.setTimers();\n }\n\n unbind() {\n this.clearTimers();\n }\n\n\n // Getter and setter methods\n @computedFrom(\n \"userService.isSessionOpen\", \n \"userService.sessionExpiresInMs\",\n \"expiryAlertingThresholdMs\"\n )\n get showSessionStatusAlert() {\n return this.userService.isSessionOpen &&\n this.userService.sessionExpiresInMs < this.expiryAlertingThresholdMs;\n }\n\n\n // Core methods\n async extendUserSession() {\n try {\n await this.userService.extendSession();\n } catch(error) {\n console.error(error);\n throw new Error(\"Error while extending user's session\");\n }\n this.resetTimers();\n this.notificationService.showUINotification({\n message: \"notifications:sessionExtended\",\n status: \"success\",\n group: \"private\"\n });\n }\n\n async closeUserSession() {\n this.publishSessionClosingEvent();\n await pause(sessionClosingEventPropagationTimeMs);\n try {\n await this.userService.closeSession();\n } catch(error) {\n console.error(error);\n throw new Error(\"Error while closing user's session\");\n }\n this.clearTimers();\n }\n\n showSessionExpiresInNotification() {\n const relativeTimeString = computeDistanceTimeString({\n timeStampMs: this.userService.sessionExpiresOnMs,\n localeCode: this.userService.uiLocaleCode,\n addSuffix: false\n });\n const sessionExpiresInMessage =\n this.i18n.tr(\"notifications:sessionExpiresIn\");\n const capitalizedSessionExpiresInMessage =\n capitalizeFirst(sessionExpiresInMessage);\n this.notificationService.showSystemNotification({\n message: `${capitalizedSessionExpiresInMessage} ${relativeTimeString}` \n });\n const englishRelativeTimeString = computeDistanceTimeString({\n timeStampMs: this.userService.sessionExpiresOnMs,\n addSuffix: false\n });\n console.warn(`Your session expires in ${englishRelativeTimeString}`);\n }\n\n showSessionExpiredNotification() {\n this.notificationService.closeUINotifications(\"private\");\n this.notificationService.showUINotification({\n message: \"notifications:autoClosedExpiredSession\",\n status: \"warning\",\n group: \"public\"\n });\n this.notificationService.showSystemNotification({\n message: notificationTitle\n });\n console.warn(\"Your session expired\");\n }\n\n setTimers() {\n const currentLocaleCode = this.userService.uiLocaleCode;\n this.sessionExpiresInString = computeDistanceTimeString({\n timeStampMs: this.userService.sessionExpiresOnMs,\n localeCode: currentLocaleCode,\n addSuffix: false\n });\n this.expiryAlertingIntervalId = setInterval(() => {\n const currentSessionExpiresInMs = this.userService.sessionExpiresInMs;\n if (currentSessionExpiresInMs > this.lastSessionExpiresInMs) {\n this.resetTimers(); // session has been extended\n }\n this.lastSessionExpiresInMs = currentSessionExpiresInMs;\n this.sessionExpiresInString = computeDistanceTimeString({\n timeStampMs: this.userService.sessionExpiresOnMs,\n localeCode: currentLocaleCode,\n addSuffix: false\n });\n }, expiryPollingIntervalMs);\n this.expiryNotificationDeadlinesTimeoutIds = expiryNotificationDeadlinesMs\n .filter(deadlineMs => deadlineMs < this.userService.sessionExpiresInMs)\n .map(sessionExpiryDeadlineMs => {\n return setTimeout(() => {\n this.showSessionExpiresInNotification(sessionExpiryDeadlineMs);\n }, this.userService.sessionExpiresInMs - sessionExpiryDeadlineMs);\n });\n this.sessionExpiredNotificationTimeoutId = setTimeout(() => {\n this.showSessionExpiredNotification();\n this.closeUserSession();\n }, this.userService.sessionExpiresInMs);\n }\n\n clearTimers() {\n clearInterval(this.expiryAlertingIntervalId);\n this.expiryNotificationDeadlinesTimeoutIds\n .forEach(timeoutId => { clearInterval(timeoutId); });\n clearInterval(this.sessionExpiredNotificationTimeoutId);\n }\n\n resetTimers() {\n this.clearTimers();\n this.setTimers();\n }\n\n\n // Event publishers\n publishSessionClosingEvent(eventData) {\n this.eventService.publish({\n eventName: \"sessionClosing\",\n eventData: {\n ...(eventData || {})\n }\n });\n }\n}\n","// Define the view-model for the \"short-tonic-accent\" component\n\n// Import library modules\nimport { bindable, bindingMode, computedFrom, inject } from \"aurelia-framework\";\n\n// Import utility modules\nimport { unsetEventHandlers } from \"utilities/event\";\nimport {\n addTonicAccents,\n removeTonicAccents\n} from \"utilities/latin\";\nimport {\n getCaretPosition,\n setCaretPosition\n} from \"utilities/dom\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n// Import service modules\nimport EventService from \"services/event\";\n\n// Define internal parameters\nconst isAnyVowelRegExp = /[aeiouăĕĭŏŭāēīōū]/g;\nconst isAnyVowelWithShortcutRegExp = /[aeiouăĕĭŏŭāēīōū]\\(/g;\nconst isPlainOrLongAccentedVowelRegExp = /[aeiouāēīōū]/;\n\n\n// Export ShortTonicAccent class\n@inject(EventService)\nexport class ShortTonicAccent {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) inputElement = null\n @bindable({ defaultBindingMode: bindingMode.toView }) uniqueId = \"\";\n @bindable({ defaultBindingMode: bindingMode.toView })\n linkClasses = \"uk-link uk-link-heading\";\n @bindable({ defaultBindingMode: bindingMode.toView })\n spanClasses = \"uk-text uk-text-bold uk-text-medium\";\n\n // Local attributes\n isInputElementFocused = document.activeElement === this.inputElement;\n refreshShowButtonToggle = true;\n caretPosition = 0;\n eventsSubscriptions = [];\n i18nParams = i18nParams;\n\n constructor(eventService) {\n this.eventService = eventService;\n }\n\n\n // Lifecycle methods\n bind() {\n if (!this.uniqueId) {\n throw new Error(`Missing required attribute \"uniqueId\"`);\n }\n this.inputChangedEventName = `${this.uniqueId}Changed`;\n this.setEventHandlers();\n }\n\n attached() {\n if (this.inputElement) {\n this.inputElement.addEventListener(\n \"focus\", this.handleInputElementFocusEvent.bind(this)\n );\n this.inputElement.addEventListener(\n \"click\", this.handleInputElementClickEvent.bind(this)\n );\n this.inputElement.addEventListener(\n \"keyup\", this.handleInputElementKeyupEvent.bind(this)\n );\n this.inputElement.addEventListener(\n \"blur\", this.handleInputElementBlurEvent.bind(this)\n );\n }\n }\n\n detached() {\n if (this.inputElement) {\n this.inputElement.removeEventListener(\n \"focus\", this.handleInputElementFocusEvent.bind(this)\n );\n this.inputElement.removeEventListener(\n \"click\", this.handleInputElementClickEvent.bind(this)\n );\n this.inputElement.removeEventListener(\n \"keyup\", this.handleInputElementKeyupEvent.bind(this)\n );\n this.inputElement.removeEventListener(\n \"blur\", this.handleInputElementBlurEvent.bind(this)\n );\n }\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"inputElement.value\", \"caretPosition\", \"refreshShowButtonToggle\")\n get targetInputCharacter() {\n return this.inputElement ?\n this.inputElement.value[this.caretPosition-1] || \"\" : \"\";\n }\n\n @computedFrom(\"targetInputCharacter\")\n get plainTargetInputCharacter() {\n return removeTonicAccents(this.targetInputCharacter);\n }\n\n @computedFrom(\"plainTargetInputCharacter\")\n get shortAccentedTargetInputCharacter() {\n return addTonicAccents(this.plainTargetInputCharacter, \"short\");\n }\n\n @computedFrom(\"plainTargetInputCharacter\")\n get tooltipI18nParams() {\n return { ...this.i18nParams, vowel: this.plainTargetInputCharacter };\n }\n\n @computedFrom(\"targetInputCharacter\")\n get showAddShortTonicAccentButton() {\n return this.isInputElementFocused &&\n isPlainOrLongAccentedVowelRegExp.test(this.targetInputCharacter);\n }\n\n\n // Core methods\n updateCaretPosition() {\n this.caretPosition = this.inputElement ?\n getCaretPosition(this.inputElement) : 0;\n }\n\n addShortTonicAccent() {\n this.inputElement.value = this.inputElement.value\n .replaceAll(isAnyVowelRegExp, (match, matchPosition) => {\n return matchPosition === this.caretPosition-1 ?\n this.shortAccentedTargetInputCharacter : match;\n });\n setCaretPosition(this.inputElement, this.caretPosition);\n this.publishInputChangedEvent();\n }\n\n replaceShortAccentShortcut() {\n if (this.targetInputCharacter === \"(\") {\n this.inputElement.value = this.inputElement.value\n .replaceAll(isAnyVowelWithShortcutRegExp, (match, matchPosition) => {\n if (matchPosition === this.caretPosition-2) {\n const vowel = this.inputElement.value[matchPosition];\n const plainVowel = removeTonicAccents(vowel);\n return addTonicAccents(plainVowel, \"short\");\n }\n return match;\n });\n setCaretPosition(this.inputElement, this.caretPosition-1);\n this.publishInputChangedEvent();\n }\n }\n\n\n // Event filters\n filterEventsByUniqueId({ uniqueId = \"\" }) {\n return uniqueId === this.uniqueId;\n }\n\n\n // Event handlers\n setEventHandlers() {\n this.eventsSubscriptions = [\n this.eventService.subscribe({\n eventName: this.inputChangedEventName,\n eventHandler: this.handleInputChangedEvent.bind(this),\n eventFilter: this.filterEventsByUniqueId.bind(this)\n }),\n this.eventService.subscribe({\n eventName: \"updateTonicAccentsButtons\",\n eventHandler: this.handleUpdateTonicAccentsButtonsEvent.bind(this),\n eventFilter: this.filterEventsByUniqueId.bind(this)\n })\n ];\n }\n\n handleInputChangedEvent() {\n this.updateCaretPosition();\n }\n handleUpdateTonicAccentsButtonsEvent({ uniqueId }) {\n if (uniqueId === this.uniqueId) {\n this.updateCaretPosition();\n this.refreshShowButtonToggle = !this.refreshShowButtonToggle;\n }\n }\n\n handleInputElementFocusEvent() {\n this.isInputElementFocused = true;\n this.updateCaretPosition();\n }\n handleInputElementClickEvent() {\n this.updateCaretPosition();\n }\n handleInputElementKeyupEvent() {\n this.updateCaretPosition();\n this.replaceShortAccentShortcut();\n }\n handleLinkElementClickEvent() {\n this.addShortTonicAccent();\n this.publishUpdateTonicAccentsButtonsEvent();\n }\n handleInputElementBlurEvent() {\n this.isInputElementFocused = false;\n }\n\n\n // Event publishers\n publishInputChangedEvent() {\n this.eventService.publish({\n eventName: this.inputChangedEventName,\n eventData: {\n newValue: this.inputElement.value\n }\n });\n }\n publishUpdateTonicAccentsButtonsEvent() {\n this.eventService.publish({\n eventName: \"updateTonicAccentsButtons\",\n eventData: {\n uniqueId: this.uniqueId\n }\n });\n }\n\n}\n","// Define the view-model for the \"spinner\" component\n\n// Import library modules\nimport { bindable, bindingMode } from \"aurelia-framework\";\n\n\n// Export Spinner class\nexport class Spinner {\n\n // Attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) isSpinning = true;\n @bindable({ defaultBindingMode: bindingMode.toView }) fontSize = \"1em\";\n @bindable({ defaultBindingMode: bindingMode.toView }) baseClass =\n \"fas fa-spinner\";\n @bindable({ defaultBindingMode: bindingMode.toView }) extraClass = \"\";\n\n}\n","// Define the view-model for the \"spiit-card-icon\" component\n\n// Import library modules\nimport { bindable, bindingMode } from \"aurelia-framework\";\n\n// Export SplitCardIcon class\nexport class SplitCardIcon {\n\n // Attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) iconSize = \"1em\";\n @bindable({ defaultBindingMode: bindingMode.toView }) \n iconRelativeSpacing = \"0.2em\";\n\n}\n","// Define the view-model for the \"system-notifications\" component\n\n// Import library modules\nimport { inject } from \"aurelia-framework\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n// Import service modules\nimport NotificationService from \"services/notification\";\n\n\n// Export SystemNotifications class\n@inject(NotificationService)\nexport class SystemNotifications {\n\n // Attributes\n i18nParams = i18nParams;\n enabled = true;\n\n constructor(notificationService) {\n this.notificationService = notificationService;\n }\n\n bind() {\n const { systemNotificationsPermission } = this.notificationService;\n this.enabled = systemNotificationsPermission === \"default\";\n }\n\n async requestSystemNotificationsPermission() {\n await this.notificationService.requestSystemNotificationsPermission();\n const { systemNotificationsPermission } = this.notificationService;\n this.enabled = systemNotificationsPermission === \"default\";\n }\n\n}\n","// Define the view-model for the \"time-stamp\" component\n\n// Import library modules\nimport { I18N } from \"aurelia-i18n\";\nimport ms from \"ms\";\nimport { \n bindable, \n bindingMode, \n computedFrom, \n inject\n} from \"aurelia-framework\";\n\n// Import utility modules\nimport { unsetEventHandlers } from \"utilities/event\";\nimport { typeOf } from \"utilities/etc\";\nimport {\n computeRelativeTimeString,\n computeDistanceTimeString,\n getCurrentTimeStampMs\n} from \"utilities/time\";\n\n// Import parameter modules\nimport { uiLocaleCode as defaultUILocaleCode } from \"parameters/environment\";\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n// Import service modules\nimport EventService from \"services/event\";\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst twentySecondsMs = ms(\"20 secs\");\nconst twentyMinutesMs = ms(\"20 mins\");\nconst oneHourMs = ms(\"1 hour\");\nconst twelveHoursMs = ms(\"12 hours\");\nconst oneDayMs = ms(\"1 day\");\n\n\n// Export TimeStamp class\n@inject(\n EventService,\n I18N,\n UserService\n)\nexport class TimeStamp {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView })\n timeStampMs = undefined;\n @bindable({ defaultBindingMode: bindingMode.toView })\n displayMode = \"relative\";\n @bindable({ defaultBindingMode: bindingMode.toView })\n anchorClasses = \"uk-link uk-link-heading\";\n @bindable({ defaultBindingMode: bindingMode.toView })\n spanClasses = \"\";\n @bindable({ defaultBindingMode: bindingMode.toView })\n showIcon = true\n\n // Local attributes\n elapsedTimeMs = 0;\n elapsedTimeIntervalMs = -1;\n uiLocaleCode = defaultUILocaleCode;\n i18nParams = i18nParams;\n\n constructor(\n eventService,\n i18n,\n userService\n ) {\n this.eventService = eventService;\n this.i18n = i18n;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n async bind() {\n this.validateBoundAttributes();\n\n // Get current locale code\n this.uiLocaleCode = this.i18n.getLocale();\n\n // Subscribe to \"i18n:locale:chaged\" event (i18n specific)\n const i18nLocaleChangedSubscription = this.eventService.subscribe({\n eventName: \"i18n:locale:changed\", \n eventHandler: this.handleI18nLocaleChangedEvent.bind(this)\n });\n this.eventsSubscriptions = [i18nLocaleChangedSubscription];\n\n // Set elapsed time interval\n this.setOrResetElapsedTimeInterval();\n }\n\n unbind() {\n if (this.elapsedTimeIntervalId) {\n clearInterval(this.elapsedTimeIntervalId);\n }\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n })\n }\n\n\n // Getter and setter methods\n @computedFrom(\"timeStampMs\", \"elapsedTimeMs\", \"displayMode\", \"uiLocaleCode\")\n get timeStampString() {\n switch (this.displayMode) {\n case \"relative\": // e.g. yesterday, at 14.56\n return computeRelativeTimeString({\n timeStampMs: this.timeStampMs,\n localeCode: this.uiLocaleCode\n });\n case \"distance\": // e.g. 53 minutes ago\n return computeDistanceTimeString({\n timeStampMs: this.timeStampMs,\n localeCode: this.uiLocaleCode,\n stringFormat: \"strict\",\n addSuffix: true // e.g. 3 days AGO\n });\n default:\n throw new Error(`Unknown time-stamp display mode \"${this.displayMode}\"`);\n }\n }\n\n\n // Core methods\n validateBoundAttributes() {\n if (typeOf(this.timeStampMs) !== \"number\") {\n throw new Error(`Parameter \"timeStampMs\" should be a number`);\n }\n if (![\"relative\", \"distance\"].includes(this.displayMode)) {\n throw new Error(`Unknown display mode \"${this.displayMode}\"`);\n }\n }\n\n setOrResetElapsedTimeInterval() {\n const oldElapsedTimeIntervalMs = this.elapsedTimeIntervalMs;\n this.updateElapsedTimeIntervalMs();\n if (this.elapsedTimeIntervalMs !== oldElapsedTimeIntervalMs) {\n if (this.elapsedTimeIntervalId) {\n clearInterval(this.elapsedTimeIntervalId);\n }\n if (this.elapsedTimeIntervalMs > 0) {\n this.elapsedTimeIntervalId = setInterval(\n this.elapsedTimeIntervalCallback.bind(this), \n this.elapsedTimeIntervalMs\n );\n }\n }\n }\n elapsedTimeIntervalCallback() {\n const currentElapsedTimeIntervalMs = this.elapsedTimeIntervalMs;\n this.updateElapsedTimeIntervalMs();\n if (this.elapsedTimeIntervalMs !== currentElapsedTimeIntervalMs) {\n this.setOrResetElapsedTimeInterval();\n }\n }\n updateElapsedTimeIntervalMs() {\n const currentTimeStampMs = getCurrentTimeStampMs();\n this.elapsedTimeMs = currentTimeStampMs - this.timeStampMs;\n const absoluteElapsedTime = Math.abs(this.elapsedTimeMs);\n switch (this.displayMode) {\n case \"relative\":\n this.elapsedTimeIntervalMs = -1; // clear interval\n break;\n case \"distance\":\n this.elapsedTimeIntervalMs = \n absoluteElapsedTime < oneHourMs ? twentySecondsMs :\n absoluteElapsedTime < oneDayMs ? twentyMinutesMs : twelveHoursMs;\n break;\n default:\n throw new Error(`Unknown display mode \"${this.displayMode}\"`);\n }\n }\n\n toggleDisplayMode() {\n this.displayMode =\n this.displayMode === \"distance\" ? \"relative\" : \"distance\";\n this.setOrResetElapsedTimeInterval();\n this.userService.conditionallyExtendSession(); // do not await\n console.debug(`Set time-stamp display mode to \"${this.displayMode}\"`);\n }\n\n\n // Enent handlers\n handleI18nLocaleChangedEvent({\n newValue: newUILocaleCode = \"\"\n }) {\n this.uiLocaleCode = newUILocaleCode;\n }\n}\n","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;"],"names":[],"sourceRoot":""}