{"version":3,"file":"app-22d3106c.f584a1446b2fc034d810.bundle.js","mappings":"AAGA","sources":["webpack://lernplattform-admin-frontend/./src/resources/elements/date-input/date-input.html","webpack://lernplattform-admin-frontend/./src/resources/elements/device-select/audio-input-select/audio-input-select.html","webpack://lernplattform-admin-frontend/./src/resources/elements/device-select/audio-output-select/audio-output-select.html","webpack://lernplattform-admin-frontend/./src/resources/elements/device-select/device-select.html","webpack://lernplattform-admin-frontend/./src/resources/elements/device-select/video-input-select/video-input-select.html","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-conference-view/distinar-conference-view.html","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-course-view/distinar-course-view.html","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-current-stream-bar/distinar-current-stream-bar.html","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-header-bar/distinar-header-bar.html","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-navigation-bar/distinar-navigation-bar.html","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-quiz-view/distinar-quiz-view.html","webpack://lernplattform-admin-frontend/./src/resources/elements/date-input/date-input.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/device-select/audio-input-select/audio-input-select.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/device-select/audio-output-select/audio-output-select.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/device-select/device-select.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/device-select/index.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/device-select/video-input-select/video-input-select.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-conference-view/distinar-conference-view.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-conference-view/index.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-course-view/distinar-course-view.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-course-view/index.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-current-stream-bar/distinar-current-stream-bar.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-current-stream-bar/index.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-header-bar/distinar-header-bar.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-header-bar/index.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-navigation-bar/distinar-navigation-bar.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-navigation-bar/index.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-quiz-view/distinar-quiz-view.ts","webpack://lernplattform-admin-frontend/./src/resources/elements/distinar-quiz-view/index.ts"],"sourcesContent":["// Module\nvar code = \"<template class=\\\"date-input date-input--pos-${positioningStrategy}\\\"> <div class=\\\"input-group ${ dense ? 'date-input--dense' : '' } ${ disabled ? 'date-input--disabled' : '' } ${ isInvalid ? 'date-input--is-invalid' : '' }\\\"> <input disabled.to-view=\\\"disabled\\\" class=\\\"form-control\\\" type=\\\"text\\\" t=\\\"[placeholder]elements.dateInput.${placeholderTextTk}\\\" value.to-view=\\\"value\\\" data-input> <span class=\\\"input-group-append\\\"> <button disabled.to-view=\\\"disabled\\\" class=\\\"btn btn-secondary date-input__btn\\\" type=\\\"button\\\" data-toggle> <safe-icon class=\\\"date-input__icon\\\" icon-name=\\\"${ mode === DateInputMode.Time ? 'System/Tabler/Clock' : 'System/Tabler/Calendar' }\\\"></safe-icon> </button> <button if.to-view=\\\"canClear && value\\\" click.trigger=\\\"clear()\\\" disabled.to-view=\\\"disabled\\\" class=\\\"btn btn-secondary date-input__btn\\\" type=\\\"button\\\" data-toggle> <safe-icon class=\\\"date-input__icon\\\" icon-name=\\\"System/Tabler/X\\\"></safe-icon> </button> </span> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <device-select type=\\\"audio-input\\\" activated.two-way=\\\"activated\\\" label-tk=\\\"elements.device-select.audioInput\\\" selected.two-way=\\\"selected\\\" show-activation.to-view=\\\"showActivation\\\" disabled.to-view=\\\"disabled\\\" error.to-view=\\\"error\\\" loading.from-view=\\\"loading\\\"></device-select> </template> \";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <device-select type=\\\"audio-output\\\" label-tk=\\\"elements.device-select.audioOutput\\\" selected.two-way=\\\"selected\\\" show-activation.to-view=\\\"false\\\" disabled.to-view=\\\"disabled\\\" error.to-view=\\\"error\\\" loading.from-view=\\\"loading\\\"></device-select> </template> \";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"device-select ${ error ? 'device-select--error' : '' }\\\"> <div class=\\\"device-select__group form-group\\\"> <div class=\\\"device-select__label-area\\\"> <label class=\\\"device-select__input-label\\\" t.to-view=\\\"labelTk\\\"></label> <div if.to-view=\\\"showActivation\\\" class=\\\"device-select__activation\\\"> <label class=\\\"device-select__checkbox-label\\\"> <span t=\\\"globals.activate\\\"></span> <input type=\\\"checkbox\\\" checked.bind=\\\"activated\\\"> </label> </div> </div> <select class=\\\"custom-select device-select__select\\\" model.to-view=\\\"selectedDeviceId\\\" change.trigger=\\\"handleSelectionChanged($event)\\\" disabled.to-view=\\\"disabled || devices == null || devices.length === 0\\\"> <option if.to-view=\\\"devices.length == null\\\" t=\\\"elements.device-select.loading\\\"></option> <option if.to-view=\\\"devices.length === 0\\\" t=\\\"elements.device-select.noDeviceSelectionAvailable\\\"></option> <option repeat.for=\\\"device of devices\\\" value.to-view=\\\"device.deviceId\\\" selected.to-view=\\\"selectedDeviceId === device.deviceId\\\">${device.label}</option> </select> </div> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template> <device-select type=\\\"video-input\\\" activated.two-way=\\\"activated\\\" label-tk=\\\"elements.device-select.videoInput\\\" selected.two-way=\\\"selected\\\" show-activation.to-view=\\\"showActivation\\\" disabled.to-view=\\\"disabled\\\" error.to-view=\\\"error\\\" loading.from-view=\\\"loading\\\"></device-select> </template> \";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"distinar-conference-view\\\"> <conference-video-matrix if.to-view=\\\"isConferenceActive\\\" class=\\\"distinar-conference-view__matrix\\\"></conference-video-matrix> <div if.to-view=\\\"!isConferenceActive\\\" class=\\\"distinar-conference-view__placeholder-container\\\"> <div class=\\\"distinar-conference-view__placeholder-title\\\" t=\\\"elements.distinarConferenceView.notActiveTitle\\\"></div> <div class=\\\"distinar-conference-view__placeholder-description\\\" t=\\\"elements.distinarConferenceView.notActiveText\\\"></div> </div> <div class=\\\"distinar-conference-view__conference-bar\\\"> <distinar-current-stream-bar></distinar-current-stream-bar> </div> </template> \";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"distinar-course-view\\\"> <presentation-viewer class=\\\"distinar-course-view__presentation-slides\\\" context-identifier.to-view=\\\"contextIdentifier\\\" slide-whiteboard-changed.trigger=\\\"onWhiteboardChanged($event)\\\"> <div class=\\\"distinar-course-view__fullscreen-current-stream\\\" slot=\\\"additionalFullscreenContent\\\"> <distinar-current-stream-bar if.to-view=\\\"isFullscreen\\\" show-students.to-view=\\\"true\\\"></distinar-current-stream-bar> </div> </presentation-viewer> <div class=\\\"distinar-course-view__conference-bar\\\"> <distinar-current-stream-bar if.to-view=\\\"!isFullscreen\\\" show-students.to-view=\\\"true\\\"></distinar-current-stream-bar> </div> </template> \";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"distinar-current-stream-bar ${isDistinarPaused ? `distinar-current-stream-bar--paused` : ``}\\\"> <div class=\\\"distinar-current-stream-bar__own-streams-wrapper\\\"> <div class=\\\"distinar-current-stream-bar__stream-wrapper\\\"> <aspect-ratio-container class=\\\"distinar-current-stream-bar__stream\\\" ratio.to-view=\\\"4/3\\\"> <div if.to-view=\\\"currentContentView === ContentView.Conference\\\" class=\\\"distinar-current-stream-bar__content\\\"> <distinar-conference-student-view is-mock.to-view=\\\"true\\\" lecture-status.to-view=\\\"lectureStatus\\\" tenant-logo-picture-url.to-view=\\\"tenantLogoPictureUrl\\\" tenant-name.to-view=\\\"tenantName\\\"></distinar-conference-student-view> </div> <course-lecture-slide-preview if.to-view=\\\"currentContentView === ContentView.Course\\\" class=\\\"distinar-current-stream-bar__content\\\" context-identifier.to-view=\\\"contextIdentifier\\\" slide-id.to-view=\\\"slideId\\\"></course-lecture-slide-preview> <lecture-quiz-slide if.to-view=\\\"currentContentView === ContentView.Quiz\\\" class=\\\"distinar-current-stream-bar__content\\\" lecture-status.to-view=\\\"lectureStatus\\\" show-header-buttons.to-view=\\\"false\\\"></lecture-quiz-slide> </aspect-ratio-container> <div class=\\\"distinar-current-stream-bar__own-streams-text-wrapper\\\"> <span class=\\\"distinar-current-stream-bar__own-streams-text\\\" t=\\\"elements.distinarCurrentStreamBar.currentStream\\\"></span> <x-icon class=\\\"distinar-current-stream-bar__external-window-btn\\\" icon-type=\\\"custom\\\" size=\\\"unspecified\\\" icon-name=\\\"Distinar/StreamEnlarge\\\" click.delegate=\\\"onOpenStreamInExternalWindow()\\\"></x-icon> </div> </div> <div if.to-view=\\\"localAttendeeId\\\" class=\\\"distinar-current-stream-bar__stream-wrapper\\\"> <aspect-ratio-container ratio.to-view=\\\"4/3\\\" class=\\\"distinar-current-stream-bar__stream\\\"> <conference-attendee class=\\\"distinar-current-stream-bar__attendee\\\" chime-attendee-id.to-view=\\\"localAttendeeId\\\" name-tag-style=\\\"bar\\\"></conference-attendee> </aspect-ratio-container> </div> </div> <div if.to-view=\\\"showStudents\\\" class=\\\"distinar-current-stream-bar__students\\\"> <div repeat.for=\\\"attendeeId of studentAttendeeIds\\\" class=\\\"distinar-current-stream-bar__stream-wrapper\\\"> <aspect-ratio-container ratio.to-view=\\\"4/3\\\" class=\\\"distinar-current-stream-bar__stream\\\"> <conference-attendee class=\\\"distinar-current-stream-bar__attendee\\\" chime-attendee-id.to-view=\\\"attendeeId\\\" name-tag-style=\\\"bar\\\"></conference-attendee> </aspect-ratio-container> </div> </div> </template> \";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"distinar-header-bar\\\"> <div if.to-view=\\\"isConferenceActive\\\" class=\\\"distinar-header-bar__conference-indication\\\"> <div class=\\\"distinar-header-bar__active-indicator\\\"></div> <span t=\\\"elements.distinarHeaderBar.conferenceActive\\\"></span> </div> <div if.to-view=\\\"!isConferenceActive\\\" class=\\\"distinar-header-bar__distinar-info\\\"> <span class=\\\"distinar-header-bar__distinar-info-title\\\">${distinarTitle}</span> <span class=\\\"distinar-header-bar__distinar-info-date\\\">${distinarDate}</span> </div> <div class=\\\"distinar-header-bar__spacer\\\"></div> <span class=\\\"distinar-header-bar__runtime\\\">${formattedRuntime}</span> <lecture-button if.to-view=\\\"!isDistinarPaused\\\" click.delegate=\\\"pauseDistinar()\\\" class=\\\"distinar-header-bar__pause\\\" type=\\\"outline\\\" disabled.to-view=\\\"isInitializing || isConnecting || hasFailedConnecting\\\"> <safe-icon class=\\\"distinar-header-bar__btn-icon\\\" icon-name=\\\"Distinar/LecturerPause\\\"></safe-icon> <span t=\\\"elements.distinarHeaderBar.pause\\\"></span> </lecture-button> <lecture-button if.to-view=\\\"isDistinarPaused\\\" click.delegate=\\\"continueDistinar()\\\" class=\\\"distinar-header-bar__continue\\\" type=\\\"fill\\\" disabled.to-view=\\\"isInitializing || isConnecting || hasFailedConnecting\\\"> <safe-icon class=\\\"distinar-header-bar__btn-icon\\\" icon-name=\\\"Distinar/LecturerContinue\\\"></safe-icon> <span t=\\\"elements.distinarHeaderBar.continue\\\"></span> </lecture-button> <lecture-button if.to-view=\\\"!isConferenceActive && !isQuickDistinar\\\" click.delegate=\\\"startConference()\\\" class=\\\"distinar-header-bar__start-conference\\\" type=\\\"fill\\\" disabled.to-view=\\\"isInitializing || isConnecting || hasFailedConnecting || isSyncingActiveMeeting || isDistinarPaused\\\"> <safe-icon class=\\\"distinar-header-bar__btn-icon\\\" icon-name=\\\"Distinar/LecturerPhoneOutgoing\\\"></safe-icon> <span t=\\\"elements.distinarHeaderBar.startConference\\\"></span> </lecture-button> <lecture-button if.to-view=\\\"isConferenceActive\\\" click.delegate=\\\"stopConference()\\\" class=\\\"distinar-header-bar__stop-conference\\\" type=\\\"fill\\\" disabled.to-view=\\\"isInitializing || isConnecting || hasFailedConnecting || isSyncingActiveMeeting || isDistinarPaused\\\"> <safe-icon class=\\\"distinar-header-bar__btn-icon\\\" icon-name=\\\"Distinar/LecturerPhoneHangUp\\\"></safe-icon> <span t=\\\"elements.distinarHeaderBar.stopConference\\\"></span> </lecture-button> <lecture-button click.delegate=\\\"endDistinar()\\\" class=\\\"distinar-header-bar__end-distinar\\\" type=\\\"fill\\\" disabled.to-view=\\\"isInitializing || isConnecting || hasFailedConnecting\\\"> <safe-icon class=\\\"distinar-header-bar__btn-icon\\\" icon-name=\\\"Distinar/LecturerEndDistinar\\\"></safe-icon> <span t=\\\"common.distinar.endDistinar\\\"></span> </lecture-button> </template>\";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"distinar-navigation-bar\\\"> <nav> <ul class=\\\"nav nav-tabs border-0\\\"> <li repeat.for=\\\"entry of entries\\\" class=\\\"nav-item navigation-bar__nav-item ${entry.disabled ? 'nav-item--disabled' : ''}\\\"> <a click.trigger=\\\"entry.click(entry)\\\" class=\\\"nav-link ${entry.selected ? 'active' : ''} ${entry.disabled ? 'disabled' : ''}\\\"> <safe-icon if.to-view=\\\"entry.icon\\\" class=\\\"distinar-navigation-bar__tab-icon\\\" icon-name.to-view=\\\"entry.icon\\\"></safe-icon> <span t.to-view=\\\"entry.tk\\\" t-params.to-view=\\\"entry.tkParams\\\"></span> </a> </li> </ul> </nav> <div class=\\\"distinar-navigation-bar__flex-spacer\\\"></div> <div show.to-view=\\\"isConferenceActive\\\" class=\\\"distinar-navigation-bar__conference-controls\\\"> <icon-button class=\\\"distinar-navigation-bar__conference-control distinar-navigation-bar__control distinar-navigation-bar__toggle ${conferenceConfiguration.streamVideo ? `distinar-navigation-bar__toggle--toggled` : ``}\\\" icon.to-view=\\\"`Distinar/LecturerCam${conferenceConfiguration.streamVideo ? `` : `Off`}`\\\" click.delegate=\\\"toggleVideoInput()\\\" disabled.to-view=\\\"isConnecting || isDistinarPaused\\\"></icon-button> <icon-button class=\\\"distinar-navigation-bar__conference-control distinar-navigation-bar__control distinar-navigation-bar__toggle ${conferenceConfiguration.streamAudio ? `distinar-navigation-bar__toggle--toggled` : ``}\\\" icon.to-view=\\\"`Distinar/LecturerMic${conferenceConfiguration.streamAudio ? `` : `Off`}`\\\" click.delegate=\\\"toggleAudioInput()\\\" disabled.to-view=\\\"isConnecting || isDistinarPaused\\\"></icon-button> <icon-button class=\\\"distinar-navigation-bar__control distinar-navigation-bar__toggle ${conferenceConfiguration.shareScreen ? `distinar-navigation-bar__toggle--toggled` : ``}\\\" icon=\\\"Distinar/LecturerShareScreen\\\" click.delegate=\\\"toggleScreenSharing()\\\" disabled.to-view=\\\"isConnecting || isDistinarPaused\\\"></icon-button> <icon-button class=\\\"distinar-navigation-bar__control\\\" icon=\\\"Distinar/GridExternal\\\" click.delegate=\\\"openConferenceInExternalWindow()\\\" disabled.to-view=\\\"isConnecting\\\"></icon-button> </div> <div class=\\\"distinar-navigation-bar__controls\\\"> <icon-button if.to-view=\\\"!isQuickDistinar\\\" class=\\\"distinar-navigation-bar__control distinar-navigation-bar__toggle\\\" icon=\\\"Distinar/QrCode\\\" click.delegate=\\\"showQrCode()\\\" disabled.to-view=\\\"isConnecting\\\"></icon-button> <icon-button if.to-view=\\\"!isQuickDistinar\\\" class=\\\"distinar-navigation-bar__control distinar-navigation-bar__toggle ${activeSideMenuSection === SideMenuSectionName.Chat ? `distinar-navigation-bar__toggle--toggled` : ``}\\\" icon=\\\"Distinar/LecturerChat\\\" has-updates.to-view=\\\"chatHasUpdates\\\" click.delegate=\\\"toggleChatInSideMenu()\\\" disabled.to-view=\\\"isConnecting\\\"></icon-button> <icon-button class=\\\"distinar-navigation-bar__control distinar-navigation-bar__toggle ${activeSideMenuSection === SideMenuSectionName.AttendeeList ? `distinar-navigation-bar__toggle--toggled` : ``}\\\" icon=\\\"Distinar/LecturerUsers\\\" click.delegate=\\\"toggleAttendeeListInSideMenu()\\\" disabled.to-view=\\\"isConnecting\\\"></icon-button> <icon-button if.to-view=\\\"!isQuickDistinar\\\" class=\\\"distinar-navigation-bar__control\\\" icon=\\\"Distinar/LecturerSettings\\\" click.delegate=\\\"showSettingsDialog()\\\" disabled.to-view=\\\"isConnecting\\\"></icon-button> </div> </template> \";\n// Exports\nexport default code;","// Module\nvar code = \"<template class=\\\"distinar-quiz-view\\\"> <div class=\\\"distinar-quiz-view__header-row\\\"> <template if.to-view=\\\"!lectureStatus.quiz\\\"> <div class=\\\"input-group\\\"> <input type=\\\"text\\\" class=\\\"form-control\\\" value.two-way=\\\"searchString\\\" t=\\\"[placeholder]pages.lectureQuiz.search\\\"> <div class=\\\"input-group-append\\\"> <button class=\\\"btn btn-outline-secondary\\\" type=\\\"button\\\" click.delegate=\\\"searchQuizTemplates(searchString)\\\"> <x-icon class=\\\"distinar-quiz-view__header-btn-icon distinar-quiz-view__header-btn\\\" size=\\\"unspecified\\\" icon-type=\\\"custom\\\" icon-name=\\\"System/Search\\\"></x-icon> </button> <button class=\\\"btn btn-outline-secondary distinar-quiz-view__header-btn\\\" click.delegate=\\\"resetQuizTemplatesFound()\\\" type=\\\"button\\\"> <x-icon class=\\\"distinar-quiz-view__header-btn-icon\\\" size=\\\"unspecified\\\" icon-type=\\\"custom\\\" icon-name=\\\"System/Close\\\"></x-icon> </button> </div> </div> </template> <template if.to-view=\\\"lectureStatus.quiz\\\"> <lecture-button class=\\\"distinar-quiz-view__btn\\\" type=\\\"fill\\\" click.delegate=\\\"requestFullscreen()\\\"> <x-icon class=\\\"distinar-quiz-view__btn-icon\\\" size=\\\"unspecified\\\" icon-type=\\\"custom\\\" icon-name=\\\"System/Maximize\\\"></x-icon> <span t=\\\"elements.distinarCourseView.fullscreen\\\"></span> </lecture-button> <lecture-button class=\\\"distinar-quiz-view__btn\\\" type=\\\"fill\\\" click.delegate=\\\"stopQuiz()\\\"> <x-icon class=\\\"distinar-quiz-view__btn-icon\\\" size=\\\"unspecified\\\" icon-type=\\\"custom\\\" icon-name=\\\"Distinar/LecturerEndDistinar\\\"></x-icon> <span t=\\\"pages.lectureQuiz.stopQuiz\\\"></span> </lecture-button> </template> </div> <div class=\\\"distinar-quiz-view__content ${!lectureStatus.quiz ? 'distinar-quiz-view__content--scroll' : ''}\\\"> <template if.to-view=\\\"!lectureStatus.quiz\\\"> <section class=\\\"distinar-quiz-view__section-grid\\\"> <quick-quiz-card class=\\\"distinar-quiz-view__section-card\\\" click.delegate=\\\"prepareQuickQuiz()\\\"></quick-quiz-card> </section> <template if.to-view=\\\"myQuizTemplates.length\\\"> <h3 class=\\\"mb-4 card-title\\\" t=\\\"pages.quiz-templates.ownQuizTitle\\\"></h3> <section class=\\\"distinar-quiz-view__section-grid\\\"> <quiz-template-card repeat.for=\\\"quizTemplate of myQuizTemplates\\\" class=\\\"distinar-quiz-view__section-card\\\" disabled.to-view=\\\"!quizTemplate.questionCount\\\" click.delegate=\\\"prepareQuizFromTemplate(quizTemplate)\\\" quiz-template.to-view=\\\"quizTemplate\\\"></quiz-template-card> </section> </template> <template if.to-view=\\\"curatedQuizTemplates.length\\\"> <h3 class=\\\"mb-4 card-title\\\" t=\\\"pages.quiz-templates.curatedQuizTitle\\\"></h3> <section class=\\\"distinar-quiz-view__section-grid\\\"> <quiz-template-card repeat.for=\\\"quizTemplate of curatedQuizTemplates\\\" class=\\\"distinar-quiz-view__section-card\\\" disabled.to-view=\\\"!quizTemplate.questionCount\\\" click.delegate=\\\"prepareQuizFromTemplate(quizTemplate)\\\" quiz-template.to-view=\\\"quizTemplate\\\"></quiz-template-card> </section> </template> </template> <lecturer-lecture-quiz if.to-view=\\\"lectureStatus.quiz\\\" class=\\\"distinar-quiz-view__quiz\\\" view-model.ref=\\\"lecturerLectureQuiz\\\" lecture-status.to-view=\\\"lectureStatus\\\"></lecturer-lecture-quiz> </div> <div class=\\\"distinar-quiz-view__conference-bar\\\"> <distinar-current-stream-bar show-students.to-view=\\\"true\\\"></distinar-current-stream-bar> </div> </template>\";\n// Exports\nexport default code;","import { PositioningStrategy } from '@popperjs/core';\nimport { autoinject, bindable, computedFrom } from 'aurelia-framework';\nimport { I18N } from 'aurelia-i18n';\nimport { SubscriptionManager, SubscriptionManagerService } from 'common/aurelia-services/SubscriptionManagerService';\nimport { assertNotNullOrUndefined } from 'common/utils/assert';\nimport { DomUtils } from 'common/utils/DomUtils';\nimport flatpickr from 'flatpickr';\nimport l10n from 'flatpickr/dist/l10n';\nimport { Instance } from 'flatpickr/dist/types/instance';\nimport { key as LocaleKey } from 'flatpickr/dist/types/locale';\n\nexport enum DateInputMode {\n  Date = 'date',\n  Time = 'time',\n  DateTime = 'date-time'\n}\n\n@autoinject()\nexport class DateInput {\n  @bindable() public value: string = '';\n  @bindable() public isInvalid = false;\n  @bindable() public disabled = false;\n  @bindable() public minuteStep = 5;\n  @bindable() public changeNotifier = false;\n  @bindable() public pullFocus = false;\n  @bindable() public canClear = false;\n  @bindable() public mode: DateInputMode = DateInputMode.DateTime;\n  @bindable() public positioningStrategy: PositioningStrategy = 'absolute';\n  @bindable() public dense = false;\n\n  private flatPickerInstance?: Instance;\n  private isAttached = false;\n  private element: HTMLElement;\n  private DateInputMode = DateInputMode;\n  private subscriptionManager: SubscriptionManager;\n  constructor(\n    element: Element,\n    private i18n: I18N,\n    subscriptionManagerService: SubscriptionManagerService,\n  ) {\n    this.element = element as HTMLElement;\n    this.subscriptionManager = subscriptionManagerService.createSubscriptionManager();\n  }\n\n  protected attached(): void {\n    this.isAttached = true;\n    const locale = this.i18n.getLocale();\n    this.flatPickerInstance = flatpickr(this.element, {\n      wrap: true,\n      altInput: true,\n      allowInput: true,\n      disableMobile: true,\n      enableTime: !!(this.mode === DateInputMode.Time || this.mode === DateInputMode.DateTime),\n      altFormat: this.getFormat(),\n      appendTo: this.element,\n      dateFormat: this.getFormat(),\n      minuteIncrement: this.minuteStep,\n      noCalendar: !!(this.mode === DateInputMode.Time),\n      locale: l10n[locale as LocaleKey],\n      time_24hr: (this.mode === DateInputMode.Time),\n      onOpen: (_, __, instance) => {\n        if(!this.value) instance.jumpToDate(new Date);\n      },\n      onClose: (_, dateStr, instance) => {\n        instance.setDate(dateStr);\n        this.value = this.parseDate(dateStr).toISOString();\n      },\n      onChange: (_, dateStr) => {\n        this.value = this.parseDate(dateStr).toISOString();\n      },\n      parseDate: dateStr => this.parseDate(dateStr),\n    });\n\n    /**\n     * Flatpickr doesn't handle the up/down keys properly, when it is only used for time\n     * Flatpickr doesn't handle Tabbing Out correctly, although this is supposed to be handled via the \"allowInput\"\n     * Flatpickr somehow doesn't close itself when you want to tab out of its element\n     * As all of this is internal weird behavior, here we override the critical keyboard events and handle them ourselves\n     */\n    const input = this.flatPickerInstance.altInput;\n    assertNotNullOrUndefined(input, 'altInput not defined');\n    this.disabledChanged();\n    this.subscriptionManager.subscribeToDomEvent(input, 'keydown', ev => {\n      const keyboardEvent = ev as KeyboardEvent;\n      if(this.mode === DateInputMode.Time && [38, 40].includes(keyboardEvent.keyCode)) { // up/down\n        ev.preventDefault();\n        ev.stopPropagation();\n        this.flatPickerInstance?.hourElement?.focus();\n      } else if(keyboardEvent.keyCode === 9) { // tab\n        this.value = input.value.trim() && this.canClear\n          ? this.parseDate(input.value).toISOString()\n          : '';\n        this.flatPickerInstance?.setDate(this.value);\n        this.flatPickerInstance?.close();\n        ev.stopPropagation();\n      }\n    });\n    if(this.pullFocus) {\n      input.focus();\n    }\n  }\n\n  protected detached(): void {\n    this.subscriptionManager.disposeSubscriptions();\n    this.flatPickerInstance?.destroy();\n    this.isAttached = false;\n  }\n\n  private parseDate(dateStr: string): Date {\n    const format = this.getFormat();\n    const validDate = flatpickr.parseDate(dateStr, format);\n    const sanitizedDate = validDate ?? new Date;\n\n    // we have to round to the minuteStep otherwise flatpickr will declare its own minute box \"INVALID\"\n    // and block the form from being submitted. Silently.\n    sanitizedDate.setMinutes(Math.floor(sanitizedDate.getMinutes() / this.minuteStep) * this.minuteStep);\n\n    return sanitizedDate;\n  }\n\n  public disabledChanged(): void {\n    if(this.flatPickerInstance?.altInput) {\n      this.flatPickerInstance.altInput.disabled = this.disabled;\n    }\n  }\n\n  private valueChanged(newValue: string, oldValue: string): void {\n    if(oldValue !== newValue && this.isAttached) {\n      this.flatPickerInstance?.setDate(newValue);\n      if(this.changeNotifier) DomUtils.fireEvent(this.element, { name: 'date-changed', bubbles: false });\n    }\n  }\n\n  private getFormat(): string {\n    switch(this.mode) {\n      case DateInputMode.Time:\n        return 'H:i';\n      case DateInputMode.Date:\n        return 'd.m.Y';\n      default:\n        return 'd.m.Y - H:i';\n    }\n  }\n\n  @computedFrom('mode')\n  private get placeholderTextTk(): string {\n    switch(this.mode) {\n      case DateInputMode.Time:\n        return 'placeholderTime';\n      case DateInputMode.Date:\n        return 'placeholderDate';\n      default:\n        return 'placeholderDateTime';\n    }\n  }\n\n  private clear(): void {\n    this.value = '';\n  }\n}\n","import { autoinject, bindable } from 'aurelia-framework';\n\n@autoinject()\nexport class AudioInputSelect {\n  @bindable() public selected: MediaDeviceInfo | null = null;\n  @bindable() public activated: boolean | null = null;\n  @bindable() public showActivation = false;\n  @bindable() public disabled = false;\n  @bindable() public error = false;\n\n  @bindable() public loading!: boolean;\n  @bindable() public couldntLoadDevices!: boolean;\n}\n","import { autoinject, bindable } from 'aurelia-framework';\n\n@autoinject()\nexport class AudioOutputSelect {\n  @bindable() public selected: MediaDeviceInfo | null = null;\n  @bindable() public activated: boolean | null = null;\n  @bindable() public showActivation = false;\n  @bindable() public disabled = false;\n  @bindable() public error = false;\n\n  @bindable() public loading!: boolean;\n  @bindable() public couldntLoadDevices!: boolean;\n}\n","import { autoinject, bindable, computedFrom } from 'aurelia-framework';\nimport { I18N } from 'aurelia-i18n';\nimport { ChimeService, Event as ChimeEvent, MediaDeviceType } from 'common/aurelia-services/ChimeService';\nimport { INullDevice } from 'common/dto/distinar/distinar.interface';\nimport { assertNotNullOrUndefined } from 'common/utils/assert';\nimport { DomUtils } from 'common/utils/DomUtils';\nimport { MediaDeviceUtils } from 'common/utils/MediaDeviceUtils';\n\n@autoinject()\nexport class DeviceSelect {\n  @bindable() public type: MediaDeviceType | null = null;\n  @bindable() public selected: MediaDeviceInfo | null = null;\n  @bindable() public activated: boolean | null = null;\n  @bindable() public showActivation = false;\n  @bindable() public labelTk: string | null = null;\n  @bindable() public disabled = false;\n\n  /**\n   * @readonly should be used as `from-view` binding exclusively\n   */\n  @bindable() public loading = false;\n  /**\n   * @readonly should be used as `from-view` binding exclusively\n   */\n  @bindable() public couldntLoadDevices = false;\n\n  private audioOutputNullDevice: INullDevice;\n\n  private devices: Array<MediaDeviceInfo | INullDevice> | null = null;\n  private isAttached = false;\n\n  constructor(\n    private chimeService: ChimeService,\n    private i18n: I18N,\n  ) {\n    this.audioOutputNullDevice = {\n      label: i18n.tr('elements.device-select.audioOutputAutomatic'),\n      deviceId: null,\n    };\n  }\n\n  protected attached(): void {\n    this.isAttached = true;\n\n    this.subscribeToDeviceChange();\n    this.loadDevices();\n  }\n\n  protected detached(): void {\n    this.isAttached = false;\n    this.chimeService.disposeSubscriptions(this);\n  }\n\n  @computedFrom('selected')\n  private get selectedDeviceId(): string | null {\n    return this.selected?.deviceId ?? null;\n  }\n\n  private async loadDevices(): Promise<void> {\n    try {\n      this.loading = true;\n      this.devices = [];\n      if(this.type === MediaDeviceType.AudioInput) this.devices = await this.chimeService.listAudioInputDevices();\n      if(this.type === MediaDeviceType.AudioOutput) this.devices = [this.audioOutputNullDevice, ...(await this.chimeService.listAudioOutputDevices())];\n      if(this.type === MediaDeviceType.VideoInput) this.devices = await this.chimeService.listVideoInputDevices();\n      this.couldntLoadDevices = this.devices.length === 0;\n\n      if(this.selected == null && this.devices.length > 0 && this.type !== MediaDeviceType.AudioOutput) {\n        this.selected = this.devices[0] as MediaDeviceInfo;\n      }\n    } finally {\n      this.loading = false;\n    }\n  }\n\n  private subscribeToDeviceChange(): void {\n    if(!this.isAttached) return;\n\n    this.chimeService.subscribe(this, ChimeEvent.DevicesChanged, payload => {\n      if(payload.type !== this.type) return;\n\n      this.devices = payload.devices;\n      if(this.selected == null && this.devices.length > 0 && this.type !== MediaDeviceType.AudioOutput) {\n        this.selected = this.devices[0] as MediaDeviceInfo;\n      }\n    });\n  }\n\n  private handleSelectionChanged(event: Event): void {\n    assertNotNullOrUndefined(this.devices, 'expected devices to be an array');\n\n    const deviceId = DomUtils.extractChangeEventValueAsString(event);\n    this.selected = deviceId === 'null'\n      ? null\n      : MediaDeviceUtils.getDeviceByIdFromArray(\n        deviceId,\n        this.devices.filter((dev): dev is MediaDeviceInfo=> dev.deviceId !== null)\n      );\n  }\n\n  private showActivationChanged(): void {\n    if(this.showActivation) {\n      this.activated = false;\n    } else {\n      this.activated = null;\n    }\n  }\n}\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/elements/device-select/audio-input-select/audio-input-select'));\n  config.globalResources(PLATFORM.moduleName('resources/elements/device-select/audio-output-select/audio-output-select'));\n  config.globalResources(PLATFORM.moduleName('resources/elements/device-select/video-input-select/video-input-select'));\n  config.globalResources(PLATFORM.moduleName('resources/elements/device-select/device-select'));\n}\n","import { autoinject, bindable } from 'aurelia-framework';\n\n@autoinject()\nexport class VideoInputSelect {\n  @bindable() public selected: MediaDeviceInfo | null = null;\n  @bindable() public activated: boolean | null = null;\n  @bindable() public showActivation = false;\n  @bindable() public disabled = false;\n  @bindable() public error = false;\n\n  @bindable() public loading!: boolean;\n  @bindable() public couldntLoadDevices!: boolean;\n}\n","import { autoinject } from 'aurelia-framework';\nimport { StoreService } from 'common/aurelia-services/StoreService';\nimport { IState } from 'store/state';\n\n@autoinject()\nexport class DistinarConferenceView {\n  private isConferenceActive = false;\n\n  constructor(\n    private storeService: StoreService<IState>,\n  ) {}\n\n  protected attached(): void {\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => !!state.distinar.lectureStatus?.conference.active,\n    ], (_state, conferenceActive) => {\n      this.isConferenceActive = conferenceActive;\n    });\n  }\n\n  protected detached(): void {\n    this.storeService.disposeAllSubscriptions(this);\n  }\n}\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/elements/distinar-conference-view/distinar-conference-view'));\n}\n","import { autoinject, ObserverLocator, Parser } from 'aurelia-framework';\nimport { selectState, SelectStateObservableComponent } from 'common/aurelia-decorators/select-state';\nimport { DistinarWebSocketService } from 'common/aurelia-services/DistinarWebSocketService';\nimport { StoreService } from 'common/aurelia-services/StoreService';\nimport { DISTINAR_PRESENTATION_CONTEXT } from 'common/constants/content.editor.constants';\nimport { LecturerEmitMap, LecturerListenerMap } from 'common/dto/distinar/distinar.interface';\nimport { LecturerEmitName } from 'common/enum/distinar.enum';\nimport * as PresentationContextMutations from 'common/store/mutations/presentation.context.mutations';\nimport { IPresentationContextState } from 'common/store/store.interface';\nimport { ToastService } from '../../../services/ToastService';\nimport { setQuickDistinarData } from '../../../store/actions';\nimport { resumePresentationInfoSelectorCreator } from '../../../store/distinar.selectors';\nimport { updateDistinarPresentationResumeData } from '../../../store/lecturer.distinar.mutations';\nimport { IDistinarPresentationResumeData, IQuickDistinarData, IResumePresentationInfo, IState } from '../../../store/state';\nimport { SlideWhiteboardChangedEvent } from '../presentation-viewer/presentation-viewer';\n\n@autoinject()\nexport class DistinarCourseView extends SelectStateObservableComponent {\n  public contextIdentifier = DISTINAR_PRESENTATION_CONTEXT;\n  @selectState(DistinarCourseView, resumePresentationInfoSelectorCreator, ['contextIdentifier']) private resumePresentationInfo?: IResumePresentationInfo | null;\n\n  private slideId: number | null = null;\n\n  constructor(\n    private storeService: StoreService<IState>,\n    private distinarWebSocket: DistinarWebSocketService<LecturerListenerMap, LecturerEmitMap>,\n    private toastService: ToastService,\n    parser: Parser,\n    observerLocator: ObserverLocator,\n  ) {\n    super(parser, observerLocator);\n  }\n\n  protected async attached(): Promise<void> {\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinarConnection.connecting,\n      state => state.distinarConnection.disconnecting,\n      state => state.distinarInitializing,\n      state => (state.contentContexts[DISTINAR_PRESENTATION_CONTEXT]?.state as IPresentationContextState | undefined)?.slideId,\n    ], (_state, connecting, disconnecting, initializing, slideId) => {\n      this.slideId = slideId ?? null;\n      if(initializing || connecting || disconnecting) return;\n      if(slideId != null) void this.distinarWebSocket.connection.emit(LecturerEmitName.SetCourseSlide, { slideId });\n    });\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinarConnection.connecting,\n      state => state.distinarConnection.disconnecting,\n      state => state.distinarInitializing,\n      state => (state.contentContexts[DISTINAR_PRESENTATION_CONTEXT]?.state as IPresentationContextState | undefined)?.fullscreenPictureId ?? null,\n    ], (_state, connecting, disconnecting, initializing, fullscreenPictureId) => {\n      if(initializing || connecting || disconnecting) return;\n      void this.distinarWebSocket.connection.emit(LecturerEmitName.SetCourseFullscreenPicture, { pictureBlockId: fullscreenPictureId });\n    });\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinarConnection.connecting,\n      state => state.distinarConnection.disconnecting,\n      state => state.distinarInitializing,\n      state => (state.contentContexts[DISTINAR_PRESENTATION_CONTEXT]?.state as IPresentationContextState | undefined)?.revealedAnswerBlockIds ?? null,\n    ], (_state, connecting, disconnecting, initializing, blockIds) => {\n      if(initializing || connecting || disconnecting) return;\n      void this.distinarWebSocket.connection.emit(LecturerEmitName.SetCourseRevealedAnswerBlockIds, { blockIds });\n    });\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinarConnection.connecting,\n      state => state.distinarConnection.disconnecting,\n      state => state.distinarInitializing,\n      state => state.distinarPresentationResumeData,\n      state => state.quickDistinarData,\n      state => state.distinarConnectionData?.id ?? null\n    ], (_state, connecting, disconnecting, initializing, resumePreviousData, quickDistinarData, lectureId) => {\n      if(initializing || connecting || disconnecting) return;\n      if(resumePreviousData && resumePreviousData.lectureId !== lectureId) {\n        // 🚨 distinar side-effect\n        this.handleResumePresentation(resumePreviousData);\n      }\n      if(quickDistinarData) {\n        // 🚨 distinar side-effect\n        this.handleStartQuickDistinar(quickDistinarData);\n      }\n    });\n  }\n\n  protected detached(): void {\n    this.storeService.disposeAllSubscriptions(this);\n  }\n\n  private async onWhiteboardChanged(event: SlideWhiteboardChangedEvent): Promise<void> {\n    await this.distinarWebSocket.connection.emit(LecturerEmitName.WhiteboardChanged, {\n      slideId: event.detail.slideId,\n      svgData: event.detail.svgData,\n      backgroundColor: event.detail.backgroundColor,\n    });\n  }\n\n  private handleResumePresentation(previousCourse: IDistinarPresentationResumeData): void {\n    const { presentationId, slideId } = previousCourse;\n    if(!slideId || !presentationId || slideId === this.slideId || !this.resumePresentationInfo) return;\n    this.toastService.resumePresentation({\n      ...this.resumePresentationInfo,\n      resumeCb: async () => {\n        await this.startPresentationFromExistingData(presentationId, slideId);\n      },\n      dismissCb: async () => {\n        await this.storeService.dispatch(updateDistinarPresentationResumeData, null, null);\n      }\n    });\n  }\n\n  private async handleStartQuickDistinar(quickDistinarData: IQuickDistinarData): Promise<void> {\n    const { presentationId, slideId } = quickDistinarData;\n    if(!slideId || !presentationId || slideId === this.slideId) return;\n    await this.startPresentationFromExistingData(presentationId, slideId);\n  }\n\n  private async startPresentationFromExistingData(presentationId: number, slideId: number): Promise<void> {\n    await this.distinarWebSocket.connection.emit(LecturerEmitName.ResumePresentation, { courseId: presentationId, slideId });\n    await this.storeService\n      .pipe(setQuickDistinarData, null)\n      .pipe(PresentationContextMutations.setPresentationId, this.contextIdentifier, presentationId)\n      .pipe(PresentationContextMutations.setSlideId, this.contextIdentifier, slideId)\n      .dispatch();\n  }\n}\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/elements/distinar-course-view/distinar-course-view'));\n}\n","import { autoinject, bindable, computedFrom, observable } from 'aurelia-framework';\nimport { selectState } from 'common/aurelia-decorators/select-state';\nimport { StoreService } from 'common/aurelia-services/StoreService';\nimport { DISTINAR_PRESENTATION_CONTEXT } from 'common/constants/content.editor.constants';\nimport { ILectureStatusDto } from 'common/dto/distinar/distinar.interface';\nimport { ContentView } from 'common/enum/distinar.enum';\nimport { selectLocalAttendeeId, selectLocalHasTile, selectMatrixAllAttendeeIds } from 'common/store/selectors/conference.context.selectors';\nimport { slideIdSelectorCreator } from 'common/store/selectors/presentation.context.selectors';\nimport { TenantApiService } from 'services/api/TenantApiService';\nimport { SeparateWindowService, SeparateWindowType } from 'services/SeparateWindowService';\nimport { IState } from 'store/state';\n\n@autoinject()\nexport class DistinarCurrentStreamBar {\n  @bindable() public showStudents = false;\n  @observable() private isConferenceActive = false;\n\n  public contextIdentifier = DISTINAR_PRESENTATION_CONTEXT;\n\n  @selectState(DistinarCurrentStreamBar, slideIdSelectorCreator, ['contextIdentifier']) private slideId?: number | null;\n\n  private ContentView = ContentView;\n\n  private domElement: HTMLElement;\n\n  private currentContentView: ContentView | null = null;\n\n  private tenantId: number | null = null;\n  private tenantLogoPictureUrl: string | null = null;\n  private tenantName: string | null = null;\n\n  private lectureStatus: ILectureStatusDto | null = null;\n  private isConferenceReadyForStudentConnection = false;\n  private isDistinarPaused = false;\n\n  private isVideoActive = false;\n  private localAttendeeId: string | null = null;\n  private studentAttendeeIds: Array<string> = [];\n\n\n  private isAttached = false;\n\n  constructor(\n    element: Element,\n    private storeService: StoreService<IState>,\n    private tenantApiService: TenantApiService,\n    private lectureSeparateWindowService: SeparateWindowService,\n  ) {\n    this.domElement = element as HTMLElement;\n  }\n\n  protected attached(): void {\n    this.isAttached = true;\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinar.lectureStatus,\n      state => state.distinar.activeLecture,\n      state => state.distinar.conferenceConfiguration,\n      state => state.distinar.conference.chimeAttendeeId,\n    ], state => {\n      this.lectureStatus = state.distinar.lectureStatus;\n      this.isConferenceActive = !!state.distinar.lectureStatus?.conference.active;\n      this.isConferenceReadyForStudentConnection = !!state.distinar.lectureStatus?.conference.readyForStudentConnection;\n      this.isVideoActive = state.distinar.conferenceConfiguration.streamVideo;\n      this.currentContentView = state.distinar.lectureStatus?.currentContentView ?? null;\n      this.isDistinarPaused = !!state.distinar.lectureStatus?.paused;\n    });\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => selectLocalAttendeeId({ state }),\n      state => selectLocalHasTile({ state }),\n    ], (_state, attendeeId, hasTile) => {\n      this.localAttendeeId = hasTile ? attendeeId : null;\n    });\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.currentRole?.tenantId,\n    ], state => {\n      this.tenantId = state.currentRole?.tenantId ?? null;\n      this.updateTenantData();\n    });\n\n    this.setupStudentVideosIfNecessary();\n  }\n\n  protected detached(): void {\n    this.isAttached = false;\n    this.storeService.disposeAllSubscriptions(this);\n    this.localAttendeeId = null;\n    this.studentAttendeeIds = [];\n  }\n\n  private showStudentsChanged(): void {\n    this.setupStudentVideosIfNecessary();\n  }\n\n  private isConferenceActiveChanged(): void {\n    this.setupStudentVideosIfNecessary();\n  }\n\n  @computedFrom('isConferenceActive', 'isVideoActive')\n  private get isVideoStreamActive(): boolean {\n    return this.isConferenceActive && this.isVideoActive;\n  }\n\n  @computedFrom('isConferenceActive', 'isConferenceReadyForStudentConnection')\n  private get isStudentSeeingLecturerVideo(): boolean {\n    return this.isConferenceActive && this.isConferenceReadyForStudentConnection;\n  }\n\n  private async onOpenStreamInExternalWindow(): Promise<void> {\n    await this.lectureSeparateWindowService.open(SeparateWindowType.Stream);\n  }\n\n  private async updateTenantData(): Promise<void> {\n    if(!this.tenantId) return;\n    const { logoPictureUrl, name } = await this.tenantApiService.getTenant(this.tenantId);\n    this.tenantLogoPictureUrl = logoPictureUrl;\n    this.tenantName = name;\n  }\n\n  private setupStudentVideosIfNecessary(): void {\n    if(!this.showStudents && !this.isConferenceActive) return;\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => selectMatrixAllAttendeeIds({ state }),\n    ], (_state, attendeeIds) => {\n      this.studentAttendeeIds = attendeeIds;\n    });\n  }\n}\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/elements/distinar-current-stream-bar/distinar-current-stream-bar'));\n}\n","import { autoinject, computedFrom } from 'aurelia-framework';\nimport { I18N } from 'aurelia-i18n';\nimport { LoadingIndicatorService } from 'common/aurelia-services/LoadingIndicatorService';\nimport { StoreService } from 'common/aurelia-services/StoreService';\nimport { SubscriptionManager, SubscriptionManagerService } from 'common/aurelia-services/SubscriptionManagerService';\nimport { CONFERENCE_ACTIVE_MEETING_SYNC_CONTEXT } from 'common/constants/distinar.constants';\nimport { IEventDto } from 'common/dto/tenant/event/tenant.event.interface';\nimport { ICommonState } from 'common/store/store.interface';\nimport { DateUtils } from 'common/utils/DateUtils';\nimport moment from 'moment';\nimport { CustomDialogService } from '../../../services/CustomDialogService';\nimport { DistinarService } from '../../../services/DistinarService';\n\n@autoinject()\nexport class DistinarHeaderBar {\n  private subscriptionManager: SubscriptionManager;\n\n  private activeLecture: IEventDto<string> | null = null;\n  private isDistinarPaused = false;\n  private isConferenceActive = false;\n  private isQuickDistinar = false;\n  private distinarActualDateFrom: string | null = null;\n  private formattedRuntime: string | null = null;\n\n  private isSyncingActiveMeeting = false;\n  private isInitializing = true;\n  private isConnecting = false;\n  private hasFailedConnecting = false;\n\n  constructor(\n    subscriptionManagerService: SubscriptionManagerService,\n    private storeService: StoreService<ICommonState>,\n    private distinarService: DistinarService,\n    private customDialogService: CustomDialogService,\n    private loadingIndicatorService: LoadingIndicatorService,\n    private i18n: I18N,\n  ) {\n    this.subscriptionManager = subscriptionManagerService.createSubscriptionManager();\n  }\n\n  protected attached(): void {\n    this.loadingIndicatorService.subscribeToActivity(this, active => {\n      this.isSyncingActiveMeeting = active;\n    }, CONFERENCE_ACTIVE_MEETING_SYNC_CONTEXT);\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinarInitializing,\n      state => state.distinarConnection.connecting,\n      state => state.distinarConnection.failedConnecting,\n    ], (_state, initializing, connecting, failedConnecting) => {\n      this.isInitializing = initializing;\n      this.isConnecting = connecting;\n      this.hasFailedConnecting = failedConnecting;\n    });\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinar.lectureStatus?.paused,\n      state => state.distinar.lectureStatus?.conference.active,\n      state => state.distinar.activeLecture,\n    ], state => {\n      this.isDistinarPaused = !!state.distinar.lectureStatus?.paused;\n      this.isConferenceActive = !!state.distinar.lectureStatus?.conference.active;\n      this.activeLecture = state.distinar.activeLecture;\n      this.isQuickDistinar = !!(state.distinar.activeLecture?.isQuickQuiz || state.distinar.activeLecture?.isQuickDistinar);\n    });\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinar.activeLecture?.actualDateFrom,\n    ], state => {\n      this.distinarActualDateFrom = state.distinar.activeLecture?.actualDateFrom ?? null;\n    });\n\n    this.subscriptionManager.subscribeToInterval(() => {\n      this.updateRuntime();\n    }, 1000);\n  }\n\n  protected detached(): void {\n    this.storeService.disposeAllSubscriptions(this);\n    this.subscriptionManager.disposeSubscriptions();\n    this.loadingIndicatorService.disposeSubscriptions(this);\n  }\n\n  private async pauseDistinar(): Promise<void> {\n    await this.distinarService.pauseDistinar();\n  }\n\n  private async continueDistinar(): Promise<void> {\n    await this.distinarService.continueDistinar();\n  }\n\n  private async endDistinar(): Promise<void> {\n    if(await this.customDialogService.confirmAction({\n      icon: { name: 'alert-triangle', color: 'var(--warning)' },\n      titleTk: 'common.distinar.endDistinar',\n      textTk: 'elements.distinarHeaderBar.endDistinarWarning',\n      confirmTk: 'elements.distinarHeaderBar.endDistinar',\n    })) {\n      await this.distinarService.endActiveLecture();\n    }\n  }\n\n  private async startConference(): Promise<void> {\n    await this.distinarService.startConferenceForActiveLecture();\n  }\n\n  private async stopConference(): Promise<void> {\n    await this.distinarService.stopConferenceForActiveLecture();\n  }\n\n  private setupUpdateRuntimeInterval(): void {\n    this.subscriptionManager.disposeSubscriptions();\n\n    if(this.distinarActualDateFrom) {\n      this.updateRuntime();\n      this.subscriptionManager.subscribeToInterval(() => {\n        this.updateRuntime();\n      }, 1000);\n    }\n  }\n\n  private updateRuntime(): void {\n    this.formattedRuntime = this.distinarActualDateFrom\n      ? DateUtils.formatUnixTime(DateUtils.diffSeconds(this.distinarActualDateFrom))\n      : null;\n  }\n\n  @computedFrom('activeLecture')\n  private get distinarTitle(): string | null {\n    const title = this.activeLecture?.isQuickDistinar || this.activeLecture?.isQuickQuiz\n      ? this.i18n.tr('elements.distinarHeaderBar.code', { code: this.activeLecture.code })\n      : this.activeLecture?.title;\n    return title ?? null;\n  }\n\n  @computedFrom('activeLecture')\n  private get distinarDate(): string | null {\n    if(this.activeLecture?.actualDateFrom == null) return null;\n    return moment(this.activeLecture.actualDateFrom).format('DD.MM.YYYY');\n  }\n}\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/elements/distinar-header-bar/distinar-header-bar'));\n}\n","import { autoinject, computedFrom } from 'aurelia-framework';\nimport { StoreService } from 'common/aurelia-services/StoreService';\nimport { IRoleAssignment } from 'common/dto/auth/auth.interface';\nimport { ILocalConferenceConfiguration } from 'common/dto/distinar/distinar.interface';\nimport { IEventDto } from 'common/dto/tenant/event/tenant.event.interface';\nimport { ContentView } from 'common/enum/distinar.enum';\nimport { setConferenceShareScreen, setConferenceStreamAudio, setConferenceStreamVideo, updateActiveLecture } from 'common/store/mutations/distinar.mutations';\nimport { AppUtils } from 'common/utils/AppUtils';\nimport { assertNotNullOrUndefined } from 'common/utils/assert';\nimport { LogUtils } from 'common/utils/LogUtils';\nimport Moment from 'moment';\nimport { v4 as uuidv4 } from 'uuid';\nimport { EventsApiService } from '../../../services/api/EventsApiService';\nimport { CustomDialogService } from '../../../services/CustomDialogService';\nimport { DistinarService } from '../../../services/DistinarService';\nimport { SeparateWindowService, SeparateWindowType } from '../../../services/SeparateWindowService';\nimport { SnackbarService } from '../../../services/SnackbarService';\nimport { ToastService } from '../../../services/ToastService';\nimport { setDistinarSideMenuSection } from '../../../store/lecturer.distinar.mutations';\nimport { IState } from '../../../store/state';\nimport { LectureSideMenuSectionName } from '../lecture-side-menu/lecture-side-menu';\n\ninterface INavigationEntry {\n  click: (entry: INavigationEntry) => void;\n  disabled: boolean;\n  icon?: string;\n  selected: boolean;\n  tk: string;\n  tkParams?: Record<string, any>;\n}\n\n@autoinject()\nexport class DistinarNavigationBar {\n  private static CANNOT_START_MEDIA_SNACKBAR_ID = uuidv4();\n  private SideMenuSectionName = LectureSideMenuSectionName;\n\n  private isConferenceActive = false;\n  private isDistinarPaused = false;\n  private isQuickDistinar = false;\n  private currentContentView: ContentView | null = null;\n  private conferenceConfiguration: ILocalConferenceConfiguration | null = null;\n  private activeSideMenuSection: LectureSideMenuSectionName | null = null;\n  private currentRole: IRoleAssignment<string> | null = null;\n  private activeLecture: IEventDto<string> | null = null;\n  private chatHasUpdates = false;\n\n  private isConnecting = false;\n  private hasFailedConnecting = false;\n\n  constructor(\n    private storeService: StoreService<IState>,\n    private distinarService: DistinarService,\n    private customDialogService: CustomDialogService,\n    private eventsApiService: EventsApiService,\n    private toastService: ToastService,\n    private separateWindowService: SeparateWindowService,\n    private snackbarService: SnackbarService,\n  ) { }\n\n  protected attached(): void {\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinarConnection.connecting,\n      state => state.distinarConnection.failedConnecting,\n    ], (_state, connecting, failedConnecting) => {\n      this.isConnecting = connecting;\n      this.hasFailedConnecting = failedConnecting;\n    });\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => !!state.distinar.lectureStatus?.conference.active,\n      state => state.distinar.lectureStatus?.currentContentView ?? null,\n      state => !!state.distinar.lectureStatus?.paused,\n      state => state.distinar.conferenceConfiguration,\n      state => state.distinar.sideMenu.activeSideMenuSection,\n      state => state.currentRole,\n      state => state.distinar.activeLecture,\n    ], (\n      _state,\n      conferenceActive,\n      currentContentView,\n      paused,\n      conferenceConfiguration,\n      activeSideMenuSection,\n      currentRole,\n      activeLecture,\n    ) => {\n      this.isConferenceActive = conferenceActive;\n      this.isDistinarPaused = paused;\n      this.currentContentView = currentContentView;\n      this.conferenceConfiguration = conferenceConfiguration;\n      this.activeSideMenuSection = activeSideMenuSection;\n      this.currentRole = currentRole;\n      this.activeLecture = activeLecture;\n      this.isQuickDistinar = !!(activeLecture?.isQuickQuiz || activeLecture?.isQuickDistinar);\n    });\n\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinar.activeLecture?.chatRoomId,\n      state => state.distinar.chatRoomLastRead ?? undefined,\n      state => state.distinar.chatRoomLastMessageReceived,\n    ], (_state, chatRoomId, chatRoomLastRead, chatRoomLastMessageReceived) => {\n      this.chatHasUpdates = !!(\n        chatRoomId != null\n        && chatRoomLastMessageReceived\n        && (!chatRoomLastRead || Moment(chatRoomLastMessageReceived).isAfter(chatRoomLastRead))\n      );\n    });\n  }\n\n  protected detached(): void {\n    this.storeService.disposeAllSubscriptions(this);\n  }\n\n  @computedFrom(\n    'isConferenceActive',\n    'currentContentView',\n    'isDistinarPaused',\n    'isConnecting',\n    'hasFailedConnecting',\n    'isQuickDistinar'\n  )\n  private get entries(): Array<INavigationEntry> {\n    const disabledClickWrapper = (handleClick: () => void) => (entry: INavigationEntry) => {\n      if(entry.disabled) return;\n\n      handleClick();\n    };\n\n    const disabled = this.isConnecting || this.hasFailedConnecting || this.isDistinarPaused;\n    const selectedPreCondition = !this.isConnecting && !this.hasFailedConnecting && !this.isDistinarPaused;\n    const courseEntry = {\n      click: disabledClickWrapper(() => this.navigateToContentView(ContentView.Course)),\n      disabled,\n      icon: 'Distinar/Course',\n      selected: selectedPreCondition && this.currentContentView === ContentView.Course,\n      tk: 'elements.distinarNavigationBar.course',\n    };\n    const quizEntry = {\n      click: disabledClickWrapper(() => this.navigateToContentView(ContentView.Quiz)),\n      disabled,\n      icon: 'LectureQuiz/Quiz',\n      selected: selectedPreCondition && this.currentContentView === ContentView.Quiz,\n      tk: 'elements.distinarNavigationBar.quiz',\n    };\n    if(this.isQuickDistinar) return [courseEntry, quizEntry];\n\n    return [\n      courseEntry,\n      quizEntry,\n      {\n        click: disabledClickWrapper(() => this.navigateToContentView(ContentView.Conference)),\n        disabled,\n        icon: 'Distinar/GridFilled',\n        selected: selectedPreCondition && this.currentContentView === ContentView.Conference,\n        tk: 'elements.distinarNavigationBar.conference',\n      },\n      {\n        click: disabledClickWrapper(() => this.openAfeInSeparateWindow()),\n        disabled,\n        icon: 'Distinar/OpenExternal',\n        selected: false,\n        tk: 'elements.distinarNavigationBar.openAfeInSeparateWindow',\n        tkParams: { 'appName': AppUtils.getAppName() }\n      },\n    ];\n  }\n\n  private async navigateToContentView(contentView: ContentView): Promise<void> {\n    if(this.conferenceConfiguration?.shareScreen) await this.storeService.dispatch(setConferenceShareScreen, false);\n    await this.distinarService.setCurrentContentView(contentView);\n  }\n\n  private toggleScreenSharing(): void {\n    assertNotNullOrUndefined(this.conferenceConfiguration, 'conferenceConfiguration cannot be null or undefined');\n    this.storeService.dispatch(setConferenceShareScreen, !this.conferenceConfiguration.shareScreen);\n  }\n\n  private toggleAudioInput(): void {\n    assertNotNullOrUndefined(this.conferenceConfiguration, 'conferenceConfiguration cannot be null or undefined');\n    const streamAudio = !this.conferenceConfiguration.streamAudio;\n    if(this.conferenceConfiguration.selectedDevices.audioInput == null && streamAudio) {\n      this.snackbarService.show(DistinarNavigationBar.CANNOT_START_MEDIA_SNACKBAR_ID, {\n        message: { textTk: 'common.distinar.cannotStartWithoutDevice' },\n        icon: 'System/Tabler/Alert-Triangle',\n        dismissable: true,\n        autoCloseAfterMs: 6000,\n      });\n    } else {\n      this.storeService.dispatch(setConferenceStreamAudio, streamAudio);\n    }\n  }\n\n  private toggleVideoInput(): void {\n    assertNotNullOrUndefined(this.conferenceConfiguration, 'conferenceConfiguration cannot be null or undefined');\n    const streamVideo = !this.conferenceConfiguration.streamVideo;\n    if(this.conferenceConfiguration.selectedDevices.videoInput == null && streamVideo) {\n      this.snackbarService.show(DistinarNavigationBar.CANNOT_START_MEDIA_SNACKBAR_ID, {\n        message: { textTk: 'common.distinar.cannotStartWithoutDevice' },\n        icon: 'System/Tabler/Alert-Triangle',\n        dismissable: true,\n        autoCloseAfterMs: 6000,\n      });\n    } else {\n      this.storeService.dispatch(setConferenceStreamVideo, streamVideo);\n    }\n  }\n\n  private showQrCode(): void {\n    this.distinarService.setQrCodeShown(true);\n  }\n\n  private toggleChatInSideMenu(): void {\n    this.toggleSectionInSideMenu(LectureSideMenuSectionName.Chat);\n  }\n\n  private toggleAttendeeListInSideMenu(): void {\n    this.toggleSectionInSideMenu(LectureSideMenuSectionName.AttendeeList);\n  }\n\n  private async toggleSectionInSideMenu(sectionName: LectureSideMenuSectionName): Promise<void> {\n    await this.storeService.dispatch(setDistinarSideMenuSection, sectionName, true);\n  }\n\n  private async showSettingsDialog(): Promise<void> {\n    assertNotNullOrUndefined(this.activeLecture, 'cannot show settings dialog without active lecture');\n    if(!this.currentRole?.tenantId) return;\n\n    const tenantId = this.currentRole?.tenantId;\n    const modifiedLecture = await this.customDialogService.showLectureSettingsDialog(\n      {\n        plannedDateFrom: this.activeLecture.plannedDateFrom,\n        plannedDateTo: this.activeLecture.plannedDateTo,\n        description: this.activeLecture.description,\n        title: this.activeLecture.title,\n      }\n    );\n\n    if(modifiedLecture && modifiedLecture.plannedDateFrom && modifiedLecture.plannedDateTo) {\n      try {\n        await this.eventsApiService.updateLecture(tenantId, this.activeLecture.id, modifiedLecture);\n        this.toastService.success('pages.lecturerEvents.saveSuccess');\n      } catch(e) {\n        LogUtils.exception(e);\n        this.toastService.error('pages.lecturerEvents.saveError');\n      } finally {\n        const updatedLecture = await this.eventsApiService.getEvent(tenantId, this.activeLecture.id);\n        this.storeService.dispatch(updateActiveLecture, updatedLecture);\n      }\n    }\n  }\n\n  private async openAfeInSeparateWindow(): Promise<void> {\n    await this.separateWindowService.open(SeparateWindowType.Admin);\n  }\n\n  private async openConferenceInExternalWindow(): Promise<void> {\n    await this.separateWindowService.open(SeparateWindowType.Conference);\n  }\n}\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/elements/distinar-navigation-bar/distinar-navigation-bar'));\n}\n","import { autoinject } from 'aurelia-framework';\nimport { DistinarWebSocketService } from 'common/aurelia-services/DistinarWebSocketService';\nimport { StoreService } from 'common/aurelia-services/StoreService';\nimport { SubscriptionManager, SubscriptionManagerService } from 'common/aurelia-services/SubscriptionManagerService';\nimport { ICourseEditResponseDto } from 'common/dto/course/management/course.management.interface';\nimport { IQuizTemplateWithQuestionCountDto } from 'common/dto/course/quiz/template/quiz.template.interface';\nimport {\n  IAttendeeDto,\n  ILectureStatusDto,\n  IPrepareQuickQuizDto,\n  IPrepareTemplateQuizDto,\n  LectureQuizState,\n  LecturerEmitMap,\n  LecturerListenerMap,\n} from 'common/dto/distinar/distinar.interface';\nimport { LecturerEmitName } from 'common/enum/distinar.enum';\nimport { ErrorType } from 'common/enum/errortype.enum';\nimport { KeyboardKey } from 'common/enum/keyboard.key.enum';\nimport { assertNotNullOrUndefined } from 'common/utils/assert';\nimport { LogUtils } from 'common/utils/LogUtils';\nimport { TenantApiService } from '../../../services/api/TenantApiService';\nimport { CustomDialogService } from '../../../services/CustomDialogService';\nimport { ToastService } from '../../../services/ToastService';\nimport { setQuickQuizData } from '../../../store/actions';\nimport { IQuickQuizData, IState } from '../../../store/state';\nimport { LecturerLectureQuiz } from '../lecturer-lecture-quiz/lecturer-lecture-quiz';\n\n@autoinject()\nexport class DistinarQuizView {\n  private quizTemplates: IQuizTemplateWithQuestionCountDto[] = [];\n\n  private domElement: HTMLElement;\n  private LectureQuizState = LectureQuizState;\n  private subscriptionManager: SubscriptionManager;\n  private lecturerLectureQuiz: LecturerLectureQuiz | null = null;\n\n  private lectureStatus: ILectureStatusDto | null = null;\n  private attendees: IAttendeeDto[] = [];\n  private userId: number | null = null;\n  private availableCourses: Array<ICourseEditResponseDto> = [];\n  private curatedQuizTemplates: IQuizTemplateWithQuestionCountDto[] = [];\n  private myQuizTemplates: IQuizTemplateWithQuestionCountDto[] = [];\n  private searchString = '';\n\n  constructor(\n    element: Element,\n    subscriptionManagerService: SubscriptionManagerService,\n    private storeService: StoreService<IState>,\n    private dialogService: CustomDialogService,\n    private distinarWebSocket: DistinarWebSocketService<LecturerListenerMap, LecturerEmitMap>,\n    private toastService: ToastService,\n    private tenantApiService: TenantApiService,\n  ) {\n    this.domElement = element as HTMLElement;\n    this.subscriptionManager = subscriptionManagerService.createSubscriptionManager();\n  }\n\n  protected attached(): void {\n    this.storeService.subscribeToDetailedChanges(this, [\n      state => state.distinar.lectureStatus,\n      state => state.distinar.attendees,\n      state => state.user.id,\n      state => state.quizTemplates,\n      state => state.quickQuizData\n    ], (_state, lectureStatus, attendees, userId, quizTemplates, quickQuizData) => {\n      this.lectureStatus = lectureStatus;\n      this.attendees = attendees;\n      this.userId = userId;\n      this.quizTemplates = quizTemplates;\n      this.resetQuizTemplatesFound();\n      this.prepareQuickQuizDistinar(quickQuizData);\n    });\n\n    this.subscriptionManager.subscribeToKeyboardEvent(this.domElement, KeyboardKey.Enter, () => {\n      this.searchQuizTemplates(this.searchString);\n    });\n  }\n\n  protected detached(): void {\n    this.storeService.disposeAllSubscriptions(this);\n    this.subscriptionManager.disposeSubscriptions();\n  }\n\n  private getAllMyQuizTemplates(): IQuizTemplateWithQuestionCountDto[] {\n    return this.quizTemplates?.filter(t => t.creator.id === this.userId) ?? [];\n  }\n\n  private getAllCuratedQuizTemplates(): IQuizTemplateWithQuestionCountDto[] {\n    return this.quizTemplates?.filter(t => t.creator.id !== this.userId) ?? [];\n  }\n\n  private searchQuizTemplates(searchString: string): void {\n    if(!this.quizTemplates) return;\n    if(searchString === '') {\n      this.resetQuizTemplatesFound();\n    } else {\n      const searchStringLowerCase = searchString.toLowerCase();\n      this.myQuizTemplates = this.getAllMyQuizTemplates().filter(quizTemplate => quizTemplate.name.toLowerCase().includes(searchStringLowerCase));\n      this.curatedQuizTemplates = this.getAllCuratedQuizTemplates().filter(quizTemplate => quizTemplate.name.toLowerCase().includes(searchStringLowerCase));\n    }\n  }\n\n  private resetQuizTemplatesFound(): void {\n    this.searchString = '';\n    this.myQuizTemplates = this.getAllMyQuizTemplates();\n    this.curatedQuizTemplates = this.getAllCuratedQuizTemplates();\n  }\n\n  private async prepareQuickQuiz(): Promise<void> {\n    const availableCourses = await this.tenantApiService.getAvailableRegularCourses();\n    const selection = await this.dialogService.showStartQuickQuizDialog(availableCourses, this.attendees);\n    if(!selection) return;\n    await this.startQuickQuiz(selection);\n  }\n\n  private async prepareQuizFromTemplate(quizTemplate: IQuizTemplateWithQuestionCountDto): Promise<void> {\n    try {\n      if(!quizTemplate.questionCount) throw new Error(ErrorType.QUIZ_HAS_NO_QUESTIONS);\n      const selection = await this.dialogService.showStartTemplateQuizDialog();\n      if(selection == null) return;\n\n      const data: IPrepareTemplateQuizDto = {\n        quizTemplateId: quizTemplate.id,\n        answerTime: selection.answerTime\n      };\n      await this.startTemplateQuiz(data);\n    } catch(e) {\n      if(e.message === ErrorType.QUIZ_HAS_NO_QUESTIONS) {\n        this.toastService.error('pages.lectureQuiz.noQuestionsInQuizError');\n      } else {\n        LogUtils.exception(e);\n      }\n    }\n  }\n\n  private async prepareQuickQuizDistinar(quickQuizData: IQuickQuizData | null): Promise<void> {\n    if(quickQuizData?.quickQuiz) {\n      return this.startQuickQuiz(quickQuizData.quickQuiz);\n    }\n    if(quickQuizData?.templateQuiz) {\n      return this.startTemplateQuiz(quickQuizData.templateQuiz);\n    }\n  }\n\n  private async startTemplateQuiz(selection: IPrepareTemplateQuizDto): Promise<void> {\n    await this.storeService.dispatch(setQuickQuizData, null);\n    await this.distinarWebSocket.connection.emit(LecturerEmitName.PrepareTemplateQuiz, selection);\n  }\n\n  private async startQuickQuiz(selection: IPrepareQuickQuizDto): Promise<void> {\n    await this.storeService.dispatch(setQuickQuizData, null);\n    await this.distinarWebSocket.connection.emit(LecturerEmitName.PrepareQuickQuiz, selection);\n  }\n\n  private requestFullscreen(): void {\n    assertNotNullOrUndefined(this.lecturerLectureQuiz, 'lecturerQuiz not ref\\'d');\n    this.lecturerLectureQuiz.requestFullscreen();\n  }\n\n  private async stopQuiz(): Promise<void> {\n    // TODO: \"Are you sure?\"\n    return this.distinarWebSocket.connection.emit(LecturerEmitName.StopQuiz, {});\n  }\n}\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\n\nexport function configure(config: FrameworkConfiguration): void {\n  config.globalResources(PLATFORM.moduleName('resources/elements/distinar-quiz-view/distinar-quiz-view'));\n}\n"],"names":[],"sourceRoot":""}