diff --git a/frontend/allowance-planner-v2/android/.gitignore b/frontend/allowance-planner-v2/android/.gitignore
new file mode 100644
index 0000000..48354a3
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/.gitignore
@@ -0,0 +1,101 @@
+# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore
+
+# Built application files
+*.apk
+*.aar
+*.ap_
+*.aab
+
+# Files for the ART/Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+out/
+#  Uncomment the following line in case you need and you don't have the release build type files in your app
+# release/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# IntelliJ
+*.iml
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/gradle.xml
+.idea/assetWizardSettings.xml
+.idea/dictionaries
+.idea/libraries
+# Android Studio 3 in .gitignore file.
+.idea/caches
+.idea/modules.xml
+# Comment next line if keeping position of elements in Navigation Editor is relevant for you
+.idea/navEditor.xml
+
+# Keystore files
+# Uncomment the following lines if you do not want to check your keystore files in.
+#*.jks
+#*.keystore
+
+# External native build folder generated in Android Studio 2.2 and later
+.externalNativeBuild
+.cxx/
+
+# Google Services (e.g. APIs or Firebase)
+# google-services.json
+
+# Freeline
+freeline.py
+freeline/
+freeline_project_description.json
+
+# fastlane
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots
+fastlane/test_output
+fastlane/readme.md
+
+# Version control
+vcs.xml
+
+# lint
+lint/intermediates/
+lint/generated/
+lint/outputs/
+lint/tmp/
+# lint/reports/
+
+# Android Profiling
+*.hprof
+
+# Cordova plugins for Capacitor
+capacitor-cordova-android-plugins
+
+# Copied web assets
+app/src/main/assets/public
+
+# Generated Config files
+app/src/main/assets/capacitor.config.json
+app/src/main/assets/capacitor.plugins.json
+app/src/main/res/xml/config.xml
diff --git a/frontend/allowance-planner-v2/android/app/.gitignore b/frontend/allowance-planner-v2/android/app/.gitignore
new file mode 100644
index 0000000..043df80
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/.gitignore
@@ -0,0 +1,2 @@
+/build/*
+!/build/.npmkeep
diff --git a/frontend/allowance-planner-v2/android/app/build.gradle b/frontend/allowance-planner-v2/android/app/build.gradle
new file mode 100644
index 0000000..6011e85
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/build.gradle
@@ -0,0 +1,54 @@
+apply plugin: 'com.android.application'
+
+android {
+    namespace "io.ionic.starter"
+    compileSdk rootProject.ext.compileSdkVersion
+    defaultConfig {
+        applicationId "io.ionic.starter"
+        minSdkVersion rootProject.ext.minSdkVersion
+        targetSdkVersion rootProject.ext.targetSdkVersion
+        versionCode 1
+        versionName "1.0"
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        aaptOptions {
+             // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
+             // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
+            ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
+        }
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+repositories {
+    flatDir{
+        dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
+    }
+}
+
+dependencies {
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
+    implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
+    implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
+    implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
+    implementation project(':capacitor-android')
+    testImplementation "junit:junit:$junitVersion"
+    androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
+    androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
+    implementation project(':capacitor-cordova-android-plugins')
+}
+
+apply from: 'capacitor.build.gradle'
+
+try {
+    def servicesJSON = file('google-services.json')
+    if (servicesJSON.text) {
+        apply plugin: 'com.google.gms.google-services'
+    }
+} catch(Exception e) {
+    logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
+}
diff --git a/frontend/allowance-planner-v2/android/app/capacitor.build.gradle b/frontend/allowance-planner-v2/android/app/capacitor.build.gradle
new file mode 100644
index 0000000..cd87266
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/capacitor.build.gradle
@@ -0,0 +1,22 @@
+// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
+
+android {
+  compileOptions {
+      sourceCompatibility JavaVersion.VERSION_21
+      targetCompatibility JavaVersion.VERSION_21
+  }
+}
+
+apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
+dependencies {
+    implementation project(':capacitor-app')
+    implementation project(':capacitor-haptics')
+    implementation project(':capacitor-keyboard')
+    implementation project(':capacitor-status-bar')
+
+}
+
+
+if (hasProperty('postBuildExtras')) {
+  postBuildExtras()
+}
diff --git a/frontend/allowance-planner-v2/android/app/proguard-rules.pro b/frontend/allowance-planner-v2/android/app/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/frontend/allowance-planner-v2/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/frontend/allowance-planner-v2/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..f2c2217
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.getcapacitor.myapp;
+
+import static org.junit.Assert.*;
+
+import android.content.Context;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+
+    @Test
+    public void useAppContext() throws Exception {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+        assertEquals("com.getcapacitor.app", appContext.getPackageName());
+    }
+}
diff --git a/frontend/allowance-planner-v2/android/app/src/main/AndroidManifest.xml b/frontend/allowance-planner-v2/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..340e7df
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+
+        <activity
+            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"
+            android:name=".MainActivity"
+            android:label="@string/title_activity_main"
+            android:theme="@style/AppTheme.NoActionBarLaunch"
+            android:launchMode="singleTask"
+            android:exported="true">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+
+        </activity>
+
+        <provider
+            android:name="androidx.core.content.FileProvider"
+            android:authorities="${applicationId}.fileprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths"></meta-data>
+        </provider>
+    </application>
+
+    <!-- Permissions -->
+
+    <uses-permission android:name="android.permission.INTERNET" />
+</manifest>
diff --git a/frontend/allowance-planner-v2/android/app/src/main/java/io/ionic/starter/MainActivity.java b/frontend/allowance-planner-v2/android/app/src/main/java/io/ionic/starter/MainActivity.java
new file mode 100644
index 0000000..73e3a98
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/java/io/ionic/starter/MainActivity.java
@@ -0,0 +1,5 @@
+package io.ionic.starter;
+
+import com.getcapacitor.BridgeActivity;
+
+public class MainActivity extends BridgeActivity {}
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-hdpi/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-hdpi/splash.png
new file mode 100644
index 0000000..e31573b
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-hdpi/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-mdpi/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-mdpi/splash.png
new file mode 100644
index 0000000..f7a6492
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-mdpi/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-xhdpi/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-xhdpi/splash.png
new file mode 100644
index 0000000..8077255
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-xhdpi/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-xxhdpi/splash.png
new file mode 100644
index 0000000..14c6c8f
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-xxhdpi/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-xxxhdpi/splash.png
new file mode 100644
index 0000000..244ca25
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-land-xxxhdpi/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-hdpi/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-hdpi/splash.png
new file mode 100644
index 0000000..74faaa5
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-hdpi/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-mdpi/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-mdpi/splash.png
new file mode 100644
index 0000000..e944f4a
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-mdpi/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-xhdpi/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-xhdpi/splash.png
new file mode 100644
index 0000000..564a82f
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-xhdpi/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-xxhdpi/splash.png
new file mode 100644
index 0000000..bfabe68
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-xxhdpi/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-xxxhdpi/splash.png
new file mode 100644
index 0000000..6929071
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-port-xxxhdpi/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..c7bd21d
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108">
+    <path
+        android:fillType="evenOdd"
+        android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
+        android:strokeColor="#00000000"
+        android:strokeWidth="1">
+        <aapt:attr name="android:fillColor">
+            <gradient
+                android:endX="78.5885"
+                android:endY="90.9159"
+                android:startX="48.7653"
+                android:startY="61.0927"
+                android:type="linear">
+                <item
+                    android:color="#44000000"
+                    android:offset="0.0" />
+                <item
+                    android:color="#00000000"
+                    android:offset="1.0" />
+            </gradient>
+        </aapt:attr>
+    </path>
+    <path
+        android:fillColor="#FFFFFF"
+        android:fillType="nonZero"
+        android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
+        android:strokeColor="#00000000"
+        android:strokeWidth="1" />
+</vector>
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable/ic_launcher_background.xml b/frontend/allowance-planner-v2/android/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..d5fccc5
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108">
+    <path
+        android:fillColor="#26A69A"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+</vector>
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/drawable/splash.png b/frontend/allowance-planner-v2/android/app/src/main/res/drawable/splash.png
new file mode 100644
index 0000000..f7a6492
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/drawable/splash.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/layout/activity_main.xml b/frontend/allowance-planner-v2/android/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..b5ad138
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity">
+
+    <WebView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/ic_launcher_background"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
\ No newline at end of file
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/ic_launcher_background"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
\ No newline at end of file
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..c023e50
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..2127973
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..b441f37
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..72905b8
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..8ed0605
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9502e47
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..4d1e077
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..df0f158
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..853db04
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..6cdf97c
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..2960cbb
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..8e3093a
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..46de6e2
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..d2ea9ab
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..a40d73e
Binary files /dev/null and b/frontend/allowance-planner-v2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/values/ic_launcher_background.xml b/frontend/allowance-planner-v2/android/app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 0000000..c5d5899
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="ic_launcher_background">#FFFFFF</color>
+</resources>
\ No newline at end of file
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/values/strings.xml b/frontend/allowance-planner-v2/android/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..aadfecd
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/res/values/strings.xml
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+    <string name="app_name">allowance-planner-v2</string>
+    <string name="title_activity_main">allowance-planner-v2</string>
+    <string name="package_name">io.ionic.starter</string>
+    <string name="custom_url_scheme">io.ionic.starter</string>
+</resources>
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/values/styles.xml b/frontend/allowance-planner-v2/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..be874e5
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+
+    <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
+        <item name="windowActionBar">false</item>
+        <item name="windowNoTitle">true</item>
+        <item name="android:background">@null</item>
+    </style>
+
+
+    <style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
+        <item name="android:background">@drawable/splash</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/frontend/allowance-planner-v2/android/app/src/main/res/xml/file_paths.xml b/frontend/allowance-planner-v2/android/app/src/main/res/xml/file_paths.xml
new file mode 100644
index 0000000..bd0c4d8
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/main/res/xml/file_paths.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+    <external-path name="my_images" path="." />
+    <cache-path name="my_cache_images" path="." />
+</paths>
\ No newline at end of file
diff --git a/frontend/allowance-planner-v2/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/frontend/allowance-planner-v2/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java
new file mode 100644
index 0000000..0297327
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java
@@ -0,0 +1,18 @@
+package com.getcapacitor.myapp;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+
+    @Test
+    public void addition_isCorrect() throws Exception {
+        assertEquals(4, 2 + 2);
+    }
+}
diff --git a/frontend/allowance-planner-v2/android/build.gradle b/frontend/allowance-planner-v2/android/build.gradle
new file mode 100644
index 0000000..f1b3b0e
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/build.gradle
@@ -0,0 +1,29 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    
+    repositories {
+        google()
+        mavenCentral()
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:8.7.2'
+        classpath 'com.google.gms:google-services:4.4.2'
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+apply from: "variables.gradle"
+
+allprojects {
+    repositories {
+        google()
+        mavenCentral()
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}
diff --git a/frontend/allowance-planner-v2/android/capacitor.settings.gradle b/frontend/allowance-planner-v2/android/capacitor.settings.gradle
new file mode 100644
index 0000000..bd35873
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/capacitor.settings.gradle
@@ -0,0 +1,15 @@
+// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
+include ':capacitor-android'
+project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
+
+include ':capacitor-app'
+project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')
+
+include ':capacitor-haptics'
+project(':capacitor-haptics').projectDir = new File('../node_modules/@capacitor/haptics/android')
+
+include ':capacitor-keyboard'
+project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor/keyboard/android')
+
+include ':capacitor-status-bar'
+project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacitor/status-bar/android')
diff --git a/frontend/allowance-planner-v2/android/gradle.properties b/frontend/allowance-planner-v2/android/gradle.properties
new file mode 100644
index 0000000..2e87c52
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/gradle.properties
@@ -0,0 +1,22 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
diff --git a/frontend/allowance-planner-v2/android/gradle/wrapper/gradle-wrapper.jar b/frontend/allowance-planner-v2/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..a4b76b9
Binary files /dev/null and b/frontend/allowance-planner-v2/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/frontend/allowance-planner-v2/android/gradle/wrapper/gradle-wrapper.properties b/frontend/allowance-planner-v2/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..c1d5e01
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/frontend/allowance-planner-v2/android/gradlew b/frontend/allowance-planner-v2/android/gradlew
new file mode 100644
index 0000000..f5feea6
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/gradlew
@@ -0,0 +1,252 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+##############################################################################
+#
+#   Gradle start up script for POSIX generated by Gradle.
+#
+#   Important for running:
+#
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+#       noncompliant, but you have some other compliant shell such as ksh or
+#       bash, then to run this script, type that shell name before the whole
+#       command line, like:
+#
+#           ksh Gradle
+#
+#       Busybox and similar reduced shells will NOT work, because this script
+#       requires all of these POSIX shell features:
+#         * functions;
+#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+#         * compound commands having a testable exit status, especially «case»;
+#         * various built-in commands including «command», «set», and «ulimit».
+#
+#   Important for patching:
+#
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
+#       by Bash, Ksh, etc; in particular arrays are avoided.
+#
+#       The "traditional" practice of packing multiple parameters into a
+#       space-separated string is a well documented source of bugs and security
+#       problems, so this is (mostly) avoided, by progressively accumulating
+#       options in "$@", and eventually passing that to Java.
+#
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+#       see the in-line comments for details.
+#
+#       There are tweaks for specific operating systems such as AIX, CygWin,
+#       Darwin, MinGW, and NonStop.
+#
+#   (3) This script is generated from the Groovy template
+#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       within the Gradle project.
+#
+#       You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
+    [ -h "$app_path" ]
+do
+    ls=$( ls -ld "$app_path" )
+    link=${ls#*' -> '}
+    case $link in             #(
+      /*)   app_path=$link ;; #(
+      *)    app_path=$APP_HOME$link ;;
+    esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
+' "$PWD" ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+    echo "$*"
+} >&2
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in                #(
+  CYGWIN* )         cygwin=true  ;; #(
+  Darwin* )         darwin=true  ;; #(
+  MSYS* | MINGW* )  msys=true    ;; #(
+  NONSTOP* )        nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD=$JAVA_HOME/jre/sh/java
+    else
+        JAVACMD=$JAVA_HOME/bin/java
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD=java
+    if ! command -v java >/dev/null 2>&1
+    then
+        die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+    case $MAX_FD in #(
+      max*)
+        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+        # shellcheck disable=SC2039,SC3045
+        MAX_FD=$( ulimit -H -n ) ||
+            warn "Could not query maximum file descriptor limit"
+    esac
+    case $MAX_FD in  #(
+      '' | soft) :;; #(
+      *)
+        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+        # shellcheck disable=SC2039,SC3045
+        ulimit -n "$MAX_FD" ||
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
+    esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+#   * args from the command line
+#   * the main class name
+#   * -classpath
+#   * -D...appname settings
+#   * --module-path (only if needed)
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    for arg do
+        if
+            case $arg in                                #(
+              -*)   false ;;                            # don't mess with options #(
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
+                    [ -e "$t" ] ;;                      #(
+              *)    false ;;
+            esac
+        then
+            arg=$( cygpath --path --ignore --mixed "$arg" )
+        fi
+        # Roll the args list around exactly as many times as the number of
+        # args, so each arg winds up back in the position where it started, but
+        # possibly modified.
+        #
+        # NB: a `for` loop captures its iteration list before it begins, so
+        # changing the positional parameters here affects neither the number of
+        # iterations, nor the values presented in `arg`.
+        shift                   # remove old arg
+        set -- "$@" "$arg"      # push replacement arg
+    done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+#     and any embedded shellness will be escaped.
+#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+#     treated as '${Hostname}' itself on the command line.
+
+set -- \
+        "-Dorg.gradle.appname=$APP_BASE_NAME" \
+        -classpath "$CLASSPATH" \
+        org.gradle.wrapper.GradleWrapperMain \
+        "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+    die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+#   set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+        xargs -n1 |
+        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+        tr '\n' ' '
+    )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/frontend/allowance-planner-v2/android/gradlew.bat b/frontend/allowance-planner-v2/android/gradlew.bat
new file mode 100644
index 0000000..9d21a21
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/gradlew.bat
@@ -0,0 +1,94 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/frontend/allowance-planner-v2/android/settings.gradle b/frontend/allowance-planner-v2/android/settings.gradle
new file mode 100644
index 0000000..3b4431d
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/settings.gradle
@@ -0,0 +1,5 @@
+include ':app'
+include ':capacitor-cordova-android-plugins'
+project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/')
+
+apply from: 'capacitor.settings.gradle'
\ No newline at end of file
diff --git a/frontend/allowance-planner-v2/android/variables.gradle b/frontend/allowance-planner-v2/android/variables.gradle
new file mode 100644
index 0000000..2c8e408
--- /dev/null
+++ b/frontend/allowance-planner-v2/android/variables.gradle
@@ -0,0 +1,16 @@
+ext {
+    minSdkVersion = 23
+    compileSdkVersion = 35
+    targetSdkVersion = 35
+    androidxActivityVersion = '1.9.2'
+    androidxAppCompatVersion = '1.7.0'
+    androidxCoordinatorLayoutVersion = '1.2.0'
+    androidxCoreVersion = '1.15.0'
+    androidxFragmentVersion = '1.8.4'
+    coreSplashScreenVersion = '1.0.1'
+    androidxWebkitVersion = '1.12.1'
+    junitVersion = '4.13.2'
+    androidxJunitVersion = '1.2.1'
+    androidxEspressoCoreVersion = '3.6.1'
+    cordovaAndroidVersion = '10.1.1'
+}
\ No newline at end of file
diff --git a/frontend/allowance-planner-v2/package-lock.json b/frontend/allowance-planner-v2/package-lock.json
index 81b602a..e30dec2 100644
--- a/frontend/allowance-planner-v2/package-lock.json
+++ b/frontend/allowance-planner-v2/package-lock.json
@@ -18,6 +18,7 @@
         "@angular/platform-browser": "^19.0.0",
         "@angular/platform-browser-dynamic": "^19.0.0",
         "@angular/router": "^19.0.0",
+        "@capacitor/android": "7.2.0",
         "@capacitor/app": "7.0.1",
         "@capacitor/core": "7.2.0",
         "@capacitor/haptics": "7.0.1",
@@ -2452,6 +2453,14 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@capacitor/android": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-7.2.0.tgz",
+      "integrity": "sha512-zdhEy3jZPG5Toe/pGzKtDgIiBGywjaoEuQWnGVjBYPlSAEUtAhpZ2At7V0SCb26yluAuzrAUV0Ue+LQeEtHwFQ==",
+      "peerDependencies": {
+        "@capacitor/core": "^7.2.0"
+      }
+    },
     "node_modules/@capacitor/app": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-7.0.1.tgz",
diff --git a/frontend/allowance-planner-v2/package.json b/frontend/allowance-planner-v2/package.json
index 19de028..dc8b66c 100644
--- a/frontend/allowance-planner-v2/package.json
+++ b/frontend/allowance-planner-v2/package.json
@@ -23,6 +23,7 @@
     "@angular/platform-browser": "^19.0.0",
     "@angular/platform-browser-dynamic": "^19.0.0",
     "@angular/router": "^19.0.0",
+    "@capacitor/android": "7.2.0",
     "@capacitor/app": "7.0.1",
     "@capacitor/core": "7.2.0",
     "@capacitor/haptics": "7.0.1",
diff --git a/frontend/allowance-planner-v2/src/app/models/allowance.ts b/frontend/allowance-planner-v2/src/app/models/allowance.ts
new file mode 100644
index 0000000..3a79190
--- /dev/null
+++ b/frontend/allowance-planner-v2/src/app/models/allowance.ts
@@ -0,0 +1,10 @@
+export interface Allowance {
+    id: number;
+    name: string;
+    target: number;
+    // Current allowance value
+    progress: number;
+    // Can be any positive number (backend checks for number relative to each other)
+    weight: number;
+    colour: string;
+}
\ No newline at end of file
diff --git a/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.module.ts b/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.module.ts
index 075b3f8..f3e7b46 100644
--- a/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.module.ts
+++ b/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.module.ts
@@ -5,14 +5,22 @@ import { FormsModule } from '@angular/forms';
 import { AllowancePage } from './allowance.page';
 
 import { AllowancePageRoutingModule } from './allowance-routing.module';
+import { AllowanceService } from 'src/app/services/allowance.service';
+import { provideHttpClient } from '@angular/common/http';
+import { MatIconModule } from '@angular/material/icon';
 
 @NgModule({
   imports: [
     IonicModule,
     CommonModule,
     FormsModule,
-    AllowancePageRoutingModule
+    AllowancePageRoutingModule,
+    MatIconModule
   ],
-  declarations: [AllowancePage]
+  declarations: [AllowancePage],
+  providers: [
+    provideHttpClient(),
+    AllowanceService
+  ]
 })
 export class AllowancePageModule {}
diff --git a/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.html b/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.html
index f389801..0641aa1 100644
--- a/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.html
+++ b/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.html
@@ -7,4 +7,63 @@
 </ion-header>
 
 <ion-content>
+  <div class="content" *ngIf="allowance$ | async as allowance">
+    <div class="bar">
+      <div class="distribution">Allowance distribution</div>
+      <div class="allowance-bar">
+        <span
+          *ngFor="let goal of allowance"
+          class="partition"
+          [style.--partition-color]="goal.colour"
+          [style.width.%]="getPartitionSize(goal, allowance)"
+        ></span>
+      </div>
+      <div class="legend">
+        <div class="legend-item" [style.--legend-color]="goal.colour" *ngFor="let goal of allowance">
+          <div class="circle"></div>
+          <div class="title">{{ goal.name }}</div>
+        </div>
+      </div>
+    </div>
+    <div
+      class="goal"
+      [style.--used-color]="goal.colour"
+      [ngClass]="{'other-goals': goal.id !== 0}"
+      *ngFor="let goal of allowance"
+    >
+      <div class="main" *ngIf="goal.id === 0; else other_goal">
+        <div class="title">
+          <div class="name">Main Allowance</div>
+          <div class="icon">
+            <mat-icon>settings</mat-icon>
+          </div>
+        </div>
+        <div class="progress">{{ goal.progress }} SP</div>
+        <div class="buttons">
+          <button class="add-button">Add</button>
+          <!-- <button class="move-button">Move</button> -->
+          <button class="spend-button">Spend</button>
+        </div>
+      </div>
+      <ng-template #other_goal>
+        <div class="color-wrapper">
+          <div>
+            <div class="title">
+              <div class="name">{{ goal.name }}</div>
+              <div class="icon">
+                <mat-icon>settings</mat-icon>
+              </div>
+            </div>
+            <div class="progress">{{ goal.progress }} / {{ goal.target }} SP</div>
+            <div class="buttons">
+              <button class="add-button">Add</button>
+              <!-- <button class="move-button">Move</button> -->
+              <button class="spend-button" [disabled]="!canFinishGoal(goal)">Finish goal</button>
+            </div>
+          </div>
+          <div class="color" [style.--background]="hexToRgb(goal.colour)" [style.width.%]="getPercentage(goal)"></div>
+        </div>
+      </ng-template>
+    </div>
+  </div>
 </ion-content>
diff --git a/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.scss b/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.scss
index e69de29..696cb46 100644
--- a/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.scss
+++ b/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.scss
@@ -0,0 +1,130 @@
+.goal {
+    border: 1px solid var(--used-color);
+    border-radius: 10px;
+    padding: 10px;
+    margin-bottom: 20px;
+    margin-left: 10px;
+    margin-right: 10px;
+    color: var(--used-color);
+}
+
+.name {
+    font-size: 20px;
+}
+
+.progress {
+    color: var(--font-color);
+    margin-left: 15px;
+    margin-top: 8px;
+    margin-bottom: 15px;
+    font-size: 16px;
+}
+
+.bar {
+    margin-top: 20px;
+    margin-bottom: 20px;
+    margin-left: 20px;
+}
+
+.distribution {
+    color: var(--ion-color-primary);
+}
+
+.allowance-bar {
+    display: flex;
+    width: 95%;
+    height: 15px !important;
+    border-radius: 15px;
+    background-color: var(--font-color);
+    overflow: hidden;
+}
+
+.partition {
+    --partition-color: white;
+    background-color: var(--partition-color);
+    width: 25%;
+    height: 100%;
+    //border-radius: 15px;
+}
+
+.buttons,
+.title {
+    display: flex;
+    gap: 10px;
+}
+
+button {
+    height: 30px;
+    padding-inline: 30px;
+    border-radius: 10px;
+    color: white;
+    font-size: 16px;
+}
+
+button:disabled,
+button[disabled]{
+    opacity: 0.5;
+}
+
+.add-button {
+    background-color: var(--confirm-button-color);
+}
+
+.move-button {
+    background-color: var(--ion-color-primary);
+}
+
+.spend-button {
+    background-color: var(--negative-amount-color);
+}
+
+.icon {
+    margin-left: auto;
+    color: var(--font-color);
+}
+
+.color-wrapper {
+    padding: 10px;
+    border-radius: 9px;
+    position: relative;
+    z-index: 1;
+}
+
+.color {
+    --background: rgba(0, 0, 0, 0.3);
+    background-color: var(--background);
+    border-radius: 9px;
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    z-index: -1;
+}
+
+.other-goals {
+    padding: unset;
+}
+
+.legend {
+    width: 95%;
+    display: flex;
+    font-size: 13px;
+    gap: 8px;
+    margin-top: 5px;
+    flex-wrap: wrap;
+}
+
+.legend-item {
+    display: flex;
+    --legend-color: white;
+    color: var(--legend-color);
+    align-items: center;
+}
+
+.circle {
+    width: 12px;
+    height: 12px;
+    background-color: var(--legend-color);
+    border-radius: 20px;
+    margin-right: 2px;
+}
\ No newline at end of file
diff --git a/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.ts b/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.ts
index cce237c..afe1e89 100644
--- a/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.ts
+++ b/frontend/allowance-planner-v2/src/app/pages/allowance/allowance.page.ts
@@ -1,5 +1,10 @@
 import { Component } from '@angular/core';
-import { UserService } from 'src/app/services/user.service';
+import { ActivatedRoute } from '@angular/router';
+import { BehaviorSubject } from 'rxjs';
+import { Allowance } from 'src/app/models/allowance';
+import { AllowanceService } from 'src/app/services/allowance.service';
+import hexRgb from 'hex-rgb';
+import { ViewWillEnter } from '@ionic/angular';
 
 @Component({
   selector: 'app-allowance',
@@ -7,8 +12,64 @@ import { UserService } from 'src/app/services/user.service';
   styleUrls: ['allowance.page.scss'],
   standalone: false,
 })
-export class AllowancePage {
+export class AllowancePage implements ViewWillEnter {
+  private id: number;
+  // Move to add/edit page later
+  private possibleColors: Array<string> = [
+    '#6199D9',
+    '#D98B61',
+    '#DBC307',
+    '#13DEB5',
+    '#7DCB7D',
+    '#CF1DBD',
+    '#F53311',
+    '#2F00FF',
+    '#098B0D',
+    '#1BC2E8'
+  ];
+  public allowance$: BehaviorSubject<Array<Allowance>> = new BehaviorSubject<Array<Allowance>>([]);
 
-  constructor(private userService: UserService) {}
+  constructor(
+    private route: ActivatedRoute,
+    private allowanceService: AllowanceService
+  ) {
+    this.id = this.route.snapshot.params['id'];
+    this.getAllowance();
+  }
 
+  ionViewWillEnter(): void {
+    this.getAllowance();
+  }
+
+  getAllowance() {
+    setTimeout(() => {
+      this.allowanceService.getAllowanceList(this.id).subscribe(allowance => {
+        allowance[0].colour = '#9C4BE4';
+        allowance[0].name = 'Main Allowance';
+        console.log('Allowance list: ', allowance);
+        this.allowance$.next(allowance);
+      })
+    }, 10);
+  }
+
+  canFinishGoal(allowance: Allowance): boolean {
+    return allowance.progress >= allowance.target;
+  }
+
+  hexToRgb(color: string) {
+    return hexRgb(color, { alpha: 0.3, format: 'css' })
+  }
+
+  getPercentage(allowance: Allowance): number {
+    return allowance.progress / allowance.target * 100;
+  }
+
+  // Returns number in percent
+  getPartitionSize(goal: Allowance, allowanceList: Array<Allowance>): number {
+    let allowanceTotal = 0;
+    for (let allowance of allowanceList) {
+      allowanceTotal += allowance.progress;
+    }
+    return goal.progress / allowanceTotal * 100;
+  }
 }
diff --git a/frontend/allowance-planner-v2/src/app/pages/edit-task/edit-task.page.html b/frontend/allowance-planner-v2/src/app/pages/edit-task/edit-task.page.html
index 5670744..52eb693 100644
--- a/frontend/allowance-planner-v2/src/app/pages/edit-task/edit-task.page.html
+++ b/frontend/allowance-planner-v2/src/app/pages/edit-task/edit-task.page.html
@@ -18,7 +18,7 @@
     <input id="name" type="text" formControlName="name"/>
 
     <label>Reward</label>
-    <input id="name" type="number" formControlName="reward"/>
+    <input id="name" type="number" placeholder="0.00" name="price" min="0" value="0" step="0.01" formControlName="reward"/>
 
     <label>Assigned</label>
     <select formControlName="assigned">
diff --git a/frontend/allowance-planner-v2/src/app/pages/edit-task/edit-task.page.ts b/frontend/allowance-planner-v2/src/app/pages/edit-task/edit-task.page.ts
index ce2f1b3..6b0396f 100644
--- a/frontend/allowance-planner-v2/src/app/pages/edit-task/edit-task.page.ts
+++ b/frontend/allowance-planner-v2/src/app/pages/edit-task/edit-task.page.ts
@@ -30,7 +30,7 @@ export class EditTaskPage implements OnInit {
 
     this.form = this.formBuilder.group({
       name: ['', Validators.required],
-      reward: ['', [Validators.required, Validators.pattern("^[0-9]*$")]],
+      reward: ['', Validators.required],
       assigned: [0, Validators.required]
     });
   }
diff --git a/frontend/allowance-planner-v2/src/app/services/allowance.service.ts b/frontend/allowance-planner-v2/src/app/services/allowance.service.ts
new file mode 100644
index 0000000..a32538a
--- /dev/null
+++ b/frontend/allowance-planner-v2/src/app/services/allowance.service.ts
@@ -0,0 +1,17 @@
+import { HttpClient } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs';
+import { Allowance } from '../models/allowance';
+
+@Injectable({
+    providedIn: 'root'
+})
+export class AllowanceService {
+    private url = 'http://localhost:8080/api';
+
+    constructor(private http: HttpClient) {}
+
+    getAllowanceList(userId: number): Observable<Array<Allowance>> {
+        return this.http.get<Allowance[]>(`${this.url}/user/${userId}/allowance`);
+    }
+}
\ No newline at end of file
diff --git a/frontend/node_modules/.package-lock.json b/frontend/node_modules/.package-lock.json
new file mode 100644
index 0000000..186c793
--- /dev/null
+++ b/frontend/node_modules/.package-lock.json
@@ -0,0 +1,27 @@
+{
+  "name": "frontend",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "node_modules/@ionic/pwa-elements": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/@ionic/pwa-elements/-/pwa-elements-3.3.0.tgz",
+      "integrity": "sha512-vbykpxd2nGRlA67AnqDwsiVf8PUmInLyi6lQdnPDjeiML1WZa0CPe6r632nGDV9PTi+sWNde9Xexg9SD6Pwyqw==",
+      "engines": {
+        "node": ">=16.0.0",
+        "npm": ">=8.0.0"
+      }
+    },
+    "node_modules/hex-rgb": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-5.0.0.tgz",
+      "integrity": "sha512-NQO+lgVUCtHxZ792FodgW0zflK+ozS9X9dwGp9XvvmPlH7pyxd588cn24TD3rmPm/N0AIRXF10Otah8yKqGw4w==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    }
+  }
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/LICENSE b/frontend/node_modules/@ionic/pwa-elements/LICENSE
new file mode 100644
index 0000000..cdedba3
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Ionic
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/cjs/index-d7f36e37.js b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/index-d7f36e37.js
new file mode 100644
index 0000000..4cbe41d
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/index-d7f36e37.js
@@ -0,0 +1,1666 @@
+'use strict';
+
+function _interopNamespace(e) {
+  if (e && e.__esModule) return e;
+  var n = Object.create(null);
+  if (e) {
+    Object.keys(e).forEach(function (k) {
+      if (k !== 'default') {
+        var d = Object.getOwnPropertyDescriptor(e, k);
+        Object.defineProperty(n, k, d.get ? d : {
+          enumerable: true,
+          get: function () {
+            return e[k];
+          }
+        });
+      }
+    });
+  }
+  n['default'] = e;
+  return Object.freeze(n);
+}
+
+const NAMESPACE = 'ionicpwaelements';
+
+/**
+ * Virtual DOM patching algorithm based on Snabbdom by
+ * Simon Friis Vindum (@paldepind)
+ * Licensed under the MIT License
+ * https://github.com/snabbdom/snabbdom/blob/master/LICENSE
+ *
+ * Modified for Stencil's renderer and slot projection
+ */
+let scopeId;
+let hostTagName;
+let isSvgMode = false;
+let queuePending = false;
+const createTime = (fnName, tagName = '') => {
+    {
+        return () => {
+            return;
+        };
+    }
+};
+const uniqueTime = (key, measureText) => {
+    {
+        return () => {
+            return;
+        };
+    }
+};
+const HYDRATED_CSS = '{visibility:hidden}.hydrated{visibility:inherit}';
+/**
+ * Default style mode id
+ */
+/**
+ * Reusable empty obj/array
+ * Don't add values to these!!
+ */
+const EMPTY_OBJ = {};
+/**
+ * Namespaces
+ */
+const SVG_NS = 'http://www.w3.org/2000/svg';
+const HTML_NS = 'http://www.w3.org/1999/xhtml';
+const isDef = (v) => v != null;
+/**
+ * Check whether a value is a 'complex type', defined here as an object or a
+ * function.
+ *
+ * @param o the value to check
+ * @returns whether it's a complex type or not
+ */
+const isComplexType = (o) => {
+    // https://jsperf.com/typeof-fn-object/5
+    o = typeof o;
+    return o === 'object' || o === 'function';
+};
+/**
+ * Helper method for querying a `meta` tag that contains a nonce value
+ * out of a DOM's head.
+ *
+ * @param doc The DOM containing the `head` to query against
+ * @returns The content of the meta tag representing the nonce value, or `undefined` if no tag
+ * exists or the tag has no content.
+ */
+function queryNonceMetaTagContent(doc) {
+    var _a, _b, _c;
+    return (_c = (_b = (_a = doc.head) === null || _a === void 0 ? void 0 : _a.querySelector('meta[name="csp-nonce"]')) === null || _b === void 0 ? void 0 : _b.getAttribute('content')) !== null && _c !== void 0 ? _c : undefined;
+}
+/**
+ * Production h() function based on Preact by
+ * Jason Miller (@developit)
+ * Licensed under the MIT License
+ * https://github.com/developit/preact/blob/master/LICENSE
+ *
+ * Modified for Stencil's compiler and vdom
+ */
+// export function h(nodeName: string | d.FunctionalComponent, vnodeData: d.PropsType, child?: d.ChildType): d.VNode;
+// export function h(nodeName: string | d.FunctionalComponent, vnodeData: d.PropsType, ...children: d.ChildType[]): d.VNode;
+const h = (nodeName, vnodeData, ...children) => {
+    let child = null;
+    let simple = false;
+    let lastSimple = false;
+    const vNodeChildren = [];
+    const walk = (c) => {
+        for (let i = 0; i < c.length; i++) {
+            child = c[i];
+            if (Array.isArray(child)) {
+                walk(child);
+            }
+            else if (child != null && typeof child !== 'boolean') {
+                if ((simple = typeof nodeName !== 'function' && !isComplexType(child))) {
+                    child = String(child);
+                }
+                if (simple && lastSimple) {
+                    // If the previous child was simple (string), we merge both
+                    vNodeChildren[vNodeChildren.length - 1].$text$ += child;
+                }
+                else {
+                    // Append a new vNode, if it's text, we create a text vNode
+                    vNodeChildren.push(simple ? newVNode(null, child) : child);
+                }
+                lastSimple = simple;
+            }
+        }
+    };
+    walk(children);
+    if (vnodeData) {
+        {
+            const classData = vnodeData.className || vnodeData.class;
+            if (classData) {
+                vnodeData.class =
+                    typeof classData !== 'object'
+                        ? classData
+                        : Object.keys(classData)
+                            .filter((k) => classData[k])
+                            .join(' ');
+            }
+        }
+    }
+    const vnode = newVNode(nodeName, null);
+    vnode.$attrs$ = vnodeData;
+    if (vNodeChildren.length > 0) {
+        vnode.$children$ = vNodeChildren;
+    }
+    return vnode;
+};
+/**
+ * A utility function for creating a virtual DOM node from a tag and some
+ * possible text content.
+ *
+ * @param tag the tag for this element
+ * @param text possible text content for the node
+ * @returns a newly-minted virtual DOM node
+ */
+const newVNode = (tag, text) => {
+    const vnode = {
+        $flags$: 0,
+        $tag$: tag,
+        $text$: text,
+        $elm$: null,
+        $children$: null,
+    };
+    {
+        vnode.$attrs$ = null;
+    }
+    return vnode;
+};
+const Host = {};
+/**
+ * Check whether a given node is a Host node or not
+ *
+ * @param node the virtual DOM node to check
+ * @returns whether it's a Host node or not
+ */
+const isHost = (node) => node && node.$tag$ === Host;
+/**
+ * Parse a new property value for a given property type.
+ *
+ * While the prop value can reasonably be expected to be of `any` type as far as TypeScript's type checker is concerned,
+ * it is not safe to assume that the string returned by evaluating `typeof propValue` matches:
+ *   1. `any`, the type given to `propValue` in the function signature
+ *   2. the type stored from `propType`.
+ *
+ * This function provides the capability to parse/coerce a property's value to potentially any other JavaScript type.
+ *
+ * Property values represented in TSX preserve their type information. In the example below, the number 0 is passed to
+ * a component. This `propValue` will preserve its type information (`typeof propValue === 'number'`). Note that is
+ * based on the type of the value being passed in, not the type declared of the class member decorated with `@Prop`.
+ * ```tsx
+ * <my-cmp prop-val={0}></my-cmp>
+ * ```
+ *
+ * HTML prop values on the other hand, will always a string
+ *
+ * @param propValue the new value to coerce to some type
+ * @param propType the type of the prop, expressed as a binary number
+ * @returns the parsed/coerced value
+ */
+const parsePropertyValue = (propValue, propType) => {
+    // ensure this value is of the correct prop type
+    if (propValue != null && !isComplexType(propValue)) {
+        if (propType & 4 /* MEMBER_FLAGS.Boolean */) {
+            // per the HTML spec, any string value means it is a boolean true value
+            // but we'll cheat here and say that the string "false" is the boolean false
+            return propValue === 'false' ? false : propValue === '' || !!propValue;
+        }
+        if (propType & 2 /* MEMBER_FLAGS.Number */) {
+            // force it to be a number
+            return parseFloat(propValue);
+        }
+        if (propType & 1 /* MEMBER_FLAGS.String */) {
+            // could have been passed as a number or boolean
+            // but we still want it as a string
+            return String(propValue);
+        }
+        // redundant return here for better minification
+        return propValue;
+    }
+    // not sure exactly what type we want
+    // so no need to change to a different type
+    return propValue;
+};
+const getElement = (ref) => (getHostRef(ref).$hostElement$ );
+const createEvent = (ref, name, flags) => {
+    const elm = getElement(ref);
+    return {
+        emit: (detail) => {
+            return emitEvent(elm, name, {
+                bubbles: !!(flags & 4 /* EVENT_FLAGS.Bubbles */),
+                composed: !!(flags & 2 /* EVENT_FLAGS.Composed */),
+                cancelable: !!(flags & 1 /* EVENT_FLAGS.Cancellable */),
+                detail,
+            });
+        },
+    };
+};
+/**
+ * Helper function to create & dispatch a custom Event on a provided target
+ * @param elm the target of the Event
+ * @param name the name to give the custom Event
+ * @param opts options for configuring a custom Event
+ * @returns the custom Event
+ */
+const emitEvent = (elm, name, opts) => {
+    const ev = plt.ce(name, opts);
+    elm.dispatchEvent(ev);
+    return ev;
+};
+const rootAppliedStyles = /*@__PURE__*/ new WeakMap();
+const registerStyle = (scopeId, cssText, allowCS) => {
+    let style = styles.get(scopeId);
+    if (supportsConstructableStylesheets && allowCS) {
+        style = (style || new CSSStyleSheet());
+        if (typeof style === 'string') {
+            style = cssText;
+        }
+        else {
+            style.replaceSync(cssText);
+        }
+    }
+    else {
+        style = cssText;
+    }
+    styles.set(scopeId, style);
+};
+const addStyle = (styleContainerNode, cmpMeta, mode, hostElm) => {
+    var _a;
+    let scopeId = getScopeId(cmpMeta);
+    const style = styles.get(scopeId);
+    // if an element is NOT connected then getRootNode() will return the wrong root node
+    // so the fallback is to always use the document for the root node in those cases
+    styleContainerNode = styleContainerNode.nodeType === 11 /* NODE_TYPE.DocumentFragment */ ? styleContainerNode : doc;
+    if (style) {
+        if (typeof style === 'string') {
+            styleContainerNode = styleContainerNode.head || styleContainerNode;
+            let appliedStyles = rootAppliedStyles.get(styleContainerNode);
+            let styleElm;
+            if (!appliedStyles) {
+                rootAppliedStyles.set(styleContainerNode, (appliedStyles = new Set()));
+            }
+            if (!appliedStyles.has(scopeId)) {
+                {
+                    // TODO(STENCIL-659): Remove code implementing the CSS variable shim
+                    {
+                        styleElm = doc.createElement('style');
+                        styleElm.innerHTML = style;
+                    }
+                    // Apply CSP nonce to the style tag if it exists
+                    const nonce = (_a = plt.$nonce$) !== null && _a !== void 0 ? _a : queryNonceMetaTagContent(doc);
+                    if (nonce != null) {
+                        styleElm.setAttribute('nonce', nonce);
+                    }
+                    styleContainerNode.insertBefore(styleElm, styleContainerNode.querySelector('link'));
+                }
+                if (appliedStyles) {
+                    appliedStyles.add(scopeId);
+                }
+            }
+        }
+        else if (!styleContainerNode.adoptedStyleSheets.includes(style)) {
+            styleContainerNode.adoptedStyleSheets = [...styleContainerNode.adoptedStyleSheets, style];
+        }
+    }
+    return scopeId;
+};
+const attachStyles = (hostRef) => {
+    const cmpMeta = hostRef.$cmpMeta$;
+    const elm = hostRef.$hostElement$;
+    const flags = cmpMeta.$flags$;
+    const endAttachStyles = createTime('attachStyles', cmpMeta.$tagName$);
+    const scopeId = addStyle(elm.shadowRoot ? elm.shadowRoot : elm.getRootNode(), cmpMeta);
+    // TODO(STENCIL-662): Remove code related to deprecated shadowDomShim field
+    if (flags & 10 /* CMP_FLAGS.needsScopedEncapsulation */) {
+        // only required when we're NOT using native shadow dom (slot)
+        // or this browser doesn't support native shadow dom
+        // and this host element was NOT created with SSR
+        // let's pick out the inner content for slot projection
+        // create a node to represent where the original
+        // content was first placed, which is useful later on
+        // DOM WRITE!!
+        elm['s-sc'] = scopeId;
+        elm.classList.add(scopeId + '-h');
+    }
+    endAttachStyles();
+};
+const getScopeId = (cmp, mode) => 'sc-' + (cmp.$tagName$);
+/**
+ * Production setAccessor() function based on Preact by
+ * Jason Miller (@developit)
+ * Licensed under the MIT License
+ * https://github.com/developit/preact/blob/master/LICENSE
+ *
+ * Modified for Stencil's compiler and vdom
+ */
+const setAccessor = (elm, memberName, oldValue, newValue, isSvg, flags) => {
+    if (oldValue !== newValue) {
+        let isProp = isMemberInElement(elm, memberName);
+        let ln = memberName.toLowerCase();
+        if (memberName === 'class') {
+            const classList = elm.classList;
+            const oldClasses = parseClassList(oldValue);
+            const newClasses = parseClassList(newValue);
+            classList.remove(...oldClasses.filter((c) => c && !newClasses.includes(c)));
+            classList.add(...newClasses.filter((c) => c && !oldClasses.includes(c)));
+        }
+        else if (memberName === 'style') {
+            // update style attribute, css properties and values
+            {
+                for (const prop in oldValue) {
+                    if (!newValue || newValue[prop] == null) {
+                        if (prop.includes('-')) {
+                            elm.style.removeProperty(prop);
+                        }
+                        else {
+                            elm.style[prop] = '';
+                        }
+                    }
+                }
+            }
+            for (const prop in newValue) {
+                if (!oldValue || newValue[prop] !== oldValue[prop]) {
+                    if (prop.includes('-')) {
+                        elm.style.setProperty(prop, newValue[prop]);
+                    }
+                    else {
+                        elm.style[prop] = newValue[prop];
+                    }
+                }
+            }
+        }
+        else if (memberName === 'ref') {
+            // minifier will clean this up
+            if (newValue) {
+                newValue(elm);
+            }
+        }
+        else if ((!isProp ) &&
+            memberName[0] === 'o' &&
+            memberName[1] === 'n') {
+            // Event Handlers
+            // so if the member name starts with "on" and the 3rd characters is
+            // a capital letter, and it's not already a member on the element,
+            // then we're assuming it's an event listener
+            if (memberName[2] === '-') {
+                // on- prefixed events
+                // allows to be explicit about the dom event to listen without any magic
+                // under the hood:
+                // <my-cmp on-click> // listens for "click"
+                // <my-cmp on-Click> // listens for "Click"
+                // <my-cmp on-ionChange> // listens for "ionChange"
+                // <my-cmp on-EVENTS> // listens for "EVENTS"
+                memberName = memberName.slice(3);
+            }
+            else if (isMemberInElement(win, ln)) {
+                // standard event
+                // the JSX attribute could have been "onMouseOver" and the
+                // member name "onmouseover" is on the window's prototype
+                // so let's add the listener "mouseover", which is all lowercased
+                memberName = ln.slice(2);
+            }
+            else {
+                // custom event
+                // the JSX attribute could have been "onMyCustomEvent"
+                // so let's trim off the "on" prefix and lowercase the first character
+                // and add the listener "myCustomEvent"
+                // except for the first character, we keep the event name case
+                memberName = ln[2] + memberName.slice(3);
+            }
+            if (oldValue) {
+                plt.rel(elm, memberName, oldValue, false);
+            }
+            if (newValue) {
+                plt.ael(elm, memberName, newValue, false);
+            }
+        }
+        else {
+            // Set property if it exists and it's not a SVG
+            const isComplex = isComplexType(newValue);
+            if ((isProp || (isComplex && newValue !== null)) && !isSvg) {
+                try {
+                    if (!elm.tagName.includes('-')) {
+                        const n = newValue == null ? '' : newValue;
+                        // Workaround for Safari, moving the <input> caret when re-assigning the same valued
+                        if (memberName === 'list') {
+                            isProp = false;
+                        }
+                        else if (oldValue == null || elm[memberName] != n) {
+                            elm[memberName] = n;
+                        }
+                    }
+                    else {
+                        elm[memberName] = newValue;
+                    }
+                }
+                catch (e) { }
+            }
+            if (newValue == null || newValue === false) {
+                if (newValue !== false || elm.getAttribute(memberName) === '') {
+                    {
+                        elm.removeAttribute(memberName);
+                    }
+                }
+            }
+            else if ((!isProp || flags & 4 /* VNODE_FLAGS.isHost */ || isSvg) && !isComplex) {
+                newValue = newValue === true ? '' : newValue;
+                {
+                    elm.setAttribute(memberName, newValue);
+                }
+            }
+        }
+    }
+};
+const parseClassListRegex = /\s/;
+const parseClassList = (value) => (!value ? [] : value.split(parseClassListRegex));
+const updateElement = (oldVnode, newVnode, isSvgMode, memberName) => {
+    // if the element passed in is a shadow root, which is a document fragment
+    // then we want to be adding attrs/props to the shadow root's "host" element
+    // if it's not a shadow root, then we add attrs/props to the same element
+    const elm = newVnode.$elm$.nodeType === 11 /* NODE_TYPE.DocumentFragment */ && newVnode.$elm$.host
+        ? newVnode.$elm$.host
+        : newVnode.$elm$;
+    const oldVnodeAttrs = (oldVnode && oldVnode.$attrs$) || EMPTY_OBJ;
+    const newVnodeAttrs = newVnode.$attrs$ || EMPTY_OBJ;
+    {
+        // remove attributes no longer present on the vnode by setting them to undefined
+        for (memberName in oldVnodeAttrs) {
+            if (!(memberName in newVnodeAttrs)) {
+                setAccessor(elm, memberName, oldVnodeAttrs[memberName], undefined, isSvgMode, newVnode.$flags$);
+            }
+        }
+    }
+    // add new & update changed attributes
+    for (memberName in newVnodeAttrs) {
+        setAccessor(elm, memberName, oldVnodeAttrs[memberName], newVnodeAttrs[memberName], isSvgMode, newVnode.$flags$);
+    }
+};
+/**
+ * Create a DOM Node corresponding to one of the children of a given VNode.
+ *
+ * @param oldParentVNode the parent VNode from the previous render
+ * @param newParentVNode the parent VNode from the current render
+ * @param childIndex the index of the VNode, in the _new_ parent node's
+ * children, for which we will create a new DOM node
+ * @param parentElm the parent DOM node which our new node will be a child of
+ * @returns the newly created node
+ */
+const createElm = (oldParentVNode, newParentVNode, childIndex, parentElm) => {
+    // tslint:disable-next-line: prefer-const
+    const newVNode = newParentVNode.$children$[childIndex];
+    let i = 0;
+    let elm;
+    let childNode;
+    if (newVNode.$text$ !== null) {
+        // create text node
+        elm = newVNode.$elm$ = doc.createTextNode(newVNode.$text$);
+    }
+    else {
+        if (!isSvgMode) {
+            isSvgMode = newVNode.$tag$ === 'svg';
+        }
+        // create element
+        elm = newVNode.$elm$ = (doc.createElementNS(isSvgMode ? SVG_NS : HTML_NS, newVNode.$tag$)
+            );
+        if (isSvgMode && newVNode.$tag$ === 'foreignObject') {
+            isSvgMode = false;
+        }
+        // add css classes, attrs, props, listeners, etc.
+        {
+            updateElement(null, newVNode, isSvgMode);
+        }
+        if (isDef(scopeId) && elm['s-si'] !== scopeId) {
+            // if there is a scopeId and this is the initial render
+            // then let's add the scopeId as a css class
+            elm.classList.add((elm['s-si'] = scopeId));
+        }
+        if (newVNode.$children$) {
+            for (i = 0; i < newVNode.$children$.length; ++i) {
+                // create the node
+                childNode = createElm(oldParentVNode, newVNode, i);
+                // return node could have been null
+                if (childNode) {
+                    // append our new node
+                    elm.appendChild(childNode);
+                }
+            }
+        }
+        {
+            if (newVNode.$tag$ === 'svg') {
+                // Only reset the SVG context when we're exiting <svg> element
+                isSvgMode = false;
+            }
+            else if (elm.tagName === 'foreignObject') {
+                // Reenter SVG context when we're exiting <foreignObject> element
+                isSvgMode = true;
+            }
+        }
+    }
+    return elm;
+};
+/**
+ * Create DOM nodes corresponding to a list of {@link d.Vnode} objects and
+ * add them to the DOM in the appropriate place.
+ *
+ * @param parentElm the DOM node which should be used as a parent for the new
+ * DOM nodes
+ * @param before a child of the `parentElm` which the new children should be
+ * inserted before (optional)
+ * @param parentVNode the parent virtual DOM node
+ * @param vnodes the new child virtual DOM nodes to produce DOM nodes for
+ * @param startIdx the index in the child virtual DOM nodes at which to start
+ * creating DOM nodes (inclusive)
+ * @param endIdx the index in the child virtual DOM nodes at which to stop
+ * creating DOM nodes (inclusive)
+ */
+const addVnodes = (parentElm, before, parentVNode, vnodes, startIdx, endIdx) => {
+    let containerElm = (parentElm);
+    let childNode;
+    if (containerElm.shadowRoot && containerElm.tagName === hostTagName) {
+        containerElm = containerElm.shadowRoot;
+    }
+    for (; startIdx <= endIdx; ++startIdx) {
+        if (vnodes[startIdx]) {
+            childNode = createElm(null, parentVNode, startIdx);
+            if (childNode) {
+                vnodes[startIdx].$elm$ = childNode;
+                containerElm.insertBefore(childNode, before);
+            }
+        }
+    }
+};
+/**
+ * Remove the DOM elements corresponding to a list of {@link d.VNode} objects.
+ * This can be used to, for instance, clean up after a list of children which
+ * should no longer be shown.
+ *
+ * This function also handles some of Stencil's slot relocation logic.
+ *
+ * @param vnodes a list of virtual DOM nodes to remove
+ * @param startIdx the index at which to start removing nodes (inclusive)
+ * @param endIdx the index at which to stop removing nodes (inclusive)
+ */
+const removeVnodes = (vnodes, startIdx, endIdx) => {
+    for (let index = startIdx; index <= endIdx; ++index) {
+        const vnode = vnodes[index];
+        if (vnode) {
+            const elm = vnode.$elm$;
+            nullifyVNodeRefs(vnode);
+            if (elm) {
+                // remove the vnode's element from the dom
+                elm.remove();
+            }
+        }
+    }
+};
+/**
+ * Reconcile the children of a new VNode with the children of an old VNode by
+ * traversing the two collections of children, identifying nodes that are
+ * conserved or changed, calling out to `patch` to make any necessary
+ * updates to the DOM, and rearranging DOM nodes as needed.
+ *
+ * The algorithm for reconciling children works by analyzing two 'windows' onto
+ * the two arrays of children (`oldCh` and `newCh`). We keep track of the
+ * 'windows' by storing start and end indices and references to the
+ * corresponding array entries. Initially the two 'windows' are basically equal
+ * to the entire array, but we progressively narrow the windows until there are
+ * no children left to update by doing the following:
+ *
+ * 1. Skip any `null` entries at the beginning or end of the two arrays, so
+ *    that if we have an initial array like the following we'll end up dealing
+ *    only with a window bounded by the highlighted elements:
+ *
+ *    [null, null, VNode1 , ... , VNode2, null, null]
+ *                 ^^^^^^         ^^^^^^
+ *
+ * 2. Check to see if the elements at the head and tail positions are equal
+ *    across the windows. This will basically detect elements which haven't
+ *    been added, removed, or changed position, i.e. if you had the following
+ *    VNode elements (represented as HTML):
+ *
+ *    oldVNode: `<div><p><span>HEY</span></p></div>`
+ *    newVNode: `<div><p><span>THERE</span></p></div>`
+ *
+ *    Then when comparing the children of the `<div>` tag we check the equality
+ *    of the VNodes corresponding to the `<p>` tags and, since they are the
+ *    same tag in the same position, we'd be able to avoid completely
+ *    re-rendering the subtree under them with a new DOM element and would just
+ *    call out to `patch` to handle reconciling their children and so on.
+ *
+ * 3. Check, for both windows, to see if the element at the beginning of the
+ *    window corresponds to the element at the end of the other window. This is
+ *    a heuristic which will let us identify _some_ situations in which
+ *    elements have changed position, for instance it _should_ detect that the
+ *    children nodes themselves have not changed but merely moved in the
+ *    following example:
+ *
+ *    oldVNode: `<div><element-one /><element-two /></div>`
+ *    newVNode: `<div><element-two /><element-one /></div>`
+ *
+ *    If we find cases like this then we also need to move the concrete DOM
+ *    elements corresponding to the moved children to write the re-order to the
+ *    DOM.
+ *
+ * 4. Finally, if VNodes have the `key` attribute set on them we check for any
+ *    nodes in the old children which have the same key as the first element in
+ *    our window on the new children. If we find such a node we handle calling
+ *    out to `patch`, moving relevant DOM nodes, and so on, in accordance with
+ *    what we find.
+ *
+ * Finally, once we've narrowed our 'windows' to the point that either of them
+ * collapse (i.e. they have length 0) we then handle any remaining VNode
+ * insertion or deletion that needs to happen to get a DOM state that correctly
+ * reflects the new child VNodes. If, for instance, after our window on the old
+ * children has collapsed we still have more nodes on the new children that
+ * we haven't dealt with yet then we need to add them, or if the new children
+ * collapse but we still have unhandled _old_ children then we need to make
+ * sure the corresponding DOM nodes are removed.
+ *
+ * @param parentElm the node into which the parent VNode is rendered
+ * @param oldCh the old children of the parent node
+ * @param newVNode the new VNode which will replace the parent
+ * @param newCh the new children of the parent node
+ */
+const updateChildren = (parentElm, oldCh, newVNode, newCh) => {
+    let oldStartIdx = 0;
+    let newStartIdx = 0;
+    let oldEndIdx = oldCh.length - 1;
+    let oldStartVnode = oldCh[0];
+    let oldEndVnode = oldCh[oldEndIdx];
+    let newEndIdx = newCh.length - 1;
+    let newStartVnode = newCh[0];
+    let newEndVnode = newCh[newEndIdx];
+    let node;
+    while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
+        if (oldStartVnode == null) {
+            // VNode might have been moved left
+            oldStartVnode = oldCh[++oldStartIdx];
+        }
+        else if (oldEndVnode == null) {
+            oldEndVnode = oldCh[--oldEndIdx];
+        }
+        else if (newStartVnode == null) {
+            newStartVnode = newCh[++newStartIdx];
+        }
+        else if (newEndVnode == null) {
+            newEndVnode = newCh[--newEndIdx];
+        }
+        else if (isSameVnode(oldStartVnode, newStartVnode)) {
+            // if the start nodes are the same then we should patch the new VNode
+            // onto the old one, and increment our `newStartIdx` and `oldStartIdx`
+            // indices to reflect that. We don't need to move any DOM Nodes around
+            // since things are matched up in order.
+            patch(oldStartVnode, newStartVnode);
+            oldStartVnode = oldCh[++oldStartIdx];
+            newStartVnode = newCh[++newStartIdx];
+        }
+        else if (isSameVnode(oldEndVnode, newEndVnode)) {
+            // likewise, if the end nodes are the same we patch new onto old and
+            // decrement our end indices, and also likewise in this case we don't
+            // need to move any DOM Nodes.
+            patch(oldEndVnode, newEndVnode);
+            oldEndVnode = oldCh[--oldEndIdx];
+            newEndVnode = newCh[--newEndIdx];
+        }
+        else if (isSameVnode(oldStartVnode, newEndVnode)) {
+            patch(oldStartVnode, newEndVnode);
+            // We need to move the element for `oldStartVnode` into a position which
+            // will be appropriate for `newEndVnode`. For this we can use
+            // `.insertBefore` and `oldEndVnode.$elm$.nextSibling`. If there is a
+            // sibling for `oldEndVnode.$elm$` then we want to move the DOM node for
+            // `oldStartVnode` between `oldEndVnode` and it's sibling, like so:
+            //
+            // <old-start-node />
+            // <some-intervening-node />
+            // <old-end-node />
+            // <!-- ->              <-- `oldStartVnode.$elm$` should be inserted here
+            // <next-sibling />
+            //
+            // If instead `oldEndVnode.$elm$` has no sibling then we just want to put
+            // the node for `oldStartVnode` at the end of the children of
+            // `parentElm`. Luckily, `Node.nextSibling` will return `null` if there
+            // aren't any siblings, and passing `null` to `Node.insertBefore` will
+            // append it to the children of the parent element.
+            parentElm.insertBefore(oldStartVnode.$elm$, oldEndVnode.$elm$.nextSibling);
+            oldStartVnode = oldCh[++oldStartIdx];
+            newEndVnode = newCh[--newEndIdx];
+        }
+        else if (isSameVnode(oldEndVnode, newStartVnode)) {
+            patch(oldEndVnode, newStartVnode);
+            // We've already checked above if `oldStartVnode` and `newStartVnode` are
+            // the same node, so since we're here we know that they are not. Thus we
+            // can move the element for `oldEndVnode` _before_ the element for
+            // `oldStartVnode`, leaving `oldStartVnode` to be reconciled in the
+            // future.
+            parentElm.insertBefore(oldEndVnode.$elm$, oldStartVnode.$elm$);
+            oldEndVnode = oldCh[--oldEndIdx];
+            newStartVnode = newCh[++newStartIdx];
+        }
+        else {
+            {
+                // We either didn't find an element in the old children that matches
+                // the key of the first new child OR the build is not using `key`
+                // attributes at all. In either case we need to create a new element
+                // for the new node.
+                node = createElm(oldCh && oldCh[newStartIdx], newVNode, newStartIdx);
+                newStartVnode = newCh[++newStartIdx];
+            }
+            if (node) {
+                // if we created a new node then handle inserting it to the DOM
+                {
+                    oldStartVnode.$elm$.parentNode.insertBefore(node, oldStartVnode.$elm$);
+                }
+            }
+        }
+    }
+    if (oldStartIdx > oldEndIdx) {
+        // we have some more new nodes to add which don't match up with old nodes
+        addVnodes(parentElm, newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].$elm$, newVNode, newCh, newStartIdx, newEndIdx);
+    }
+    else if (newStartIdx > newEndIdx) {
+        // there are nodes in the `oldCh` array which no longer correspond to nodes
+        // in the new array, so lets remove them (which entails cleaning up the
+        // relevant DOM nodes)
+        removeVnodes(oldCh, oldStartIdx, oldEndIdx);
+    }
+};
+/**
+ * Compare two VNodes to determine if they are the same
+ *
+ * **NB**: This function is an equality _heuristic_ based on the available
+ * information set on the two VNodes and can be misleading under certain
+ * circumstances. In particular, if the two nodes do not have `key` attrs
+ * (available under `$key$` on VNodes) then the function falls back on merely
+ * checking that they have the same tag.
+ *
+ * So, in other words, if `key` attrs are not set on VNodes which may be
+ * changing order within a `children` array or something along those lines then
+ * we could obtain a false negative and then have to do needless re-rendering
+ * (i.e. we'd say two VNodes aren't equal when in fact they should be).
+ *
+ * @param leftVNode the first VNode to check
+ * @param rightVNode the second VNode to check
+ * @returns whether they're equal or not
+ */
+const isSameVnode = (leftVNode, rightVNode) => {
+    // compare if two vnode to see if they're "technically" the same
+    // need to have the same element tag, and same key to be the same
+    if (leftVNode.$tag$ === rightVNode.$tag$) {
+        return true;
+    }
+    return false;
+};
+/**
+ * Handle reconciling an outdated VNode with a new one which corresponds to
+ * it. This function handles flushing updates to the DOM and reconciling the
+ * children of the two nodes (if any).
+ *
+ * @param oldVNode an old VNode whose DOM element and children we want to update
+ * @param newVNode a new VNode representing an updated version of the old one
+ */
+const patch = (oldVNode, newVNode) => {
+    const elm = (newVNode.$elm$ = oldVNode.$elm$);
+    const oldChildren = oldVNode.$children$;
+    const newChildren = newVNode.$children$;
+    const tag = newVNode.$tag$;
+    const text = newVNode.$text$;
+    if (text === null) {
+        {
+            // test if we're rendering an svg element, or still rendering nodes inside of one
+            // only add this to the when the compiler sees we're using an svg somewhere
+            isSvgMode = tag === 'svg' ? true : tag === 'foreignObject' ? false : isSvgMode;
+        }
+        {
+            {
+                // either this is the first render of an element OR it's an update
+                // AND we already know it's possible it could have changed
+                // this updates the element's css classes, attrs, props, listeners, etc.
+                updateElement(oldVNode, newVNode, isSvgMode);
+            }
+        }
+        if (oldChildren !== null && newChildren !== null) {
+            // looks like there's child vnodes for both the old and new vnodes
+            // so we need to call `updateChildren` to reconcile them
+            updateChildren(elm, oldChildren, newVNode, newChildren);
+        }
+        else if (newChildren !== null) {
+            // no old child vnodes, but there are new child vnodes to add
+            if (oldVNode.$text$ !== null) {
+                // the old vnode was text, so be sure to clear it out
+                elm.textContent = '';
+            }
+            // add the new vnode children
+            addVnodes(elm, null, newVNode, newChildren, 0, newChildren.length - 1);
+        }
+        else if (oldChildren !== null) {
+            // no new child vnodes, but there are old child vnodes to remove
+            removeVnodes(oldChildren, 0, oldChildren.length - 1);
+        }
+        if (isSvgMode && tag === 'svg') {
+            isSvgMode = false;
+        }
+    }
+    else if (oldVNode.$text$ !== text) {
+        // update the text content for the text only vnode
+        // and also only if the text is different than before
+        elm.data = text;
+    }
+};
+/**
+ * 'Nullify' any VDom `ref` callbacks on a VDom node or its children by
+ * calling them with `null`. This signals that the DOM element corresponding to
+ * the VDom node has been removed from the DOM.
+ *
+ * @param vNode a virtual DOM node
+ */
+const nullifyVNodeRefs = (vNode) => {
+    {
+        vNode.$attrs$ && vNode.$attrs$.ref && vNode.$attrs$.ref(null);
+        vNode.$children$ && vNode.$children$.map(nullifyVNodeRefs);
+    }
+};
+/**
+ * The main entry point for Stencil's virtual DOM-based rendering engine
+ *
+ * Given a {@link d.HostRef} container and some virtual DOM nodes, this
+ * function will handle creating a virtual DOM tree with a single root, patching
+ * the current virtual DOM tree onto an old one (if any), dealing with slot
+ * relocation, and reflecting attributes.
+ *
+ * @param hostRef data needed to root and render the virtual DOM tree, such as
+ * the DOM node into which it should be rendered.
+ * @param renderFnResults the virtual DOM nodes to be rendered
+ */
+const renderVdom = (hostRef, renderFnResults) => {
+    const hostElm = hostRef.$hostElement$;
+    const oldVNode = hostRef.$vnode$ || newVNode(null, null);
+    const rootVnode = isHost(renderFnResults) ? renderFnResults : h(null, null, renderFnResults);
+    hostTagName = hostElm.tagName;
+    rootVnode.$tag$ = null;
+    rootVnode.$flags$ |= 4 /* VNODE_FLAGS.isHost */;
+    hostRef.$vnode$ = rootVnode;
+    rootVnode.$elm$ = oldVNode.$elm$ = (hostElm.shadowRoot || hostElm );
+    {
+        scopeId = hostElm['s-sc'];
+    }
+    // synchronous patch
+    patch(oldVNode, rootVnode);
+};
+const attachToAncestor = (hostRef, ancestorComponent) => {
+    if (ancestorComponent && !hostRef.$onRenderResolve$ && ancestorComponent['s-p']) {
+        ancestorComponent['s-p'].push(new Promise((r) => (hostRef.$onRenderResolve$ = r)));
+    }
+};
+const scheduleUpdate = (hostRef, isInitialLoad) => {
+    {
+        hostRef.$flags$ |= 16 /* HOST_FLAGS.isQueuedForUpdate */;
+    }
+    if (hostRef.$flags$ & 4 /* HOST_FLAGS.isWaitingForChildren */) {
+        hostRef.$flags$ |= 512 /* HOST_FLAGS.needsRerender */;
+        return;
+    }
+    attachToAncestor(hostRef, hostRef.$ancestorComponent$);
+    // there is no ancestor component or the ancestor component
+    // has already fired off its lifecycle update then
+    // fire off the initial update
+    const dispatch = () => dispatchHooks(hostRef, isInitialLoad);
+    return writeTask(dispatch) ;
+};
+/**
+ * Dispatch initial-render and update lifecycle hooks, enqueuing calls to
+ * component lifecycle methods like `componentWillLoad` as well as
+ * {@link updateComponent}, which will kick off the virtual DOM re-render.
+ *
+ * @param hostRef a reference to a host DOM node
+ * @param isInitialLoad whether we're on the initial load or not
+ * @returns an empty Promise which is used to enqueue a series of operations for
+ * the component
+ */
+const dispatchHooks = (hostRef, isInitialLoad) => {
+    const endSchedule = createTime('scheduleUpdate', hostRef.$cmpMeta$.$tagName$);
+    const instance = hostRef.$lazyInstance$ ;
+    // We're going to use this variable together with `enqueue` to implement a
+    // little promise-based queue. We start out with it `undefined`. When we add
+    // the first function to the queue we'll set this variable to be that
+    // function's return value. When we attempt to add subsequent values to the
+    // queue we'll check that value and, if it was a `Promise`, we'll then chain
+    // the new function off of that `Promise` using `.then()`. This will give our
+    // queue two nice properties:
+    //
+    // 1. If all functions added to the queue are synchronous they'll be called
+    //    synchronously right away.
+    // 2. If all functions added to the queue are asynchronous they'll all be
+    //    called in order after `dispatchHooks` exits.
+    let maybePromise;
+    if (isInitialLoad) {
+        {
+            hostRef.$flags$ |= 256 /* HOST_FLAGS.isListenReady */;
+            if (hostRef.$queuedListeners$) {
+                hostRef.$queuedListeners$.map(([methodName, event]) => safeCall(instance, methodName, event));
+                hostRef.$queuedListeners$ = undefined;
+            }
+        }
+    }
+    endSchedule();
+    return enqueue(maybePromise, () => updateComponent(hostRef, instance, isInitialLoad));
+};
+/**
+ * This function uses a Promise to implement a simple first-in, first-out queue
+ * of functions to be called.
+ *
+ * The queue is ordered on the basis of the first argument. If it's
+ * `undefined`, then nothing is on the queue yet, so the provided function can
+ * be called synchronously (although note that this function may return a
+ * `Promise`). The idea is that then the return value of that enqueueing
+ * operation is kept around, so that if it was a `Promise` then subsequent
+ * functions can be enqueued by calling this function again with that `Promise`
+ * as the first argument.
+ *
+ * @param maybePromise either a `Promise` which should resolve before the next function is called or an 'empty' sentinel
+ * @param fn a function to enqueue
+ * @returns either a `Promise` or the return value of the provided function
+ */
+const enqueue = (maybePromise, fn) => isPromisey(maybePromise) ? maybePromise.then(fn) : fn();
+/**
+ * Check that a value is a `Promise`. To check, we first see if the value is an
+ * instance of the `Promise` global. In a few circumstances, in particular if
+ * the global has been overwritten, this is could be misleading, so we also do
+ * a little 'duck typing' check to see if the `.then` property of the value is
+ * defined and a function.
+ *
+ * @param maybePromise it might be a promise!
+ * @returns whether it is or not
+ */
+const isPromisey = (maybePromise) => maybePromise instanceof Promise ||
+    (maybePromise && maybePromise.then && typeof maybePromise.then === 'function');
+const updateComponent = async (hostRef, instance, isInitialLoad) => {
+    var _a;
+    const elm = hostRef.$hostElement$;
+    const endUpdate = createTime('update', hostRef.$cmpMeta$.$tagName$);
+    const rc = elm['s-rc'];
+    if (isInitialLoad) {
+        // DOM WRITE!
+        attachStyles(hostRef);
+    }
+    const endRender = createTime('render', hostRef.$cmpMeta$.$tagName$);
+    {
+        callRender(hostRef, instance);
+    }
+    if (rc) {
+        // ok, so turns out there are some child host elements
+        // waiting on this parent element to load
+        // let's fire off all update callbacks waiting
+        rc.map((cb) => cb());
+        elm['s-rc'] = undefined;
+    }
+    endRender();
+    endUpdate();
+    {
+        const childrenPromises = (_a = elm['s-p']) !== null && _a !== void 0 ? _a : [];
+        const postUpdate = () => postUpdateComponent(hostRef);
+        if (childrenPromises.length === 0) {
+            postUpdate();
+        }
+        else {
+            Promise.all(childrenPromises).then(postUpdate);
+            hostRef.$flags$ |= 4 /* HOST_FLAGS.isWaitingForChildren */;
+            childrenPromises.length = 0;
+        }
+    }
+};
+const callRender = (hostRef, instance, elm) => {
+    try {
+        instance = instance.render() ;
+        {
+            hostRef.$flags$ &= ~16 /* HOST_FLAGS.isQueuedForUpdate */;
+        }
+        {
+            hostRef.$flags$ |= 2 /* HOST_FLAGS.hasRendered */;
+        }
+        {
+            {
+                // looks like we've got child nodes to render into this host element
+                // or we need to update the css class/attrs on the host element
+                // DOM WRITE!
+                {
+                    renderVdom(hostRef, instance);
+                }
+            }
+        }
+    }
+    catch (e) {
+        consoleError(e, hostRef.$hostElement$);
+    }
+    return null;
+};
+const postUpdateComponent = (hostRef) => {
+    const tagName = hostRef.$cmpMeta$.$tagName$;
+    const elm = hostRef.$hostElement$;
+    const endPostUpdate = createTime('postUpdate', tagName);
+    const instance = hostRef.$lazyInstance$ ;
+    const ancestorComponent = hostRef.$ancestorComponent$;
+    if (!(hostRef.$flags$ & 64 /* HOST_FLAGS.hasLoadedComponent */)) {
+        hostRef.$flags$ |= 64 /* HOST_FLAGS.hasLoadedComponent */;
+        {
+            // DOM WRITE!
+            addHydratedFlag(elm);
+        }
+        {
+            safeCall(instance, 'componentDidLoad');
+        }
+        endPostUpdate();
+        {
+            hostRef.$onReadyResolve$(elm);
+            if (!ancestorComponent) {
+                appDidLoad();
+            }
+        }
+    }
+    else {
+        endPostUpdate();
+    }
+    {
+        hostRef.$onInstanceResolve$(elm);
+    }
+    // load events fire from bottom to top
+    // the deepest elements load first then bubbles up
+    {
+        if (hostRef.$onRenderResolve$) {
+            hostRef.$onRenderResolve$();
+            hostRef.$onRenderResolve$ = undefined;
+        }
+        if (hostRef.$flags$ & 512 /* HOST_FLAGS.needsRerender */) {
+            nextTick(() => scheduleUpdate(hostRef, false));
+        }
+        hostRef.$flags$ &= ~(4 /* HOST_FLAGS.isWaitingForChildren */ | 512 /* HOST_FLAGS.needsRerender */);
+    }
+    // ( •_•)
+    // ( •_•)>⌐■-■
+    // (⌐■_■)
+};
+const forceUpdate = (ref) => {
+    {
+        const hostRef = getHostRef(ref);
+        const isConnected = hostRef.$hostElement$.isConnected;
+        if (isConnected &&
+            (hostRef.$flags$ & (2 /* HOST_FLAGS.hasRendered */ | 16 /* HOST_FLAGS.isQueuedForUpdate */)) === 2 /* HOST_FLAGS.hasRendered */) {
+            scheduleUpdate(hostRef, false);
+        }
+        // Returns "true" when the forced update was successfully scheduled
+        return isConnected;
+    }
+};
+const appDidLoad = (who) => {
+    // on appload
+    // we have finish the first big initial render
+    {
+        addHydratedFlag(doc.documentElement);
+    }
+    nextTick(() => emitEvent(win, 'appload', { detail: { namespace: NAMESPACE } }));
+};
+const safeCall = (instance, method, arg) => {
+    if (instance && instance[method]) {
+        try {
+            return instance[method](arg);
+        }
+        catch (e) {
+            consoleError(e);
+        }
+    }
+    return undefined;
+};
+const addHydratedFlag = (elm) => elm.classList.add('hydrated')
+    ;
+const getValue = (ref, propName) => getHostRef(ref).$instanceValues$.get(propName);
+const setValue = (ref, propName, newVal, cmpMeta) => {
+    // check our new property value against our internal value
+    const hostRef = getHostRef(ref);
+    const oldVal = hostRef.$instanceValues$.get(propName);
+    const flags = hostRef.$flags$;
+    const instance = hostRef.$lazyInstance$ ;
+    newVal = parsePropertyValue(newVal, cmpMeta.$members$[propName][0]);
+    // explicitly check for NaN on both sides, as `NaN === NaN` is always false
+    const areBothNaN = Number.isNaN(oldVal) && Number.isNaN(newVal);
+    const didValueChange = newVal !== oldVal && !areBothNaN;
+    if ((!(flags & 8 /* HOST_FLAGS.isConstructingInstance */) || oldVal === undefined) && didValueChange) {
+        // gadzooks! the property's value has changed!!
+        // set our new value!
+        hostRef.$instanceValues$.set(propName, newVal);
+        if (instance) {
+            if ((flags & (2 /* HOST_FLAGS.hasRendered */ | 16 /* HOST_FLAGS.isQueuedForUpdate */)) === 2 /* HOST_FLAGS.hasRendered */) {
+                // looks like this value actually changed, so we've got work to do!
+                // but only if we've already rendered, otherwise just chill out
+                // queue that we need to do an update, but don't worry about queuing
+                // up millions cuz this function ensures it only runs once
+                scheduleUpdate(hostRef, false);
+            }
+        }
+    }
+};
+/**
+ * Attach a series of runtime constructs to a compiled Stencil component
+ * constructor, including getters and setters for the `@Prop` and `@State`
+ * decorators, callbacks for when attributes change, and so on.
+ *
+ * @param Cstr the constructor for a component that we need to process
+ * @param cmpMeta metadata collected previously about the component
+ * @param flags a number used to store a series of bit flags
+ * @returns a reference to the same constructor passed in (but now mutated)
+ */
+const proxyComponent = (Cstr, cmpMeta, flags) => {
+    if (cmpMeta.$members$) {
+        // It's better to have a const than two Object.entries()
+        const members = Object.entries(cmpMeta.$members$);
+        const prototype = Cstr.prototype;
+        members.map(([memberName, [memberFlags]]) => {
+            if ((memberFlags & 31 /* MEMBER_FLAGS.Prop */ ||
+                    ((flags & 2 /* PROXY_FLAGS.proxyState */) && memberFlags & 32 /* MEMBER_FLAGS.State */))) {
+                // proxyComponent - prop
+                Object.defineProperty(prototype, memberName, {
+                    get() {
+                        // proxyComponent, get value
+                        return getValue(this, memberName);
+                    },
+                    set(newValue) {
+                        // proxyComponent, set value
+                        setValue(this, memberName, newValue, cmpMeta);
+                    },
+                    configurable: true,
+                    enumerable: true,
+                });
+            }
+            else if (flags & 1 /* PROXY_FLAGS.isElementConstructor */ &&
+                memberFlags & 64 /* MEMBER_FLAGS.Method */) {
+                // proxyComponent - method
+                Object.defineProperty(prototype, memberName, {
+                    value(...args) {
+                        const ref = getHostRef(this);
+                        return ref.$onInstancePromise$.then(() => ref.$lazyInstance$[memberName](...args));
+                    },
+                });
+            }
+        });
+        if ((flags & 1 /* PROXY_FLAGS.isElementConstructor */)) {
+            const attrNameToPropName = new Map();
+            prototype.attributeChangedCallback = function (attrName, _oldValue, newValue) {
+                plt.jmp(() => {
+                    const propName = attrNameToPropName.get(attrName);
+                    //  In a web component lifecycle the attributeChangedCallback runs prior to connectedCallback
+                    //  in the case where an attribute was set inline.
+                    //  ```html
+                    //    <my-component some-attribute="some-value"></my-component>
+                    //  ```
+                    //
+                    //  There is an edge case where a developer sets the attribute inline on a custom element and then
+                    //  programmatically changes it before it has been upgraded as shown below:
+                    //
+                    //  ```html
+                    //    <!-- this component has _not_ been upgraded yet -->
+                    //    <my-component id="test" some-attribute="some-value"></my-component>
+                    //    <script>
+                    //      // grab non-upgraded component
+                    //      el = document.querySelector("#test");
+                    //      el.someAttribute = "another-value";
+                    //      // upgrade component
+                    //      customElements.define('my-component', MyComponent);
+                    //    </script>
+                    //  ```
+                    //  In this case if we do not unshadow here and use the value of the shadowing property, attributeChangedCallback
+                    //  will be called with `newValue = "some-value"` and will set the shadowed property (this.someAttribute = "another-value")
+                    //  to the value that was set inline i.e. "some-value" from above example. When
+                    //  the connectedCallback attempts to unshadow it will use "some-value" as the initial value rather than "another-value"
+                    //
+                    //  The case where the attribute was NOT set inline but was not set programmatically shall be handled/unshadowed
+                    //  by connectedCallback as this attributeChangedCallback will not fire.
+                    //
+                    //  https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties
+                    //
+                    //  TODO(STENCIL-16) we should think about whether or not we actually want to be reflecting the attributes to
+                    //  properties here given that this goes against best practices outlined here
+                    //  https://developers.google.com/web/fundamentals/web-components/best-practices#avoid-reentrancy
+                    if (this.hasOwnProperty(propName)) {
+                        newValue = this[propName];
+                        delete this[propName];
+                    }
+                    else if (prototype.hasOwnProperty(propName) &&
+                        typeof this[propName] === 'number' &&
+                        this[propName] == newValue) {
+                        // if the propName exists on the prototype of `Cstr`, this update may be a result of Stencil using native
+                        // APIs to reflect props as attributes. Calls to `setAttribute(someElement, propName)` will result in
+                        // `propName` to be converted to a `DOMString`, which may not be what we want for other primitive props.
+                        return;
+                    }
+                    this[propName] = newValue === null && typeof this[propName] === 'boolean' ? false : newValue;
+                });
+            };
+            // create an array of attributes to observe
+            // and also create a map of html attribute name to js property name
+            Cstr.observedAttributes = members
+                .filter(([_, m]) => m[0] & 15 /* MEMBER_FLAGS.HasAttribute */) // filter to only keep props that should match attributes
+                .map(([propName, m]) => {
+                const attrName = m[1] || propName;
+                attrNameToPropName.set(attrName, propName);
+                return attrName;
+            });
+        }
+    }
+    return Cstr;
+};
+const initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId, Cstr) => {
+    // initializeComponent
+    if ((hostRef.$flags$ & 32 /* HOST_FLAGS.hasInitializedComponent */) === 0) {
+        // Let the runtime know that the component has been initialized
+        hostRef.$flags$ |= 32 /* HOST_FLAGS.hasInitializedComponent */;
+        {
+            // lazy loaded components
+            // request the component's implementation to be
+            // wired up with the host element
+            Cstr = loadModule(cmpMeta);
+            if (Cstr.then) {
+                // Await creates a micro-task avoid if possible
+                const endLoad = uniqueTime();
+                Cstr = await Cstr;
+                endLoad();
+            }
+            if (!Cstr.isProxied) {
+                proxyComponent(Cstr, cmpMeta, 2 /* PROXY_FLAGS.proxyState */);
+                Cstr.isProxied = true;
+            }
+            const endNewInstance = createTime('createInstance', cmpMeta.$tagName$);
+            // ok, time to construct the instance
+            // but let's keep track of when we start and stop
+            // so that the getters/setters don't incorrectly step on data
+            {
+                hostRef.$flags$ |= 8 /* HOST_FLAGS.isConstructingInstance */;
+            }
+            // construct the lazy-loaded component implementation
+            // passing the hostRef is very important during
+            // construction in order to directly wire together the
+            // host element and the lazy-loaded instance
+            try {
+                new Cstr(hostRef);
+            }
+            catch (e) {
+                consoleError(e);
+            }
+            {
+                hostRef.$flags$ &= ~8 /* HOST_FLAGS.isConstructingInstance */;
+            }
+            endNewInstance();
+        }
+        if (Cstr.style) {
+            // this component has styles but we haven't registered them yet
+            let style = Cstr.style;
+            const scopeId = getScopeId(cmpMeta);
+            if (!styles.has(scopeId)) {
+                const endRegisterStyles = createTime('registerStyles', cmpMeta.$tagName$);
+                registerStyle(scopeId, style, !!(cmpMeta.$flags$ & 1 /* CMP_FLAGS.shadowDomEncapsulation */));
+                endRegisterStyles();
+            }
+        }
+    }
+    // we've successfully created a lazy instance
+    const ancestorComponent = hostRef.$ancestorComponent$;
+    const schedule = () => scheduleUpdate(hostRef, true);
+    if (ancestorComponent && ancestorComponent['s-rc']) {
+        // this is the initial load and this component it has an ancestor component
+        // but the ancestor component has NOT fired its will update lifecycle yet
+        // so let's just cool our jets and wait for the ancestor to continue first
+        // this will get fired off when the ancestor component
+        // finally gets around to rendering its lazy self
+        // fire off the initial update
+        ancestorComponent['s-rc'].push(schedule);
+    }
+    else {
+        schedule();
+    }
+};
+const connectedCallback = (elm) => {
+    if ((plt.$flags$ & 1 /* PLATFORM_FLAGS.isTmpDisconnected */) === 0) {
+        const hostRef = getHostRef(elm);
+        const cmpMeta = hostRef.$cmpMeta$;
+        const endConnected = createTime('connectedCallback', cmpMeta.$tagName$);
+        if (!(hostRef.$flags$ & 1 /* HOST_FLAGS.hasConnected */)) {
+            // first time this component has connected
+            hostRef.$flags$ |= 1 /* HOST_FLAGS.hasConnected */;
+            {
+                // find the first ancestor component (if there is one) and register
+                // this component as one of the actively loading child components for its ancestor
+                let ancestorComponent = elm;
+                while ((ancestorComponent = ancestorComponent.parentNode || ancestorComponent.host)) {
+                    // climb up the ancestors looking for the first
+                    // component that hasn't finished its lifecycle update yet
+                    if (ancestorComponent['s-p']) {
+                        // we found this components first ancestor component
+                        // keep a reference to this component's ancestor component
+                        attachToAncestor(hostRef, (hostRef.$ancestorComponent$ = ancestorComponent));
+                        break;
+                    }
+                }
+            }
+            // Lazy properties
+            // https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties
+            if (cmpMeta.$members$) {
+                Object.entries(cmpMeta.$members$).map(([memberName, [memberFlags]]) => {
+                    if (memberFlags & 31 /* MEMBER_FLAGS.Prop */ && elm.hasOwnProperty(memberName)) {
+                        const value = elm[memberName];
+                        delete elm[memberName];
+                        elm[memberName] = value;
+                    }
+                });
+            }
+            {
+                initializeComponent(elm, hostRef, cmpMeta);
+            }
+        }
+        else {
+            // not the first time this has connected
+            // reattach any event listeners to the host
+            // since they would have been removed when disconnected
+            addHostEventListeners(elm, hostRef, cmpMeta.$listeners$);
+        }
+        endConnected();
+    }
+};
+const disconnectedCallback = (elm) => {
+    if ((plt.$flags$ & 1 /* PLATFORM_FLAGS.isTmpDisconnected */) === 0) {
+        const hostRef = getHostRef(elm);
+        const instance = hostRef.$lazyInstance$ ;
+        {
+            if (hostRef.$rmListeners$) {
+                hostRef.$rmListeners$.map((rmListener) => rmListener());
+                hostRef.$rmListeners$ = undefined;
+            }
+        }
+        {
+            safeCall(instance, 'disconnectedCallback');
+        }
+    }
+};
+const bootstrapLazy = (lazyBundles, options = {}) => {
+    var _a;
+    const endBootstrap = createTime();
+    const cmpTags = [];
+    const exclude = options.exclude || [];
+    const customElements = win.customElements;
+    const head = doc.head;
+    const metaCharset = /*@__PURE__*/ head.querySelector('meta[charset]');
+    const visibilityStyle = /*@__PURE__*/ doc.createElement('style');
+    const deferredConnectedCallbacks = [];
+    let appLoadFallback;
+    let isBootstrapping = true;
+    Object.assign(plt, options);
+    plt.$resourcesUrl$ = new URL(options.resourcesUrl || './', doc.baseURI).href;
+    lazyBundles.map((lazyBundle) => {
+        lazyBundle[1].map((compactMeta) => {
+            const cmpMeta = {
+                $flags$: compactMeta[0],
+                $tagName$: compactMeta[1],
+                $members$: compactMeta[2],
+                $listeners$: compactMeta[3],
+            };
+            {
+                cmpMeta.$members$ = compactMeta[2];
+            }
+            {
+                cmpMeta.$listeners$ = compactMeta[3];
+            }
+            const tagName = cmpMeta.$tagName$;
+            const HostElement = class extends HTMLElement {
+                // StencilLazyHost
+                constructor(self) {
+                    // @ts-ignore
+                    super(self);
+                    self = this;
+                    registerHost(self, cmpMeta);
+                    if (cmpMeta.$flags$ & 1 /* CMP_FLAGS.shadowDomEncapsulation */) {
+                        // this component is using shadow dom
+                        // and this browser supports shadow dom
+                        // add the read-only property "shadowRoot" to the host element
+                        // adding the shadow root build conditionals to minimize runtime
+                        {
+                            {
+                                self.attachShadow({ mode: 'open' });
+                            }
+                        }
+                    }
+                }
+                connectedCallback() {
+                    if (appLoadFallback) {
+                        clearTimeout(appLoadFallback);
+                        appLoadFallback = null;
+                    }
+                    if (isBootstrapping) {
+                        // connectedCallback will be processed once all components have been registered
+                        deferredConnectedCallbacks.push(this);
+                    }
+                    else {
+                        plt.jmp(() => connectedCallback(this));
+                    }
+                }
+                disconnectedCallback() {
+                    plt.jmp(() => disconnectedCallback(this));
+                }
+                componentOnReady() {
+                    return getHostRef(this).$onReadyPromise$;
+                }
+            };
+            cmpMeta.$lazyBundleId$ = lazyBundle[0];
+            if (!exclude.includes(tagName) && !customElements.get(tagName)) {
+                cmpTags.push(tagName);
+                customElements.define(tagName, proxyComponent(HostElement, cmpMeta, 1 /* PROXY_FLAGS.isElementConstructor */));
+            }
+        });
+    });
+    {
+        visibilityStyle.innerHTML = cmpTags + HYDRATED_CSS;
+        visibilityStyle.setAttribute('data-styles', '');
+        // Apply CSP nonce to the style tag if it exists
+        const nonce = (_a = plt.$nonce$) !== null && _a !== void 0 ? _a : queryNonceMetaTagContent(doc);
+        if (nonce != null) {
+            visibilityStyle.setAttribute('nonce', nonce);
+        }
+        head.insertBefore(visibilityStyle, metaCharset ? metaCharset.nextSibling : head.firstChild);
+    }
+    // Process deferred connectedCallbacks now all components have been registered
+    isBootstrapping = false;
+    if (deferredConnectedCallbacks.length) {
+        deferredConnectedCallbacks.map((host) => host.connectedCallback());
+    }
+    else {
+        {
+            plt.jmp(() => (appLoadFallback = setTimeout(appDidLoad, 30)));
+        }
+    }
+    // Fallback appLoad event
+    endBootstrap();
+};
+const addHostEventListeners = (elm, hostRef, listeners, attachParentListeners) => {
+    if (listeners) {
+        listeners.map(([flags, name, method]) => {
+            const target = getHostListenerTarget(elm, flags) ;
+            const handler = hostListenerProxy(hostRef, method);
+            const opts = hostListenerOpts(flags);
+            plt.ael(target, name, handler, opts);
+            (hostRef.$rmListeners$ = hostRef.$rmListeners$ || []).push(() => plt.rel(target, name, handler, opts));
+        });
+    }
+};
+const hostListenerProxy = (hostRef, methodName) => (ev) => {
+    try {
+        {
+            if (hostRef.$flags$ & 256 /* HOST_FLAGS.isListenReady */) {
+                // instance is ready, let's call it's member method for this event
+                hostRef.$lazyInstance$[methodName](ev);
+            }
+            else {
+                (hostRef.$queuedListeners$ = hostRef.$queuedListeners$ || []).push([methodName, ev]);
+            }
+        }
+    }
+    catch (e) {
+        consoleError(e);
+    }
+};
+const getHostListenerTarget = (elm, flags) => {
+    if (flags & 16 /* LISTENER_FLAGS.TargetBody */)
+        return doc.body;
+    return elm;
+};
+// prettier-ignore
+const hostListenerOpts = (flags) => (flags & 2 /* LISTENER_FLAGS.Capture */) !== 0;
+/**
+ * Assigns the given value to the nonce property on the runtime platform object.
+ * During runtime, this value is used to set the nonce attribute on all dynamically created script and style tags.
+ * @param nonce The value to be assigned to the platform nonce property.
+ * @returns void
+ */
+const setNonce = (nonce) => (plt.$nonce$ = nonce);
+const hostRefs = /*@__PURE__*/ new WeakMap();
+const getHostRef = (ref) => hostRefs.get(ref);
+const registerInstance = (lazyInstance, hostRef) => hostRefs.set((hostRef.$lazyInstance$ = lazyInstance), hostRef);
+const registerHost = (elm, cmpMeta) => {
+    const hostRef = {
+        $flags$: 0,
+        $hostElement$: elm,
+        $cmpMeta$: cmpMeta,
+        $instanceValues$: new Map(),
+    };
+    {
+        hostRef.$onInstancePromise$ = new Promise((r) => (hostRef.$onInstanceResolve$ = r));
+    }
+    {
+        hostRef.$onReadyPromise$ = new Promise((r) => (hostRef.$onReadyResolve$ = r));
+        elm['s-p'] = [];
+        elm['s-rc'] = [];
+    }
+    addHostEventListeners(elm, hostRef, cmpMeta.$listeners$);
+    return hostRefs.set(elm, hostRef);
+};
+const isMemberInElement = (elm, memberName) => memberName in elm;
+const consoleError = (e, el) => (0, console.error)(e, el);
+const cmpModules = /*@__PURE__*/ new Map();
+const loadModule = (cmpMeta, hostRef, hmrVersionId) => {
+    // loadModuleImport
+    const exportName = cmpMeta.$tagName$.replace(/-/g, '_');
+    const bundleId = cmpMeta.$lazyBundleId$;
+    const module = cmpModules.get(bundleId) ;
+    if (module) {
+        return module[exportName];
+    }
+    
+    if (!hmrVersionId || !BUILD.hotModuleReplacement) {
+      const processMod = importedModule => {
+        cmpModules.set(bundleId, importedModule);
+        return importedModule[exportName];
+      }
+      switch(bundleId) {
+        
+        case 'pwa-action-sheet.cjs':
+          return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
+            /* webpackMode: "lazy" */
+            './pwa-action-sheet.cjs.entry.js')); }).then(processMod, consoleError);
+        case 'pwa-camera-modal.cjs':
+          return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
+            /* webpackMode: "lazy" */
+            './pwa-camera-modal.cjs.entry.js')); }).then(processMod, consoleError);
+        case 'pwa-toast.cjs':
+          return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
+            /* webpackMode: "lazy" */
+            './pwa-toast.cjs.entry.js')); }).then(processMod, consoleError);
+        case 'pwa-camera-modal-instance.cjs':
+          return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
+            /* webpackMode: "lazy" */
+            './pwa-camera-modal-instance.cjs.entry.js')); }).then(processMod, consoleError);
+        case 'pwa-camera.cjs':
+          return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
+            /* webpackMode: "lazy" */
+            './pwa-camera.cjs.entry.js')); }).then(processMod, consoleError);
+      }
+    }
+    return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
+    /* @vite-ignore */
+    /* webpackInclude: /\.entry\.js$/ */
+    /* webpackExclude: /\.system\.entry\.js$/ */
+    /* webpackMode: "lazy" */
+    `./${bundleId}.entry.js${''}`)); }).then((importedModule) => {
+        {
+            cmpModules.set(bundleId, importedModule);
+        }
+        return importedModule[exportName];
+    }, consoleError);
+};
+const styles = /*@__PURE__*/ new Map();
+const win = typeof window !== 'undefined' ? window : {};
+const doc = win.document || { head: {} };
+const plt = {
+    $flags$: 0,
+    $resourcesUrl$: '',
+    jmp: (h) => h(),
+    raf: (h) => requestAnimationFrame(h),
+    ael: (el, eventName, listener, opts) => el.addEventListener(eventName, listener, opts),
+    rel: (el, eventName, listener, opts) => el.removeEventListener(eventName, listener, opts),
+    ce: (eventName, opts) => new CustomEvent(eventName, opts),
+};
+const promiseResolve = (v) => Promise.resolve(v);
+const supportsConstructableStylesheets = /*@__PURE__*/ (() => {
+        try {
+            new CSSStyleSheet();
+            return typeof new CSSStyleSheet().replaceSync === 'function';
+        }
+        catch (e) { }
+        return false;
+    })()
+    ;
+const queueDomReads = [];
+const queueDomWrites = [];
+const queueTask = (queue, write) => (cb) => {
+    queue.push(cb);
+    if (!queuePending) {
+        queuePending = true;
+        if (write && plt.$flags$ & 4 /* PLATFORM_FLAGS.queueSync */) {
+            nextTick(flush);
+        }
+        else {
+            plt.raf(flush);
+        }
+    }
+};
+const consume = (queue) => {
+    for (let i = 0; i < queue.length; i++) {
+        try {
+            queue[i](performance.now());
+        }
+        catch (e) {
+            consoleError(e);
+        }
+    }
+    queue.length = 0;
+};
+const flush = () => {
+    // always force a bunch of medium callbacks to run, but still have
+    // a throttle on how many can run in a certain time
+    // DOM READS!!!
+    consume(queueDomReads);
+    // DOM WRITES!!!
+    {
+        consume(queueDomWrites);
+        if ((queuePending = queueDomReads.length > 0)) {
+            // still more to do yet, but we've run out of time
+            // let's let this thing cool off and try again in the next tick
+            plt.raf(flush);
+        }
+    }
+};
+const nextTick = /*@__PURE__*/ (cb) => promiseResolve().then(cb);
+const writeTask = /*@__PURE__*/ queueTask(queueDomWrites, true);
+
+exports.Host = Host;
+exports.bootstrapLazy = bootstrapLazy;
+exports.createEvent = createEvent;
+exports.forceUpdate = forceUpdate;
+exports.getElement = getElement;
+exports.h = h;
+exports.promiseResolve = promiseResolve;
+exports.registerInstance = registerInstance;
+exports.setNonce = setNonce;
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/cjs/index.cjs.js b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/index.cjs.js
new file mode 100644
index 0000000..eb109ab
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/index.cjs.js
@@ -0,0 +1,2 @@
+'use strict';
+
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/cjs/ionicpwaelements.cjs.js b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/ionicpwaelements.cjs.js
new file mode 100644
index 0000000..10dd1b3
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/ionicpwaelements.cjs.js
@@ -0,0 +1,26 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+const index = require('./index-d7f36e37.js');
+
+/*
+ Stencil Client Patch Browser v3.4.0 | MIT Licensed | https://stenciljs.com
+ */
+const patchBrowser = () => {
+    const importMeta = (typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('ionicpwaelements.cjs.js', document.baseURI).href));
+    const opts = {};
+    // TODO(STENCIL-663): Remove code related to deprecated `safari10` field.
+    if (importMeta !== '') {
+        opts.resourcesUrl = new URL('.', importMeta).href;
+        // TODO(STENCIL-661): Remove code related to the dynamic import shim
+        // TODO(STENCIL-663): Remove code related to deprecated `safari10` field.
+    }
+    return index.promiseResolve(opts);
+};
+
+patchBrowser().then(options => {
+  return index.bootstrapLazy([["pwa-camera-modal.cjs",[[1,"pwa-camera-modal",{"facingMode":[1,"facing-mode"],"hidePicker":[4,"hide-picker"],"present":[64],"dismiss":[64]}]]],["pwa-action-sheet.cjs",[[1,"pwa-action-sheet",{"header":[1],"cancelable":[4],"options":[16],"open":[32]}]]],["pwa-toast.cjs",[[1,"pwa-toast",{"message":[1],"duration":[2],"closing":[32]}]]],["pwa-camera.cjs",[[1,"pwa-camera",{"facingMode":[1,"facing-mode"],"handlePhoto":[16],"hidePicker":[4,"hide-picker"],"handleNoDeviceError":[16],"noDevicesText":[1,"no-devices-text"],"noDevicesButtonText":[1,"no-devices-button-text"],"photo":[32],"photoSrc":[32],"showShutterOverlay":[32],"flashIndex":[32],"hasCamera":[32],"rotation":[32],"deviceError":[32]}]]],["pwa-camera-modal-instance.cjs",[[1,"pwa-camera-modal-instance",{"facingMode":[1,"facing-mode"],"hidePicker":[4,"hide-picker"],"noDevicesText":[1,"no-devices-text"],"noDevicesButtonText":[1,"no-devices-button-text"]},[[16,"keyup","handleBackdropKeyUp"]]]]]], options);
+});
+
+exports.setNonce = index.setNonce;
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/cjs/loader.cjs.js b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/loader.cjs.js
new file mode 100644
index 0000000..a197f5f
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/loader.cjs.js
@@ -0,0 +1,22 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+const index = require('./index-d7f36e37.js');
+
+/*
+ Stencil Client Patch Esm v3.4.0 | MIT Licensed | https://stenciljs.com
+ */
+const patchEsm = () => {
+    return index.promiseResolve();
+};
+
+const defineCustomElements = (win, options) => {
+  if (typeof window === 'undefined') return Promise.resolve();
+  return patchEsm().then(() => {
+  return index.bootstrapLazy([["pwa-camera-modal.cjs",[[1,"pwa-camera-modal",{"facingMode":[1,"facing-mode"],"hidePicker":[4,"hide-picker"],"present":[64],"dismiss":[64]}]]],["pwa-action-sheet.cjs",[[1,"pwa-action-sheet",{"header":[1],"cancelable":[4],"options":[16],"open":[32]}]]],["pwa-toast.cjs",[[1,"pwa-toast",{"message":[1],"duration":[2],"closing":[32]}]]],["pwa-camera.cjs",[[1,"pwa-camera",{"facingMode":[1,"facing-mode"],"handlePhoto":[16],"hidePicker":[4,"hide-picker"],"handleNoDeviceError":[16],"noDevicesText":[1,"no-devices-text"],"noDevicesButtonText":[1,"no-devices-button-text"],"photo":[32],"photoSrc":[32],"showShutterOverlay":[32],"flashIndex":[32],"hasCamera":[32],"rotation":[32],"deviceError":[32]}]]],["pwa-camera-modal-instance.cjs",[[1,"pwa-camera-modal-instance",{"facingMode":[1,"facing-mode"],"hidePicker":[4,"hide-picker"],"noDevicesText":[1,"no-devices-text"],"noDevicesButtonText":[1,"no-devices-button-text"]},[[16,"keyup","handleBackdropKeyUp"]]]]]], options);
+  });
+};
+
+exports.setNonce = index.setNonce;
+exports.defineCustomElements = defineCustomElements;
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-action-sheet.cjs.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-action-sheet.cjs.entry.js
new file mode 100644
index 0000000..f482ee2
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-action-sheet.cjs.entry.js
@@ -0,0 +1,46 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+const index = require('./index-d7f36e37.js');
+
+const actionSheetCss = ":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:-apple-system, BlinkMacSystemFont, \"Helvetica Neue\", \"Roboto\", sans-serif}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0);-webkit-transition:400ms background-color cubic-bezier(.36,.66,.04,1);transition:400ms background-color cubic-bezier(.36,.66,.04,1)}.wrapper.open{background-color:rgba(0, 0, 0, 0.32)}.title{color:#999;height:23px;line-height:23px;padding-bottom:17px;-webkit-padding-end:16px;padding-inline-end:16px;-webkit-padding-start:16px;padding-inline-start:16px;padding-left:16px;padding-right:16px;padding-top:20px}.content{width:568px;-ms-flex-item-align:end;align-self:flex-end;background-color:#fff;-webkit-transition:400ms -webkit-transform cubic-bezier(.36,.66,.04,1);transition:400ms -webkit-transform cubic-bezier(.36,.66,.04,1);transition:400ms transform cubic-bezier(.36,.66,.04,1);transition:400ms transform cubic-bezier(.36,.66,.04,1), 400ms -webkit-transform cubic-bezier(.36,.66,.04,1);-webkit-transform:translateY(100%);transform:translateY(100%)}.wrapper.open .content{-webkit-transform:translateY(0%);transform:translateY(0%)}@media only screen and (max-width: 568px){.content{width:100%}}.action-sheet-option{cursor:pointer;height:52px;line-height:52px}.action-sheet-button{color:rgb(38, 38, 38);font-size:16px;-webkit-padding-end:16px;padding-inline-end:16px;-webkit-padding-start:16px;padding-inline-start:16px;padding-left:16px;padding-right:16px;padding-top:0px}.action-sheet-button:hover{background-color:#F6F6F6}";
+
+const PWAActionSheet = class {
+  constructor(hostRef) {
+    index.registerInstance(this, hostRef);
+    this.onSelection = index.createEvent(this, "onSelection", 7);
+    this.header = undefined;
+    this.cancelable = true;
+    this.options = [];
+    this.open = false;
+  }
+  componentDidLoad() {
+    requestAnimationFrame(() => {
+      this.open = true;
+    });
+  }
+  dismiss() {
+    if (this.cancelable) {
+      this.close();
+    }
+  }
+  close() {
+    this.open = false;
+    setTimeout(() => {
+      this.el.parentNode.removeChild(this.el);
+    }, 500);
+  }
+  handleOptionClick(e, i) {
+    e.stopPropagation();
+    this.onSelection.emit(i);
+    this.close();
+  }
+  render() {
+    return (index.h("div", { class: `wrapper${this.open ? ' open' : ''}`, onClick: () => this.dismiss() }, index.h("div", { class: "content" }, index.h("div", { class: "title" }, this.header), this.options.map((option, i) => index.h("div", { class: "action-sheet-option", onClick: (e) => this.handleOptionClick(e, i) }, index.h("div", { class: "action-sheet-button" }, option.title))))));
+  }
+  get el() { return index.getElement(this); }
+};
+PWAActionSheet.style = actionSheetCss;
+
+exports.pwa_action_sheet = PWAActionSheet;
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-camera-modal-instance.cjs.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-camera-modal-instance.cjs.entry.js
new file mode 100644
index 0000000..0c8cfe3
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-camera-modal-instance.cjs.entry.js
@@ -0,0 +1,45 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+const index = require('./index-d7f36e37.js');
+
+const cameraModalInstanceCss = ":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict;--inset-width:600px;--inset-height:600px}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0.15)}.content{-webkit-box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);width:var(--inset-width);height:var(--inset-height);max-height:100%}@media only screen and (max-width: 600px){.content{width:100%;height:100%}}";
+
+const PWACameraModal = class {
+  constructor(hostRef) {
+    index.registerInstance(this, hostRef);
+    this.onPhoto = index.createEvent(this, "onPhoto", 7);
+    this.noDeviceError = index.createEvent(this, "noDeviceError", 7);
+    this.handlePhoto = async (photo) => {
+      this.onPhoto.emit(photo);
+    };
+    this.handleNoDeviceError = async (photo) => {
+      this.noDeviceError.emit(photo);
+    };
+    this.facingMode = 'user';
+    this.hidePicker = false;
+    this.noDevicesText = 'No camera found';
+    this.noDevicesButtonText = 'Choose image';
+  }
+  handleBackdropClick(e) {
+    if (e.target !== this.el) {
+      this.onPhoto.emit(null);
+    }
+  }
+  handleComponentClick(e) {
+    e.stopPropagation();
+  }
+  handleBackdropKeyUp(e) {
+    if (e.key === "Escape") {
+      this.onPhoto.emit(null);
+    }
+  }
+  render() {
+    return (index.h("div", { class: "wrapper", onClick: e => this.handleBackdropClick(e) }, index.h("div", { class: "content" }, index.h("pwa-camera", { onClick: e => this.handleComponentClick(e), facingMode: this.facingMode, hidePicker: this.hidePicker, handlePhoto: this.handlePhoto, handleNoDeviceError: this.handleNoDeviceError, noDevicesButtonText: this.noDevicesButtonText, noDevicesText: this.noDevicesText }))));
+  }
+  get el() { return index.getElement(this); }
+};
+PWACameraModal.style = cameraModalInstanceCss;
+
+exports.pwa_camera_modal_instance = PWACameraModal;
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-camera-modal.cjs.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-camera-modal.cjs.entry.js
new file mode 100644
index 0000000..867fa4c
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-camera-modal.cjs.entry.js
@@ -0,0 +1,47 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+const index = require('./index-d7f36e37.js');
+
+const cameraModalCss = ":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0.15)}.content{-webkit-box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);width:600px;height:600px}";
+
+const PWACameraModal = class {
+  constructor(hostRef) {
+    index.registerInstance(this, hostRef);
+    this.onPhoto = index.createEvent(this, "onPhoto", 7);
+    this.noDeviceError = index.createEvent(this, "noDeviceError", 7);
+    this.facingMode = 'user';
+    this.hidePicker = false;
+  }
+  async present() {
+    const camera = document.createElement('pwa-camera-modal-instance');
+    camera.facingMode = this.facingMode;
+    camera.hidePicker = this.hidePicker;
+    camera.addEventListener('onPhoto', async (e) => {
+      if (!this._modal) {
+        return;
+      }
+      const photo = e.detail;
+      this.onPhoto.emit(photo);
+    });
+    camera.addEventListener('noDeviceError', async (e) => {
+      this.noDeviceError.emit(e);
+    });
+    document.body.append(camera);
+    this._modal = camera;
+  }
+  async dismiss() {
+    if (!this._modal) {
+      return;
+    }
+    this._modal && this._modal.parentNode.removeChild(this._modal);
+    this._modal = null;
+  }
+  render() {
+    return (index.h("div", null));
+  }
+};
+PWACameraModal.style = cameraModalCss;
+
+exports.pwa_camera_modal = PWACameraModal;
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-camera.cjs.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-camera.cjs.entry.js
new file mode 100644
index 0000000..f961db3
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-camera.cjs.entry.js
@@ -0,0 +1,485 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+const index = require('./index-d7f36e37.js');
+
+/**
+ * MediaStream ImageCapture polyfill
+ *
+ * @license
+ * Copyright 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+let ImageCapture = window.ImageCapture;
+if (typeof ImageCapture === 'undefined') {
+  ImageCapture = class {
+    /**
+     * TODO https://www.w3.org/TR/image-capture/#constructors
+     *
+     * @param {MediaStreamTrack} videoStreamTrack - A MediaStreamTrack of the 'video' kind
+     */
+    constructor(videoStreamTrack) {
+      if (videoStreamTrack.kind !== 'video')
+        throw new DOMException('NotSupportedError');
+      this._videoStreamTrack = videoStreamTrack;
+      if (!('readyState' in this._videoStreamTrack)) {
+        // Polyfill for Firefox
+        this._videoStreamTrack.readyState = 'live';
+      }
+      // MediaStream constructor not available until Chrome 55 - https://www.chromestatus.com/feature/5912172546752512
+      this._previewStream = new MediaStream([videoStreamTrack]);
+      this.videoElement = document.createElement('video');
+      this.videoElementPlaying = new Promise(resolve => {
+        this.videoElement.addEventListener('playing', resolve);
+      });
+      if (HTMLMediaElement) {
+        this.videoElement.srcObject = this._previewStream; // Safari 11 doesn't allow use of createObjectURL for MediaStream
+      }
+      else {
+        this.videoElement.src = URL.createObjectURL(this._previewStream);
+      }
+      this.videoElement.muted = true;
+      this.videoElement.setAttribute('playsinline', ''); // Required by Safari on iOS 11. See https://webkit.org/blog/6784
+      this.videoElement.play();
+      this.canvasElement = document.createElement('canvas');
+      // TODO Firefox has https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas
+      this.canvas2dContext = this.canvasElement.getContext('2d');
+    }
+    /**
+     * https://w3c.github.io/mediacapture-image/index.html#dom-imagecapture-videostreamtrack
+     * @return {MediaStreamTrack} The MediaStreamTrack passed into the constructor
+     */
+    get videoStreamTrack() {
+      return this._videoStreamTrack;
+    }
+    /**
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-getphotocapabilities
+     * @return {Promise<PhotoCapabilities>} Fulfilled promise with
+     * [PhotoCapabilities](https://www.w3.org/TR/image-capture/#idl-def-photocapabilities)
+     * object on success, rejected promise on failure
+     */
+    getPhotoCapabilities() {
+      return new Promise(function executorGPC(resolve, reject) {
+        // TODO see https://github.com/w3c/mediacapture-image/issues/97
+        const MediaSettingsRange = {
+          current: 0, min: 0, max: 0,
+        };
+        resolve({
+          exposureCompensation: MediaSettingsRange,
+          exposureMode: 'none',
+          fillLightMode: ['none'],
+          focusMode: 'none',
+          imageHeight: MediaSettingsRange,
+          imageWidth: MediaSettingsRange,
+          iso: MediaSettingsRange,
+          redEyeReduction: false,
+          whiteBalanceMode: 'none',
+          zoom: MediaSettingsRange,
+        });
+        reject(new DOMException('OperationError'));
+      });
+    }
+    /**
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-setoptions
+     * @param {Object} photoSettings - Photo settings dictionary, https://www.w3.org/TR/image-capture/#idl-def-photosettings
+     * @return {Promise<void>} Fulfilled promise on success, rejected promise on failure
+     */
+    setOptions(_photoSettings = {}) {
+      return new Promise(function executorSO(_resolve, _reject) {
+        // TODO
+      });
+    }
+    /**
+     * TODO
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-takephoto
+     * @return {Promise<Blob>} Fulfilled promise with [Blob](https://www.w3.org/TR/FileAPI/#blob)
+     * argument on success; rejected promise on failure
+     */
+    takePhoto() {
+      const self = this;
+      return new Promise(function executorTP(resolve, reject) {
+        // `If the readyState of the MediaStreamTrack provided in the constructor is not live,
+        // return a promise rejected with a new DOMException whose name is "InvalidStateError".`
+        if (self._videoStreamTrack.readyState !== 'live') {
+          return reject(new DOMException('InvalidStateError'));
+        }
+        self.videoElementPlaying.then(() => {
+          try {
+            self.canvasElement.width = self.videoElement.videoWidth;
+            self.canvasElement.height = self.videoElement.videoHeight;
+            self.canvas2dContext.drawImage(self.videoElement, 0, 0);
+            self.canvasElement.toBlob(resolve);
+          }
+          catch (error) {
+            reject(new DOMException('UnknownError'));
+          }
+        });
+      });
+    }
+    /**
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-grabframe
+     * @return {Promise<ImageBitmap>} Fulfilled promise with
+     * [ImageBitmap](https://www.w3.org/TR/html51/webappapis.html#webappapis-images)
+     * argument on success; rejected promise on failure
+     */
+    grabFrame() {
+      const self = this;
+      return new Promise(function executorGF(resolve, reject) {
+        // `If the readyState of the MediaStreamTrack provided in the constructor is not live,
+        // return a promise rejected with a new DOMException whose name is "InvalidStateError".`
+        if (self._videoStreamTrack.readyState !== 'live') {
+          return reject(new DOMException('InvalidStateError'));
+        }
+        self.videoElementPlaying.then(() => {
+          try {
+            self.canvasElement.width = self.videoElement.videoWidth;
+            self.canvasElement.height = self.videoElement.videoHeight;
+            self.canvas2dContext.drawImage(self.videoElement, 0, 0);
+            // TODO polyfill https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmapFactories/createImageBitmap for IE
+            resolve(window.createImageBitmap(self.canvasElement));
+          }
+          catch (error) {
+            reject(new DOMException('UnknownError'));
+          }
+        });
+      });
+    }
+  };
+}
+window.ImageCapture = ImageCapture;
+
+const cameraCss = ":host{--header-height:4em;--footer-height:9em;--header-height-landscape:3em;--footer-height-landscape:6em;--shutter-size:6em;--icon-size-header:1.5em;--icon-size-footer:2.5em;--margin-size-header:1.5em;--margin-size-footer:2.0em;font-family:-apple-system, BlinkMacSystemFont,\n    “Segoe UI”, “Roboto”, “Droid Sans”, “Helvetica Neue”, sans-serif;display:block;width:100%;height:100%}.items{-webkit-box-sizing:border-box;box-sizing:border-box;display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.items .item{-ms-flex:1;flex:1;text-align:center}.items .item:first-child{text-align:left}.items .item:last-child{text-align:right}.camera-wrapper{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;height:100%}.camera-header{color:white;background-color:black;height:var(--header-height)}.camera-header .items{padding:var(--margin-size-header)}.camera-footer{position:relative;color:white;background-color:black;height:var(--footer-height)}.camera-footer .items{padding:var(--margin-size-footer)}@media (max-height: 375px){.camera-header{--header-height:var(--header-height-landscape)}.camera-footer{--footer-height:var(--footer-height-landscape)}.camera-footer .shutter{--shutter-size:4em}}.camera-video{position:relative;-ms-flex:1;flex:1;overflow:hidden;background-color:black}video{width:100%;height:100%;max-height:100%;min-height:100%;-o-object-fit:cover;object-fit:cover;background-color:black}.pick-image{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;left:var(--margin-size-footer);top:0;height:100%;width:var(--icon-size-footer);color:white}.pick-image input{visibility:hidden}.pick-image svg{cursor:pointer;fill:white;width:var(--icon-size-footer);height:var(--icon-size-footer)}.shutter{position:absolute;left:50%;top:50%;width:var(--shutter-size);height:var(--shutter-size);margin-top:calc(var(--shutter-size) / -2);margin-left:calc(var(--shutter-size) / -2);border-radius:100%;background-color:#c6cdd8;padding:12px;-webkit-box-sizing:border-box;box-sizing:border-box}.shutter:active .shutter-button{background-color:#9da9bb}.shutter-button{background-color:white;border-radius:100%;width:100%;height:100%}.rotate{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;right:var(--margin-size-footer);top:0;height:100%;width:var(--icon-size-footer);color:white}.rotate img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.shutter-overlay{z-index:5;position:absolute;width:100%;height:100%;background-color:black}.error{width:100%;height:100%;color:white;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.no-device{background-color:black;-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;color:white}.no-device label{cursor:pointer;background:#fff;border-radius:6px;padding:6px 8px;color:black}.no-device input{visibility:hidden;height:0;margin-top:16px}.accept{background-color:black;-ms-flex:1;flex:1;overflow:hidden}.accept .accept-image{width:100%;height:100%;max-height:100%;background-position:center center;background-size:cover;background-repeat:no-repeat}.close img{cursor:pointer;width:var(--icon-size-header);height:var(--icon-size-header)}.flash img{width:var(--icon-size-header);height:var(--icon-size-header)}.accept-use img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.accept-cancel img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.offscreen-image-render{top:0;left:0;visibility:hidden;pointer-events:none;width:100%;height:100%}";
+
+const CameraPWA = class {
+  constructor(hostRef) {
+    index.registerInstance(this, hostRef);
+    // Whether the device has multiple cameras (front/back)
+    this.hasMultipleCameras = false;
+    // Whether the device has flash support
+    this.hasFlash = false;
+    // Flash modes for camera
+    this.flashModes = [];
+    // Current flash mode
+    this.flashMode = 'off';
+    this.handlePickFile = (_e) => {
+    };
+    this.handleShutterClick = (_e) => {
+      console.debug('shutter click');
+      this.capture();
+    };
+    this.handleRotateClick = (_e) => {
+      this.rotate();
+    };
+    this.handleClose = (_e) => {
+      this.handlePhoto && this.handlePhoto(null);
+    };
+    this.handleFlashClick = (_e) => {
+      this.cycleFlash();
+    };
+    this.handleCancelPhoto = (_e) => {
+      const track = this.stream && this.stream.getTracks()[0];
+      let c = track && track.getConstraints();
+      this.photo = null;
+      this.photoSrc = null;
+      if (c) {
+        this.initCamera({
+          video: {
+            facingMode: c.facingMode
+          }
+        });
+      }
+      else {
+        this.initCamera();
+      }
+    };
+    this.handleAcceptPhoto = (_e) => {
+      this.handlePhoto && this.handlePhoto(this.photo);
+    };
+    this.handleFileInputChange = async (e) => {
+      const input = e.target;
+      const file = input.files[0];
+      try {
+        const orientation = await this.getOrientation(file);
+        console.debug('Got orientation', orientation);
+        this.photoOrientation = orientation;
+      }
+      catch (e) {
+      }
+      this.handlePhoto && this.handlePhoto(file);
+    };
+    this.handleVideoMetadata = (e) => {
+      console.debug('Video metadata', e);
+    };
+    this.facingMode = 'user';
+    this.handlePhoto = undefined;
+    this.hidePicker = false;
+    this.handleNoDeviceError = undefined;
+    this.noDevicesText = 'No camera found';
+    this.noDevicesButtonText = 'Choose image';
+    this.photo = undefined;
+    this.photoSrc = undefined;
+    this.showShutterOverlay = false;
+    this.flashIndex = 0;
+    this.hasCamera = null;
+    this.rotation = 0;
+    this.deviceError = null;
+  }
+  async componentDidLoad() {
+    this.defaultConstraints = {
+      video: {
+        facingMode: this.facingMode
+      }
+    };
+    // Figure out how many cameras we have
+    await this.queryDevices();
+    // Initialize the camera
+    await this.initCamera();
+  }
+  disconnectedCallback() {
+    this.stopStream();
+    this.photoSrc && URL.revokeObjectURL(this.photoSrc);
+  }
+  hasImageCapture() {
+    return 'ImageCapture' in window;
+  }
+  /**
+   * Query the list of connected devices and figure out how many video inputs we have.
+   */
+  async queryDevices() {
+    try {
+      const devices = await navigator.mediaDevices.enumerateDevices();
+      const videoDevices = devices.filter(d => d.kind == 'videoinput');
+      this.hasCamera = !!videoDevices.length;
+      this.hasMultipleCameras = videoDevices.length > 1;
+    }
+    catch (e) {
+      this.deviceError = e;
+    }
+  }
+  async initCamera(constraints) {
+    if (!constraints) {
+      constraints = this.defaultConstraints;
+    }
+    try {
+      const stream = await navigator.mediaDevices.getUserMedia(Object.assign({ video: true, audio: false }, constraints));
+      this.initStream(stream);
+    }
+    catch (e) {
+      this.deviceError = e;
+      this.handleNoDeviceError && this.handleNoDeviceError(e);
+    }
+  }
+  async initStream(stream) {
+    this.stream = stream;
+    this.videoElement.srcObject = stream;
+    if (this.hasImageCapture()) {
+      this.imageCapture = new window.ImageCapture(stream.getVideoTracks()[0]);
+      await this.initPhotoCapabilities(this.imageCapture);
+    }
+    else {
+      this.deviceError = 'No image capture';
+      this.handleNoDeviceError && this.handleNoDeviceError();
+    }
+    // Always re-render
+    index.forceUpdate(this.el);
+  }
+  async initPhotoCapabilities(imageCapture) {
+    const c = await imageCapture.getPhotoCapabilities();
+    if (c.fillLightMode && c.fillLightMode.length > 1) {
+      this.flashModes = c.fillLightMode.map(m => m);
+      // Try to recall the current flash mode
+      if (this.flashMode) {
+        this.flashMode = this.flashModes[this.flashModes.indexOf(this.flashMode)] || 'off';
+        this.flashIndex = this.flashModes.indexOf(this.flashMode) || 0;
+      }
+      else {
+        this.flashIndex = 0;
+      }
+    }
+  }
+  stopStream() {
+    if (this.videoElement) {
+      this.videoElement.srcObject = null;
+    }
+    this.stream && this.stream.getTracks().forEach(track => track.stop());
+  }
+  async capture() {
+    if (this.hasImageCapture()) {
+      try {
+        const photo = await this.imageCapture.takePhoto({
+          fillLightMode: this.flashModes.length > 1 ? this.flashMode : undefined
+        });
+        await this.flashScreen();
+        this.promptAccept(photo);
+      }
+      catch (e) {
+        console.error('Unable to take photo!', e);
+      }
+    }
+    this.stopStream();
+  }
+  async promptAccept(photo) {
+    this.photo = photo;
+    const orientation = await this.getOrientation(photo);
+    console.debug('Got orientation', orientation);
+    this.photoOrientation = orientation;
+    if (orientation) {
+      switch (orientation) {
+        case 1:
+        case 2:
+          this.rotation = 0;
+          break;
+        case 3:
+        case 4:
+          this.rotation = 180;
+          break;
+        case 5:
+        case 6:
+          this.rotation = 90;
+          break;
+        case 7:
+        case 8:
+          this.rotation = 270;
+          break;
+      }
+    }
+    this.photoSrc = URL.createObjectURL(photo);
+  }
+  getOrientation(file) {
+    return new Promise(resolve => {
+      const reader = new FileReader();
+      reader.onload = (event) => {
+        const view = new DataView(event.target.result);
+        if (view.getUint16(0, false) !== 0xFFD8) {
+          return resolve(-2);
+        }
+        const length = view.byteLength;
+        let offset = 2;
+        while (offset < length) {
+          const marker = view.getUint16(offset, false);
+          offset += 2;
+          if (marker === 0xFFE1) {
+            if (view.getUint32(offset += 2, false) !== 0x45786966) {
+              return resolve(-1);
+            }
+            const little = view.getUint16(offset += 6, false) === 0x4949;
+            offset += view.getUint32(offset + 4, little);
+            const tags = view.getUint16(offset, little);
+            offset += 2;
+            for (let i = 0; i < tags; i++) {
+              if (view.getUint16(offset + (i * 12), little) === 0x0112) {
+                return resolve(view.getUint16(offset + (i * 12) + 8, little));
+              }
+            }
+          }
+          else if ((marker & 0xFF00) !== 0xFF00) {
+            break;
+          }
+          else {
+            offset += view.getUint16(offset, false);
+          }
+        }
+        return resolve(-1);
+      };
+      reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
+    });
+  }
+  rotate() {
+    this.stopStream();
+    const track = this.stream && this.stream.getTracks()[0];
+    if (!track) {
+      return;
+    }
+    let c = track.getConstraints();
+    let facingMode = c.facingMode;
+    if (!facingMode) {
+      let c = track.getCapabilities();
+      if (c.facingMode) {
+        facingMode = c.facingMode[0];
+      }
+    }
+    if (facingMode === 'environment') {
+      this.initCamera({
+        video: {
+          facingMode: 'user'
+        }
+      });
+    }
+    else {
+      this.initCamera({
+        video: {
+          facingMode: 'environment'
+        }
+      });
+    }
+  }
+  setFlashMode(mode) {
+    console.debug('New flash mode: ', mode);
+    this.flashMode = mode;
+  }
+  cycleFlash() {
+    if (this.flashModes.length > 0) {
+      this.flashIndex = (this.flashIndex + 1) % this.flashModes.length;
+      this.setFlashMode(this.flashModes[this.flashIndex]);
+    }
+  }
+  async flashScreen() {
+    return new Promise((resolve, _reject) => {
+      this.showShutterOverlay = true;
+      setTimeout(() => {
+        this.showShutterOverlay = false;
+        resolve();
+      }, 100);
+    });
+  }
+  iconExit() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M402.2,134L378,109.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L139.6,109.8 c-1.6-1.6-4.1-1.6-5.7,0L109.8,134c-1.6,1.6-1.6,4.1,0,5.7l113.5,113.5c1.6,1.6,1.6,4.1,0,5.7L109.8,372.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l113.5-113.5c1.6-1.6,4.1-1.6,5.7,0l113.5,113.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l113.5-113.5C403.7,138.1,403.7,135.5,402.2,134z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconPhotos() {
+    return (index.h("svg", { xmlns: 'http://www.w3.org/2000/svg', width: '512', height: '512', viewBox: '0 0 512 512' }, index.h("path", { d: 'M450.29,112H142c-34,0-62,27.51-62,61.33V418.67C80,452.49,108,480,142,480H450c34,0,62-26.18,62-60V173.33C512,139.51,484.32,112,450.29,112Zm-77.15,61.34a46,46,0,1,1-46.28,46A46.19,46.19,0,0,1,373.14,173.33Zm-231.55,276c-17,0-29.86-13.75-29.86-30.66V353.85l90.46-80.79a46.54,46.54,0,0,1,63.44,1.83L328.27,337l-113,112.33ZM480,418.67a30.67,30.67,0,0,1-30.71,30.66H259L376.08,333a46.24,46.24,0,0,1,59.44-.16L480,370.59Z' }), index.h("path", { d: 'M384,32H64A64,64,0,0,0,0,96V352a64.11,64.11,0,0,0,48,62V152a72,72,0,0,1,72-72H446A64.11,64.11,0,0,0,384,32Z' })));
+  }
+  iconConfirm() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%232CD865' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_1_'%3E%3Cg%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M208,301.4l-55.4-55.5c-1.5-1.5-4-1.6-5.6-0.1l-23.4,22.3c-1.6,1.6-1.7,4.1-0.1,5.7l81.6,81.4 c3.1,3.1,8.2,3.1,11.3,0l171.8-171.7c1.6-1.6,1.6-4.2-0.1-5.7l-23.4-22.3c-1.6-1.5-4.1-1.5-5.6,0.1L213.7,301.4 C212.1,303,209.6,303,208,301.4z'/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconReverseCamera() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M352,0H160C72,0,0,72,0,160v192c0,88,72,160,160,160h192c88,0,160-72,160-160V160C512,72,440,0,352,0z M356.7,365.8l-3.7,3.3c-27,23.2-61.4,35.9-96.8,35.9c-72.4,0-135.8-54.7-147-125.6c-0.3-1.9-2-3.3-3.9-3.3H64 c-3.3,0-5.2-3.8-3.2-6.4l61.1-81.4c1.6-2.1,4.7-2.1,6.4-0.1l63.3,81.4c2,2.6,0.2,6.5-3.2,6.5h-40.6c-2.5,0-4.5,2.4-3.9,4.8 c11.5,51.5,59.2,90.6,112.4,90.6c26.4,0,51.8-9.7,73.7-27.9l3.1-2.5c1.6-1.3,3.9-1.1,5.3,0.3l18.5,18.6 C358.5,361.6,358.4,364.3,356.7,365.8z M451.4,245.6l-61,83.5c-1.6,2.2-4.8,2.2-6.4,0.1l-63.3-83.3c-2-2.6-0.1-6.4,3.2-6.4h40.8 c2.5,0,4.4-2.3,3.9-4.8c-5.1-24.2-17.8-46.5-36.5-63.7c-21.2-19.4-48.2-30.1-76-30.1c-26.5,0-52.6,9.7-73.7,27.3l-3.1,2.5 c-1.6,1.3-3.9,1.2-5.4-0.3l-18.5-18.5c-1.6-1.6-1.5-4.3,0.2-5.9l3.5-3.1c27-23.2,61.4-35.9,96.8-35.9c38,0,73.9,13.7,101.2,38.7 c23.2,21.1,40.3,55.2,45.7,90.1c0.3,1.9,1.9,3.4,3.9,3.4h41.3C451.4,239.2,453.3,243,451.4,245.6z'/%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconRetake() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%23727A87' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M394.2,142L370,117.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L147.6,117.8 c-1.6-1.6-4.1-1.6-5.7,0L117.8,142c-1.6,1.6-1.6,4.1,0,5.7l105.5,105.5c1.6,1.6,1.6,4.1,0,5.7L117.8,364.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l105.5-105.5c1.6-1.6,4.1-1.6,5.7,0l105.5,105.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l105.5-105.5C395.7,146.1,395.7,143.5,394.2,142z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconFlashOff() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cg%3E%3Cpath class='st0' d='M498,483.7L42.3,28L14,56.4l149.8,149.8L91,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9c1.6,0,2.7,1.3,2.4,2.7 L197.6,507c-1,4.4,5.8,6.9,8.9,3.2l118.6-142.8L469.6,512L498,483.7z'/%3E%3Cpath class='st0' d='M449,218.2c2.5-3,0.1-7.2-3.9-7.2H301.2c-1.6,0-2.7-1.3-2.4-2.7L342.4,5c1-4.4-5.8-6.9-8.9-3.2L214.9,144.6 l161.3,161.3L449,218.2z'/%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconFlashOn() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3C/svg%3E`;
+  }
+  iconFlashAuto() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3Cg%3E%3Cpath class='st0' d='M321.3,186l74-186H438l74,186h-43.5l-11.9-32.5h-80.9l-12,32.5H321.3z M415.8,47.9l-27.2,70.7h54.9l-27.2-70.7 H415.8z'/%3E%3C/g%3E%3C/svg%3E`;
+  }
+  render() {
+    // const acceptStyles = { transform: `rotate(${-this.rotation}deg)` };
+    const acceptStyles = {};
+    return (index.h("div", { class: "camera-wrapper" }, index.h("div", { class: "camera-header" }, index.h("section", { class: "items" }, index.h("div", { class: "item close", onClick: e => this.handleClose(e) }, index.h("img", { src: this.iconExit() })), index.h("div", { class: "item flash", onClick: e => this.handleFlashClick(e) }, this.flashModes.length > 0 && (index.h("div", null, this.flashMode == 'off' ? index.h("img", { src: this.iconFlashOff() }) : '', this.flashMode == 'auto' ? index.h("img", { src: this.iconFlashAuto() }) : '', this.flashMode == 'flash' ? index.h("img", { src: this.iconFlashOn() }) : ''))))), (this.hasCamera === false || !!this.deviceError) && (index.h("div", { class: "no-device" }, index.h("h2", null, this.noDevicesText), index.h("label", { htmlFor: "_pwa-elements-camera-input" }, this.noDevicesButtonText), index.h("input", { type: "file", id: "_pwa-elements-camera-input", onChange: this.handleFileInputChange, accept: "image/*", class: "select-file-button" }))), this.photoSrc ? (index.h("div", { class: "accept" }, index.h("div", { class: "accept-image", style: Object.assign({ backgroundImage: `url(${this.photoSrc})` }, acceptStyles) }))) : (index.h("div", { class: "camera-video" }, this.showShutterOverlay && (index.h("div", { class: "shutter-overlay" })), this.hasImageCapture() ? (index.h("video", { ref: (el) => this.videoElement = el, onLoadedMetaData: this.handleVideoMetadata, autoplay: true, playsinline: true })) : (index.h("canvas", { ref: (el) => this.canvasElement = el, width: "100%", height: "100%" })), index.h("canvas", { class: "offscreen-image-render", ref: e => this.offscreenCanvas = e, width: "100%", height: "100%" }))), this.hasCamera && (index.h("div", { class: "camera-footer" }, !this.photo ? ([
+      !this.hidePicker && (index.h("div", { class: "pick-image", onClick: this.handlePickFile }, index.h("label", { htmlFor: "_pwa-elements-file-pick" }, this.iconPhotos()), index.h("input", { type: "file", id: "_pwa-elements-file-pick", onChange: this.handleFileInputChange, accept: "image/*", class: "pick-image-button" }))),
+      index.h("div", { class: "shutter", onClick: this.handleShutterClick }, index.h("div", { class: "shutter-button" })),
+      index.h("div", { class: "rotate", onClick: this.handleRotateClick }, index.h("img", { src: this.iconReverseCamera() })),
+    ]) : (index.h("section", { class: "items" }, index.h("div", { class: "item accept-cancel", onClick: e => this.handleCancelPhoto(e) }, index.h("img", { src: this.iconRetake() })), index.h("div", { class: "item accept-use", onClick: e => this.handleAcceptPhoto(e) }, index.h("img", { src: this.iconConfirm() }))))))));
+  }
+  static get assetsDirs() { return ["icons"]; }
+  get el() { return index.getElement(this); }
+};
+CameraPWA.style = cameraCss;
+
+exports.pwa_camera = CameraPWA;
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-toast.cjs.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-toast.cjs.entry.js
new file mode 100644
index 0000000..a799f7d
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/cjs/pwa-toast.cjs.entry.js
@@ -0,0 +1,49 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+const index = require('./index-d7f36e37.js');
+
+const toastCss = ":host{position:fixed;bottom:20px;left:0;right:0;display:-ms-flexbox;display:flex;opacity:0}:host(.in){-webkit-transition:opacity 300ms;transition:opacity 300ms;opacity:1}:host(.out){-webkit-transition:opacity 1s;transition:opacity 1s;opacity:0}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.toast{font-family:-apple-system, system-ui, \"Helvetica Neue\", Roboto, sans-serif;background-color:#eee;color:black;border-radius:5px;padding:10px 15px;font-size:14px;font-weight:500;-webkit-box-shadow:0px 1px 2px rgba(0, 0, 0, 0.20);box-shadow:0px 1px 2px rgba(0, 0, 0, 0.20)}";
+
+const PWAToast = class {
+  constructor(hostRef) {
+    index.registerInstance(this, hostRef);
+    this.message = undefined;
+    this.duration = 2000;
+    this.closing = null;
+  }
+  hostData() {
+    const classes = {
+      out: !!this.closing
+    };
+    if (this.closing !== null) {
+      classes['in'] = !this.closing;
+    }
+    return {
+      class: classes
+    };
+  }
+  componentDidLoad() {
+    setTimeout(() => {
+      this.closing = false;
+    });
+    setTimeout(() => {
+      this.close();
+    }, this.duration);
+  }
+  close() {
+    this.closing = true;
+    setTimeout(() => {
+      this.el.parentNode.removeChild(this.el);
+    }, 1000);
+  }
+  __stencil_render() {
+    return (index.h("div", { class: "wrapper" }, index.h("div", { class: "toast" }, this.message)));
+  }
+  get el() { return index.getElement(this); }
+  render() { return index.h(index.Host, this.hostData(), this.__stencil_render()); }
+};
+PWAToast.style = toastCss;
+
+exports.pwa_toast = PWAToast;
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/collection-manifest.json b/frontend/node_modules/@ionic/pwa-elements/dist/collection/collection-manifest.json
new file mode 100644
index 0000000..d234bf1
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/collection-manifest.json
@@ -0,0 +1,16 @@
+{
+  "entries": [
+    "./components/action-sheet/action-sheet.js",
+    "./components/camera/camera.js",
+    "./components/camera-modal/camera-modal-instance.js",
+    "./components/camera-modal/camera-modal.js",
+    "./components/toast/toast.js"
+  ],
+  "compiler": {
+    "name": "@stencil/core",
+    "version": "3.4.0",
+    "typescriptVersion": "5.0.4"
+  },
+  "collections": [],
+  "bundles": []
+}
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/action-sheet/action-sheet.css b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/action-sheet/action-sheet.css
new file mode 100644
index 0000000..5b18b97
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/action-sheet/action-sheet.css
@@ -0,0 +1,79 @@
+:host {
+  z-index: 1000;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  contain: strict;
+
+  user-select: none;
+
+  font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif;
+}
+
+.wrapper {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color: rgba(0, 0, 0, 0);
+  transition: 400ms background-color cubic-bezier(.36,.66,.04,1);
+}
+
+.wrapper.open {
+  background-color: rgba(0, 0, 0, 0.32);
+}
+
+.title {
+  color: #999;
+  height: 23px;
+  line-height: 23px;
+  padding-bottom: 17px;
+  padding-inline-end: 16px;
+  padding-inline-start: 16px;
+  padding-left: 16px;
+  padding-right: 16px;
+  padding-top: 20px;
+}
+
+.content {
+  width: 568px;
+  align-self: flex-end;
+  background-color:#fff;
+  transition: 400ms transform cubic-bezier(.36,.66,.04,1);
+  transform: translateY(100%);
+}
+
+.wrapper.open .content {
+  transform: translateY(0%);
+}
+
+@media only screen and (max-width: 568px) {
+  .content {
+    width: 100%;
+  }
+}
+
+.action-sheet-option {
+  cursor: pointer;
+  height: 52px;
+  line-height: 52px;
+}
+
+.action-sheet-button {
+  color: rgb(38, 38, 38);
+  font-size: 16px;
+  padding-inline-end: 16px;
+  padding-inline-start: 16px;
+  padding-left: 16px;
+  padding-right: 16px;
+  padding-top: 0px;
+}
+
+.action-sheet-button:hover {
+  background-color: #F6F6F6;
+}
+
+
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/action-sheet/action-sheet.js b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/action-sheet/action-sheet.js
new file mode 100644
index 0000000..a2c8e06
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/action-sheet/action-sheet.js
@@ -0,0 +1,129 @@
+import { h } from '@stencil/core';
+export class PWAActionSheet {
+  constructor() {
+    this.header = undefined;
+    this.cancelable = true;
+    this.options = [];
+    this.open = false;
+  }
+  componentDidLoad() {
+    requestAnimationFrame(() => {
+      this.open = true;
+    });
+  }
+  dismiss() {
+    if (this.cancelable) {
+      this.close();
+    }
+  }
+  close() {
+    this.open = false;
+    setTimeout(() => {
+      this.el.parentNode.removeChild(this.el);
+    }, 500);
+  }
+  handleOptionClick(e, i) {
+    e.stopPropagation();
+    this.onSelection.emit(i);
+    this.close();
+  }
+  render() {
+    return (h("div", { class: `wrapper${this.open ? ' open' : ''}`, onClick: () => this.dismiss() }, h("div", { class: "content" }, h("div", { class: "title" }, this.header), this.options.map((option, i) => h("div", { class: "action-sheet-option", onClick: (e) => this.handleOptionClick(e, i) }, h("div", { class: "action-sheet-button" }, option.title))))));
+  }
+  static get is() { return "pwa-action-sheet"; }
+  static get encapsulation() { return "shadow"; }
+  static get originalStyleUrls() {
+    return {
+      "$": ["action-sheet.css"]
+    };
+  }
+  static get styleUrls() {
+    return {
+      "$": ["action-sheet.css"]
+    };
+  }
+  static get properties() {
+    return {
+      "header": {
+        "type": "string",
+        "mutable": false,
+        "complexType": {
+          "original": "string",
+          "resolved": "string",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "header",
+        "reflect": false
+      },
+      "cancelable": {
+        "type": "boolean",
+        "mutable": false,
+        "complexType": {
+          "original": "boolean",
+          "resolved": "boolean",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "cancelable",
+        "reflect": false,
+        "defaultValue": "true"
+      },
+      "options": {
+        "type": "unknown",
+        "mutable": false,
+        "complexType": {
+          "original": "ActionSheetOption[]",
+          "resolved": "ActionSheetOption[]",
+          "references": {
+            "ActionSheetOption": {
+              "location": "import",
+              "path": "../../definitions"
+            }
+          }
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "defaultValue": "[]"
+      }
+    };
+  }
+  static get states() {
+    return {
+      "open": {}
+    };
+  }
+  static get events() {
+    return [{
+        "method": "onSelection",
+        "name": "onSelection",
+        "bubbles": true,
+        "cancelable": true,
+        "composed": true,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "complexType": {
+          "original": "any",
+          "resolved": "any",
+          "references": {}
+        }
+      }];
+  }
+  static get elementRef() { return "el"; }
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal-instance.css b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal-instance.css
new file mode 100644
index 0000000..595d43a
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal-instance.css
@@ -0,0 +1,35 @@
+:host {
+  z-index: 1000;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  contain: strict;
+
+  --inset-width: 600px;
+  --inset-height: 600px;
+}
+
+.wrapper {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color: rgba(0, 0, 0, 0.15);
+}
+
+.content {
+  box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
+  width: var(--inset-width);
+  height: var(--inset-height);
+  max-height: 100%;
+}
+
+@media only screen and (max-width: 600px) {
+  .content {
+    width: 100%;
+    height: 100%;
+  }
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal-instance.js b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal-instance.js
new file mode 100644
index 0000000..6f0187a
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal-instance.js
@@ -0,0 +1,162 @@
+import { h } from '@stencil/core';
+export class PWACameraModal {
+  constructor() {
+    this.handlePhoto = async (photo) => {
+      this.onPhoto.emit(photo);
+    };
+    this.handleNoDeviceError = async (photo) => {
+      this.noDeviceError.emit(photo);
+    };
+    this.facingMode = 'user';
+    this.hidePicker = false;
+    this.noDevicesText = 'No camera found';
+    this.noDevicesButtonText = 'Choose image';
+  }
+  handleBackdropClick(e) {
+    if (e.target !== this.el) {
+      this.onPhoto.emit(null);
+    }
+  }
+  handleComponentClick(e) {
+    e.stopPropagation();
+  }
+  handleBackdropKeyUp(e) {
+    if (e.key === "Escape") {
+      this.onPhoto.emit(null);
+    }
+  }
+  render() {
+    return (h("div", { class: "wrapper", onClick: e => this.handleBackdropClick(e) }, h("div", { class: "content" }, h("pwa-camera", { onClick: e => this.handleComponentClick(e), facingMode: this.facingMode, hidePicker: this.hidePicker, handlePhoto: this.handlePhoto, handleNoDeviceError: this.handleNoDeviceError, noDevicesButtonText: this.noDevicesButtonText, noDevicesText: this.noDevicesText }))));
+  }
+  static get is() { return "pwa-camera-modal-instance"; }
+  static get encapsulation() { return "shadow"; }
+  static get originalStyleUrls() {
+    return {
+      "$": ["camera-modal-instance.css"]
+    };
+  }
+  static get styleUrls() {
+    return {
+      "$": ["camera-modal-instance.css"]
+    };
+  }
+  static get properties() {
+    return {
+      "facingMode": {
+        "type": "string",
+        "mutable": false,
+        "complexType": {
+          "original": "string",
+          "resolved": "string",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "facing-mode",
+        "reflect": false,
+        "defaultValue": "'user'"
+      },
+      "hidePicker": {
+        "type": "boolean",
+        "mutable": false,
+        "complexType": {
+          "original": "boolean",
+          "resolved": "boolean",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "hide-picker",
+        "reflect": false,
+        "defaultValue": "false"
+      },
+      "noDevicesText": {
+        "type": "string",
+        "mutable": false,
+        "complexType": {
+          "original": "string",
+          "resolved": "string",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "no-devices-text",
+        "reflect": false,
+        "defaultValue": "'No camera found'"
+      },
+      "noDevicesButtonText": {
+        "type": "string",
+        "mutable": false,
+        "complexType": {
+          "original": "string",
+          "resolved": "string",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "no-devices-button-text",
+        "reflect": false,
+        "defaultValue": "'Choose image'"
+      }
+    };
+  }
+  static get events() {
+    return [{
+        "method": "onPhoto",
+        "name": "onPhoto",
+        "bubbles": true,
+        "cancelable": true,
+        "composed": true,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "complexType": {
+          "original": "any",
+          "resolved": "any",
+          "references": {}
+        }
+      }, {
+        "method": "noDeviceError",
+        "name": "noDeviceError",
+        "bubbles": true,
+        "cancelable": true,
+        "composed": true,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "complexType": {
+          "original": "any",
+          "resolved": "any",
+          "references": {}
+        }
+      }];
+  }
+  static get elementRef() { return "el"; }
+  static get listeners() {
+    return [{
+        "name": "keyup",
+        "method": "handleBackdropKeyUp",
+        "target": "body",
+        "capture": false,
+        "passive": false
+      }];
+  }
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal.css b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal.css
new file mode 100644
index 0000000..7fa443e
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal.css
@@ -0,0 +1,24 @@
+:host {
+  z-index: 1000;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  contain: strict;
+}
+
+.wrapper {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color: rgba(0, 0, 0, 0.15);
+}
+
+.content {
+  box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);
+  width: 600px;
+  height: 600px;
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal.js b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal.js
new file mode 100644
index 0000000..3326ee3
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera-modal/camera-modal.js
@@ -0,0 +1,155 @@
+import { h } from '@stencil/core';
+export class PWACameraModal {
+  constructor() {
+    this.facingMode = 'user';
+    this.hidePicker = false;
+  }
+  async present() {
+    const camera = document.createElement('pwa-camera-modal-instance');
+    camera.facingMode = this.facingMode;
+    camera.hidePicker = this.hidePicker;
+    camera.addEventListener('onPhoto', async (e) => {
+      if (!this._modal) {
+        return;
+      }
+      const photo = e.detail;
+      this.onPhoto.emit(photo);
+    });
+    camera.addEventListener('noDeviceError', async (e) => {
+      this.noDeviceError.emit(e);
+    });
+    document.body.append(camera);
+    this._modal = camera;
+  }
+  async dismiss() {
+    if (!this._modal) {
+      return;
+    }
+    this._modal && this._modal.parentNode.removeChild(this._modal);
+    this._modal = null;
+  }
+  render() {
+    return (h("div", null));
+  }
+  static get is() { return "pwa-camera-modal"; }
+  static get encapsulation() { return "shadow"; }
+  static get originalStyleUrls() {
+    return {
+      "$": ["camera-modal.css"]
+    };
+  }
+  static get styleUrls() {
+    return {
+      "$": ["camera-modal.css"]
+    };
+  }
+  static get properties() {
+    return {
+      "facingMode": {
+        "type": "string",
+        "mutable": false,
+        "complexType": {
+          "original": "string",
+          "resolved": "string",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "facing-mode",
+        "reflect": false,
+        "defaultValue": "'user'"
+      },
+      "hidePicker": {
+        "type": "boolean",
+        "mutable": false,
+        "complexType": {
+          "original": "boolean",
+          "resolved": "boolean",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "hide-picker",
+        "reflect": false,
+        "defaultValue": "false"
+      }
+    };
+  }
+  static get events() {
+    return [{
+        "method": "onPhoto",
+        "name": "onPhoto",
+        "bubbles": true,
+        "cancelable": true,
+        "composed": true,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "complexType": {
+          "original": "any",
+          "resolved": "any",
+          "references": {}
+        }
+      }, {
+        "method": "noDeviceError",
+        "name": "noDeviceError",
+        "bubbles": true,
+        "cancelable": true,
+        "composed": true,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "complexType": {
+          "original": "any",
+          "resolved": "any",
+          "references": {}
+        }
+      }];
+  }
+  static get methods() {
+    return {
+      "present": {
+        "complexType": {
+          "signature": "() => Promise<void>",
+          "parameters": [],
+          "references": {
+            "Promise": {
+              "location": "global"
+            }
+          },
+          "return": "Promise<void>"
+        },
+        "docs": {
+          "text": "",
+          "tags": []
+        }
+      },
+      "dismiss": {
+        "complexType": {
+          "signature": "() => Promise<void>",
+          "parameters": [],
+          "references": {
+            "Promise": {
+              "location": "global"
+            }
+          },
+          "return": "Promise<void>"
+        },
+        "docs": {
+          "text": "",
+          "tags": []
+        }
+      }
+    };
+  }
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/camera.css b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/camera.css
new file mode 100644
index 0000000..b328579
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/camera.css
@@ -0,0 +1,244 @@
+:host {
+  --header-height: 4em;
+  --footer-height: 9em;
+  --header-height-landscape: 3em;
+  --footer-height-landscape: 6em;
+  --shutter-size: 6em;
+  --icon-size-header: 1.5em;
+  --icon-size-footer: 2.5em;
+  --margin-size-header: 1.5em;
+  --margin-size-footer: 2.0em;
+
+  font-family: -apple-system, BlinkMacSystemFont,
+    “Segoe UI”, “Roboto”, “Droid Sans”, “Helvetica Neue”, sans-serif;
+
+  display: block;
+  width: 100%;
+  height: 100%;
+}
+
+.items {
+  box-sizing: border-box;
+  display: flex;
+  width: 100%;
+  height: 100%;
+  align-items: center;
+  justify-content: center;
+}
+
+.items .item {
+  flex: 1;
+  text-align: center;
+}
+.items .item:first-child {
+  text-align: left;
+}
+.items .item:last-child {
+  text-align: right;
+}
+
+.camera-wrapper {
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  height: 100%;
+}
+
+.camera-header {
+  color: white;
+  background-color: black;
+  height: var(--header-height);
+}
+
+.camera-header .items {
+  padding: var(--margin-size-header);
+}
+
+.camera-footer {
+  position: relative;
+  color: white;
+  background-color: black;
+  height: var(--footer-height);
+}
+
+.camera-footer .items {
+  padding: var(--margin-size-footer);
+}
+
+@media (max-height: 375px) {
+  .camera-header {
+    --header-height: var(--header-height-landscape);
+  }
+  .camera-footer {
+    --footer-height: var(--footer-height-landscape);
+  }
+  .camera-footer .shutter {
+    --shutter-size: 4em;
+  }
+}
+
+.camera-video {
+  position: relative;
+  flex: 1;
+  overflow: hidden;
+  background-color: black;
+}
+
+video {
+  width: 100%;
+  height: 100%;
+  max-height: 100%;
+  min-height: 100%;
+  object-fit: cover;
+  background-color: black;
+}
+
+.pick-image {
+  display: flex;
+  align-items: center;
+  position: absolute;
+  left: var(--margin-size-footer);
+  top: 0;
+  height: 100%;
+  width: var(--icon-size-footer);
+  color: white;
+}
+
+.pick-image input {
+  visibility: hidden;
+}
+
+.pick-image svg {
+  cursor: pointer;
+  fill: white;
+  width: var(--icon-size-footer);
+  height: var(--icon-size-footer);
+}
+
+.shutter {
+  position: absolute;
+  left: 50%;
+  top: 50%;
+  width: var(--shutter-size);
+  height: var(--shutter-size);
+  margin-top: calc(var(--shutter-size) / -2);
+  margin-left: calc(var(--shutter-size) / -2);
+  border-radius: 100%;
+  background-color: #c6cdd8;
+  padding: 12px;
+  box-sizing: border-box;
+}
+
+.shutter:active .shutter-button {
+  background-color: #9da9bb;
+}
+
+.shutter-button {
+  background-color: white;
+  border-radius: 100%;
+  width: 100%;
+  height: 100%;
+}
+
+.rotate {
+  display: flex;
+  align-items: center;
+  position: absolute;
+  right: var(--margin-size-footer);
+  top: 0;
+  height: 100%;
+  width: var(--icon-size-footer);
+  color: white;
+}
+
+.rotate img {
+  width: var(--icon-size-footer);
+  height: var(--icon-size-footer);
+}
+
+.shutter-overlay {
+  z-index: 5;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background-color: black;
+}
+
+.error {
+  width: 100%;
+  height: 100%;
+  color: white;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.no-device {
+  background-color: black;
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  color: white;
+}
+
+.no-device label {
+  cursor: pointer;
+  background: #fff;
+  border-radius: 6px;
+  padding: 6px 8px;
+  color: black;
+}
+
+.no-device input {
+  visibility: hidden;
+  height: 0;
+  margin-top: 16px;
+}
+
+.accept {
+  background-color: black;
+  flex: 1;
+  overflow: hidden;
+}
+
+.accept .accept-image {
+  width: 100%;
+  height: 100%;
+  max-height: 100%;
+  background-position: center center;
+  background-size: cover;
+  background-repeat: no-repeat;
+}
+
+.close img {
+  cursor: pointer;
+  width: var(--icon-size-header);
+  height: var(--icon-size-header);
+}
+
+.flash img {
+  width: var(--icon-size-header);
+  height: var(--icon-size-header);
+}
+
+.accept-use img {
+  width: var(--icon-size-footer);
+  height: var(--icon-size-footer);
+}
+
+.accept-cancel img {
+  width: var(--icon-size-footer);
+  height: var(--icon-size-footer);
+}
+
+.offscreen-image-render {
+  top: 0;
+  left: 0;
+  visibility: hidden;
+  pointer-events: none;
+  width: 100%;
+  height: 100%;
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/camera.js b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/camera.js
new file mode 100644
index 0000000..d94b830
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/camera.js
@@ -0,0 +1,455 @@
+import { h, Build, forceUpdate } from '@stencil/core';
+import './imagecapture';
+export class CameraPWA {
+  constructor() {
+    // Whether the device has multiple cameras (front/back)
+    this.hasMultipleCameras = false;
+    // Whether the device has flash support
+    this.hasFlash = false;
+    // Flash modes for camera
+    this.flashModes = [];
+    // Current flash mode
+    this.flashMode = 'off';
+    this.handlePickFile = (_e) => {
+    };
+    this.handleShutterClick = (_e) => {
+      console.debug('shutter click');
+      this.capture();
+    };
+    this.handleRotateClick = (_e) => {
+      this.rotate();
+    };
+    this.handleClose = (_e) => {
+      this.handlePhoto && this.handlePhoto(null);
+    };
+    this.handleFlashClick = (_e) => {
+      this.cycleFlash();
+    };
+    this.handleCancelPhoto = (_e) => {
+      const track = this.stream && this.stream.getTracks()[0];
+      let c = track && track.getConstraints();
+      this.photo = null;
+      this.photoSrc = null;
+      if (c) {
+        this.initCamera({
+          video: {
+            facingMode: c.facingMode
+          }
+        });
+      }
+      else {
+        this.initCamera();
+      }
+    };
+    this.handleAcceptPhoto = (_e) => {
+      this.handlePhoto && this.handlePhoto(this.photo);
+    };
+    this.handleFileInputChange = async (e) => {
+      const input = e.target;
+      const file = input.files[0];
+      try {
+        const orientation = await this.getOrientation(file);
+        console.debug('Got orientation', orientation);
+        this.photoOrientation = orientation;
+      }
+      catch (e) {
+      }
+      this.handlePhoto && this.handlePhoto(file);
+    };
+    this.handleVideoMetadata = (e) => {
+      console.debug('Video metadata', e);
+    };
+    this.facingMode = 'user';
+    this.handlePhoto = undefined;
+    this.hidePicker = false;
+    this.handleNoDeviceError = undefined;
+    this.noDevicesText = 'No camera found';
+    this.noDevicesButtonText = 'Choose image';
+    this.photo = undefined;
+    this.photoSrc = undefined;
+    this.showShutterOverlay = false;
+    this.flashIndex = 0;
+    this.hasCamera = null;
+    this.rotation = 0;
+    this.deviceError = null;
+  }
+  async componentDidLoad() {
+    if (Build.isServer) {
+      return;
+    }
+    this.defaultConstraints = {
+      video: {
+        facingMode: this.facingMode
+      }
+    };
+    // Figure out how many cameras we have
+    await this.queryDevices();
+    // Initialize the camera
+    await this.initCamera();
+  }
+  disconnectedCallback() {
+    this.stopStream();
+    this.photoSrc && URL.revokeObjectURL(this.photoSrc);
+  }
+  hasImageCapture() {
+    return 'ImageCapture' in window;
+  }
+  /**
+   * Query the list of connected devices and figure out how many video inputs we have.
+   */
+  async queryDevices() {
+    try {
+      const devices = await navigator.mediaDevices.enumerateDevices();
+      const videoDevices = devices.filter(d => d.kind == 'videoinput');
+      this.hasCamera = !!videoDevices.length;
+      this.hasMultipleCameras = videoDevices.length > 1;
+    }
+    catch (e) {
+      this.deviceError = e;
+    }
+  }
+  async initCamera(constraints) {
+    if (!constraints) {
+      constraints = this.defaultConstraints;
+    }
+    try {
+      const stream = await navigator.mediaDevices.getUserMedia(Object.assign({ video: true, audio: false }, constraints));
+      this.initStream(stream);
+    }
+    catch (e) {
+      this.deviceError = e;
+      this.handleNoDeviceError && this.handleNoDeviceError(e);
+    }
+  }
+  async initStream(stream) {
+    this.stream = stream;
+    this.videoElement.srcObject = stream;
+    if (this.hasImageCapture()) {
+      this.imageCapture = new window.ImageCapture(stream.getVideoTracks()[0]);
+      await this.initPhotoCapabilities(this.imageCapture);
+    }
+    else {
+      this.deviceError = 'No image capture';
+      this.handleNoDeviceError && this.handleNoDeviceError();
+    }
+    // Always re-render
+    forceUpdate(this.el);
+  }
+  async initPhotoCapabilities(imageCapture) {
+    const c = await imageCapture.getPhotoCapabilities();
+    if (c.fillLightMode && c.fillLightMode.length > 1) {
+      this.flashModes = c.fillLightMode.map(m => m);
+      // Try to recall the current flash mode
+      if (this.flashMode) {
+        this.flashMode = this.flashModes[this.flashModes.indexOf(this.flashMode)] || 'off';
+        this.flashIndex = this.flashModes.indexOf(this.flashMode) || 0;
+      }
+      else {
+        this.flashIndex = 0;
+      }
+    }
+  }
+  stopStream() {
+    if (this.videoElement) {
+      this.videoElement.srcObject = null;
+    }
+    this.stream && this.stream.getTracks().forEach(track => track.stop());
+  }
+  async capture() {
+    if (this.hasImageCapture()) {
+      try {
+        const photo = await this.imageCapture.takePhoto({
+          fillLightMode: this.flashModes.length > 1 ? this.flashMode : undefined
+        });
+        await this.flashScreen();
+        this.promptAccept(photo);
+      }
+      catch (e) {
+        console.error('Unable to take photo!', e);
+      }
+    }
+    this.stopStream();
+  }
+  async promptAccept(photo) {
+    this.photo = photo;
+    const orientation = await this.getOrientation(photo);
+    console.debug('Got orientation', orientation);
+    this.photoOrientation = orientation;
+    if (orientation) {
+      switch (orientation) {
+        case 1:
+        case 2:
+          this.rotation = 0;
+          break;
+        case 3:
+        case 4:
+          this.rotation = 180;
+          break;
+        case 5:
+        case 6:
+          this.rotation = 90;
+          break;
+        case 7:
+        case 8:
+          this.rotation = 270;
+          break;
+      }
+    }
+    this.photoSrc = URL.createObjectURL(photo);
+  }
+  getOrientation(file) {
+    return new Promise(resolve => {
+      const reader = new FileReader();
+      reader.onload = (event) => {
+        const view = new DataView(event.target.result);
+        if (view.getUint16(0, false) !== 0xFFD8) {
+          return resolve(-2);
+        }
+        const length = view.byteLength;
+        let offset = 2;
+        while (offset < length) {
+          const marker = view.getUint16(offset, false);
+          offset += 2;
+          if (marker === 0xFFE1) {
+            if (view.getUint32(offset += 2, false) !== 0x45786966) {
+              return resolve(-1);
+            }
+            const little = view.getUint16(offset += 6, false) === 0x4949;
+            offset += view.getUint32(offset + 4, little);
+            const tags = view.getUint16(offset, little);
+            offset += 2;
+            for (let i = 0; i < tags; i++) {
+              if (view.getUint16(offset + (i * 12), little) === 0x0112) {
+                return resolve(view.getUint16(offset + (i * 12) + 8, little));
+              }
+            }
+          }
+          else if ((marker & 0xFF00) !== 0xFF00) {
+            break;
+          }
+          else {
+            offset += view.getUint16(offset, false);
+          }
+        }
+        return resolve(-1);
+      };
+      reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
+    });
+  }
+  rotate() {
+    this.stopStream();
+    const track = this.stream && this.stream.getTracks()[0];
+    if (!track) {
+      return;
+    }
+    let c = track.getConstraints();
+    let facingMode = c.facingMode;
+    if (!facingMode) {
+      let c = track.getCapabilities();
+      if (c.facingMode) {
+        facingMode = c.facingMode[0];
+      }
+    }
+    if (facingMode === 'environment') {
+      this.initCamera({
+        video: {
+          facingMode: 'user'
+        }
+      });
+    }
+    else {
+      this.initCamera({
+        video: {
+          facingMode: 'environment'
+        }
+      });
+    }
+  }
+  setFlashMode(mode) {
+    console.debug('New flash mode: ', mode);
+    this.flashMode = mode;
+  }
+  cycleFlash() {
+    if (this.flashModes.length > 0) {
+      this.flashIndex = (this.flashIndex + 1) % this.flashModes.length;
+      this.setFlashMode(this.flashModes[this.flashIndex]);
+    }
+  }
+  async flashScreen() {
+    return new Promise((resolve, _reject) => {
+      this.showShutterOverlay = true;
+      setTimeout(() => {
+        this.showShutterOverlay = false;
+        resolve();
+      }, 100);
+    });
+  }
+  iconExit() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M402.2,134L378,109.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L139.6,109.8 c-1.6-1.6-4.1-1.6-5.7,0L109.8,134c-1.6,1.6-1.6,4.1,0,5.7l113.5,113.5c1.6,1.6,1.6,4.1,0,5.7L109.8,372.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l113.5-113.5c1.6-1.6,4.1-1.6,5.7,0l113.5,113.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l113.5-113.5C403.7,138.1,403.7,135.5,402.2,134z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconPhotos() {
+    return (h("svg", { xmlns: 'http://www.w3.org/2000/svg', width: '512', height: '512', viewBox: '0 0 512 512' }, h("path", { d: 'M450.29,112H142c-34,0-62,27.51-62,61.33V418.67C80,452.49,108,480,142,480H450c34,0,62-26.18,62-60V173.33C512,139.51,484.32,112,450.29,112Zm-77.15,61.34a46,46,0,1,1-46.28,46A46.19,46.19,0,0,1,373.14,173.33Zm-231.55,276c-17,0-29.86-13.75-29.86-30.66V353.85l90.46-80.79a46.54,46.54,0,0,1,63.44,1.83L328.27,337l-113,112.33ZM480,418.67a30.67,30.67,0,0,1-30.71,30.66H259L376.08,333a46.24,46.24,0,0,1,59.44-.16L480,370.59Z' }), h("path", { d: 'M384,32H64A64,64,0,0,0,0,96V352a64.11,64.11,0,0,0,48,62V152a72,72,0,0,1,72-72H446A64.11,64.11,0,0,0,384,32Z' })));
+  }
+  iconConfirm() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%232CD865' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_1_'%3E%3Cg%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M208,301.4l-55.4-55.5c-1.5-1.5-4-1.6-5.6-0.1l-23.4,22.3c-1.6,1.6-1.7,4.1-0.1,5.7l81.6,81.4 c3.1,3.1,8.2,3.1,11.3,0l171.8-171.7c1.6-1.6,1.6-4.2-0.1-5.7l-23.4-22.3c-1.6-1.5-4.1-1.5-5.6,0.1L213.7,301.4 C212.1,303,209.6,303,208,301.4z'/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconReverseCamera() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M352,0H160C72,0,0,72,0,160v192c0,88,72,160,160,160h192c88,0,160-72,160-160V160C512,72,440,0,352,0z M356.7,365.8l-3.7,3.3c-27,23.2-61.4,35.9-96.8,35.9c-72.4,0-135.8-54.7-147-125.6c-0.3-1.9-2-3.3-3.9-3.3H64 c-3.3,0-5.2-3.8-3.2-6.4l61.1-81.4c1.6-2.1,4.7-2.1,6.4-0.1l63.3,81.4c2,2.6,0.2,6.5-3.2,6.5h-40.6c-2.5,0-4.5,2.4-3.9,4.8 c11.5,51.5,59.2,90.6,112.4,90.6c26.4,0,51.8-9.7,73.7-27.9l3.1-2.5c1.6-1.3,3.9-1.1,5.3,0.3l18.5,18.6 C358.5,361.6,358.4,364.3,356.7,365.8z M451.4,245.6l-61,83.5c-1.6,2.2-4.8,2.2-6.4,0.1l-63.3-83.3c-2-2.6-0.1-6.4,3.2-6.4h40.8 c2.5,0,4.4-2.3,3.9-4.8c-5.1-24.2-17.8-46.5-36.5-63.7c-21.2-19.4-48.2-30.1-76-30.1c-26.5,0-52.6,9.7-73.7,27.3l-3.1,2.5 c-1.6,1.3-3.9,1.2-5.4-0.3l-18.5-18.5c-1.6-1.6-1.5-4.3,0.2-5.9l3.5-3.1c27-23.2,61.4-35.9,96.8-35.9c38,0,73.9,13.7,101.2,38.7 c23.2,21.1,40.3,55.2,45.7,90.1c0.3,1.9,1.9,3.4,3.9,3.4h41.3C451.4,239.2,453.3,243,451.4,245.6z'/%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconRetake() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%23727A87' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M394.2,142L370,117.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L147.6,117.8 c-1.6-1.6-4.1-1.6-5.7,0L117.8,142c-1.6,1.6-1.6,4.1,0,5.7l105.5,105.5c1.6,1.6,1.6,4.1,0,5.7L117.8,364.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l105.5-105.5c1.6-1.6,4.1-1.6,5.7,0l105.5,105.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l105.5-105.5C395.7,146.1,395.7,143.5,394.2,142z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconFlashOff() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cg%3E%3Cpath class='st0' d='M498,483.7L42.3,28L14,56.4l149.8,149.8L91,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9c1.6,0,2.7,1.3,2.4,2.7 L197.6,507c-1,4.4,5.8,6.9,8.9,3.2l118.6-142.8L469.6,512L498,483.7z'/%3E%3Cpath class='st0' d='M449,218.2c2.5-3,0.1-7.2-3.9-7.2H301.2c-1.6,0-2.7-1.3-2.4-2.7L342.4,5c1-4.4-5.8-6.9-8.9-3.2L214.9,144.6 l161.3,161.3L449,218.2z'/%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconFlashOn() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3C/svg%3E`;
+  }
+  iconFlashAuto() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3Cg%3E%3Cpath class='st0' d='M321.3,186l74-186H438l74,186h-43.5l-11.9-32.5h-80.9l-12,32.5H321.3z M415.8,47.9l-27.2,70.7h54.9l-27.2-70.7 H415.8z'/%3E%3C/g%3E%3C/svg%3E`;
+  }
+  render() {
+    // const acceptStyles = { transform: `rotate(${-this.rotation}deg)` };
+    const acceptStyles = {};
+    return (h("div", { class: "camera-wrapper" }, h("div", { class: "camera-header" }, h("section", { class: "items" }, h("div", { class: "item close", onClick: e => this.handleClose(e) }, h("img", { src: this.iconExit() })), h("div", { class: "item flash", onClick: e => this.handleFlashClick(e) }, this.flashModes.length > 0 && (h("div", null, this.flashMode == 'off' ? h("img", { src: this.iconFlashOff() }) : '', this.flashMode == 'auto' ? h("img", { src: this.iconFlashAuto() }) : '', this.flashMode == 'flash' ? h("img", { src: this.iconFlashOn() }) : ''))))), (this.hasCamera === false || !!this.deviceError) && (h("div", { class: "no-device" }, h("h2", null, this.noDevicesText), h("label", { htmlFor: "_pwa-elements-camera-input" }, this.noDevicesButtonText), h("input", { type: "file", id: "_pwa-elements-camera-input", onChange: this.handleFileInputChange, accept: "image/*", class: "select-file-button" }))), this.photoSrc ? (h("div", { class: "accept" }, h("div", { class: "accept-image", style: Object.assign({ backgroundImage: `url(${this.photoSrc})` }, acceptStyles) }))) : (h("div", { class: "camera-video" }, this.showShutterOverlay && (h("div", { class: "shutter-overlay" })), this.hasImageCapture() ? (h("video", { ref: (el) => this.videoElement = el, onLoadedMetaData: this.handleVideoMetadata, autoplay: true, playsinline: true })) : (h("canvas", { ref: (el) => this.canvasElement = el, width: "100%", height: "100%" })), h("canvas", { class: "offscreen-image-render", ref: e => this.offscreenCanvas = e, width: "100%", height: "100%" }))), this.hasCamera && (h("div", { class: "camera-footer" }, !this.photo ? ([
+      !this.hidePicker && (h("div", { class: "pick-image", onClick: this.handlePickFile }, h("label", { htmlFor: "_pwa-elements-file-pick" }, this.iconPhotos()), h("input", { type: "file", id: "_pwa-elements-file-pick", onChange: this.handleFileInputChange, accept: "image/*", class: "pick-image-button" }))),
+      h("div", { class: "shutter", onClick: this.handleShutterClick }, h("div", { class: "shutter-button" })),
+      h("div", { class: "rotate", onClick: this.handleRotateClick }, h("img", { src: this.iconReverseCamera() })),
+    ]) : (h("section", { class: "items" }, h("div", { class: "item accept-cancel", onClick: e => this.handleCancelPhoto(e) }, h("img", { src: this.iconRetake() })), h("div", { class: "item accept-use", onClick: e => this.handleAcceptPhoto(e) }, h("img", { src: this.iconConfirm() }))))))));
+  }
+  static get is() { return "pwa-camera"; }
+  static get encapsulation() { return "shadow"; }
+  static get originalStyleUrls() {
+    return {
+      "$": ["camera.css"]
+    };
+  }
+  static get styleUrls() {
+    return {
+      "$": ["camera.css"]
+    };
+  }
+  static get assetsDirs() { return ["icons"]; }
+  static get properties() {
+    return {
+      "facingMode": {
+        "type": "string",
+        "mutable": false,
+        "complexType": {
+          "original": "string",
+          "resolved": "string",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "facing-mode",
+        "reflect": false,
+        "defaultValue": "'user'"
+      },
+      "handlePhoto": {
+        "type": "unknown",
+        "mutable": false,
+        "complexType": {
+          "original": "(photo: Blob) => void",
+          "resolved": "(photo: Blob) => void",
+          "references": {
+            "Blob": {
+              "location": "global"
+            }
+          }
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        }
+      },
+      "hidePicker": {
+        "type": "boolean",
+        "mutable": false,
+        "complexType": {
+          "original": "boolean",
+          "resolved": "boolean",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "hide-picker",
+        "reflect": false,
+        "defaultValue": "false"
+      },
+      "handleNoDeviceError": {
+        "type": "unknown",
+        "mutable": false,
+        "complexType": {
+          "original": "(e?: any) => void",
+          "resolved": "(e?: any) => void",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        }
+      },
+      "noDevicesText": {
+        "type": "string",
+        "mutable": false,
+        "complexType": {
+          "original": "string",
+          "resolved": "string",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "no-devices-text",
+        "reflect": false,
+        "defaultValue": "'No camera found'"
+      },
+      "noDevicesButtonText": {
+        "type": "string",
+        "mutable": false,
+        "complexType": {
+          "original": "string",
+          "resolved": "string",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "no-devices-button-text",
+        "reflect": false,
+        "defaultValue": "'Choose image'"
+      }
+    };
+  }
+  static get states() {
+    return {
+      "photo": {},
+      "photoSrc": {},
+      "showShutterOverlay": {},
+      "flashIndex": {},
+      "hasCamera": {},
+      "rotation": {},
+      "deviceError": {}
+    };
+  }
+  static get elementRef() { return "el"; }
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/confirm.svg b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/confirm.svg
new file mode 100644
index 0000000..1213fd9
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/confirm.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<circle fill="#2CD865" cx="256" cy="256" r="256"/>
+<g id="Icon_1_">
+	<g>
+		<g>
+			<path fill="#FFFFFF" d="M208,301.4l-55.4-55.5c-1.5-1.5-4-1.6-5.6-0.1l-23.4,22.3c-1.6,1.6-1.7,4.1-0.1,5.7l81.6,81.4
+				c3.1,3.1,8.2,3.1,11.3,0l171.8-171.7c1.6-1.6,1.6-4.2-0.1-5.7l-23.4-22.3c-1.6-1.5-4.1-1.5-5.6,0.1L213.7,301.4
+				C212.1,303,209.6,303,208,301.4z"/>
+		</g>
+	</g>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/exit.svg b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/exit.svg
new file mode 100644
index 0000000..be96592
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/exit.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g id="Icon_5_">
+	<g>
+		<path fill="#FFFFFF" d="M402.2,134L378,109.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L139.6,109.8
+			c-1.6-1.6-4.1-1.6-5.7,0L109.8,134c-1.6,1.6-1.6,4.1,0,5.7l113.5,113.5c1.6,1.6,1.6,4.1,0,5.7L109.8,372.4c-1.6,1.6-1.6,4.1,0,5.7
+			l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l113.5-113.5c1.6-1.6,4.1-1.6,5.7,0l113.5,113.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1
+			c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l113.5-113.5C403.7,138.1,403.7,135.5,402.2,134z"/>
+	</g>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/flash-auto.svg b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/flash-auto.svg
new file mode 100644
index 0000000..c388e86
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/flash-auto.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFFFFF;}
+</style>
+<path class="st0" d="M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9
+	c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z"/>
+<g>
+	<path class="st0" d="M321.3,186l74-186H438l74,186h-43.5l-11.9-32.5h-80.9l-12,32.5H321.3z M415.8,47.9l-27.2,70.7h54.9l-27.2-70.7
+		H415.8z"/>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/flash-off.svg b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/flash-off.svg
new file mode 100644
index 0000000..98b2599
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/flash-off.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFFFFF;}
+</style>
+<g>
+	<path class="st0" d="M498,483.7L42.3,28L14,56.4l149.8,149.8L91,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9c1.6,0,2.7,1.3,2.4,2.7
+		L197.6,507c-1,4.4,5.8,6.9,8.9,3.2l118.6-142.8L469.6,512L498,483.7z"/>
+	<path class="st0" d="M449,218.2c2.5-3,0.1-7.2-3.9-7.2H301.2c-1.6,0-2.7-1.3-2.4-2.7L342.4,5c1-4.4-5.8-6.9-8.9-3.2L214.9,144.6
+		l161.3,161.3L449,218.2z"/>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/flash-on.svg b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/flash-on.svg
new file mode 100644
index 0000000..e045c08
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/flash-on.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFFFFF;}
+</style>
+<path class="st0" d="M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9
+	c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z"/>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/retake.svg b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/retake.svg
new file mode 100644
index 0000000..04fc2a0
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/retake.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<circle fill="#727A87" cx="256" cy="256" r="256"/>
+<g id="Icon_5_">
+	<g>
+		<path fill="#FFFFFF" d="M394.2,142L370,117.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L147.6,117.8
+			c-1.6-1.6-4.1-1.6-5.7,0L117.8,142c-1.6,1.6-1.6,4.1,0,5.7l105.5,105.5c1.6,1.6,1.6,4.1,0,5.7L117.8,364.4c-1.6,1.6-1.6,4.1,0,5.7
+			l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l105.5-105.5c1.6-1.6,4.1-1.6,5.7,0l105.5,105.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1
+			c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l105.5-105.5C395.7,146.1,395.7,143.5,394.2,142z"/>
+	</g>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/reverse-camera.svg b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/reverse-camera.svg
new file mode 100644
index 0000000..ec09076
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/icons/reverse-camera.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g>
+	<path fill="#FFFFFF" d="M352,0H160C72,0,0,72,0,160v192c0,88,72,160,160,160h192c88,0,160-72,160-160V160C512,72,440,0,352,0z
+		 M356.7,365.8l-3.7,3.3c-27,23.2-61.4,35.9-96.8,35.9c-72.4,0-135.8-54.7-147-125.6c-0.3-1.9-2-3.3-3.9-3.3H64
+		c-3.3,0-5.2-3.8-3.2-6.4l61.1-81.4c1.6-2.1,4.7-2.1,6.4-0.1l63.3,81.4c2,2.6,0.2,6.5-3.2,6.5h-40.6c-2.5,0-4.5,2.4-3.9,4.8
+		c11.5,51.5,59.2,90.6,112.4,90.6c26.4,0,51.8-9.7,73.7-27.9l3.1-2.5c1.6-1.3,3.9-1.1,5.3,0.3l18.5,18.6
+		C358.5,361.6,358.4,364.3,356.7,365.8z M451.4,245.6l-61,83.5c-1.6,2.2-4.8,2.2-6.4,0.1l-63.3-83.3c-2-2.6-0.1-6.4,3.2-6.4h40.8
+		c2.5,0,4.4-2.3,3.9-4.8c-5.1-24.2-17.8-46.5-36.5-63.7c-21.2-19.4-48.2-30.1-76-30.1c-26.5,0-52.6,9.7-73.7,27.3l-3.1,2.5
+		c-1.6,1.3-3.9,1.2-5.4-0.3l-18.5-18.5c-1.6-1.6-1.5-4.3,0.2-5.9l3.5-3.1c27-23.2,61.4-35.9,96.8-35.9c38,0,73.9,13.7,101.2,38.7
+		c23.2,21.1,40.3,55.2,45.7,90.1c0.3,1.9,1.9,3.4,3.9,3.4h41.3C451.4,239.2,453.3,243,451.4,245.6z"/>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/imagecapture.js b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/imagecapture.js
new file mode 100644
index 0000000..dfb6cba
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/camera/imagecapture.js
@@ -0,0 +1,155 @@
+/**
+ * MediaStream ImageCapture polyfill
+ *
+ * @license
+ * Copyright 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export let ImageCapture = window.ImageCapture;
+if (typeof ImageCapture === 'undefined') {
+  ImageCapture = class {
+    /**
+     * TODO https://www.w3.org/TR/image-capture/#constructors
+     *
+     * @param {MediaStreamTrack} videoStreamTrack - A MediaStreamTrack of the 'video' kind
+     */
+    constructor(videoStreamTrack) {
+      if (videoStreamTrack.kind !== 'video')
+        throw new DOMException('NotSupportedError');
+      this._videoStreamTrack = videoStreamTrack;
+      if (!('readyState' in this._videoStreamTrack)) {
+        // Polyfill for Firefox
+        this._videoStreamTrack.readyState = 'live';
+      }
+      // MediaStream constructor not available until Chrome 55 - https://www.chromestatus.com/feature/5912172546752512
+      this._previewStream = new MediaStream([videoStreamTrack]);
+      this.videoElement = document.createElement('video');
+      this.videoElementPlaying = new Promise(resolve => {
+        this.videoElement.addEventListener('playing', resolve);
+      });
+      if (HTMLMediaElement) {
+        this.videoElement.srcObject = this._previewStream; // Safari 11 doesn't allow use of createObjectURL for MediaStream
+      }
+      else {
+        this.videoElement.src = URL.createObjectURL(this._previewStream);
+      }
+      this.videoElement.muted = true;
+      this.videoElement.setAttribute('playsinline', ''); // Required by Safari on iOS 11. See https://webkit.org/blog/6784
+      this.videoElement.play();
+      this.canvasElement = document.createElement('canvas');
+      // TODO Firefox has https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas
+      this.canvas2dContext = this.canvasElement.getContext('2d');
+    }
+    /**
+     * https://w3c.github.io/mediacapture-image/index.html#dom-imagecapture-videostreamtrack
+     * @return {MediaStreamTrack} The MediaStreamTrack passed into the constructor
+     */
+    get videoStreamTrack() {
+      return this._videoStreamTrack;
+    }
+    /**
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-getphotocapabilities
+     * @return {Promise<PhotoCapabilities>} Fulfilled promise with
+     * [PhotoCapabilities](https://www.w3.org/TR/image-capture/#idl-def-photocapabilities)
+     * object on success, rejected promise on failure
+     */
+    getPhotoCapabilities() {
+      return new Promise(function executorGPC(resolve, reject) {
+        // TODO see https://github.com/w3c/mediacapture-image/issues/97
+        const MediaSettingsRange = {
+          current: 0, min: 0, max: 0,
+        };
+        resolve({
+          exposureCompensation: MediaSettingsRange,
+          exposureMode: 'none',
+          fillLightMode: ['none'],
+          focusMode: 'none',
+          imageHeight: MediaSettingsRange,
+          imageWidth: MediaSettingsRange,
+          iso: MediaSettingsRange,
+          redEyeReduction: false,
+          whiteBalanceMode: 'none',
+          zoom: MediaSettingsRange,
+        });
+        reject(new DOMException('OperationError'));
+      });
+    }
+    /**
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-setoptions
+     * @param {Object} photoSettings - Photo settings dictionary, https://www.w3.org/TR/image-capture/#idl-def-photosettings
+     * @return {Promise<void>} Fulfilled promise on success, rejected promise on failure
+     */
+    setOptions(_photoSettings = {}) {
+      return new Promise(function executorSO(_resolve, _reject) {
+        // TODO
+      });
+    }
+    /**
+     * TODO
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-takephoto
+     * @return {Promise<Blob>} Fulfilled promise with [Blob](https://www.w3.org/TR/FileAPI/#blob)
+     * argument on success; rejected promise on failure
+     */
+    takePhoto() {
+      const self = this;
+      return new Promise(function executorTP(resolve, reject) {
+        // `If the readyState of the MediaStreamTrack provided in the constructor is not live,
+        // return a promise rejected with a new DOMException whose name is "InvalidStateError".`
+        if (self._videoStreamTrack.readyState !== 'live') {
+          return reject(new DOMException('InvalidStateError'));
+        }
+        self.videoElementPlaying.then(() => {
+          try {
+            self.canvasElement.width = self.videoElement.videoWidth;
+            self.canvasElement.height = self.videoElement.videoHeight;
+            self.canvas2dContext.drawImage(self.videoElement, 0, 0);
+            self.canvasElement.toBlob(resolve);
+          }
+          catch (error) {
+            reject(new DOMException('UnknownError'));
+          }
+        });
+      });
+    }
+    /**
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-grabframe
+     * @return {Promise<ImageBitmap>} Fulfilled promise with
+     * [ImageBitmap](https://www.w3.org/TR/html51/webappapis.html#webappapis-images)
+     * argument on success; rejected promise on failure
+     */
+    grabFrame() {
+      const self = this;
+      return new Promise(function executorGF(resolve, reject) {
+        // `If the readyState of the MediaStreamTrack provided in the constructor is not live,
+        // return a promise rejected with a new DOMException whose name is "InvalidStateError".`
+        if (self._videoStreamTrack.readyState !== 'live') {
+          return reject(new DOMException('InvalidStateError'));
+        }
+        self.videoElementPlaying.then(() => {
+          try {
+            self.canvasElement.width = self.videoElement.videoWidth;
+            self.canvasElement.height = self.videoElement.videoHeight;
+            self.canvas2dContext.drawImage(self.videoElement, 0, 0);
+            // TODO polyfill https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmapFactories/createImageBitmap for IE
+            resolve(window.createImageBitmap(self.canvasElement));
+          }
+          catch (error) {
+            reject(new DOMException('UnknownError'));
+          }
+        });
+      });
+    }
+  };
+}
+window.ImageCapture = ImageCapture;
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/toast/toast.css b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/toast/toast.css
new file mode 100644
index 0000000..180ec87
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/toast/toast.css
@@ -0,0 +1,37 @@
+:host {
+  position: fixed;
+  bottom: 20px;
+  left: 0;
+  right: 0;
+  display: flex;
+
+  opacity: 0;
+}
+
+:host(.in) {
+  transition: opacity 300ms;
+  opacity: 1;
+}
+
+:host(.out) {
+  transition: opacity 1s;
+  opacity: 0;
+}
+
+.wrapper {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.toast {
+  font-family: -apple-system, system-ui, "Helvetica Neue", Roboto, sans-serif;
+  background-color: #eee;
+  color: black;
+  border-radius: 5px;
+  padding: 10px 15px;
+  font-size: 14px;
+  font-weight: 500;
+  box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.20);
+}
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/toast/toast.js b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/toast/toast.js
new file mode 100644
index 0000000..3dc57b7
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/components/toast/toast.js
@@ -0,0 +1,93 @@
+import { h } from '@stencil/core';
+export class PWAToast {
+  constructor() {
+    this.message = undefined;
+    this.duration = 2000;
+    this.closing = null;
+  }
+  hostData() {
+    const classes = {
+      out: !!this.closing
+    };
+    if (this.closing !== null) {
+      classes['in'] = !this.closing;
+    }
+    return {
+      class: classes
+    };
+  }
+  componentDidLoad() {
+    setTimeout(() => {
+      this.closing = false;
+    });
+    setTimeout(() => {
+      this.close();
+    }, this.duration);
+  }
+  close() {
+    this.closing = true;
+    setTimeout(() => {
+      this.el.parentNode.removeChild(this.el);
+    }, 1000);
+  }
+  render() {
+    return (h("div", { class: "wrapper" }, h("div", { class: "toast" }, this.message)));
+  }
+  static get is() { return "pwa-toast"; }
+  static get encapsulation() { return "shadow"; }
+  static get originalStyleUrls() {
+    return {
+      "$": ["toast.css"]
+    };
+  }
+  static get styleUrls() {
+    return {
+      "$": ["toast.css"]
+    };
+  }
+  static get properties() {
+    return {
+      "message": {
+        "type": "string",
+        "mutable": false,
+        "complexType": {
+          "original": "string",
+          "resolved": "string",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "message",
+        "reflect": false
+      },
+      "duration": {
+        "type": "number",
+        "mutable": false,
+        "complexType": {
+          "original": "number",
+          "resolved": "number",
+          "references": {}
+        },
+        "required": false,
+        "optional": false,
+        "docs": {
+          "tags": [],
+          "text": ""
+        },
+        "attribute": "duration",
+        "reflect": false,
+        "defaultValue": "2000"
+      }
+    };
+  }
+  static get states() {
+    return {
+      "closing": {}
+    };
+  }
+  static get elementRef() { return "el"; }
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/definitions.js b/frontend/node_modules/@ionic/pwa-elements/dist/collection/definitions.js
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/definitions.js
@@ -0,0 +1 @@
+export {};
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/collection/index.js b/frontend/node_modules/@ionic/pwa-elements/dist/collection/index.js
new file mode 100644
index 0000000..07635cb
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/collection/index.js
@@ -0,0 +1 @@
+export * from './components';
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/index-1c5c47b4.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/index-1c5c47b4.js
new file mode 100644
index 0000000..6f5cdf8
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/index-1c5c47b4.js
@@ -0,0 +1 @@
+var __extends=this&&this.__extends||function(){var e=function(t,n){e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n))e[n]=t[n]};return e(t,n)};return function(t,n){if(typeof n!=="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}();var __awaiter=this&&this.__awaiter||function(e,t,n,r){function a(e){return e instanceof n?e:new n((function(t){t(e)}))}return new(n||(n=Promise))((function(n,o){function s(e){try{l(r.next(e))}catch(e){o(e)}}function i(e){try{l(r["throw"](e))}catch(e){o(e)}}function l(e){e.done?n(e.value):a(e.value).then(s,i)}l((r=r.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var n={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,a,o,s;return s={next:i(0),throw:i(1),return:i(2)},typeof Symbol==="function"&&(s[Symbol.iterator]=function(){return this}),s;function i(e){return function(t){return l([e,t])}}function l(i){if(r)throw new TypeError("Generator is already executing.");while(s&&(s=0,i[0]&&(n=0)),n)try{if(r=1,a&&(o=i[0]&2?a["return"]:i[0]?a["throw"]||((o=a["return"])&&o.call(a),0):a.next)&&!(o=o.call(a,i[1])).done)return o;if(a=0,o)i=[i[0]&2,o.value];switch(i[0]){case 0:case 1:o=i;break;case 4:n.label++;return{value:i[1],done:false};case 5:n.label++;a=i[1];i=[0];continue;case 7:i=n.ops.pop();n.trys.pop();continue;default:if(!(o=n.trys,o=o.length>0&&o[o.length-1])&&(i[0]===6||i[0]===2)){n=0;continue}if(i[0]===3&&(!o||i[1]>o[0]&&i[1]<o[3])){n.label=i[1];break}if(i[0]===6&&n.label<o[1]){n.label=o[1];o=i;break}if(o&&n.label<o[2]){n.label=o[2];n.ops.push(i);break}if(o[2])n.ops.pop();n.trys.pop();continue}i=t.call(e,n)}catch(e){i=[6,e];a=0}finally{r=o=0}if(i[0]&5)throw i[1];return{value:i[0]?i[1]:void 0,done:true}}};var __spreadArray=this&&this.__spreadArray||function(e,t,n){if(n||arguments.length===2)for(var r=0,a=t.length,o;r<a;r++){if(o||!(r in t)){if(!o)o=Array.prototype.slice.call(t,0,r);o[r]=t[r]}}return e.concat(o||Array.prototype.slice.call(t))};var NAMESPACE="ionicpwaelements";var scopeId;var hostTagName;var isSvgMode=false;var queuePending=false;var createTime=function(e,t){if(t===void 0){t=""}{return function(){return}}};var uniqueTime=function(e,t){{return function(){return}}};var HYDRATED_CSS="{visibility:hidden}.hydrated{visibility:inherit}";var EMPTY_OBJ={};var SVG_NS="http://www.w3.org/2000/svg";var HTML_NS="http://www.w3.org/1999/xhtml";var isDef=function(e){return e!=null};var isComplexType=function(e){e=typeof e;return e==="object"||e==="function"};function queryNonceMetaTagContent(e){var t,n,r;return(r=(n=(t=e.head)===null||t===void 0?void 0:t.querySelector('meta[name="csp-nonce"]'))===null||n===void 0?void 0:n.getAttribute("content"))!==null&&r!==void 0?r:undefined}var h=function(e,t){var n=[];for(var r=2;r<arguments.length;r++){n[r-2]=arguments[r]}var a=null;var o=false;var s=false;var i=[];var l=function(t){for(var n=0;n<t.length;n++){a=t[n];if(Array.isArray(a)){l(a)}else if(a!=null&&typeof a!=="boolean"){if(o=typeof e!=="function"&&!isComplexType(a)){a=String(a)}if(o&&s){i[i.length-1].$text$+=a}else{i.push(o?newVNode(null,a):a)}s=o}}};l(n);if(t){{var u=t.className||t.class;if(u){t.class=typeof u!=="object"?u:Object.keys(u).filter((function(e){return u[e]})).join(" ")}}}var c=newVNode(e,null);c.$attrs$=t;if(i.length>0){c.$children$=i}return c};var newVNode=function(e,t){var n={$flags$:0,$tag$:e,$text$:t,$elm$:null,$children$:null};{n.$attrs$=null}return n};var Host={};var isHost=function(e){return e&&e.$tag$===Host};var parsePropertyValue=function(e,t){if(e!=null&&!isComplexType(e)){if(t&4){return e==="false"?false:e===""||!!e}if(t&2){return parseFloat(e)}if(t&1){return String(e)}return e}return e};var getElement=function(e){return getHostRef(e).$hostElement$};var createEvent=function(e,t,n){var r=getElement(e);return{emit:function(e){return emitEvent(r,t,{bubbles:!!(n&4),composed:!!(n&2),cancelable:!!(n&1),detail:e})}}};var emitEvent=function(e,t,n){var r=plt.ce(t,n);e.dispatchEvent(r);return r};var rootAppliedStyles=new WeakMap;var registerStyle=function(e,t,n){var r=styles.get(e);if(supportsConstructableStylesheets&&n){r=r||new CSSStyleSheet;if(typeof r==="string"){r=t}else{r.replaceSync(t)}}else{r=t}styles.set(e,r)};var addStyle=function(e,t,n,r){var a;var o=getScopeId(t);var s=styles.get(o);e=e.nodeType===11?e:doc;if(s){if(typeof s==="string"){e=e.head||e;var i=rootAppliedStyles.get(e);var l=void 0;if(!i){rootAppliedStyles.set(e,i=new Set)}if(!i.has(o)){{{l=doc.createElement("style");l.innerHTML=s}var u=(a=plt.$nonce$)!==null&&a!==void 0?a:queryNonceMetaTagContent(doc);if(u!=null){l.setAttribute("nonce",u)}e.insertBefore(l,e.querySelector("link"))}if(i){i.add(o)}}}else if(!e.adoptedStyleSheets.includes(s)){e.adoptedStyleSheets=__spreadArray(__spreadArray([],e.adoptedStyleSheets,true),[s],false)}}return o};var attachStyles=function(e){var t=e.$cmpMeta$;var n=e.$hostElement$;var r=t.$flags$;var a=createTime("attachStyles",t.$tagName$);var o=addStyle(n.shadowRoot?n.shadowRoot:n.getRootNode(),t);if(r&10){n["s-sc"]=o;n.classList.add(o+"-h")}a()};var getScopeId=function(e,t){return"sc-"+e.$tagName$};var setAccessor=function(e,t,n,r,a,o){if(n!==r){var s=isMemberInElement(e,t);var i=t.toLowerCase();if(t==="class"){var l=e.classList;var u=parseClassList(n);var c=parseClassList(r);l.remove.apply(l,u.filter((function(e){return e&&!c.includes(e)})));l.add.apply(l,c.filter((function(e){return e&&!u.includes(e)})))}else if(t==="style"){{for(var f in n){if(!r||r[f]==null){if(f.includes("-")){e.style.removeProperty(f)}else{e.style[f]=""}}}}for(var f in r){if(!n||r[f]!==n[f]){if(f.includes("-")){e.style.setProperty(f,r[f])}else{e.style[f]=r[f]}}}}else if(t==="ref"){if(r){r(e)}}else if(!s&&t[0]==="o"&&t[1]==="n"){if(t[2]==="-"){t=t.slice(3)}else if(isMemberInElement(win,i)){t=i.slice(2)}else{t=i[2]+t.slice(3)}if(n){plt.rel(e,t,n,false)}if(r){plt.ael(e,t,r,false)}}else{var $=isComplexType(r);if((s||$&&r!==null)&&!a){try{if(!e.tagName.includes("-")){var d=r==null?"":r;if(t==="list"){s=false}else if(n==null||e[t]!=d){e[t]=d}}else{e[t]=r}}catch(e){}}if(r==null||r===false){if(r!==false||e.getAttribute(t)===""){{e.removeAttribute(t)}}}else if((!s||o&4||a)&&!$){r=r===true?"":r;{e.setAttribute(t,r)}}}}};var parseClassListRegex=/\s/;var parseClassList=function(e){return!e?[]:e.split(parseClassListRegex)};var updateElement=function(e,t,n,r){var a=t.$elm$.nodeType===11&&t.$elm$.host?t.$elm$.host:t.$elm$;var o=e&&e.$attrs$||EMPTY_OBJ;var s=t.$attrs$||EMPTY_OBJ;{for(r in o){if(!(r in s)){setAccessor(a,r,o[r],undefined,n,t.$flags$)}}}for(r in s){setAccessor(a,r,o[r],s[r],n,t.$flags$)}};var createElm=function(e,t,n,r){var a=t.$children$[n];var o=0;var s;var i;if(a.$text$!==null){s=a.$elm$=doc.createTextNode(a.$text$)}else{if(!isSvgMode){isSvgMode=a.$tag$==="svg"}s=a.$elm$=doc.createElementNS(isSvgMode?SVG_NS:HTML_NS,a.$tag$);if(isSvgMode&&a.$tag$==="foreignObject"){isSvgMode=false}{updateElement(null,a,isSvgMode)}if(isDef(scopeId)&&s["s-si"]!==scopeId){s.classList.add(s["s-si"]=scopeId)}if(a.$children$){for(o=0;o<a.$children$.length;++o){i=createElm(e,a,o);if(i){s.appendChild(i)}}}{if(a.$tag$==="svg"){isSvgMode=false}else if(s.tagName==="foreignObject"){isSvgMode=true}}}return s};var addVnodes=function(e,t,n,r,a,o){var s=e;var i;if(s.shadowRoot&&s.tagName===hostTagName){s=s.shadowRoot}for(;a<=o;++a){if(r[a]){i=createElm(null,n,a);if(i){r[a].$elm$=i;s.insertBefore(i,t)}}}};var removeVnodes=function(e,t,n){for(var r=t;r<=n;++r){var a=e[r];if(a){var o=a.$elm$;nullifyVNodeRefs(a);if(o){o.remove()}}}};var updateChildren=function(e,t,n,r){var a=0;var o=0;var s=t.length-1;var i=t[0];var l=t[s];var u=r.length-1;var c=r[0];var f=r[u];var $;while(a<=s&&o<=u){if(i==null){i=t[++a]}else if(l==null){l=t[--s]}else if(c==null){c=r[++o]}else if(f==null){f=r[--u]}else if(isSameVnode(i,c)){patch(i,c);i=t[++a];c=r[++o]}else if(isSameVnode(l,f)){patch(l,f);l=t[--s];f=r[--u]}else if(isSameVnode(i,f)){patch(i,f);e.insertBefore(i.$elm$,l.$elm$.nextSibling);i=t[++a];f=r[--u]}else if(isSameVnode(l,c)){patch(l,c);e.insertBefore(l.$elm$,i.$elm$);l=t[--s];c=r[++o]}else{{$=createElm(t&&t[o],n,o);c=r[++o]}if($){{i.$elm$.parentNode.insertBefore($,i.$elm$)}}}}if(a>s){addVnodes(e,r[u+1]==null?null:r[u+1].$elm$,n,r,o,u)}else if(o>u){removeVnodes(t,a,s)}};var isSameVnode=function(e,t){if(e.$tag$===t.$tag$){return true}return false};var patch=function(e,t){var n=t.$elm$=e.$elm$;var r=e.$children$;var a=t.$children$;var o=t.$tag$;var s=t.$text$;if(s===null){{isSvgMode=o==="svg"?true:o==="foreignObject"?false:isSvgMode}{{updateElement(e,t,isSvgMode)}}if(r!==null&&a!==null){updateChildren(n,r,t,a)}else if(a!==null){if(e.$text$!==null){n.textContent=""}addVnodes(n,null,t,a,0,a.length-1)}else if(r!==null){removeVnodes(r,0,r.length-1)}if(isSvgMode&&o==="svg"){isSvgMode=false}}else if(e.$text$!==s){n.data=s}};var nullifyVNodeRefs=function(e){{e.$attrs$&&e.$attrs$.ref&&e.$attrs$.ref(null);e.$children$&&e.$children$.map(nullifyVNodeRefs)}};var renderVdom=function(e,t){var n=e.$hostElement$;var r=e.$vnode$||newVNode(null,null);var a=isHost(t)?t:h(null,null,t);hostTagName=n.tagName;a.$tag$=null;a.$flags$|=4;e.$vnode$=a;a.$elm$=r.$elm$=n.shadowRoot||n;{scopeId=n["s-sc"]}patch(r,a)};var attachToAncestor=function(e,t){if(t&&!e.$onRenderResolve$&&t["s-p"]){t["s-p"].push(new Promise((function(t){return e.$onRenderResolve$=t})))}};var scheduleUpdate=function(e,t){{e.$flags$|=16}if(e.$flags$&4){e.$flags$|=512;return}attachToAncestor(e,e.$ancestorComponent$);var n=function(){return dispatchHooks(e,t)};return writeTask(n)};var dispatchHooks=function(e,t){var n=createTime("scheduleUpdate",e.$cmpMeta$.$tagName$);var r=e.$lazyInstance$;var a;if(t){{e.$flags$|=256;if(e.$queuedListeners$){e.$queuedListeners$.map((function(e){var t=e[0],n=e[1];return safeCall(r,t,n)}));e.$queuedListeners$=undefined}}}n();return enqueue(a,(function(){return updateComponent(e,r,t)}))};var enqueue=function(e,t){return isPromisey(e)?e.then(t):t()};var isPromisey=function(e){return e instanceof Promise||e&&e.then&&typeof e.then==="function"};var updateComponent=function(e,t,n){return __awaiter(void 0,void 0,void 0,(function(){var r,a,o,s,i,l,u;return __generator(this,(function(c){a=e.$hostElement$;o=createTime("update",e.$cmpMeta$.$tagName$);s=a["s-rc"];if(n){attachStyles(e)}i=createTime("render",e.$cmpMeta$.$tagName$);{callRender(e,t)}if(s){s.map((function(e){return e()}));a["s-rc"]=undefined}i();o();{l=(r=a["s-p"])!==null&&r!==void 0?r:[];u=function(){return postUpdateComponent(e)};if(l.length===0){u()}else{Promise.all(l).then(u);e.$flags$|=4;l.length=0}}return[2]}))}))};var callRender=function(e,t,n){try{t=t.render();{e.$flags$&=~16}{e.$flags$|=2}{{{renderVdom(e,t)}}}}catch(t){consoleError(t,e.$hostElement$)}return null};var postUpdateComponent=function(e){var t=e.$cmpMeta$.$tagName$;var n=e.$hostElement$;var r=createTime("postUpdate",t);var a=e.$lazyInstance$;var o=e.$ancestorComponent$;if(!(e.$flags$&64)){e.$flags$|=64;{addHydratedFlag(n)}{safeCall(a,"componentDidLoad")}r();{e.$onReadyResolve$(n);if(!o){appDidLoad()}}}else{r()}{e.$onInstanceResolve$(n)}{if(e.$onRenderResolve$){e.$onRenderResolve$();e.$onRenderResolve$=undefined}if(e.$flags$&512){nextTick((function(){return scheduleUpdate(e,false)}))}e.$flags$&=~(4|512)}};var forceUpdate=function(e){{var t=getHostRef(e);var n=t.$hostElement$.isConnected;if(n&&(t.$flags$&(2|16))===2){scheduleUpdate(t,false)}return n}};var appDidLoad=function(e){{addHydratedFlag(doc.documentElement)}nextTick((function(){return emitEvent(win,"appload",{detail:{namespace:NAMESPACE}})}))};var safeCall=function(e,t,n){if(e&&e[t]){try{return e[t](n)}catch(e){consoleError(e)}}return undefined};var addHydratedFlag=function(e){return e.classList.add("hydrated")};var getValue=function(e,t){return getHostRef(e).$instanceValues$.get(t)};var setValue=function(e,t,n,r){var a=getHostRef(e);var o=a.$instanceValues$.get(t);var s=a.$flags$;var i=a.$lazyInstance$;n=parsePropertyValue(n,r.$members$[t][0]);var l=Number.isNaN(o)&&Number.isNaN(n);var u=n!==o&&!l;if((!(s&8)||o===undefined)&&u){a.$instanceValues$.set(t,n);if(i){if((s&(2|16))===2){scheduleUpdate(a,false)}}}};var proxyComponent=function(e,t,n){if(t.$members$){var r=Object.entries(t.$members$);var a=e.prototype;r.map((function(e){var r=e[0],o=e[1][0];if(o&31||n&2&&o&32){Object.defineProperty(a,r,{get:function(){return getValue(this,r)},set:function(e){setValue(this,r,e,t)},configurable:true,enumerable:true})}else if(n&1&&o&64){Object.defineProperty(a,r,{value:function(){var e=[];for(var t=0;t<arguments.length;t++){e[t]=arguments[t]}var n=getHostRef(this);return n.$onInstancePromise$.then((function(){var t;return(t=n.$lazyInstance$)[r].apply(t,e)}))}})}}));if(n&1){var o=new Map;a.attributeChangedCallback=function(e,t,n){var r=this;plt.jmp((function(){var t=o.get(e);if(r.hasOwnProperty(t)){n=r[t];delete r[t]}else if(a.hasOwnProperty(t)&&typeof r[t]==="number"&&r[t]==n){return}r[t]=n===null&&typeof r[t]==="boolean"?false:n}))};e.observedAttributes=r.filter((function(e){var t=e[0],n=e[1];return n[0]&15})).map((function(e){var t=e[0],n=e[1];var r=n[1]||t;o.set(r,t);return r}))}}return e};var initializeComponent=function(e,t,n,r,a){return __awaiter(void 0,void 0,void 0,(function(){var e,r,o,s,i,l,u;return __generator(this,(function(c){switch(c.label){case 0:if(!((t.$flags$&32)===0))return[3,3];t.$flags$|=32;a=loadModule(n);if(!a.then)return[3,2];e=uniqueTime();return[4,a];case 1:a=c.sent();e();c.label=2;case 2:if(!a.isProxied){proxyComponent(a,n,2);a.isProxied=true}r=createTime("createInstance",n.$tagName$);{t.$flags$|=8}try{new a(t)}catch(e){consoleError(e)}{t.$flags$&=~8}r();if(a.style){o=a.style;s=getScopeId(n);if(!styles.has(s)){i=createTime("registerStyles",n.$tagName$);registerStyle(s,o,!!(n.$flags$&1));i()}}c.label=3;case 3:l=t.$ancestorComponent$;u=function(){return scheduleUpdate(t,true)};if(l&&l["s-rc"]){l["s-rc"].push(u)}else{u()}return[2]}}))}))};var connectedCallback=function(e){if((plt.$flags$&1)===0){var t=getHostRef(e);var n=t.$cmpMeta$;var r=createTime("connectedCallback",n.$tagName$);if(!(t.$flags$&1)){t.$flags$|=1;{var a=e;while(a=a.parentNode||a.host){if(a["s-p"]){attachToAncestor(t,t.$ancestorComponent$=a);break}}}if(n.$members$){Object.entries(n.$members$).map((function(t){var n=t[0],r=t[1][0];if(r&31&&e.hasOwnProperty(n)){var a=e[n];delete e[n];e[n]=a}}))}{initializeComponent(e,t,n)}}else{addHostEventListeners(e,t,n.$listeners$)}r()}};var disconnectedCallback=function(e){if((plt.$flags$&1)===0){var t=getHostRef(e);var n=t.$lazyInstance$;{if(t.$rmListeners$){t.$rmListeners$.map((function(e){return e()}));t.$rmListeners$=undefined}}{safeCall(n,"disconnectedCallback")}}};var bootstrapLazy=function(e,t){if(t===void 0){t={}}var n;var r=createTime();var a=[];var o=t.exclude||[];var s=win.customElements;var i=doc.head;var l=i.querySelector("meta[charset]");var u=doc.createElement("style");var c=[];var f;var $=true;Object.assign(plt,t);plt.$resourcesUrl$=new URL(t.resourcesUrl||"./",doc.baseURI).href;e.map((function(e){e[1].map((function(t){var n={$flags$:t[0],$tagName$:t[1],$members$:t[2],$listeners$:t[3]};{n.$members$=t[2]}{n.$listeners$=t[3]}var r=n.$tagName$;var i=function(e){__extends(t,e);function t(t){var r=e.call(this,t)||this;t=r;registerHost(t,n);if(n.$flags$&1){{{t.attachShadow({mode:"open"})}}}return r}t.prototype.connectedCallback=function(){var e=this;if(f){clearTimeout(f);f=null}if($){c.push(this)}else{plt.jmp((function(){return connectedCallback(e)}))}};t.prototype.disconnectedCallback=function(){var e=this;plt.jmp((function(){return disconnectedCallback(e)}))};t.prototype.componentOnReady=function(){return getHostRef(this).$onReadyPromise$};return t}(HTMLElement);n.$lazyBundleId$=e[0];if(!o.includes(r)&&!s.get(r)){a.push(r);s.define(r,proxyComponent(i,n,1))}}))}));{u.innerHTML=a+HYDRATED_CSS;u.setAttribute("data-styles","");var d=(n=plt.$nonce$)!==null&&n!==void 0?n:queryNonceMetaTagContent(doc);if(d!=null){u.setAttribute("nonce",d)}i.insertBefore(u,l?l.nextSibling:i.firstChild)}$=false;if(c.length){c.map((function(e){return e.connectedCallback()}))}else{{plt.jmp((function(){return f=setTimeout(appDidLoad,30)}))}}r()};var addHostEventListeners=function(e,t,n,r){if(n){n.map((function(n){var r=n[0],a=n[1],o=n[2];var s=getHostListenerTarget(e,r);var i=hostListenerProxy(t,o);var l=hostListenerOpts(r);plt.ael(s,a,i,l);(t.$rmListeners$=t.$rmListeners$||[]).push((function(){return plt.rel(s,a,i,l)}))}))}};var hostListenerProxy=function(e,t){return function(n){try{{if(e.$flags$&256){e.$lazyInstance$[t](n)}else{(e.$queuedListeners$=e.$queuedListeners$||[]).push([t,n])}}}catch(e){consoleError(e)}}};var getHostListenerTarget=function(e,t){if(t&16)return doc.body;return e};var hostListenerOpts=function(e){return(e&2)!==0};var setNonce=function(e){return plt.$nonce$=e};var hostRefs=new WeakMap;var getHostRef=function(e){return hostRefs.get(e)};var registerInstance=function(e,t){return hostRefs.set(t.$lazyInstance$=e,t)};var registerHost=function(e,t){var n={$flags$:0,$hostElement$:e,$cmpMeta$:t,$instanceValues$:new Map};{n.$onInstancePromise$=new Promise((function(e){return n.$onInstanceResolve$=e}))}{n.$onReadyPromise$=new Promise((function(e){return n.$onReadyResolve$=e}));e["s-p"]=[];e["s-rc"]=[]}addHostEventListeners(e,n,t.$listeners$);return hostRefs.set(e,n)};var isMemberInElement=function(e,t){return t in e};var consoleError=function(e,t){return(0,console.error)(e,t)};var cmpModules=new Map;var loadModule=function(e,t,n){var r=e.$tagName$.replace(/-/g,"_");var a=e.$lazyBundleId$;var o=cmpModules.get(a);if(o){return o[r]}if(!n||!BUILD.hotModuleReplacement){var s=function(e){cmpModules.set(a,e);return e[r]};switch(a){case"pwa-action-sheet":return import("./pwa-action-sheet.entry.js").then(s,consoleError);case"pwa-camera-modal":return import("./pwa-camera-modal.entry.js").then(s,consoleError);case"pwa-toast":return import("./pwa-toast.entry.js").then(s,consoleError);case"pwa-camera-modal-instance":return import("./pwa-camera-modal-instance.entry.js").then(s,consoleError);case"pwa-camera":return import("./pwa-camera.entry.js").then(s,consoleError)}}return import("./".concat(a,".entry.js").concat("")).then((function(e){{cmpModules.set(a,e)}return e[r]}),consoleError)};var styles=new Map;var win=typeof window!=="undefined"?window:{};var doc=win.document||{head:{}};var plt={$flags$:0,$resourcesUrl$:"",jmp:function(e){return e()},raf:function(e){return requestAnimationFrame(e)},ael:function(e,t,n,r){return e.addEventListener(t,n,r)},rel:function(e,t,n,r){return e.removeEventListener(t,n,r)},ce:function(e,t){return new CustomEvent(e,t)}};var promiseResolve=function(e){return Promise.resolve(e)};var supportsConstructableStylesheets=function(){try{new CSSStyleSheet;return typeof(new CSSStyleSheet).replaceSync==="function"}catch(e){}return false}();var queueDomReads=[];var queueDomWrites=[];var queueTask=function(e,t){return function(n){e.push(n);if(!queuePending){queuePending=true;if(t&&plt.$flags$&4){nextTick(flush)}else{plt.raf(flush)}}}};var consume=function(e){for(var t=0;t<e.length;t++){try{e[t](performance.now())}catch(e){consoleError(e)}}e.length=0};var flush=function(){consume(queueDomReads);{consume(queueDomWrites);if(queuePending=queueDomReads.length>0){plt.raf(flush)}}};var nextTick=function(e){return promiseResolve().then(e)};var writeTask=queueTask(queueDomWrites,true);export{Host as H,bootstrapLazy as b,createEvent as c,forceUpdate as f,getElement as g,h,promiseResolve as p,registerInstance as r,setNonce as s};
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/index.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/ionicpwaelements.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/ionicpwaelements.js
new file mode 100644
index 0000000..a1b8a72
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/ionicpwaelements.js
@@ -0,0 +1 @@
+import{p as promiseResolve,b as bootstrapLazy}from"./index-1c5c47b4.js";export{s as setNonce}from"./index-1c5c47b4.js";var patchBrowser=function(){var e=import.meta.url;var a={};if(e!==""){a.resourcesUrl=new URL(".",e).href}return promiseResolve(a)};patchBrowser().then((function(e){return bootstrapLazy([["pwa-camera-modal",[[1,"pwa-camera-modal",{facingMode:[1,"facing-mode"],hidePicker:[4,"hide-picker"],present:[64],dismiss:[64]}]]],["pwa-action-sheet",[[1,"pwa-action-sheet",{header:[1],cancelable:[4],options:[16],open:[32]}]]],["pwa-toast",[[1,"pwa-toast",{message:[1],duration:[2],closing:[32]}]]],["pwa-camera",[[1,"pwa-camera",{facingMode:[1,"facing-mode"],handlePhoto:[16],hidePicker:[4,"hide-picker"],handleNoDeviceError:[16],noDevicesText:[1,"no-devices-text"],noDevicesButtonText:[1,"no-devices-button-text"],photo:[32],photoSrc:[32],showShutterOverlay:[32],flashIndex:[32],hasCamera:[32],rotation:[32],deviceError:[32]}]]],["pwa-camera-modal-instance",[[1,"pwa-camera-modal-instance",{facingMode:[1,"facing-mode"],hidePicker:[4,"hide-picker"],noDevicesText:[1,"no-devices-text"],noDevicesButtonText:[1,"no-devices-button-text"]},[[16,"keyup","handleBackdropKeyUp"]]]]]],e)}));
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/loader.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/loader.js
new file mode 100644
index 0000000..89fde8d
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/loader.js
@@ -0,0 +1 @@
+import{p as promiseResolve,b as bootstrapLazy}from"./index-1c5c47b4.js";export{s as setNonce}from"./index-1c5c47b4.js";var patchEsm=function(){return promiseResolve()};var defineCustomElements=function(e,o){if(typeof window==="undefined")return Promise.resolve();return patchEsm().then((function(){return bootstrapLazy([["pwa-camera-modal",[[1,"pwa-camera-modal",{facingMode:[1,"facing-mode"],hidePicker:[4,"hide-picker"],present:[64],dismiss:[64]}]]],["pwa-action-sheet",[[1,"pwa-action-sheet",{header:[1],cancelable:[4],options:[16],open:[32]}]]],["pwa-toast",[[1,"pwa-toast",{message:[1],duration:[2],closing:[32]}]]],["pwa-camera",[[1,"pwa-camera",{facingMode:[1,"facing-mode"],handlePhoto:[16],hidePicker:[4,"hide-picker"],handleNoDeviceError:[16],noDevicesText:[1,"no-devices-text"],noDevicesButtonText:[1,"no-devices-button-text"],photo:[32],photoSrc:[32],showShutterOverlay:[32],flashIndex:[32],hasCamera:[32],rotation:[32],deviceError:[32]}]]],["pwa-camera-modal-instance",[[1,"pwa-camera-modal-instance",{facingMode:[1,"facing-mode"],hidePicker:[4,"hide-picker"],noDevicesText:[1,"no-devices-text"],noDevicesButtonText:[1,"no-devices-button-text"]},[[16,"keyup","handleBackdropKeyUp"]]]]]],o)}))};export{defineCustomElements};
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-action-sheet.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-action-sheet.entry.js
new file mode 100644
index 0000000..36f6d26
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-action-sheet.entry.js
@@ -0,0 +1 @@
+import{r as registerInstance,c as createEvent,h,g as getElement}from"./index-1c5c47b4.js";var actionSheetCss=':host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:-apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0);-webkit-transition:400ms background-color cubic-bezier(.36,.66,.04,1);transition:400ms background-color cubic-bezier(.36,.66,.04,1)}.wrapper.open{background-color:rgba(0, 0, 0, 0.32)}.title{color:#999;height:23px;line-height:23px;padding-bottom:17px;-webkit-padding-end:16px;padding-inline-end:16px;-webkit-padding-start:16px;padding-inline-start:16px;padding-left:16px;padding-right:16px;padding-top:20px}.content{width:568px;-ms-flex-item-align:end;align-self:flex-end;background-color:#fff;-webkit-transition:400ms -webkit-transform cubic-bezier(.36,.66,.04,1);transition:400ms -webkit-transform cubic-bezier(.36,.66,.04,1);transition:400ms transform cubic-bezier(.36,.66,.04,1);transition:400ms transform cubic-bezier(.36,.66,.04,1), 400ms -webkit-transform cubic-bezier(.36,.66,.04,1);-webkit-transform:translateY(100%);transform:translateY(100%)}.wrapper.open .content{-webkit-transform:translateY(0%);transform:translateY(0%)}@media only screen and (max-width: 568px){.content{width:100%}}.action-sheet-option{cursor:pointer;height:52px;line-height:52px}.action-sheet-button{color:rgb(38, 38, 38);font-size:16px;-webkit-padding-end:16px;padding-inline-end:16px;-webkit-padding-start:16px;padding-inline-start:16px;padding-left:16px;padding-right:16px;padding-top:0px}.action-sheet-button:hover{background-color:#F6F6F6}';var PWAActionSheet=function(){function e(e){registerInstance(this,e);this.onSelection=createEvent(this,"onSelection",7);this.header=undefined;this.cancelable=true;this.options=[];this.open=false}e.prototype.componentDidLoad=function(){var e=this;requestAnimationFrame((function(){e.open=true}))};e.prototype.dismiss=function(){if(this.cancelable){this.close()}};e.prototype.close=function(){var e=this;this.open=false;setTimeout((function(){e.el.parentNode.removeChild(e.el)}),500)};e.prototype.handleOptionClick=function(e,t){e.stopPropagation();this.onSelection.emit(t);this.close()};e.prototype.render=function(){var e=this;return h("div",{class:"wrapper".concat(this.open?" open":""),onClick:function(){return e.dismiss()}},h("div",{class:"content"},h("div",{class:"title"},this.header),this.options.map((function(t,n){return h("div",{class:"action-sheet-option",onClick:function(t){return e.handleOptionClick(t,n)}},h("div",{class:"action-sheet-button"},t.title))}))))};Object.defineProperty(e.prototype,"el",{get:function(){return getElement(this)},enumerable:false,configurable:true});return e}();PWAActionSheet.style=actionSheetCss;export{PWAActionSheet as pwa_action_sheet};
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-camera-modal-instance.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-camera-modal-instance.entry.js
new file mode 100644
index 0000000..a1746cf
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-camera-modal-instance.entry.js
@@ -0,0 +1 @@
+var __awaiter=this&&this.__awaiter||function(e,t,n,o){function r(e){return e instanceof n?e:new n((function(t){t(e)}))}return new(n||(n=Promise))((function(n,i){function a(e){try{s(o.next(e))}catch(e){i(e)}}function c(e){try{s(o["throw"](e))}catch(e){i(e)}}function s(e){e.done?n(e.value):r(e.value).then(a,c)}s((o=o.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var n={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},o,r,i,a;return a={next:c(0),throw:c(1),return:c(2)},typeof Symbol==="function"&&(a[Symbol.iterator]=function(){return this}),a;function c(e){return function(t){return s([e,t])}}function s(c){if(o)throw new TypeError("Generator is already executing.");while(a&&(a=0,c[0]&&(n=0)),n)try{if(o=1,r&&(i=c[0]&2?r["return"]:c[0]?r["throw"]||((i=r["return"])&&i.call(r),0):r.next)&&!(i=i.call(r,c[1])).done)return i;if(r=0,i)c=[c[0]&2,i.value];switch(c[0]){case 0:case 1:i=c;break;case 4:n.label++;return{value:c[1],done:false};case 5:n.label++;r=c[1];c=[0];continue;case 7:c=n.ops.pop();n.trys.pop();continue;default:if(!(i=n.trys,i=i.length>0&&i[i.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]<i[3])){n.label=c[1];break}if(c[0]===6&&n.label<i[1]){n.label=i[1];i=c;break}if(i&&n.label<i[2]){n.label=i[2];n.ops.push(c);break}if(i[2])n.ops.pop();n.trys.pop();continue}c=t.call(e,n)}catch(e){c=[6,e];r=0}finally{o=i=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:true}}};import{r as registerInstance,c as createEvent,h,g as getElement}from"./index-1c5c47b4.js";var cameraModalInstanceCss=":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict;--inset-width:600px;--inset-height:600px}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0.15)}.content{-webkit-box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);width:var(--inset-width);height:var(--inset-height);max-height:100%}@media only screen and (max-width: 600px){.content{width:100%;height:100%}}";var PWACameraModal=function(){function e(e){var t=this;registerInstance(this,e);this.onPhoto=createEvent(this,"onPhoto",7);this.noDeviceError=createEvent(this,"noDeviceError",7);this.handlePhoto=function(e){return __awaiter(t,void 0,void 0,(function(){return __generator(this,(function(t){this.onPhoto.emit(e);return[2]}))}))};this.handleNoDeviceError=function(e){return __awaiter(t,void 0,void 0,(function(){return __generator(this,(function(t){this.noDeviceError.emit(e);return[2]}))}))};this.facingMode="user";this.hidePicker=false;this.noDevicesText="No camera found";this.noDevicesButtonText="Choose image"}e.prototype.handleBackdropClick=function(e){if(e.target!==this.el){this.onPhoto.emit(null)}};e.prototype.handleComponentClick=function(e){e.stopPropagation()};e.prototype.handleBackdropKeyUp=function(e){if(e.key==="Escape"){this.onPhoto.emit(null)}};e.prototype.render=function(){var e=this;return h("div",{class:"wrapper",onClick:function(t){return e.handleBackdropClick(t)}},h("div",{class:"content"},h("pwa-camera",{onClick:function(t){return e.handleComponentClick(t)},facingMode:this.facingMode,hidePicker:this.hidePicker,handlePhoto:this.handlePhoto,handleNoDeviceError:this.handleNoDeviceError,noDevicesButtonText:this.noDevicesButtonText,noDevicesText:this.noDevicesText})))};Object.defineProperty(e.prototype,"el",{get:function(){return getElement(this)},enumerable:false,configurable:true});return e}();PWACameraModal.style=cameraModalInstanceCss;export{PWACameraModal as pwa_camera_modal_instance};
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-camera-modal.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-camera-modal.entry.js
new file mode 100644
index 0000000..3f04ded
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-camera-modal.entry.js
@@ -0,0 +1 @@
+var __awaiter=this&&this.__awaiter||function(e,t,n,r){function i(e){return e instanceof n?e:new n((function(t){t(e)}))}return new(n||(n=Promise))((function(n,o){function a(e){try{c(r.next(e))}catch(e){o(e)}}function s(e){try{c(r["throw"](e))}catch(e){o(e)}}function c(e){e.done?n(e.value):i(e.value).then(a,s)}c((r=r.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var n={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,i,o,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol==="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(e){return function(t){return c([e,t])}}function c(s){if(r)throw new TypeError("Generator is already executing.");while(a&&(a=0,s[0]&&(n=0)),n)try{if(r=1,i&&(o=s[0]&2?i["return"]:s[0]?i["throw"]||((o=i["return"])&&o.call(i),0):i.next)&&!(o=o.call(i,s[1])).done)return o;if(i=0,o)s=[s[0]&2,o.value];switch(s[0]){case 0:case 1:o=s;break;case 4:n.label++;return{value:s[1],done:false};case 5:n.label++;i=s[1];s=[0];continue;case 7:s=n.ops.pop();n.trys.pop();continue;default:if(!(o=n.trys,o=o.length>0&&o[o.length-1])&&(s[0]===6||s[0]===2)){n=0;continue}if(s[0]===3&&(!o||s[1]>o[0]&&s[1]<o[3])){n.label=s[1];break}if(s[0]===6&&n.label<o[1]){n.label=o[1];o=s;break}if(o&&n.label<o[2]){n.label=o[2];n.ops.push(s);break}if(o[2])n.ops.pop();n.trys.pop();continue}s=t.call(e,n)}catch(e){s=[6,e];i=0}finally{r=o=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:true}}};import{r as registerInstance,c as createEvent,h}from"./index-1c5c47b4.js";var cameraModalCss=":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0.15)}.content{-webkit-box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);width:600px;height:600px}";var PWACameraModal=function(){function e(e){registerInstance(this,e);this.onPhoto=createEvent(this,"onPhoto",7);this.noDeviceError=createEvent(this,"noDeviceError",7);this.facingMode="user";this.hidePicker=false}e.prototype.present=function(){return __awaiter(this,void 0,void 0,(function(){var e;var t=this;return __generator(this,(function(n){e=document.createElement("pwa-camera-modal-instance");e.facingMode=this.facingMode;e.hidePicker=this.hidePicker;e.addEventListener("onPhoto",(function(e){return __awaiter(t,void 0,void 0,(function(){var t;return __generator(this,(function(n){if(!this._modal){return[2]}t=e.detail;this.onPhoto.emit(t);return[2]}))}))}));e.addEventListener("noDeviceError",(function(e){return __awaiter(t,void 0,void 0,(function(){return __generator(this,(function(t){this.noDeviceError.emit(e);return[2]}))}))}));document.body.append(e);this._modal=e;return[2]}))}))};e.prototype.dismiss=function(){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(e){if(!this._modal){return[2]}this._modal&&this._modal.parentNode.removeChild(this._modal);this._modal=null;return[2]}))}))};e.prototype.render=function(){return h("div",null)};return e}();PWACameraModal.style=cameraModalCss;export{PWACameraModal as pwa_camera_modal};
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-camera.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-camera.entry.js
new file mode 100644
index 0000000..ae82a51
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-camera.entry.js
@@ -0,0 +1,19 @@
+var __awaiter=this&&this.__awaiter||function(e,t,i,n){function r(e){return e instanceof i?e:new i((function(t){t(e)}))}return new(i||(i=Promise))((function(i,a){function o(e){try{c(n.next(e))}catch(e){a(e)}}function s(e){try{c(n["throw"](e))}catch(e){a(e)}}function c(e){e.done?i(e.value):r(e.value).then(o,s)}c((n=n.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var i={label:0,sent:function(){if(a[0]&1)throw a[1];return a[1]},trys:[],ops:[]},n,r,a,o;return o={next:s(0),throw:s(1),return:s(2)},typeof Symbol==="function"&&(o[Symbol.iterator]=function(){return this}),o;function s(e){return function(t){return c([e,t])}}function c(s){if(n)throw new TypeError("Generator is already executing.");while(o&&(o=0,s[0]&&(i=0)),i)try{if(n=1,r&&(a=s[0]&2?r["return"]:s[0]?r["throw"]||((a=r["return"])&&a.call(r),0):r.next)&&!(a=a.call(r,s[1])).done)return a;if(r=0,a)s=[s[0]&2,a.value];switch(s[0]){case 0:case 1:a=s;break;case 4:i.label++;return{value:s[1],done:false};case 5:i.label++;r=s[1];s=[0];continue;case 7:s=i.ops.pop();i.trys.pop();continue;default:if(!(a=i.trys,a=a.length>0&&a[a.length-1])&&(s[0]===6||s[0]===2)){i=0;continue}if(s[0]===3&&(!a||s[1]>a[0]&&s[1]<a[3])){i.label=s[1];break}if(s[0]===6&&i.label<a[1]){i.label=a[1];a=s;break}if(a&&i.label<a[2]){i.label=a[2];i.ops.push(s);break}if(a[2])i.ops.pop();i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e];r=0}finally{n=a=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:true}}};import{r as registerInstance,f as forceUpdate,h,g as getElement}from"./index-1c5c47b4.js";
+/**
+ * MediaStream ImageCapture polyfill
+ *
+ * @license
+ * Copyright 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */var ImageCapture=window.ImageCapture;if(typeof ImageCapture==="undefined"){ImageCapture=function(){function e(e){var t=this;if(e.kind!=="video")throw new DOMException("NotSupportedError");this._videoStreamTrack=e;if(!("readyState"in this._videoStreamTrack)){this._videoStreamTrack.readyState="live"}this._previewStream=new MediaStream([e]);this.videoElement=document.createElement("video");this.videoElementPlaying=new Promise((function(e){t.videoElement.addEventListener("playing",e)}));if(HTMLMediaElement){this.videoElement.srcObject=this._previewStream}else{this.videoElement.src=URL.createObjectURL(this._previewStream)}this.videoElement.muted=true;this.videoElement.setAttribute("playsinline","");this.videoElement.play();this.canvasElement=document.createElement("canvas");this.canvas2dContext=this.canvasElement.getContext("2d")}Object.defineProperty(e.prototype,"videoStreamTrack",{get:function(){return this._videoStreamTrack},enumerable:false,configurable:true});e.prototype.getPhotoCapabilities=function(){return new Promise((function e(t,i){var n={current:0,min:0,max:0};t({exposureCompensation:n,exposureMode:"none",fillLightMode:["none"],focusMode:"none",imageHeight:n,imageWidth:n,iso:n,redEyeReduction:false,whiteBalanceMode:"none",zoom:n});i(new DOMException("OperationError"))}))};e.prototype.setOptions=function(e){if(e===void 0){e={}}return new Promise((function e(t,i){}))};e.prototype.takePhoto=function(){var e=this;return new Promise((function t(i,n){if(e._videoStreamTrack.readyState!=="live"){return n(new DOMException("InvalidStateError"))}e.videoElementPlaying.then((function(){try{e.canvasElement.width=e.videoElement.videoWidth;e.canvasElement.height=e.videoElement.videoHeight;e.canvas2dContext.drawImage(e.videoElement,0,0);e.canvasElement.toBlob(i)}catch(e){n(new DOMException("UnknownError"))}}))}))};e.prototype.grabFrame=function(){var e=this;return new Promise((function t(i,n){if(e._videoStreamTrack.readyState!=="live"){return n(new DOMException("InvalidStateError"))}e.videoElementPlaying.then((function(){try{e.canvasElement.width=e.videoElement.videoWidth;e.canvasElement.height=e.videoElement.videoHeight;e.canvas2dContext.drawImage(e.videoElement,0,0);i(window.createImageBitmap(e.canvasElement))}catch(e){n(new DOMException("UnknownError"))}}))}))};return e}()}window.ImageCapture=ImageCapture;var cameraCss=":host{--header-height:4em;--footer-height:9em;--header-height-landscape:3em;--footer-height-landscape:6em;--shutter-size:6em;--icon-size-header:1.5em;--icon-size-footer:2.5em;--margin-size-header:1.5em;--margin-size-footer:2.0em;font-family:-apple-system, BlinkMacSystemFont,\n    “Segoe UI”, “Roboto”, “Droid Sans”, “Helvetica Neue”, sans-serif;display:block;width:100%;height:100%}.items{-webkit-box-sizing:border-box;box-sizing:border-box;display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.items .item{-ms-flex:1;flex:1;text-align:center}.items .item:first-child{text-align:left}.items .item:last-child{text-align:right}.camera-wrapper{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;height:100%}.camera-header{color:white;background-color:black;height:var(--header-height)}.camera-header .items{padding:var(--margin-size-header)}.camera-footer{position:relative;color:white;background-color:black;height:var(--footer-height)}.camera-footer .items{padding:var(--margin-size-footer)}@media (max-height: 375px){.camera-header{--header-height:var(--header-height-landscape)}.camera-footer{--footer-height:var(--footer-height-landscape)}.camera-footer .shutter{--shutter-size:4em}}.camera-video{position:relative;-ms-flex:1;flex:1;overflow:hidden;background-color:black}video{width:100%;height:100%;max-height:100%;min-height:100%;-o-object-fit:cover;object-fit:cover;background-color:black}.pick-image{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;left:var(--margin-size-footer);top:0;height:100%;width:var(--icon-size-footer);color:white}.pick-image input{visibility:hidden}.pick-image svg{cursor:pointer;fill:white;width:var(--icon-size-footer);height:var(--icon-size-footer)}.shutter{position:absolute;left:50%;top:50%;width:var(--shutter-size);height:var(--shutter-size);margin-top:calc(var(--shutter-size) / -2);margin-left:calc(var(--shutter-size) / -2);border-radius:100%;background-color:#c6cdd8;padding:12px;-webkit-box-sizing:border-box;box-sizing:border-box}.shutter:active .shutter-button{background-color:#9da9bb}.shutter-button{background-color:white;border-radius:100%;width:100%;height:100%}.rotate{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;right:var(--margin-size-footer);top:0;height:100%;width:var(--icon-size-footer);color:white}.rotate img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.shutter-overlay{z-index:5;position:absolute;width:100%;height:100%;background-color:black}.error{width:100%;height:100%;color:white;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.no-device{background-color:black;-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;color:white}.no-device label{cursor:pointer;background:#fff;border-radius:6px;padding:6px 8px;color:black}.no-device input{visibility:hidden;height:0;margin-top:16px}.accept{background-color:black;-ms-flex:1;flex:1;overflow:hidden}.accept .accept-image{width:100%;height:100%;max-height:100%;background-position:center center;background-size:cover;background-repeat:no-repeat}.close img{cursor:pointer;width:var(--icon-size-header);height:var(--icon-size-header)}.flash img{width:var(--icon-size-header);height:var(--icon-size-header)}.accept-use img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.accept-cancel img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.offscreen-image-render{top:0;left:0;visibility:hidden;pointer-events:none;width:100%;height:100%}";var CameraPWA=function(){function e(e){var t=this;registerInstance(this,e);this.hasMultipleCameras=false;this.hasFlash=false;this.flashModes=[];this.flashMode="off";this.handlePickFile=function(e){};this.handleShutterClick=function(e){console.debug("shutter click");t.capture()};this.handleRotateClick=function(e){t.rotate()};this.handleClose=function(e){t.handlePhoto&&t.handlePhoto(null)};this.handleFlashClick=function(e){t.cycleFlash()};this.handleCancelPhoto=function(e){var i=t.stream&&t.stream.getTracks()[0];var n=i&&i.getConstraints();t.photo=null;t.photoSrc=null;if(n){t.initCamera({video:{facingMode:n.facingMode}})}else{t.initCamera()}};this.handleAcceptPhoto=function(e){t.handlePhoto&&t.handlePhoto(t.photo)};this.handleFileInputChange=function(e){return __awaiter(t,void 0,void 0,(function(){var t,i,n,r;return __generator(this,(function(a){switch(a.label){case 0:t=e.target;i=t.files[0];a.label=1;case 1:a.trys.push([1,3,,4]);return[4,this.getOrientation(i)];case 2:n=a.sent();console.debug("Got orientation",n);this.photoOrientation=n;return[3,4];case 3:r=a.sent();return[3,4];case 4:this.handlePhoto&&this.handlePhoto(i);return[2]}}))}))};this.handleVideoMetadata=function(e){console.debug("Video metadata",e)};this.facingMode="user";this.handlePhoto=undefined;this.hidePicker=false;this.handleNoDeviceError=undefined;this.noDevicesText="No camera found";this.noDevicesButtonText="Choose image";this.photo=undefined;this.photoSrc=undefined;this.showShutterOverlay=false;this.flashIndex=0;this.hasCamera=null;this.rotation=0;this.deviceError=null}e.prototype.componentDidLoad=function(){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(e){switch(e.label){case 0:this.defaultConstraints={video:{facingMode:this.facingMode}};return[4,this.queryDevices()];case 1:e.sent();return[4,this.initCamera()];case 2:e.sent();return[2]}}))}))};e.prototype.disconnectedCallback=function(){this.stopStream();this.photoSrc&&URL.revokeObjectURL(this.photoSrc)};e.prototype.hasImageCapture=function(){return"ImageCapture"in window};e.prototype.queryDevices=function(){return __awaiter(this,void 0,void 0,(function(){var e,t,i;return __generator(this,(function(n){switch(n.label){case 0:n.trys.push([0,2,,3]);return[4,navigator.mediaDevices.enumerateDevices()];case 1:e=n.sent();t=e.filter((function(e){return e.kind=="videoinput"}));this.hasCamera=!!t.length;this.hasMultipleCameras=t.length>1;return[3,3];case 2:i=n.sent();this.deviceError=i;return[3,3];case 3:return[2]}}))}))};e.prototype.initCamera=function(e){return __awaiter(this,void 0,void 0,(function(){var t,i;return __generator(this,(function(n){switch(n.label){case 0:if(!e){e=this.defaultConstraints}n.label=1;case 1:n.trys.push([1,3,,4]);return[4,navigator.mediaDevices.getUserMedia(Object.assign({video:true,audio:false},e))];case 2:t=n.sent();this.initStream(t);return[3,4];case 3:i=n.sent();this.deviceError=i;this.handleNoDeviceError&&this.handleNoDeviceError(i);return[3,4];case 4:return[2]}}))}))};e.prototype.initStream=function(e){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(t){switch(t.label){case 0:this.stream=e;this.videoElement.srcObject=e;if(!this.hasImageCapture())return[3,2];this.imageCapture=new window.ImageCapture(e.getVideoTracks()[0]);return[4,this.initPhotoCapabilities(this.imageCapture)];case 1:t.sent();return[3,3];case 2:this.deviceError="No image capture";this.handleNoDeviceError&&this.handleNoDeviceError();t.label=3;case 3:forceUpdate(this.el);return[2]}}))}))};e.prototype.initPhotoCapabilities=function(e){return __awaiter(this,void 0,void 0,(function(){var t;return __generator(this,(function(i){switch(i.label){case 0:return[4,e.getPhotoCapabilities()];case 1:t=i.sent();if(t.fillLightMode&&t.fillLightMode.length>1){this.flashModes=t.fillLightMode.map((function(e){return e}));if(this.flashMode){this.flashMode=this.flashModes[this.flashModes.indexOf(this.flashMode)]||"off";this.flashIndex=this.flashModes.indexOf(this.flashMode)||0}else{this.flashIndex=0}}return[2]}}))}))};e.prototype.stopStream=function(){if(this.videoElement){this.videoElement.srcObject=null}this.stream&&this.stream.getTracks().forEach((function(e){return e.stop()}))};e.prototype.capture=function(){return __awaiter(this,void 0,void 0,(function(){var e,t;return __generator(this,(function(i){switch(i.label){case 0:if(!this.hasImageCapture())return[3,5];i.label=1;case 1:i.trys.push([1,4,,5]);return[4,this.imageCapture.takePhoto({fillLightMode:this.flashModes.length>1?this.flashMode:undefined})];case 2:e=i.sent();return[4,this.flashScreen()];case 3:i.sent();this.promptAccept(e);return[3,5];case 4:t=i.sent();console.error("Unable to take photo!",t);return[3,5];case 5:this.stopStream();return[2]}}))}))};e.prototype.promptAccept=function(e){return __awaiter(this,void 0,void 0,(function(){var t;return __generator(this,(function(i){switch(i.label){case 0:this.photo=e;return[4,this.getOrientation(e)];case 1:t=i.sent();console.debug("Got orientation",t);this.photoOrientation=t;if(t){switch(t){case 1:case 2:this.rotation=0;break;case 3:case 4:this.rotation=180;break;case 5:case 6:this.rotation=90;break;case 7:case 8:this.rotation=270;break}}this.photoSrc=URL.createObjectURL(e);return[2]}}))}))};e.prototype.getOrientation=function(e){return new Promise((function(t){var i=new FileReader;i.onload=function(e){var i=new DataView(e.target.result);if(i.getUint16(0,false)!==65496){return t(-2)}var n=i.byteLength;var r=2;while(r<n){var a=i.getUint16(r,false);r+=2;if(a===65505){if(i.getUint32(r+=2,false)!==1165519206){return t(-1)}var o=i.getUint16(r+=6,false)===18761;r+=i.getUint32(r+4,o);var s=i.getUint16(r,o);r+=2;for(var c=0;c<s;c++){if(i.getUint16(r+c*12,o)===274){return t(i.getUint16(r+c*12+8,o))}}}else if((a&65280)!==65280){break}else{r+=i.getUint16(r,false)}}return t(-1)};i.readAsArrayBuffer(e.slice(0,64*1024))}))};e.prototype.rotate=function(){this.stopStream();var e=this.stream&&this.stream.getTracks()[0];if(!e){return}var t=e.getConstraints();var i=t.facingMode;if(!i){var n=e.getCapabilities();if(n.facingMode){i=n.facingMode[0]}}if(i==="environment"){this.initCamera({video:{facingMode:"user"}})}else{this.initCamera({video:{facingMode:"environment"}})}};e.prototype.setFlashMode=function(e){console.debug("New flash mode: ",e);this.flashMode=e};e.prototype.cycleFlash=function(){if(this.flashModes.length>0){this.flashIndex=(this.flashIndex+1)%this.flashModes.length;this.setFlashMode(this.flashModes[this.flashIndex])}};e.prototype.flashScreen=function(){return __awaiter(this,void 0,void 0,(function(){var e=this;return __generator(this,(function(t){return[2,new Promise((function(t,i){e.showShutterOverlay=true;setTimeout((function(){e.showShutterOverlay=false;t()}),100)}))]}))}))};e.prototype.iconExit=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M402.2,134L378,109.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L139.6,109.8 c-1.6-1.6-4.1-1.6-5.7,0L109.8,134c-1.6,1.6-1.6,4.1,0,5.7l113.5,113.5c1.6,1.6,1.6,4.1,0,5.7L109.8,372.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l113.5-113.5c1.6-1.6,4.1-1.6,5.7,0l113.5,113.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l113.5-113.5C403.7,138.1,403.7,135.5,402.2,134z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"};e.prototype.iconPhotos=function(){return h("svg",{xmlns:"http://www.w3.org/2000/svg",width:"512",height:"512",viewBox:"0 0 512 512"},h("path",{d:"M450.29,112H142c-34,0-62,27.51-62,61.33V418.67C80,452.49,108,480,142,480H450c34,0,62-26.18,62-60V173.33C512,139.51,484.32,112,450.29,112Zm-77.15,61.34a46,46,0,1,1-46.28,46A46.19,46.19,0,0,1,373.14,173.33Zm-231.55,276c-17,0-29.86-13.75-29.86-30.66V353.85l90.46-80.79a46.54,46.54,0,0,1,63.44,1.83L328.27,337l-113,112.33ZM480,418.67a30.67,30.67,0,0,1-30.71,30.66H259L376.08,333a46.24,46.24,0,0,1,59.44-.16L480,370.59Z"}),h("path",{d:"M384,32H64A64,64,0,0,0,0,96V352a64.11,64.11,0,0,0,48,62V152a72,72,0,0,1,72-72H446A64.11,64.11,0,0,0,384,32Z"}))};e.prototype.iconConfirm=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%232CD865' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_1_'%3E%3Cg%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M208,301.4l-55.4-55.5c-1.5-1.5-4-1.6-5.6-0.1l-23.4,22.3c-1.6,1.6-1.7,4.1-0.1,5.7l81.6,81.4 c3.1,3.1,8.2,3.1,11.3,0l171.8-171.7c1.6-1.6,1.6-4.2-0.1-5.7l-23.4-22.3c-1.6-1.5-4.1-1.5-5.6,0.1L213.7,301.4 C212.1,303,209.6,303,208,301.4z'/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E"};e.prototype.iconReverseCamera=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M352,0H160C72,0,0,72,0,160v192c0,88,72,160,160,160h192c88,0,160-72,160-160V160C512,72,440,0,352,0z M356.7,365.8l-3.7,3.3c-27,23.2-61.4,35.9-96.8,35.9c-72.4,0-135.8-54.7-147-125.6c-0.3-1.9-2-3.3-3.9-3.3H64 c-3.3,0-5.2-3.8-3.2-6.4l61.1-81.4c1.6-2.1,4.7-2.1,6.4-0.1l63.3,81.4c2,2.6,0.2,6.5-3.2,6.5h-40.6c-2.5,0-4.5,2.4-3.9,4.8 c11.5,51.5,59.2,90.6,112.4,90.6c26.4,0,51.8-9.7,73.7-27.9l3.1-2.5c1.6-1.3,3.9-1.1,5.3,0.3l18.5,18.6 C358.5,361.6,358.4,364.3,356.7,365.8z M451.4,245.6l-61,83.5c-1.6,2.2-4.8,2.2-6.4,0.1l-63.3-83.3c-2-2.6-0.1-6.4,3.2-6.4h40.8 c2.5,0,4.4-2.3,3.9-4.8c-5.1-24.2-17.8-46.5-36.5-63.7c-21.2-19.4-48.2-30.1-76-30.1c-26.5,0-52.6,9.7-73.7,27.3l-3.1,2.5 c-1.6,1.3-3.9,1.2-5.4-0.3l-18.5-18.5c-1.6-1.6-1.5-4.3,0.2-5.9l3.5-3.1c27-23.2,61.4-35.9,96.8-35.9c38,0,73.9,13.7,101.2,38.7 c23.2,21.1,40.3,55.2,45.7,90.1c0.3,1.9,1.9,3.4,3.9,3.4h41.3C451.4,239.2,453.3,243,451.4,245.6z'/%3E%3C/g%3E%3C/svg%3E"};e.prototype.iconRetake=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%23727A87' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M394.2,142L370,117.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L147.6,117.8 c-1.6-1.6-4.1-1.6-5.7,0L117.8,142c-1.6,1.6-1.6,4.1,0,5.7l105.5,105.5c1.6,1.6,1.6,4.1,0,5.7L117.8,364.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l105.5-105.5c1.6-1.6,4.1-1.6,5.7,0l105.5,105.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l105.5-105.5C395.7,146.1,395.7,143.5,394.2,142z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"};e.prototype.iconFlashOff=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cg%3E%3Cpath class='st0' d='M498,483.7L42.3,28L14,56.4l149.8,149.8L91,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9c1.6,0,2.7,1.3,2.4,2.7 L197.6,507c-1,4.4,5.8,6.9,8.9,3.2l118.6-142.8L469.6,512L498,483.7z'/%3E%3Cpath class='st0' d='M449,218.2c2.5-3,0.1-7.2-3.9-7.2H301.2c-1.6,0-2.7-1.3-2.4-2.7L342.4,5c1-4.4-5.8-6.9-8.9-3.2L214.9,144.6 l161.3,161.3L449,218.2z'/%3E%3C/g%3E%3C/svg%3E"};e.prototype.iconFlashOn=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3C/svg%3E"};e.prototype.iconFlashAuto=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3Cg%3E%3Cpath class='st0' d='M321.3,186l74-186H438l74,186h-43.5l-11.9-32.5h-80.9l-12,32.5H321.3z M415.8,47.9l-27.2,70.7h54.9l-27.2-70.7 H415.8z'/%3E%3C/g%3E%3C/svg%3E"};e.prototype.render=function(){var e=this;var t={};return h("div",{class:"camera-wrapper"},h("div",{class:"camera-header"},h("section",{class:"items"},h("div",{class:"item close",onClick:function(t){return e.handleClose(t)}},h("img",{src:this.iconExit()})),h("div",{class:"item flash",onClick:function(t){return e.handleFlashClick(t)}},this.flashModes.length>0&&h("div",null,this.flashMode=="off"?h("img",{src:this.iconFlashOff()}):"",this.flashMode=="auto"?h("img",{src:this.iconFlashAuto()}):"",this.flashMode=="flash"?h("img",{src:this.iconFlashOn()}):"")))),(this.hasCamera===false||!!this.deviceError)&&h("div",{class:"no-device"},h("h2",null,this.noDevicesText),h("label",{htmlFor:"_pwa-elements-camera-input"},this.noDevicesButtonText),h("input",{type:"file",id:"_pwa-elements-camera-input",onChange:this.handleFileInputChange,accept:"image/*",class:"select-file-button"})),this.photoSrc?h("div",{class:"accept"},h("div",{class:"accept-image",style:Object.assign({backgroundImage:"url(".concat(this.photoSrc,")")},t)})):h("div",{class:"camera-video"},this.showShutterOverlay&&h("div",{class:"shutter-overlay"}),this.hasImageCapture()?h("video",{ref:function(t){return e.videoElement=t},onLoadedMetaData:this.handleVideoMetadata,autoplay:true,playsinline:true}):h("canvas",{ref:function(t){return e.canvasElement=t},width:"100%",height:"100%"}),h("canvas",{class:"offscreen-image-render",ref:function(t){return e.offscreenCanvas=t},width:"100%",height:"100%"})),this.hasCamera&&h("div",{class:"camera-footer"},!this.photo?[!this.hidePicker&&h("div",{class:"pick-image",onClick:this.handlePickFile},h("label",{htmlFor:"_pwa-elements-file-pick"},this.iconPhotos()),h("input",{type:"file",id:"_pwa-elements-file-pick",onChange:this.handleFileInputChange,accept:"image/*",class:"pick-image-button"})),h("div",{class:"shutter",onClick:this.handleShutterClick},h("div",{class:"shutter-button"})),h("div",{class:"rotate",onClick:this.handleRotateClick},h("img",{src:this.iconReverseCamera()}))]:h("section",{class:"items"},h("div",{class:"item accept-cancel",onClick:function(t){return e.handleCancelPhoto(t)}},h("img",{src:this.iconRetake()})),h("div",{class:"item accept-use",onClick:function(t){return e.handleAcceptPhoto(t)}},h("img",{src:this.iconConfirm()})))))};Object.defineProperty(e,"assetsDirs",{get:function(){return["icons"]},enumerable:false,configurable:true});Object.defineProperty(e.prototype,"el",{get:function(){return getElement(this)},enumerable:false,configurable:true});return e}();CameraPWA.style=cameraCss;export{CameraPWA as pwa_camera};
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-toast.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-toast.entry.js
new file mode 100644
index 0000000..2b8e239
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm-es5/pwa-toast.entry.js
@@ -0,0 +1 @@
+import{r as registerInstance,h,g as getElement,H as Host}from"./index-1c5c47b4.js";var toastCss=':host{position:fixed;bottom:20px;left:0;right:0;display:-ms-flexbox;display:flex;opacity:0}:host(.in){-webkit-transition:opacity 300ms;transition:opacity 300ms;opacity:1}:host(.out){-webkit-transition:opacity 1s;transition:opacity 1s;opacity:0}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.toast{font-family:-apple-system, system-ui, "Helvetica Neue", Roboto, sans-serif;background-color:#eee;color:black;border-radius:5px;padding:10px 15px;font-size:14px;font-weight:500;-webkit-box-shadow:0px 1px 2px rgba(0, 0, 0, 0.20);box-shadow:0px 1px 2px rgba(0, 0, 0, 0.20)}';var PWAToast=function(){function t(t){registerInstance(this,t);this.message=undefined;this.duration=2e3;this.closing=null}t.prototype.hostData=function(){var t={out:!!this.closing};if(this.closing!==null){t["in"]=!this.closing}return{class:t}};t.prototype.componentDidLoad=function(){var t=this;setTimeout((function(){t.closing=false}));setTimeout((function(){t.close()}),this.duration)};t.prototype.close=function(){var t=this;this.closing=true;setTimeout((function(){t.el.parentNode.removeChild(t.el)}),1e3)};t.prototype.__stencil_render=function(){return h("div",{class:"wrapper"},h("div",{class:"toast"},this.message))};Object.defineProperty(t.prototype,"el",{get:function(){return getElement(this)},enumerable:false,configurable:true});t.prototype.render=function(){return h(Host,this.hostData(),this.__stencil_render())};return t}();PWAToast.style=toastCss;export{PWAToast as pwa_toast};
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/index-1c5c47b4.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/index-1c5c47b4.js
new file mode 100644
index 0000000..14e6a7f
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/index-1c5c47b4.js
@@ -0,0 +1,1636 @@
+const NAMESPACE = 'ionicpwaelements';
+
+/**
+ * Virtual DOM patching algorithm based on Snabbdom by
+ * Simon Friis Vindum (@paldepind)
+ * Licensed under the MIT License
+ * https://github.com/snabbdom/snabbdom/blob/master/LICENSE
+ *
+ * Modified for Stencil's renderer and slot projection
+ */
+let scopeId;
+let hostTagName;
+let isSvgMode = false;
+let queuePending = false;
+const createTime = (fnName, tagName = '') => {
+    {
+        return () => {
+            return;
+        };
+    }
+};
+const uniqueTime = (key, measureText) => {
+    {
+        return () => {
+            return;
+        };
+    }
+};
+const HYDRATED_CSS = '{visibility:hidden}.hydrated{visibility:inherit}';
+/**
+ * Default style mode id
+ */
+/**
+ * Reusable empty obj/array
+ * Don't add values to these!!
+ */
+const EMPTY_OBJ = {};
+/**
+ * Namespaces
+ */
+const SVG_NS = 'http://www.w3.org/2000/svg';
+const HTML_NS = 'http://www.w3.org/1999/xhtml';
+const isDef = (v) => v != null;
+/**
+ * Check whether a value is a 'complex type', defined here as an object or a
+ * function.
+ *
+ * @param o the value to check
+ * @returns whether it's a complex type or not
+ */
+const isComplexType = (o) => {
+    // https://jsperf.com/typeof-fn-object/5
+    o = typeof o;
+    return o === 'object' || o === 'function';
+};
+/**
+ * Helper method for querying a `meta` tag that contains a nonce value
+ * out of a DOM's head.
+ *
+ * @param doc The DOM containing the `head` to query against
+ * @returns The content of the meta tag representing the nonce value, or `undefined` if no tag
+ * exists or the tag has no content.
+ */
+function queryNonceMetaTagContent(doc) {
+    var _a, _b, _c;
+    return (_c = (_b = (_a = doc.head) === null || _a === void 0 ? void 0 : _a.querySelector('meta[name="csp-nonce"]')) === null || _b === void 0 ? void 0 : _b.getAttribute('content')) !== null && _c !== void 0 ? _c : undefined;
+}
+/**
+ * Production h() function based on Preact by
+ * Jason Miller (@developit)
+ * Licensed under the MIT License
+ * https://github.com/developit/preact/blob/master/LICENSE
+ *
+ * Modified for Stencil's compiler and vdom
+ */
+// export function h(nodeName: string | d.FunctionalComponent, vnodeData: d.PropsType, child?: d.ChildType): d.VNode;
+// export function h(nodeName: string | d.FunctionalComponent, vnodeData: d.PropsType, ...children: d.ChildType[]): d.VNode;
+const h = (nodeName, vnodeData, ...children) => {
+    let child = null;
+    let simple = false;
+    let lastSimple = false;
+    const vNodeChildren = [];
+    const walk = (c) => {
+        for (let i = 0; i < c.length; i++) {
+            child = c[i];
+            if (Array.isArray(child)) {
+                walk(child);
+            }
+            else if (child != null && typeof child !== 'boolean') {
+                if ((simple = typeof nodeName !== 'function' && !isComplexType(child))) {
+                    child = String(child);
+                }
+                if (simple && lastSimple) {
+                    // If the previous child was simple (string), we merge both
+                    vNodeChildren[vNodeChildren.length - 1].$text$ += child;
+                }
+                else {
+                    // Append a new vNode, if it's text, we create a text vNode
+                    vNodeChildren.push(simple ? newVNode(null, child) : child);
+                }
+                lastSimple = simple;
+            }
+        }
+    };
+    walk(children);
+    if (vnodeData) {
+        {
+            const classData = vnodeData.className || vnodeData.class;
+            if (classData) {
+                vnodeData.class =
+                    typeof classData !== 'object'
+                        ? classData
+                        : Object.keys(classData)
+                            .filter((k) => classData[k])
+                            .join(' ');
+            }
+        }
+    }
+    const vnode = newVNode(nodeName, null);
+    vnode.$attrs$ = vnodeData;
+    if (vNodeChildren.length > 0) {
+        vnode.$children$ = vNodeChildren;
+    }
+    return vnode;
+};
+/**
+ * A utility function for creating a virtual DOM node from a tag and some
+ * possible text content.
+ *
+ * @param tag the tag for this element
+ * @param text possible text content for the node
+ * @returns a newly-minted virtual DOM node
+ */
+const newVNode = (tag, text) => {
+    const vnode = {
+        $flags$: 0,
+        $tag$: tag,
+        $text$: text,
+        $elm$: null,
+        $children$: null,
+    };
+    {
+        vnode.$attrs$ = null;
+    }
+    return vnode;
+};
+const Host = {};
+/**
+ * Check whether a given node is a Host node or not
+ *
+ * @param node the virtual DOM node to check
+ * @returns whether it's a Host node or not
+ */
+const isHost = (node) => node && node.$tag$ === Host;
+/**
+ * Parse a new property value for a given property type.
+ *
+ * While the prop value can reasonably be expected to be of `any` type as far as TypeScript's type checker is concerned,
+ * it is not safe to assume that the string returned by evaluating `typeof propValue` matches:
+ *   1. `any`, the type given to `propValue` in the function signature
+ *   2. the type stored from `propType`.
+ *
+ * This function provides the capability to parse/coerce a property's value to potentially any other JavaScript type.
+ *
+ * Property values represented in TSX preserve their type information. In the example below, the number 0 is passed to
+ * a component. This `propValue` will preserve its type information (`typeof propValue === 'number'`). Note that is
+ * based on the type of the value being passed in, not the type declared of the class member decorated with `@Prop`.
+ * ```tsx
+ * <my-cmp prop-val={0}></my-cmp>
+ * ```
+ *
+ * HTML prop values on the other hand, will always a string
+ *
+ * @param propValue the new value to coerce to some type
+ * @param propType the type of the prop, expressed as a binary number
+ * @returns the parsed/coerced value
+ */
+const parsePropertyValue = (propValue, propType) => {
+    // ensure this value is of the correct prop type
+    if (propValue != null && !isComplexType(propValue)) {
+        if (propType & 4 /* MEMBER_FLAGS.Boolean */) {
+            // per the HTML spec, any string value means it is a boolean true value
+            // but we'll cheat here and say that the string "false" is the boolean false
+            return propValue === 'false' ? false : propValue === '' || !!propValue;
+        }
+        if (propType & 2 /* MEMBER_FLAGS.Number */) {
+            // force it to be a number
+            return parseFloat(propValue);
+        }
+        if (propType & 1 /* MEMBER_FLAGS.String */) {
+            // could have been passed as a number or boolean
+            // but we still want it as a string
+            return String(propValue);
+        }
+        // redundant return here for better minification
+        return propValue;
+    }
+    // not sure exactly what type we want
+    // so no need to change to a different type
+    return propValue;
+};
+const getElement = (ref) => (getHostRef(ref).$hostElement$ );
+const createEvent = (ref, name, flags) => {
+    const elm = getElement(ref);
+    return {
+        emit: (detail) => {
+            return emitEvent(elm, name, {
+                bubbles: !!(flags & 4 /* EVENT_FLAGS.Bubbles */),
+                composed: !!(flags & 2 /* EVENT_FLAGS.Composed */),
+                cancelable: !!(flags & 1 /* EVENT_FLAGS.Cancellable */),
+                detail,
+            });
+        },
+    };
+};
+/**
+ * Helper function to create & dispatch a custom Event on a provided target
+ * @param elm the target of the Event
+ * @param name the name to give the custom Event
+ * @param opts options for configuring a custom Event
+ * @returns the custom Event
+ */
+const emitEvent = (elm, name, opts) => {
+    const ev = plt.ce(name, opts);
+    elm.dispatchEvent(ev);
+    return ev;
+};
+const rootAppliedStyles = /*@__PURE__*/ new WeakMap();
+const registerStyle = (scopeId, cssText, allowCS) => {
+    let style = styles.get(scopeId);
+    if (supportsConstructableStylesheets && allowCS) {
+        style = (style || new CSSStyleSheet());
+        if (typeof style === 'string') {
+            style = cssText;
+        }
+        else {
+            style.replaceSync(cssText);
+        }
+    }
+    else {
+        style = cssText;
+    }
+    styles.set(scopeId, style);
+};
+const addStyle = (styleContainerNode, cmpMeta, mode, hostElm) => {
+    var _a;
+    let scopeId = getScopeId(cmpMeta);
+    const style = styles.get(scopeId);
+    // if an element is NOT connected then getRootNode() will return the wrong root node
+    // so the fallback is to always use the document for the root node in those cases
+    styleContainerNode = styleContainerNode.nodeType === 11 /* NODE_TYPE.DocumentFragment */ ? styleContainerNode : doc;
+    if (style) {
+        if (typeof style === 'string') {
+            styleContainerNode = styleContainerNode.head || styleContainerNode;
+            let appliedStyles = rootAppliedStyles.get(styleContainerNode);
+            let styleElm;
+            if (!appliedStyles) {
+                rootAppliedStyles.set(styleContainerNode, (appliedStyles = new Set()));
+            }
+            if (!appliedStyles.has(scopeId)) {
+                {
+                    // TODO(STENCIL-659): Remove code implementing the CSS variable shim
+                    {
+                        styleElm = doc.createElement('style');
+                        styleElm.innerHTML = style;
+                    }
+                    // Apply CSP nonce to the style tag if it exists
+                    const nonce = (_a = plt.$nonce$) !== null && _a !== void 0 ? _a : queryNonceMetaTagContent(doc);
+                    if (nonce != null) {
+                        styleElm.setAttribute('nonce', nonce);
+                    }
+                    styleContainerNode.insertBefore(styleElm, styleContainerNode.querySelector('link'));
+                }
+                if (appliedStyles) {
+                    appliedStyles.add(scopeId);
+                }
+            }
+        }
+        else if (!styleContainerNode.adoptedStyleSheets.includes(style)) {
+            styleContainerNode.adoptedStyleSheets = [...styleContainerNode.adoptedStyleSheets, style];
+        }
+    }
+    return scopeId;
+};
+const attachStyles = (hostRef) => {
+    const cmpMeta = hostRef.$cmpMeta$;
+    const elm = hostRef.$hostElement$;
+    const flags = cmpMeta.$flags$;
+    const endAttachStyles = createTime('attachStyles', cmpMeta.$tagName$);
+    const scopeId = addStyle(elm.shadowRoot ? elm.shadowRoot : elm.getRootNode(), cmpMeta);
+    // TODO(STENCIL-662): Remove code related to deprecated shadowDomShim field
+    if (flags & 10 /* CMP_FLAGS.needsScopedEncapsulation */) {
+        // only required when we're NOT using native shadow dom (slot)
+        // or this browser doesn't support native shadow dom
+        // and this host element was NOT created with SSR
+        // let's pick out the inner content for slot projection
+        // create a node to represent where the original
+        // content was first placed, which is useful later on
+        // DOM WRITE!!
+        elm['s-sc'] = scopeId;
+        elm.classList.add(scopeId + '-h');
+    }
+    endAttachStyles();
+};
+const getScopeId = (cmp, mode) => 'sc-' + (cmp.$tagName$);
+/**
+ * Production setAccessor() function based on Preact by
+ * Jason Miller (@developit)
+ * Licensed under the MIT License
+ * https://github.com/developit/preact/blob/master/LICENSE
+ *
+ * Modified for Stencil's compiler and vdom
+ */
+const setAccessor = (elm, memberName, oldValue, newValue, isSvg, flags) => {
+    if (oldValue !== newValue) {
+        let isProp = isMemberInElement(elm, memberName);
+        let ln = memberName.toLowerCase();
+        if (memberName === 'class') {
+            const classList = elm.classList;
+            const oldClasses = parseClassList(oldValue);
+            const newClasses = parseClassList(newValue);
+            classList.remove(...oldClasses.filter((c) => c && !newClasses.includes(c)));
+            classList.add(...newClasses.filter((c) => c && !oldClasses.includes(c)));
+        }
+        else if (memberName === 'style') {
+            // update style attribute, css properties and values
+            {
+                for (const prop in oldValue) {
+                    if (!newValue || newValue[prop] == null) {
+                        if (prop.includes('-')) {
+                            elm.style.removeProperty(prop);
+                        }
+                        else {
+                            elm.style[prop] = '';
+                        }
+                    }
+                }
+            }
+            for (const prop in newValue) {
+                if (!oldValue || newValue[prop] !== oldValue[prop]) {
+                    if (prop.includes('-')) {
+                        elm.style.setProperty(prop, newValue[prop]);
+                    }
+                    else {
+                        elm.style[prop] = newValue[prop];
+                    }
+                }
+            }
+        }
+        else if (memberName === 'ref') {
+            // minifier will clean this up
+            if (newValue) {
+                newValue(elm);
+            }
+        }
+        else if ((!isProp ) &&
+            memberName[0] === 'o' &&
+            memberName[1] === 'n') {
+            // Event Handlers
+            // so if the member name starts with "on" and the 3rd characters is
+            // a capital letter, and it's not already a member on the element,
+            // then we're assuming it's an event listener
+            if (memberName[2] === '-') {
+                // on- prefixed events
+                // allows to be explicit about the dom event to listen without any magic
+                // under the hood:
+                // <my-cmp on-click> // listens for "click"
+                // <my-cmp on-Click> // listens for "Click"
+                // <my-cmp on-ionChange> // listens for "ionChange"
+                // <my-cmp on-EVENTS> // listens for "EVENTS"
+                memberName = memberName.slice(3);
+            }
+            else if (isMemberInElement(win, ln)) {
+                // standard event
+                // the JSX attribute could have been "onMouseOver" and the
+                // member name "onmouseover" is on the window's prototype
+                // so let's add the listener "mouseover", which is all lowercased
+                memberName = ln.slice(2);
+            }
+            else {
+                // custom event
+                // the JSX attribute could have been "onMyCustomEvent"
+                // so let's trim off the "on" prefix and lowercase the first character
+                // and add the listener "myCustomEvent"
+                // except for the first character, we keep the event name case
+                memberName = ln[2] + memberName.slice(3);
+            }
+            if (oldValue) {
+                plt.rel(elm, memberName, oldValue, false);
+            }
+            if (newValue) {
+                plt.ael(elm, memberName, newValue, false);
+            }
+        }
+        else {
+            // Set property if it exists and it's not a SVG
+            const isComplex = isComplexType(newValue);
+            if ((isProp || (isComplex && newValue !== null)) && !isSvg) {
+                try {
+                    if (!elm.tagName.includes('-')) {
+                        const n = newValue == null ? '' : newValue;
+                        // Workaround for Safari, moving the <input> caret when re-assigning the same valued
+                        if (memberName === 'list') {
+                            isProp = false;
+                        }
+                        else if (oldValue == null || elm[memberName] != n) {
+                            elm[memberName] = n;
+                        }
+                    }
+                    else {
+                        elm[memberName] = newValue;
+                    }
+                }
+                catch (e) { }
+            }
+            if (newValue == null || newValue === false) {
+                if (newValue !== false || elm.getAttribute(memberName) === '') {
+                    {
+                        elm.removeAttribute(memberName);
+                    }
+                }
+            }
+            else if ((!isProp || flags & 4 /* VNODE_FLAGS.isHost */ || isSvg) && !isComplex) {
+                newValue = newValue === true ? '' : newValue;
+                {
+                    elm.setAttribute(memberName, newValue);
+                }
+            }
+        }
+    }
+};
+const parseClassListRegex = /\s/;
+const parseClassList = (value) => (!value ? [] : value.split(parseClassListRegex));
+const updateElement = (oldVnode, newVnode, isSvgMode, memberName) => {
+    // if the element passed in is a shadow root, which is a document fragment
+    // then we want to be adding attrs/props to the shadow root's "host" element
+    // if it's not a shadow root, then we add attrs/props to the same element
+    const elm = newVnode.$elm$.nodeType === 11 /* NODE_TYPE.DocumentFragment */ && newVnode.$elm$.host
+        ? newVnode.$elm$.host
+        : newVnode.$elm$;
+    const oldVnodeAttrs = (oldVnode && oldVnode.$attrs$) || EMPTY_OBJ;
+    const newVnodeAttrs = newVnode.$attrs$ || EMPTY_OBJ;
+    {
+        // remove attributes no longer present on the vnode by setting them to undefined
+        for (memberName in oldVnodeAttrs) {
+            if (!(memberName in newVnodeAttrs)) {
+                setAccessor(elm, memberName, oldVnodeAttrs[memberName], undefined, isSvgMode, newVnode.$flags$);
+            }
+        }
+    }
+    // add new & update changed attributes
+    for (memberName in newVnodeAttrs) {
+        setAccessor(elm, memberName, oldVnodeAttrs[memberName], newVnodeAttrs[memberName], isSvgMode, newVnode.$flags$);
+    }
+};
+/**
+ * Create a DOM Node corresponding to one of the children of a given VNode.
+ *
+ * @param oldParentVNode the parent VNode from the previous render
+ * @param newParentVNode the parent VNode from the current render
+ * @param childIndex the index of the VNode, in the _new_ parent node's
+ * children, for which we will create a new DOM node
+ * @param parentElm the parent DOM node which our new node will be a child of
+ * @returns the newly created node
+ */
+const createElm = (oldParentVNode, newParentVNode, childIndex, parentElm) => {
+    // tslint:disable-next-line: prefer-const
+    const newVNode = newParentVNode.$children$[childIndex];
+    let i = 0;
+    let elm;
+    let childNode;
+    if (newVNode.$text$ !== null) {
+        // create text node
+        elm = newVNode.$elm$ = doc.createTextNode(newVNode.$text$);
+    }
+    else {
+        if (!isSvgMode) {
+            isSvgMode = newVNode.$tag$ === 'svg';
+        }
+        // create element
+        elm = newVNode.$elm$ = (doc.createElementNS(isSvgMode ? SVG_NS : HTML_NS, newVNode.$tag$)
+            );
+        if (isSvgMode && newVNode.$tag$ === 'foreignObject') {
+            isSvgMode = false;
+        }
+        // add css classes, attrs, props, listeners, etc.
+        {
+            updateElement(null, newVNode, isSvgMode);
+        }
+        if (isDef(scopeId) && elm['s-si'] !== scopeId) {
+            // if there is a scopeId and this is the initial render
+            // then let's add the scopeId as a css class
+            elm.classList.add((elm['s-si'] = scopeId));
+        }
+        if (newVNode.$children$) {
+            for (i = 0; i < newVNode.$children$.length; ++i) {
+                // create the node
+                childNode = createElm(oldParentVNode, newVNode, i);
+                // return node could have been null
+                if (childNode) {
+                    // append our new node
+                    elm.appendChild(childNode);
+                }
+            }
+        }
+        {
+            if (newVNode.$tag$ === 'svg') {
+                // Only reset the SVG context when we're exiting <svg> element
+                isSvgMode = false;
+            }
+            else if (elm.tagName === 'foreignObject') {
+                // Reenter SVG context when we're exiting <foreignObject> element
+                isSvgMode = true;
+            }
+        }
+    }
+    return elm;
+};
+/**
+ * Create DOM nodes corresponding to a list of {@link d.Vnode} objects and
+ * add them to the DOM in the appropriate place.
+ *
+ * @param parentElm the DOM node which should be used as a parent for the new
+ * DOM nodes
+ * @param before a child of the `parentElm` which the new children should be
+ * inserted before (optional)
+ * @param parentVNode the parent virtual DOM node
+ * @param vnodes the new child virtual DOM nodes to produce DOM nodes for
+ * @param startIdx the index in the child virtual DOM nodes at which to start
+ * creating DOM nodes (inclusive)
+ * @param endIdx the index in the child virtual DOM nodes at which to stop
+ * creating DOM nodes (inclusive)
+ */
+const addVnodes = (parentElm, before, parentVNode, vnodes, startIdx, endIdx) => {
+    let containerElm = (parentElm);
+    let childNode;
+    if (containerElm.shadowRoot && containerElm.tagName === hostTagName) {
+        containerElm = containerElm.shadowRoot;
+    }
+    for (; startIdx <= endIdx; ++startIdx) {
+        if (vnodes[startIdx]) {
+            childNode = createElm(null, parentVNode, startIdx);
+            if (childNode) {
+                vnodes[startIdx].$elm$ = childNode;
+                containerElm.insertBefore(childNode, before);
+            }
+        }
+    }
+};
+/**
+ * Remove the DOM elements corresponding to a list of {@link d.VNode} objects.
+ * This can be used to, for instance, clean up after a list of children which
+ * should no longer be shown.
+ *
+ * This function also handles some of Stencil's slot relocation logic.
+ *
+ * @param vnodes a list of virtual DOM nodes to remove
+ * @param startIdx the index at which to start removing nodes (inclusive)
+ * @param endIdx the index at which to stop removing nodes (inclusive)
+ */
+const removeVnodes = (vnodes, startIdx, endIdx) => {
+    for (let index = startIdx; index <= endIdx; ++index) {
+        const vnode = vnodes[index];
+        if (vnode) {
+            const elm = vnode.$elm$;
+            nullifyVNodeRefs(vnode);
+            if (elm) {
+                // remove the vnode's element from the dom
+                elm.remove();
+            }
+        }
+    }
+};
+/**
+ * Reconcile the children of a new VNode with the children of an old VNode by
+ * traversing the two collections of children, identifying nodes that are
+ * conserved or changed, calling out to `patch` to make any necessary
+ * updates to the DOM, and rearranging DOM nodes as needed.
+ *
+ * The algorithm for reconciling children works by analyzing two 'windows' onto
+ * the two arrays of children (`oldCh` and `newCh`). We keep track of the
+ * 'windows' by storing start and end indices and references to the
+ * corresponding array entries. Initially the two 'windows' are basically equal
+ * to the entire array, but we progressively narrow the windows until there are
+ * no children left to update by doing the following:
+ *
+ * 1. Skip any `null` entries at the beginning or end of the two arrays, so
+ *    that if we have an initial array like the following we'll end up dealing
+ *    only with a window bounded by the highlighted elements:
+ *
+ *    [null, null, VNode1 , ... , VNode2, null, null]
+ *                 ^^^^^^         ^^^^^^
+ *
+ * 2. Check to see if the elements at the head and tail positions are equal
+ *    across the windows. This will basically detect elements which haven't
+ *    been added, removed, or changed position, i.e. if you had the following
+ *    VNode elements (represented as HTML):
+ *
+ *    oldVNode: `<div><p><span>HEY</span></p></div>`
+ *    newVNode: `<div><p><span>THERE</span></p></div>`
+ *
+ *    Then when comparing the children of the `<div>` tag we check the equality
+ *    of the VNodes corresponding to the `<p>` tags and, since they are the
+ *    same tag in the same position, we'd be able to avoid completely
+ *    re-rendering the subtree under them with a new DOM element and would just
+ *    call out to `patch` to handle reconciling their children and so on.
+ *
+ * 3. Check, for both windows, to see if the element at the beginning of the
+ *    window corresponds to the element at the end of the other window. This is
+ *    a heuristic which will let us identify _some_ situations in which
+ *    elements have changed position, for instance it _should_ detect that the
+ *    children nodes themselves have not changed but merely moved in the
+ *    following example:
+ *
+ *    oldVNode: `<div><element-one /><element-two /></div>`
+ *    newVNode: `<div><element-two /><element-one /></div>`
+ *
+ *    If we find cases like this then we also need to move the concrete DOM
+ *    elements corresponding to the moved children to write the re-order to the
+ *    DOM.
+ *
+ * 4. Finally, if VNodes have the `key` attribute set on them we check for any
+ *    nodes in the old children which have the same key as the first element in
+ *    our window on the new children. If we find such a node we handle calling
+ *    out to `patch`, moving relevant DOM nodes, and so on, in accordance with
+ *    what we find.
+ *
+ * Finally, once we've narrowed our 'windows' to the point that either of them
+ * collapse (i.e. they have length 0) we then handle any remaining VNode
+ * insertion or deletion that needs to happen to get a DOM state that correctly
+ * reflects the new child VNodes. If, for instance, after our window on the old
+ * children has collapsed we still have more nodes on the new children that
+ * we haven't dealt with yet then we need to add them, or if the new children
+ * collapse but we still have unhandled _old_ children then we need to make
+ * sure the corresponding DOM nodes are removed.
+ *
+ * @param parentElm the node into which the parent VNode is rendered
+ * @param oldCh the old children of the parent node
+ * @param newVNode the new VNode which will replace the parent
+ * @param newCh the new children of the parent node
+ */
+const updateChildren = (parentElm, oldCh, newVNode, newCh) => {
+    let oldStartIdx = 0;
+    let newStartIdx = 0;
+    let oldEndIdx = oldCh.length - 1;
+    let oldStartVnode = oldCh[0];
+    let oldEndVnode = oldCh[oldEndIdx];
+    let newEndIdx = newCh.length - 1;
+    let newStartVnode = newCh[0];
+    let newEndVnode = newCh[newEndIdx];
+    let node;
+    while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
+        if (oldStartVnode == null) {
+            // VNode might have been moved left
+            oldStartVnode = oldCh[++oldStartIdx];
+        }
+        else if (oldEndVnode == null) {
+            oldEndVnode = oldCh[--oldEndIdx];
+        }
+        else if (newStartVnode == null) {
+            newStartVnode = newCh[++newStartIdx];
+        }
+        else if (newEndVnode == null) {
+            newEndVnode = newCh[--newEndIdx];
+        }
+        else if (isSameVnode(oldStartVnode, newStartVnode)) {
+            // if the start nodes are the same then we should patch the new VNode
+            // onto the old one, and increment our `newStartIdx` and `oldStartIdx`
+            // indices to reflect that. We don't need to move any DOM Nodes around
+            // since things are matched up in order.
+            patch(oldStartVnode, newStartVnode);
+            oldStartVnode = oldCh[++oldStartIdx];
+            newStartVnode = newCh[++newStartIdx];
+        }
+        else if (isSameVnode(oldEndVnode, newEndVnode)) {
+            // likewise, if the end nodes are the same we patch new onto old and
+            // decrement our end indices, and also likewise in this case we don't
+            // need to move any DOM Nodes.
+            patch(oldEndVnode, newEndVnode);
+            oldEndVnode = oldCh[--oldEndIdx];
+            newEndVnode = newCh[--newEndIdx];
+        }
+        else if (isSameVnode(oldStartVnode, newEndVnode)) {
+            patch(oldStartVnode, newEndVnode);
+            // We need to move the element for `oldStartVnode` into a position which
+            // will be appropriate for `newEndVnode`. For this we can use
+            // `.insertBefore` and `oldEndVnode.$elm$.nextSibling`. If there is a
+            // sibling for `oldEndVnode.$elm$` then we want to move the DOM node for
+            // `oldStartVnode` between `oldEndVnode` and it's sibling, like so:
+            //
+            // <old-start-node />
+            // <some-intervening-node />
+            // <old-end-node />
+            // <!-- ->              <-- `oldStartVnode.$elm$` should be inserted here
+            // <next-sibling />
+            //
+            // If instead `oldEndVnode.$elm$` has no sibling then we just want to put
+            // the node for `oldStartVnode` at the end of the children of
+            // `parentElm`. Luckily, `Node.nextSibling` will return `null` if there
+            // aren't any siblings, and passing `null` to `Node.insertBefore` will
+            // append it to the children of the parent element.
+            parentElm.insertBefore(oldStartVnode.$elm$, oldEndVnode.$elm$.nextSibling);
+            oldStartVnode = oldCh[++oldStartIdx];
+            newEndVnode = newCh[--newEndIdx];
+        }
+        else if (isSameVnode(oldEndVnode, newStartVnode)) {
+            patch(oldEndVnode, newStartVnode);
+            // We've already checked above if `oldStartVnode` and `newStartVnode` are
+            // the same node, so since we're here we know that they are not. Thus we
+            // can move the element for `oldEndVnode` _before_ the element for
+            // `oldStartVnode`, leaving `oldStartVnode` to be reconciled in the
+            // future.
+            parentElm.insertBefore(oldEndVnode.$elm$, oldStartVnode.$elm$);
+            oldEndVnode = oldCh[--oldEndIdx];
+            newStartVnode = newCh[++newStartIdx];
+        }
+        else {
+            {
+                // We either didn't find an element in the old children that matches
+                // the key of the first new child OR the build is not using `key`
+                // attributes at all. In either case we need to create a new element
+                // for the new node.
+                node = createElm(oldCh && oldCh[newStartIdx], newVNode, newStartIdx);
+                newStartVnode = newCh[++newStartIdx];
+            }
+            if (node) {
+                // if we created a new node then handle inserting it to the DOM
+                {
+                    oldStartVnode.$elm$.parentNode.insertBefore(node, oldStartVnode.$elm$);
+                }
+            }
+        }
+    }
+    if (oldStartIdx > oldEndIdx) {
+        // we have some more new nodes to add which don't match up with old nodes
+        addVnodes(parentElm, newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].$elm$, newVNode, newCh, newStartIdx, newEndIdx);
+    }
+    else if (newStartIdx > newEndIdx) {
+        // there are nodes in the `oldCh` array which no longer correspond to nodes
+        // in the new array, so lets remove them (which entails cleaning up the
+        // relevant DOM nodes)
+        removeVnodes(oldCh, oldStartIdx, oldEndIdx);
+    }
+};
+/**
+ * Compare two VNodes to determine if they are the same
+ *
+ * **NB**: This function is an equality _heuristic_ based on the available
+ * information set on the two VNodes and can be misleading under certain
+ * circumstances. In particular, if the two nodes do not have `key` attrs
+ * (available under `$key$` on VNodes) then the function falls back on merely
+ * checking that they have the same tag.
+ *
+ * So, in other words, if `key` attrs are not set on VNodes which may be
+ * changing order within a `children` array or something along those lines then
+ * we could obtain a false negative and then have to do needless re-rendering
+ * (i.e. we'd say two VNodes aren't equal when in fact they should be).
+ *
+ * @param leftVNode the first VNode to check
+ * @param rightVNode the second VNode to check
+ * @returns whether they're equal or not
+ */
+const isSameVnode = (leftVNode, rightVNode) => {
+    // compare if two vnode to see if they're "technically" the same
+    // need to have the same element tag, and same key to be the same
+    if (leftVNode.$tag$ === rightVNode.$tag$) {
+        return true;
+    }
+    return false;
+};
+/**
+ * Handle reconciling an outdated VNode with a new one which corresponds to
+ * it. This function handles flushing updates to the DOM and reconciling the
+ * children of the two nodes (if any).
+ *
+ * @param oldVNode an old VNode whose DOM element and children we want to update
+ * @param newVNode a new VNode representing an updated version of the old one
+ */
+const patch = (oldVNode, newVNode) => {
+    const elm = (newVNode.$elm$ = oldVNode.$elm$);
+    const oldChildren = oldVNode.$children$;
+    const newChildren = newVNode.$children$;
+    const tag = newVNode.$tag$;
+    const text = newVNode.$text$;
+    if (text === null) {
+        {
+            // test if we're rendering an svg element, or still rendering nodes inside of one
+            // only add this to the when the compiler sees we're using an svg somewhere
+            isSvgMode = tag === 'svg' ? true : tag === 'foreignObject' ? false : isSvgMode;
+        }
+        {
+            {
+                // either this is the first render of an element OR it's an update
+                // AND we already know it's possible it could have changed
+                // this updates the element's css classes, attrs, props, listeners, etc.
+                updateElement(oldVNode, newVNode, isSvgMode);
+            }
+        }
+        if (oldChildren !== null && newChildren !== null) {
+            // looks like there's child vnodes for both the old and new vnodes
+            // so we need to call `updateChildren` to reconcile them
+            updateChildren(elm, oldChildren, newVNode, newChildren);
+        }
+        else if (newChildren !== null) {
+            // no old child vnodes, but there are new child vnodes to add
+            if (oldVNode.$text$ !== null) {
+                // the old vnode was text, so be sure to clear it out
+                elm.textContent = '';
+            }
+            // add the new vnode children
+            addVnodes(elm, null, newVNode, newChildren, 0, newChildren.length - 1);
+        }
+        else if (oldChildren !== null) {
+            // no new child vnodes, but there are old child vnodes to remove
+            removeVnodes(oldChildren, 0, oldChildren.length - 1);
+        }
+        if (isSvgMode && tag === 'svg') {
+            isSvgMode = false;
+        }
+    }
+    else if (oldVNode.$text$ !== text) {
+        // update the text content for the text only vnode
+        // and also only if the text is different than before
+        elm.data = text;
+    }
+};
+/**
+ * 'Nullify' any VDom `ref` callbacks on a VDom node or its children by
+ * calling them with `null`. This signals that the DOM element corresponding to
+ * the VDom node has been removed from the DOM.
+ *
+ * @param vNode a virtual DOM node
+ */
+const nullifyVNodeRefs = (vNode) => {
+    {
+        vNode.$attrs$ && vNode.$attrs$.ref && vNode.$attrs$.ref(null);
+        vNode.$children$ && vNode.$children$.map(nullifyVNodeRefs);
+    }
+};
+/**
+ * The main entry point for Stencil's virtual DOM-based rendering engine
+ *
+ * Given a {@link d.HostRef} container and some virtual DOM nodes, this
+ * function will handle creating a virtual DOM tree with a single root, patching
+ * the current virtual DOM tree onto an old one (if any), dealing with slot
+ * relocation, and reflecting attributes.
+ *
+ * @param hostRef data needed to root and render the virtual DOM tree, such as
+ * the DOM node into which it should be rendered.
+ * @param renderFnResults the virtual DOM nodes to be rendered
+ */
+const renderVdom = (hostRef, renderFnResults) => {
+    const hostElm = hostRef.$hostElement$;
+    const oldVNode = hostRef.$vnode$ || newVNode(null, null);
+    const rootVnode = isHost(renderFnResults) ? renderFnResults : h(null, null, renderFnResults);
+    hostTagName = hostElm.tagName;
+    rootVnode.$tag$ = null;
+    rootVnode.$flags$ |= 4 /* VNODE_FLAGS.isHost */;
+    hostRef.$vnode$ = rootVnode;
+    rootVnode.$elm$ = oldVNode.$elm$ = (hostElm.shadowRoot || hostElm );
+    {
+        scopeId = hostElm['s-sc'];
+    }
+    // synchronous patch
+    patch(oldVNode, rootVnode);
+};
+const attachToAncestor = (hostRef, ancestorComponent) => {
+    if (ancestorComponent && !hostRef.$onRenderResolve$ && ancestorComponent['s-p']) {
+        ancestorComponent['s-p'].push(new Promise((r) => (hostRef.$onRenderResolve$ = r)));
+    }
+};
+const scheduleUpdate = (hostRef, isInitialLoad) => {
+    {
+        hostRef.$flags$ |= 16 /* HOST_FLAGS.isQueuedForUpdate */;
+    }
+    if (hostRef.$flags$ & 4 /* HOST_FLAGS.isWaitingForChildren */) {
+        hostRef.$flags$ |= 512 /* HOST_FLAGS.needsRerender */;
+        return;
+    }
+    attachToAncestor(hostRef, hostRef.$ancestorComponent$);
+    // there is no ancestor component or the ancestor component
+    // has already fired off its lifecycle update then
+    // fire off the initial update
+    const dispatch = () => dispatchHooks(hostRef, isInitialLoad);
+    return writeTask(dispatch) ;
+};
+/**
+ * Dispatch initial-render and update lifecycle hooks, enqueuing calls to
+ * component lifecycle methods like `componentWillLoad` as well as
+ * {@link updateComponent}, which will kick off the virtual DOM re-render.
+ *
+ * @param hostRef a reference to a host DOM node
+ * @param isInitialLoad whether we're on the initial load or not
+ * @returns an empty Promise which is used to enqueue a series of operations for
+ * the component
+ */
+const dispatchHooks = (hostRef, isInitialLoad) => {
+    const endSchedule = createTime('scheduleUpdate', hostRef.$cmpMeta$.$tagName$);
+    const instance = hostRef.$lazyInstance$ ;
+    // We're going to use this variable together with `enqueue` to implement a
+    // little promise-based queue. We start out with it `undefined`. When we add
+    // the first function to the queue we'll set this variable to be that
+    // function's return value. When we attempt to add subsequent values to the
+    // queue we'll check that value and, if it was a `Promise`, we'll then chain
+    // the new function off of that `Promise` using `.then()`. This will give our
+    // queue two nice properties:
+    //
+    // 1. If all functions added to the queue are synchronous they'll be called
+    //    synchronously right away.
+    // 2. If all functions added to the queue are asynchronous they'll all be
+    //    called in order after `dispatchHooks` exits.
+    let maybePromise;
+    if (isInitialLoad) {
+        {
+            hostRef.$flags$ |= 256 /* HOST_FLAGS.isListenReady */;
+            if (hostRef.$queuedListeners$) {
+                hostRef.$queuedListeners$.map(([methodName, event]) => safeCall(instance, methodName, event));
+                hostRef.$queuedListeners$ = undefined;
+            }
+        }
+    }
+    endSchedule();
+    return enqueue(maybePromise, () => updateComponent(hostRef, instance, isInitialLoad));
+};
+/**
+ * This function uses a Promise to implement a simple first-in, first-out queue
+ * of functions to be called.
+ *
+ * The queue is ordered on the basis of the first argument. If it's
+ * `undefined`, then nothing is on the queue yet, so the provided function can
+ * be called synchronously (although note that this function may return a
+ * `Promise`). The idea is that then the return value of that enqueueing
+ * operation is kept around, so that if it was a `Promise` then subsequent
+ * functions can be enqueued by calling this function again with that `Promise`
+ * as the first argument.
+ *
+ * @param maybePromise either a `Promise` which should resolve before the next function is called or an 'empty' sentinel
+ * @param fn a function to enqueue
+ * @returns either a `Promise` or the return value of the provided function
+ */
+const enqueue = (maybePromise, fn) => isPromisey(maybePromise) ? maybePromise.then(fn) : fn();
+/**
+ * Check that a value is a `Promise`. To check, we first see if the value is an
+ * instance of the `Promise` global. In a few circumstances, in particular if
+ * the global has been overwritten, this is could be misleading, so we also do
+ * a little 'duck typing' check to see if the `.then` property of the value is
+ * defined and a function.
+ *
+ * @param maybePromise it might be a promise!
+ * @returns whether it is or not
+ */
+const isPromisey = (maybePromise) => maybePromise instanceof Promise ||
+    (maybePromise && maybePromise.then && typeof maybePromise.then === 'function');
+const updateComponent = async (hostRef, instance, isInitialLoad) => {
+    var _a;
+    const elm = hostRef.$hostElement$;
+    const endUpdate = createTime('update', hostRef.$cmpMeta$.$tagName$);
+    const rc = elm['s-rc'];
+    if (isInitialLoad) {
+        // DOM WRITE!
+        attachStyles(hostRef);
+    }
+    const endRender = createTime('render', hostRef.$cmpMeta$.$tagName$);
+    {
+        callRender(hostRef, instance);
+    }
+    if (rc) {
+        // ok, so turns out there are some child host elements
+        // waiting on this parent element to load
+        // let's fire off all update callbacks waiting
+        rc.map((cb) => cb());
+        elm['s-rc'] = undefined;
+    }
+    endRender();
+    endUpdate();
+    {
+        const childrenPromises = (_a = elm['s-p']) !== null && _a !== void 0 ? _a : [];
+        const postUpdate = () => postUpdateComponent(hostRef);
+        if (childrenPromises.length === 0) {
+            postUpdate();
+        }
+        else {
+            Promise.all(childrenPromises).then(postUpdate);
+            hostRef.$flags$ |= 4 /* HOST_FLAGS.isWaitingForChildren */;
+            childrenPromises.length = 0;
+        }
+    }
+};
+const callRender = (hostRef, instance, elm) => {
+    try {
+        instance = instance.render() ;
+        {
+            hostRef.$flags$ &= ~16 /* HOST_FLAGS.isQueuedForUpdate */;
+        }
+        {
+            hostRef.$flags$ |= 2 /* HOST_FLAGS.hasRendered */;
+        }
+        {
+            {
+                // looks like we've got child nodes to render into this host element
+                // or we need to update the css class/attrs on the host element
+                // DOM WRITE!
+                {
+                    renderVdom(hostRef, instance);
+                }
+            }
+        }
+    }
+    catch (e) {
+        consoleError(e, hostRef.$hostElement$);
+    }
+    return null;
+};
+const postUpdateComponent = (hostRef) => {
+    const tagName = hostRef.$cmpMeta$.$tagName$;
+    const elm = hostRef.$hostElement$;
+    const endPostUpdate = createTime('postUpdate', tagName);
+    const instance = hostRef.$lazyInstance$ ;
+    const ancestorComponent = hostRef.$ancestorComponent$;
+    if (!(hostRef.$flags$ & 64 /* HOST_FLAGS.hasLoadedComponent */)) {
+        hostRef.$flags$ |= 64 /* HOST_FLAGS.hasLoadedComponent */;
+        {
+            // DOM WRITE!
+            addHydratedFlag(elm);
+        }
+        {
+            safeCall(instance, 'componentDidLoad');
+        }
+        endPostUpdate();
+        {
+            hostRef.$onReadyResolve$(elm);
+            if (!ancestorComponent) {
+                appDidLoad();
+            }
+        }
+    }
+    else {
+        endPostUpdate();
+    }
+    {
+        hostRef.$onInstanceResolve$(elm);
+    }
+    // load events fire from bottom to top
+    // the deepest elements load first then bubbles up
+    {
+        if (hostRef.$onRenderResolve$) {
+            hostRef.$onRenderResolve$();
+            hostRef.$onRenderResolve$ = undefined;
+        }
+        if (hostRef.$flags$ & 512 /* HOST_FLAGS.needsRerender */) {
+            nextTick(() => scheduleUpdate(hostRef, false));
+        }
+        hostRef.$flags$ &= ~(4 /* HOST_FLAGS.isWaitingForChildren */ | 512 /* HOST_FLAGS.needsRerender */);
+    }
+    // ( •_•)
+    // ( •_•)>⌐■-■
+    // (⌐■_■)
+};
+const forceUpdate = (ref) => {
+    {
+        const hostRef = getHostRef(ref);
+        const isConnected = hostRef.$hostElement$.isConnected;
+        if (isConnected &&
+            (hostRef.$flags$ & (2 /* HOST_FLAGS.hasRendered */ | 16 /* HOST_FLAGS.isQueuedForUpdate */)) === 2 /* HOST_FLAGS.hasRendered */) {
+            scheduleUpdate(hostRef, false);
+        }
+        // Returns "true" when the forced update was successfully scheduled
+        return isConnected;
+    }
+};
+const appDidLoad = (who) => {
+    // on appload
+    // we have finish the first big initial render
+    {
+        addHydratedFlag(doc.documentElement);
+    }
+    nextTick(() => emitEvent(win, 'appload', { detail: { namespace: NAMESPACE } }));
+};
+const safeCall = (instance, method, arg) => {
+    if (instance && instance[method]) {
+        try {
+            return instance[method](arg);
+        }
+        catch (e) {
+            consoleError(e);
+        }
+    }
+    return undefined;
+};
+const addHydratedFlag = (elm) => elm.classList.add('hydrated')
+    ;
+const getValue = (ref, propName) => getHostRef(ref).$instanceValues$.get(propName);
+const setValue = (ref, propName, newVal, cmpMeta) => {
+    // check our new property value against our internal value
+    const hostRef = getHostRef(ref);
+    const oldVal = hostRef.$instanceValues$.get(propName);
+    const flags = hostRef.$flags$;
+    const instance = hostRef.$lazyInstance$ ;
+    newVal = parsePropertyValue(newVal, cmpMeta.$members$[propName][0]);
+    // explicitly check for NaN on both sides, as `NaN === NaN` is always false
+    const areBothNaN = Number.isNaN(oldVal) && Number.isNaN(newVal);
+    const didValueChange = newVal !== oldVal && !areBothNaN;
+    if ((!(flags & 8 /* HOST_FLAGS.isConstructingInstance */) || oldVal === undefined) && didValueChange) {
+        // gadzooks! the property's value has changed!!
+        // set our new value!
+        hostRef.$instanceValues$.set(propName, newVal);
+        if (instance) {
+            if ((flags & (2 /* HOST_FLAGS.hasRendered */ | 16 /* HOST_FLAGS.isQueuedForUpdate */)) === 2 /* HOST_FLAGS.hasRendered */) {
+                // looks like this value actually changed, so we've got work to do!
+                // but only if we've already rendered, otherwise just chill out
+                // queue that we need to do an update, but don't worry about queuing
+                // up millions cuz this function ensures it only runs once
+                scheduleUpdate(hostRef, false);
+            }
+        }
+    }
+};
+/**
+ * Attach a series of runtime constructs to a compiled Stencil component
+ * constructor, including getters and setters for the `@Prop` and `@State`
+ * decorators, callbacks for when attributes change, and so on.
+ *
+ * @param Cstr the constructor for a component that we need to process
+ * @param cmpMeta metadata collected previously about the component
+ * @param flags a number used to store a series of bit flags
+ * @returns a reference to the same constructor passed in (but now mutated)
+ */
+const proxyComponent = (Cstr, cmpMeta, flags) => {
+    if (cmpMeta.$members$) {
+        // It's better to have a const than two Object.entries()
+        const members = Object.entries(cmpMeta.$members$);
+        const prototype = Cstr.prototype;
+        members.map(([memberName, [memberFlags]]) => {
+            if ((memberFlags & 31 /* MEMBER_FLAGS.Prop */ ||
+                    ((flags & 2 /* PROXY_FLAGS.proxyState */) && memberFlags & 32 /* MEMBER_FLAGS.State */))) {
+                // proxyComponent - prop
+                Object.defineProperty(prototype, memberName, {
+                    get() {
+                        // proxyComponent, get value
+                        return getValue(this, memberName);
+                    },
+                    set(newValue) {
+                        // proxyComponent, set value
+                        setValue(this, memberName, newValue, cmpMeta);
+                    },
+                    configurable: true,
+                    enumerable: true,
+                });
+            }
+            else if (flags & 1 /* PROXY_FLAGS.isElementConstructor */ &&
+                memberFlags & 64 /* MEMBER_FLAGS.Method */) {
+                // proxyComponent - method
+                Object.defineProperty(prototype, memberName, {
+                    value(...args) {
+                        const ref = getHostRef(this);
+                        return ref.$onInstancePromise$.then(() => ref.$lazyInstance$[memberName](...args));
+                    },
+                });
+            }
+        });
+        if ((flags & 1 /* PROXY_FLAGS.isElementConstructor */)) {
+            const attrNameToPropName = new Map();
+            prototype.attributeChangedCallback = function (attrName, _oldValue, newValue) {
+                plt.jmp(() => {
+                    const propName = attrNameToPropName.get(attrName);
+                    //  In a web component lifecycle the attributeChangedCallback runs prior to connectedCallback
+                    //  in the case where an attribute was set inline.
+                    //  ```html
+                    //    <my-component some-attribute="some-value"></my-component>
+                    //  ```
+                    //
+                    //  There is an edge case where a developer sets the attribute inline on a custom element and then
+                    //  programmatically changes it before it has been upgraded as shown below:
+                    //
+                    //  ```html
+                    //    <!-- this component has _not_ been upgraded yet -->
+                    //    <my-component id="test" some-attribute="some-value"></my-component>
+                    //    <script>
+                    //      // grab non-upgraded component
+                    //      el = document.querySelector("#test");
+                    //      el.someAttribute = "another-value";
+                    //      // upgrade component
+                    //      customElements.define('my-component', MyComponent);
+                    //    </script>
+                    //  ```
+                    //  In this case if we do not unshadow here and use the value of the shadowing property, attributeChangedCallback
+                    //  will be called with `newValue = "some-value"` and will set the shadowed property (this.someAttribute = "another-value")
+                    //  to the value that was set inline i.e. "some-value" from above example. When
+                    //  the connectedCallback attempts to unshadow it will use "some-value" as the initial value rather than "another-value"
+                    //
+                    //  The case where the attribute was NOT set inline but was not set programmatically shall be handled/unshadowed
+                    //  by connectedCallback as this attributeChangedCallback will not fire.
+                    //
+                    //  https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties
+                    //
+                    //  TODO(STENCIL-16) we should think about whether or not we actually want to be reflecting the attributes to
+                    //  properties here given that this goes against best practices outlined here
+                    //  https://developers.google.com/web/fundamentals/web-components/best-practices#avoid-reentrancy
+                    if (this.hasOwnProperty(propName)) {
+                        newValue = this[propName];
+                        delete this[propName];
+                    }
+                    else if (prototype.hasOwnProperty(propName) &&
+                        typeof this[propName] === 'number' &&
+                        this[propName] == newValue) {
+                        // if the propName exists on the prototype of `Cstr`, this update may be a result of Stencil using native
+                        // APIs to reflect props as attributes. Calls to `setAttribute(someElement, propName)` will result in
+                        // `propName` to be converted to a `DOMString`, which may not be what we want for other primitive props.
+                        return;
+                    }
+                    this[propName] = newValue === null && typeof this[propName] === 'boolean' ? false : newValue;
+                });
+            };
+            // create an array of attributes to observe
+            // and also create a map of html attribute name to js property name
+            Cstr.observedAttributes = members
+                .filter(([_, m]) => m[0] & 15 /* MEMBER_FLAGS.HasAttribute */) // filter to only keep props that should match attributes
+                .map(([propName, m]) => {
+                const attrName = m[1] || propName;
+                attrNameToPropName.set(attrName, propName);
+                return attrName;
+            });
+        }
+    }
+    return Cstr;
+};
+const initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId, Cstr) => {
+    // initializeComponent
+    if ((hostRef.$flags$ & 32 /* HOST_FLAGS.hasInitializedComponent */) === 0) {
+        // Let the runtime know that the component has been initialized
+        hostRef.$flags$ |= 32 /* HOST_FLAGS.hasInitializedComponent */;
+        {
+            // lazy loaded components
+            // request the component's implementation to be
+            // wired up with the host element
+            Cstr = loadModule(cmpMeta);
+            if (Cstr.then) {
+                // Await creates a micro-task avoid if possible
+                const endLoad = uniqueTime();
+                Cstr = await Cstr;
+                endLoad();
+            }
+            if (!Cstr.isProxied) {
+                proxyComponent(Cstr, cmpMeta, 2 /* PROXY_FLAGS.proxyState */);
+                Cstr.isProxied = true;
+            }
+            const endNewInstance = createTime('createInstance', cmpMeta.$tagName$);
+            // ok, time to construct the instance
+            // but let's keep track of when we start and stop
+            // so that the getters/setters don't incorrectly step on data
+            {
+                hostRef.$flags$ |= 8 /* HOST_FLAGS.isConstructingInstance */;
+            }
+            // construct the lazy-loaded component implementation
+            // passing the hostRef is very important during
+            // construction in order to directly wire together the
+            // host element and the lazy-loaded instance
+            try {
+                new Cstr(hostRef);
+            }
+            catch (e) {
+                consoleError(e);
+            }
+            {
+                hostRef.$flags$ &= ~8 /* HOST_FLAGS.isConstructingInstance */;
+            }
+            endNewInstance();
+        }
+        if (Cstr.style) {
+            // this component has styles but we haven't registered them yet
+            let style = Cstr.style;
+            const scopeId = getScopeId(cmpMeta);
+            if (!styles.has(scopeId)) {
+                const endRegisterStyles = createTime('registerStyles', cmpMeta.$tagName$);
+                registerStyle(scopeId, style, !!(cmpMeta.$flags$ & 1 /* CMP_FLAGS.shadowDomEncapsulation */));
+                endRegisterStyles();
+            }
+        }
+    }
+    // we've successfully created a lazy instance
+    const ancestorComponent = hostRef.$ancestorComponent$;
+    const schedule = () => scheduleUpdate(hostRef, true);
+    if (ancestorComponent && ancestorComponent['s-rc']) {
+        // this is the initial load and this component it has an ancestor component
+        // but the ancestor component has NOT fired its will update lifecycle yet
+        // so let's just cool our jets and wait for the ancestor to continue first
+        // this will get fired off when the ancestor component
+        // finally gets around to rendering its lazy self
+        // fire off the initial update
+        ancestorComponent['s-rc'].push(schedule);
+    }
+    else {
+        schedule();
+    }
+};
+const connectedCallback = (elm) => {
+    if ((plt.$flags$ & 1 /* PLATFORM_FLAGS.isTmpDisconnected */) === 0) {
+        const hostRef = getHostRef(elm);
+        const cmpMeta = hostRef.$cmpMeta$;
+        const endConnected = createTime('connectedCallback', cmpMeta.$tagName$);
+        if (!(hostRef.$flags$ & 1 /* HOST_FLAGS.hasConnected */)) {
+            // first time this component has connected
+            hostRef.$flags$ |= 1 /* HOST_FLAGS.hasConnected */;
+            {
+                // find the first ancestor component (if there is one) and register
+                // this component as one of the actively loading child components for its ancestor
+                let ancestorComponent = elm;
+                while ((ancestorComponent = ancestorComponent.parentNode || ancestorComponent.host)) {
+                    // climb up the ancestors looking for the first
+                    // component that hasn't finished its lifecycle update yet
+                    if (ancestorComponent['s-p']) {
+                        // we found this components first ancestor component
+                        // keep a reference to this component's ancestor component
+                        attachToAncestor(hostRef, (hostRef.$ancestorComponent$ = ancestorComponent));
+                        break;
+                    }
+                }
+            }
+            // Lazy properties
+            // https://developers.google.com/web/fundamentals/web-components/best-practices#lazy-properties
+            if (cmpMeta.$members$) {
+                Object.entries(cmpMeta.$members$).map(([memberName, [memberFlags]]) => {
+                    if (memberFlags & 31 /* MEMBER_FLAGS.Prop */ && elm.hasOwnProperty(memberName)) {
+                        const value = elm[memberName];
+                        delete elm[memberName];
+                        elm[memberName] = value;
+                    }
+                });
+            }
+            {
+                initializeComponent(elm, hostRef, cmpMeta);
+            }
+        }
+        else {
+            // not the first time this has connected
+            // reattach any event listeners to the host
+            // since they would have been removed when disconnected
+            addHostEventListeners(elm, hostRef, cmpMeta.$listeners$);
+        }
+        endConnected();
+    }
+};
+const disconnectedCallback = (elm) => {
+    if ((plt.$flags$ & 1 /* PLATFORM_FLAGS.isTmpDisconnected */) === 0) {
+        const hostRef = getHostRef(elm);
+        const instance = hostRef.$lazyInstance$ ;
+        {
+            if (hostRef.$rmListeners$) {
+                hostRef.$rmListeners$.map((rmListener) => rmListener());
+                hostRef.$rmListeners$ = undefined;
+            }
+        }
+        {
+            safeCall(instance, 'disconnectedCallback');
+        }
+    }
+};
+const bootstrapLazy = (lazyBundles, options = {}) => {
+    var _a;
+    const endBootstrap = createTime();
+    const cmpTags = [];
+    const exclude = options.exclude || [];
+    const customElements = win.customElements;
+    const head = doc.head;
+    const metaCharset = /*@__PURE__*/ head.querySelector('meta[charset]');
+    const visibilityStyle = /*@__PURE__*/ doc.createElement('style');
+    const deferredConnectedCallbacks = [];
+    let appLoadFallback;
+    let isBootstrapping = true;
+    Object.assign(plt, options);
+    plt.$resourcesUrl$ = new URL(options.resourcesUrl || './', doc.baseURI).href;
+    lazyBundles.map((lazyBundle) => {
+        lazyBundle[1].map((compactMeta) => {
+            const cmpMeta = {
+                $flags$: compactMeta[0],
+                $tagName$: compactMeta[1],
+                $members$: compactMeta[2],
+                $listeners$: compactMeta[3],
+            };
+            {
+                cmpMeta.$members$ = compactMeta[2];
+            }
+            {
+                cmpMeta.$listeners$ = compactMeta[3];
+            }
+            const tagName = cmpMeta.$tagName$;
+            const HostElement = class extends HTMLElement {
+                // StencilLazyHost
+                constructor(self) {
+                    // @ts-ignore
+                    super(self);
+                    self = this;
+                    registerHost(self, cmpMeta);
+                    if (cmpMeta.$flags$ & 1 /* CMP_FLAGS.shadowDomEncapsulation */) {
+                        // this component is using shadow dom
+                        // and this browser supports shadow dom
+                        // add the read-only property "shadowRoot" to the host element
+                        // adding the shadow root build conditionals to minimize runtime
+                        {
+                            {
+                                self.attachShadow({ mode: 'open' });
+                            }
+                        }
+                    }
+                }
+                connectedCallback() {
+                    if (appLoadFallback) {
+                        clearTimeout(appLoadFallback);
+                        appLoadFallback = null;
+                    }
+                    if (isBootstrapping) {
+                        // connectedCallback will be processed once all components have been registered
+                        deferredConnectedCallbacks.push(this);
+                    }
+                    else {
+                        plt.jmp(() => connectedCallback(this));
+                    }
+                }
+                disconnectedCallback() {
+                    plt.jmp(() => disconnectedCallback(this));
+                }
+                componentOnReady() {
+                    return getHostRef(this).$onReadyPromise$;
+                }
+            };
+            cmpMeta.$lazyBundleId$ = lazyBundle[0];
+            if (!exclude.includes(tagName) && !customElements.get(tagName)) {
+                cmpTags.push(tagName);
+                customElements.define(tagName, proxyComponent(HostElement, cmpMeta, 1 /* PROXY_FLAGS.isElementConstructor */));
+            }
+        });
+    });
+    {
+        visibilityStyle.innerHTML = cmpTags + HYDRATED_CSS;
+        visibilityStyle.setAttribute('data-styles', '');
+        // Apply CSP nonce to the style tag if it exists
+        const nonce = (_a = plt.$nonce$) !== null && _a !== void 0 ? _a : queryNonceMetaTagContent(doc);
+        if (nonce != null) {
+            visibilityStyle.setAttribute('nonce', nonce);
+        }
+        head.insertBefore(visibilityStyle, metaCharset ? metaCharset.nextSibling : head.firstChild);
+    }
+    // Process deferred connectedCallbacks now all components have been registered
+    isBootstrapping = false;
+    if (deferredConnectedCallbacks.length) {
+        deferredConnectedCallbacks.map((host) => host.connectedCallback());
+    }
+    else {
+        {
+            plt.jmp(() => (appLoadFallback = setTimeout(appDidLoad, 30)));
+        }
+    }
+    // Fallback appLoad event
+    endBootstrap();
+};
+const addHostEventListeners = (elm, hostRef, listeners, attachParentListeners) => {
+    if (listeners) {
+        listeners.map(([flags, name, method]) => {
+            const target = getHostListenerTarget(elm, flags) ;
+            const handler = hostListenerProxy(hostRef, method);
+            const opts = hostListenerOpts(flags);
+            plt.ael(target, name, handler, opts);
+            (hostRef.$rmListeners$ = hostRef.$rmListeners$ || []).push(() => plt.rel(target, name, handler, opts));
+        });
+    }
+};
+const hostListenerProxy = (hostRef, methodName) => (ev) => {
+    try {
+        {
+            if (hostRef.$flags$ & 256 /* HOST_FLAGS.isListenReady */) {
+                // instance is ready, let's call it's member method for this event
+                hostRef.$lazyInstance$[methodName](ev);
+            }
+            else {
+                (hostRef.$queuedListeners$ = hostRef.$queuedListeners$ || []).push([methodName, ev]);
+            }
+        }
+    }
+    catch (e) {
+        consoleError(e);
+    }
+};
+const getHostListenerTarget = (elm, flags) => {
+    if (flags & 16 /* LISTENER_FLAGS.TargetBody */)
+        return doc.body;
+    return elm;
+};
+// prettier-ignore
+const hostListenerOpts = (flags) => (flags & 2 /* LISTENER_FLAGS.Capture */) !== 0;
+/**
+ * Assigns the given value to the nonce property on the runtime platform object.
+ * During runtime, this value is used to set the nonce attribute on all dynamically created script and style tags.
+ * @param nonce The value to be assigned to the platform nonce property.
+ * @returns void
+ */
+const setNonce = (nonce) => (plt.$nonce$ = nonce);
+const hostRefs = /*@__PURE__*/ new WeakMap();
+const getHostRef = (ref) => hostRefs.get(ref);
+const registerInstance = (lazyInstance, hostRef) => hostRefs.set((hostRef.$lazyInstance$ = lazyInstance), hostRef);
+const registerHost = (elm, cmpMeta) => {
+    const hostRef = {
+        $flags$: 0,
+        $hostElement$: elm,
+        $cmpMeta$: cmpMeta,
+        $instanceValues$: new Map(),
+    };
+    {
+        hostRef.$onInstancePromise$ = new Promise((r) => (hostRef.$onInstanceResolve$ = r));
+    }
+    {
+        hostRef.$onReadyPromise$ = new Promise((r) => (hostRef.$onReadyResolve$ = r));
+        elm['s-p'] = [];
+        elm['s-rc'] = [];
+    }
+    addHostEventListeners(elm, hostRef, cmpMeta.$listeners$);
+    return hostRefs.set(elm, hostRef);
+};
+const isMemberInElement = (elm, memberName) => memberName in elm;
+const consoleError = (e, el) => (0, console.error)(e, el);
+const cmpModules = /*@__PURE__*/ new Map();
+const loadModule = (cmpMeta, hostRef, hmrVersionId) => {
+    // loadModuleImport
+    const exportName = cmpMeta.$tagName$.replace(/-/g, '_');
+    const bundleId = cmpMeta.$lazyBundleId$;
+    const module = cmpModules.get(bundleId) ;
+    if (module) {
+        return module[exportName];
+    }
+    
+    if (!hmrVersionId || !BUILD.hotModuleReplacement) {
+      const processMod = importedModule => {
+        cmpModules.set(bundleId, importedModule);
+        return importedModule[exportName];
+      }
+      switch(bundleId) {
+        
+        case 'pwa-action-sheet':
+          return import(
+            /* webpackMode: "lazy" */
+            './pwa-action-sheet.entry.js').then(processMod, consoleError);
+        case 'pwa-camera-modal':
+          return import(
+            /* webpackMode: "lazy" */
+            './pwa-camera-modal.entry.js').then(processMod, consoleError);
+        case 'pwa-toast':
+          return import(
+            /* webpackMode: "lazy" */
+            './pwa-toast.entry.js').then(processMod, consoleError);
+        case 'pwa-camera-modal-instance':
+          return import(
+            /* webpackMode: "lazy" */
+            './pwa-camera-modal-instance.entry.js').then(processMod, consoleError);
+        case 'pwa-camera':
+          return import(
+            /* webpackMode: "lazy" */
+            './pwa-camera.entry.js').then(processMod, consoleError);
+      }
+    }
+    return import(
+    /* @vite-ignore */
+    /* webpackInclude: /\.entry\.js$/ */
+    /* webpackExclude: /\.system\.entry\.js$/ */
+    /* webpackMode: "lazy" */
+    `./${bundleId}.entry.js${''}`).then((importedModule) => {
+        {
+            cmpModules.set(bundleId, importedModule);
+        }
+        return importedModule[exportName];
+    }, consoleError);
+};
+const styles = /*@__PURE__*/ new Map();
+const win = typeof window !== 'undefined' ? window : {};
+const doc = win.document || { head: {} };
+const plt = {
+    $flags$: 0,
+    $resourcesUrl$: '',
+    jmp: (h) => h(),
+    raf: (h) => requestAnimationFrame(h),
+    ael: (el, eventName, listener, opts) => el.addEventListener(eventName, listener, opts),
+    rel: (el, eventName, listener, opts) => el.removeEventListener(eventName, listener, opts),
+    ce: (eventName, opts) => new CustomEvent(eventName, opts),
+};
+const promiseResolve = (v) => Promise.resolve(v);
+const supportsConstructableStylesheets = /*@__PURE__*/ (() => {
+        try {
+            new CSSStyleSheet();
+            return typeof new CSSStyleSheet().replaceSync === 'function';
+        }
+        catch (e) { }
+        return false;
+    })()
+    ;
+const queueDomReads = [];
+const queueDomWrites = [];
+const queueTask = (queue, write) => (cb) => {
+    queue.push(cb);
+    if (!queuePending) {
+        queuePending = true;
+        if (write && plt.$flags$ & 4 /* PLATFORM_FLAGS.queueSync */) {
+            nextTick(flush);
+        }
+        else {
+            plt.raf(flush);
+        }
+    }
+};
+const consume = (queue) => {
+    for (let i = 0; i < queue.length; i++) {
+        try {
+            queue[i](performance.now());
+        }
+        catch (e) {
+            consoleError(e);
+        }
+    }
+    queue.length = 0;
+};
+const flush = () => {
+    // always force a bunch of medium callbacks to run, but still have
+    // a throttle on how many can run in a certain time
+    // DOM READS!!!
+    consume(queueDomReads);
+    // DOM WRITES!!!
+    {
+        consume(queueDomWrites);
+        if ((queuePending = queueDomReads.length > 0)) {
+            // still more to do yet, but we've run out of time
+            // let's let this thing cool off and try again in the next tick
+            plt.raf(flush);
+        }
+    }
+};
+const nextTick = /*@__PURE__*/ (cb) => promiseResolve().then(cb);
+const writeTask = /*@__PURE__*/ queueTask(queueDomWrites, true);
+
+export { Host as H, bootstrapLazy as b, createEvent as c, forceUpdate as f, getElement as g, h, promiseResolve as p, registerInstance as r, setNonce as s };
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/index.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/index.js
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/index.js
@@ -0,0 +1 @@
+
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/ionicpwaelements.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/ionicpwaelements.js
new file mode 100644
index 0000000..e189a23
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/ionicpwaelements.js
@@ -0,0 +1,21 @@
+import { p as promiseResolve, b as bootstrapLazy } from './index-1c5c47b4.js';
+export { s as setNonce } from './index-1c5c47b4.js';
+
+/*
+ Stencil Client Patch Browser v3.4.0 | MIT Licensed | https://stenciljs.com
+ */
+const patchBrowser = () => {
+    const importMeta = import.meta.url;
+    const opts = {};
+    // TODO(STENCIL-663): Remove code related to deprecated `safari10` field.
+    if (importMeta !== '') {
+        opts.resourcesUrl = new URL('.', importMeta).href;
+        // TODO(STENCIL-661): Remove code related to the dynamic import shim
+        // TODO(STENCIL-663): Remove code related to deprecated `safari10` field.
+    }
+    return promiseResolve(opts);
+};
+
+patchBrowser().then(options => {
+  return bootstrapLazy([["pwa-camera-modal",[[1,"pwa-camera-modal",{"facingMode":[1,"facing-mode"],"hidePicker":[4,"hide-picker"],"present":[64],"dismiss":[64]}]]],["pwa-action-sheet",[[1,"pwa-action-sheet",{"header":[1],"cancelable":[4],"options":[16],"open":[32]}]]],["pwa-toast",[[1,"pwa-toast",{"message":[1],"duration":[2],"closing":[32]}]]],["pwa-camera",[[1,"pwa-camera",{"facingMode":[1,"facing-mode"],"handlePhoto":[16],"hidePicker":[4,"hide-picker"],"handleNoDeviceError":[16],"noDevicesText":[1,"no-devices-text"],"noDevicesButtonText":[1,"no-devices-button-text"],"photo":[32],"photoSrc":[32],"showShutterOverlay":[32],"flashIndex":[32],"hasCamera":[32],"rotation":[32],"deviceError":[32]}]]],["pwa-camera-modal-instance",[[1,"pwa-camera-modal-instance",{"facingMode":[1,"facing-mode"],"hidePicker":[4,"hide-picker"],"noDevicesText":[1,"no-devices-text"],"noDevicesButtonText":[1,"no-devices-button-text"]},[[16,"keyup","handleBackdropKeyUp"]]]]]], options);
+});
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/loader.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/loader.js
new file mode 100644
index 0000000..608f50d
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/loader.js
@@ -0,0 +1,18 @@
+import { p as promiseResolve, b as bootstrapLazy } from './index-1c5c47b4.js';
+export { s as setNonce } from './index-1c5c47b4.js';
+
+/*
+ Stencil Client Patch Esm v3.4.0 | MIT Licensed | https://stenciljs.com
+ */
+const patchEsm = () => {
+    return promiseResolve();
+};
+
+const defineCustomElements = (win, options) => {
+  if (typeof window === 'undefined') return Promise.resolve();
+  return patchEsm().then(() => {
+  return bootstrapLazy([["pwa-camera-modal",[[1,"pwa-camera-modal",{"facingMode":[1,"facing-mode"],"hidePicker":[4,"hide-picker"],"present":[64],"dismiss":[64]}]]],["pwa-action-sheet",[[1,"pwa-action-sheet",{"header":[1],"cancelable":[4],"options":[16],"open":[32]}]]],["pwa-toast",[[1,"pwa-toast",{"message":[1],"duration":[2],"closing":[32]}]]],["pwa-camera",[[1,"pwa-camera",{"facingMode":[1,"facing-mode"],"handlePhoto":[16],"hidePicker":[4,"hide-picker"],"handleNoDeviceError":[16],"noDevicesText":[1,"no-devices-text"],"noDevicesButtonText":[1,"no-devices-button-text"],"photo":[32],"photoSrc":[32],"showShutterOverlay":[32],"flashIndex":[32],"hasCamera":[32],"rotation":[32],"deviceError":[32]}]]],["pwa-camera-modal-instance",[[1,"pwa-camera-modal-instance",{"facingMode":[1,"facing-mode"],"hidePicker":[4,"hide-picker"],"noDevicesText":[1,"no-devices-text"],"noDevicesButtonText":[1,"no-devices-button-text"]},[[16,"keyup","handleBackdropKeyUp"]]]]]], options);
+  });
+};
+
+export { defineCustomElements };
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/core-js.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/core-js.js
new file mode 100644
index 0000000..7bbc909
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/core-js.js
@@ -0,0 +1,11 @@
+/**
+ * core-js 3.6.5
+ * https://github.com/zloirock/core-js
+ * License: http://rock.mit-license.org
+ * © 2019 Denis Pushkarev (zloirock.ru)
+ */
+!function(t){"use strict";!function(t){var n={};function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var o in t)e.d(r,o,function(n){return t[n]}.bind(null,o));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=0)}([function(t,n,e){e(1),e(55),e(62),e(68),e(70),e(71),e(72),e(73),e(75),e(76),e(78),e(87),e(88),e(89),e(98),e(99),e(101),e(102),e(103),e(105),e(106),e(107),e(108),e(110),e(111),e(112),e(113),e(114),e(115),e(116),e(117),e(118),e(127),e(130),e(131),e(133),e(135),e(136),e(137),e(138),e(139),e(141),e(143),e(146),e(148),e(150),e(151),e(153),e(154),e(155),e(156),e(157),e(159),e(160),e(162),e(163),e(164),e(165),e(166),e(167),e(168),e(169),e(170),e(172),e(173),e(183),e(184),e(185),e(189),e(191),e(192),e(193),e(194),e(195),e(196),e(198),e(201),e(202),e(203),e(204),e(208),e(209),e(212),e(213),e(214),e(215),e(216),e(217),e(218),e(219),e(221),e(222),e(223),e(226),e(227),e(228),e(229),e(230),e(231),e(232),e(233),e(234),e(235),e(236),e(237),e(238),e(240),e(241),e(243),e(248),t.exports=e(246)},function(t,n,e){var r=e(2),o=e(6),i=e(45),a=e(14),u=e(46),c=e(39),f=e(47),s=e(48),l=e(52),p=e(49),h=e(53),v=p("isConcatSpreadable"),g=h>=51||!o((function(){var t=[];return t[v]=!1,t.concat()[0]!==t})),d=l("concat"),y=function(t){if(!a(t))return!1;var n=t[v];return void 0!==n?!!n:i(t)};r({target:"Array",proto:!0,forced:!g||!d},{concat:function(t){var n,e,r,o,i,a=u(this),l=s(a,0),p=0;for(n=-1,r=arguments.length;n<r;n++)if(i=-1===n?a:arguments[n],y(i)){if(p+(o=c(i.length))>9007199254740991)throw TypeError("Maximum allowed index exceeded");for(e=0;e<o;e++,p++)e in i&&f(l,p,i[e])}else{if(p>=9007199254740991)throw TypeError("Maximum allowed index exceeded");f(l,p++,i)}return l.length=p,l}})},function(t,n,e){var r=e(3),o=e(4).f,i=e(18),a=e(21),u=e(22),c=e(32),f=e(44);t.exports=function(t,n){var e,s,l,p,h,v=t.target,g=t.global,d=t.stat;if(e=g?r:d?r[v]||u(v,{}):(r[v]||{}).prototype)for(s in n){if(p=n[s],l=t.noTargetGet?(h=o(e,s))&&h.value:e[s],!f(g?s:v+(d?".":"#")+s,t.forced)&&void 0!==l){if(typeof p==typeof l)continue;c(p,l)}(t.sham||l&&l.sham)&&i(p,"sham",!0),a(e,s,p,t)}}},function(t,n){var e=function(t){return t&&t.Math==Math&&t};t.exports=e("object"==typeof globalThis&&globalThis)||e("object"==typeof window&&window)||e("object"==typeof self&&self)||e("object"==typeof global&&global)||Function("return this")()},function(t,n,e){var r=e(5),o=e(7),i=e(8),a=e(9),u=e(13),c=e(15),f=e(16),s=Object.getOwnPropertyDescriptor;n.f=r?s:function(t,n){if(t=a(t),n=u(n,!0),f)try{return s(t,n)}catch(t){}if(c(t,n))return i(!o.f.call(t,n),t[n])}},function(t,n,e){var r=e(6);t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);n.f=i?function(t){var n=o(this,t);return!!n&&n.enumerable}:r},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n,e){var r=e(10),o=e(12);t.exports=function(t){return r(o(t))}},function(t,n,e){var r=e(6),o=e(11),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},function(t,n){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,n,e){var r=e(14);t.exports=function(t,n){if(!r(t))return t;var e,o;if(n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;if("function"==typeof(e=t.valueOf)&&!r(o=e.call(t)))return o;if(!n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},function(t,n,e){var r=e(5),o=e(6),i=e(17);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(3),o=e(14),i=r.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},function(t,n,e){var r=e(5),o=e(19),i=e(8);t.exports=r?function(t,n,e){return o.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(5),o=e(16),i=e(20),a=e(13),u=Object.defineProperty;n.f=r?u:function(t,n,e){if(i(t),n=a(n,!0),i(e),o)try{return u(t,n,e)}catch(t){}if("get"in e||"set"in e)throw TypeError("Accessors not supported");return"value"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(14);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,n,e){var r=e(3),o=e(18),i=e(15),a=e(22),u=e(23),c=e(25),f=c.get,s=c.enforce,l=String(String).split("String");(t.exports=function(t,n,e,u){var c=!!u&&!!u.unsafe,f=!!u&&!!u.enumerable,p=!!u&&!!u.noTargetGet;"function"==typeof e&&("string"!=typeof n||i(e,"name")||o(e,"name",n),s(e).source=l.join("string"==typeof n?n:"")),t!==r?(c?!p&&t[n]&&(f=!0):delete t[n],f?t[n]=e:o(t,n,e)):f?t[n]=e:a(n,e)})(Function.prototype,"toString",(function(){return"function"==typeof this&&f(this).source||u(this)}))},function(t,n,e){var r=e(3),o=e(18);t.exports=function(t,n){try{o(r,t,n)}catch(e){r[t]=n}return n}},function(t,n,e){var r=e(24),o=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(t){return o.call(t)}),t.exports=r.inspectSource},function(t,n,e){var r=e(3),o=e(22),i=r["__core-js_shared__"]||o("__core-js_shared__",{});t.exports=i},function(t,n,e){var r,o,i,a=e(26),u=e(3),c=e(14),f=e(18),s=e(15),l=e(27),p=e(31),h=u.WeakMap;if(a){var v=new h,g=v.get,d=v.has,y=v.set;r=function(t,n){return y.call(v,t,n),n},o=function(t){return g.call(v,t)||{}},i=function(t){return d.call(v,t)}}else{var x=l("state");p[x]=!0,r=function(t,n){return f(t,x,n),n},o=function(t){return s(t,x)?t[x]:{}},i=function(t){return s(t,x)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(n){var e;if(!c(n)||(e=o(n)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return e}}}},function(t,n,e){var r=e(3),o=e(23),i=r.WeakMap;t.exports="function"==typeof i&&/native code/.test(o(i))},function(t,n,e){var r=e(28),o=e(30),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,n,e){var r=e(29),o=e(24);(t.exports=function(t,n){return o[t]||(o[t]=void 0!==n?n:{})})("versions",[]).push({version:"3.6.5",mode:r?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},function(t,n){t.exports=!1},function(t,n){var e=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++e+r).toString(36)}},function(t,n){t.exports={}},function(t,n,e){var r=e(15),o=e(33),i=e(4),a=e(19);t.exports=function(t,n){for(var e=o(n),u=a.f,c=i.f,f=0;f<e.length;f++){var s=e[f];r(t,s)||u(t,s,c(n,s))}}},function(t,n,e){var r=e(34),o=e(36),i=e(43),a=e(20);t.exports=r("Reflect","ownKeys")||function(t){var n=o.f(a(t)),e=i.f;return e?n.concat(e(t)):n}},function(t,n,e){var r=e(35),o=e(3),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,n){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][n]||o[t]&&o[t][n]}},function(t,n,e){var r=e(3);t.exports=r},function(t,n,e){var r=e(37),o=e(42).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,n,e){var r=e(15),o=e(9),i=e(38).indexOf,a=e(31);t.exports=function(t,n){var e,u=o(t),c=0,f=[];for(e in u)!r(a,e)&&r(u,e)&&f.push(e);for(;n.length>c;)r(u,e=n[c++])&&(~i(f,e)||f.push(e));return f}},function(t,n,e){var r=e(9),o=e(39),i=e(41),a=function(t){return function(n,e,a){var u,c=r(n),f=o(c.length),s=i(a,f);if(t&&e!=e){for(;f>s;)if((u=c[s++])!=u)return!0}else for(;f>s;s++)if((t||s in c)&&c[s]===e)return t||s||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},function(t,n,e){var r=e(40),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},function(t,n,e){var r=e(40),o=Math.max,i=Math.min;t.exports=function(t,n){var e=r(t);return e<0?o(e+n,0):i(e,n)}},function(t,n){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,e){var r=e(6),o=/#|\.prototype\./,i=function(t,n){var e=u[a(t)];return e==f||e!=c&&("function"==typeof n?r(n):!!n)},a=i.normalize=function(t){return String(t).replace(o,".").toLowerCase()},u=i.data={},c=i.NATIVE="N",f=i.POLYFILL="P";t.exports=i},function(t,n,e){var r=e(11);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,n,e){var r=e(12);t.exports=function(t){return Object(r(t))}},function(t,n,e){var r=e(13),o=e(19),i=e(8);t.exports=function(t,n,e){var a=r(n);a in t?o.f(t,a,i(0,e)):t[a]=e}},function(t,n,e){var r=e(14),o=e(45),i=e(49)("species");t.exports=function(t,n){var e;return o(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!o(e.prototype)?r(e)&&null===(e=e[i])&&(e=void 0):e=void 0),new(void 0===e?Array:e)(0===n?0:n)}},function(t,n,e){var r=e(3),o=e(28),i=e(15),a=e(30),u=e(50),c=e(51),f=o("wks"),s=r.Symbol,l=c?s:s&&s.withoutSetter||a;t.exports=function(t){return i(f,t)||(u&&i(s,t)?f[t]=s[t]:f[t]=l("Symbol."+t)),f[t]}},function(t,n,e){var r=e(6);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,n,e){var r=e(50);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,n,e){var r=e(6),o=e(49),i=e(53),a=o("species");t.exports=function(t){return i>=51||!r((function(){var n=[];return(n.constructor={})[a]=function(){return{foo:1}},1!==n[t](Boolean).foo}))}},function(t,n,e){var r,o,i=e(3),a=e(54),u=i.process,c=u&&u.versions,f=c&&c.v8;f?o=(r=f.split("."))[0]+r[1]:a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=r[1]),t.exports=o&&+o},function(t,n,e){var r=e(34);t.exports=r("navigator","userAgent")||""},function(t,n,e){var r=e(2),o=e(56),i=e(57);r({target:"Array",proto:!0},{copyWithin:o}),i("copyWithin")},function(t,n,e){var r=e(46),o=e(41),i=e(39),a=Math.min;t.exports=[].copyWithin||function(t,n){var e=r(this),u=i(e.length),c=o(t,u),f=o(n,u),s=arguments.length>2?arguments[2]:void 0,l=a((void 0===s?u:o(s,u))-f,u-c),p=1;for(f<c&&c<f+l&&(p=-1,f+=l-1,c+=l-1);l-- >0;)f in e?e[c]=e[f]:delete e[c],c+=p,f+=p;return e}},function(t,n,e){var r=e(49),o=e(58),i=e(19),a=r("unscopables"),u=Array.prototype;null==u[a]&&i.f(u,a,{configurable:!0,value:o(null)}),t.exports=function(t){u[a][t]=!0}},function(t,n,e){var r,o=e(20),i=e(59),a=e(42),u=e(31),c=e(61),f=e(17),s=e(27),l=s("IE_PROTO"),p=function(){},h=function(t){return"<script>"+t+"<\/script>"},v=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(t){}var t,n;v=r?function(t){t.write(h("")),t.close();var n=t.parentWindow.Object;return t=null,n}(r):((n=f("iframe")).style.display="none",c.appendChild(n),n.src=String("javascript:"),(t=n.contentWindow.document).open(),t.write(h("document.F=Object")),t.close(),t.F);for(var e=a.length;e--;)delete v.prototype[a[e]];return v()};u[l]=!0,t.exports=Object.create||function(t,n){var e;return null!==t?(p.prototype=o(t),e=new p,p.prototype=null,e[l]=t):e=v(),void 0===n?e:i(e,n)}},function(t,n,e){var r=e(5),o=e(19),i=e(20),a=e(60);t.exports=r?Object.defineProperties:function(t,n){i(t);for(var e,r=a(n),u=r.length,c=0;u>c;)o.f(t,e=r[c++],n[e]);return t}},function(t,n,e){var r=e(37),o=e(42);t.exports=Object.keys||function(t){return r(t,o)}},function(t,n,e){var r=e(34);t.exports=r("document","documentElement")},function(t,n,e){var r=e(2),o=e(63).every,i=e(66),a=e(67),u=i("every"),c=a("every");r({target:"Array",proto:!0,forced:!u||!c},{every:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(64),o=e(10),i=e(46),a=e(39),u=e(48),c=[].push,f=function(t){var n=1==t,e=2==t,f=3==t,s=4==t,l=6==t,p=5==t||l;return function(h,v,g,d){for(var y,x,m=i(h),b=o(m),S=r(v,g,3),E=a(b.length),w=0,O=d||u,R=n?O(h,E):e?O(h,0):void 0;E>w;w++)if((p||w in b)&&(x=S(y=b[w],w,m),t))if(n)R[w]=x;else if(x)switch(t){case 3:return!0;case 5:return y;case 6:return w;case 2:c.call(R,y)}else if(s)return!1;return l?-1:f||s?s:R}};t.exports={forEach:f(0),map:f(1),filter:f(2),some:f(3),every:f(4),find:f(5),findIndex:f(6)}},function(t,n,e){var r=e(65);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 0:return function(){return t.call(n)};case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,o){return t.call(n,e,r,o)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,n,e){var r=e(6);t.exports=function(t,n){var e=[][t];return!!e&&r((function(){e.call(null,n||function(){throw 1},1)}))}},function(t,n,e){var r=e(5),o=e(6),i=e(15),a=Object.defineProperty,u={},c=function(t){throw t};t.exports=function(t,n){if(i(u,t))return u[t];n||(n={});var e=[][t],f=!!i(n,"ACCESSORS")&&n.ACCESSORS,s=i(n,0)?n[0]:c,l=i(n,1)?n[1]:void 0;return u[t]=!!e&&!o((function(){if(f&&!r)return!0;var t={length:-1};f?a(t,1,{enumerable:!0,get:c}):t[1]=1,e.call(t,s,l)}))}},function(t,n,e){var r=e(2),o=e(69),i=e(57);r({target:"Array",proto:!0},{fill:o}),i("fill")},function(t,n,e){var r=e(46),o=e(41),i=e(39);t.exports=function(t){for(var n=r(this),e=i(n.length),a=arguments.length,u=o(a>1?arguments[1]:void 0,e),c=a>2?arguments[2]:void 0,f=void 0===c?e:o(c,e);f>u;)n[u++]=t;return n}},function(t,n,e){var r=e(2),o=e(63).filter,i=e(52),a=e(67),u=i("filter"),c=a("filter");r({target:"Array",proto:!0,forced:!u||!c},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(63).find,i=e(57),a=e(67),u=!0,c=a("find");"find"in[]&&Array(1).find((function(){u=!1})),r({target:"Array",proto:!0,forced:u||!c},{find:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("find")},function(t,n,e){var r=e(2),o=e(63).findIndex,i=e(57),a=e(67),u=!0,c=a("findIndex");"findIndex"in[]&&Array(1).findIndex((function(){u=!1})),r({target:"Array",proto:!0,forced:u||!c},{findIndex:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("findIndex")},function(t,n,e){var r=e(2),o=e(74),i=e(46),a=e(39),u=e(40),c=e(48);r({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,n=i(this),e=a(n.length),r=c(n,0);return r.length=o(r,n,n,e,0,void 0===t?1:u(t)),r}})},function(t,n,e){var r=e(45),o=e(39),i=e(64),a=function(t,n,e,u,c,f,s,l){for(var p,h=c,v=0,g=!!s&&i(s,l,3);v<u;){if(v in e){if(p=g?g(e[v],v,n):e[v],f>0&&r(p))h=a(t,n,p,o(p.length),h,f-1)-1;else{if(h>=9007199254740991)throw TypeError("Exceed the acceptable array length");t[h]=p}h++}v++}return h};t.exports=a},function(t,n,e){var r=e(2),o=e(74),i=e(46),a=e(39),u=e(65),c=e(48);r({target:"Array",proto:!0},{flatMap:function(t){var n,e=i(this),r=a(e.length);return u(t),(n=c(e,0)).length=o(n,e,e,r,0,1,t,arguments.length>1?arguments[1]:void 0),n}})},function(t,n,e){var r=e(2),o=e(77);r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},function(t,n,e){var r=e(63).forEach,o=e(66),i=e(67),a=o("forEach"),u=i("forEach");t.exports=a&&u?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},function(t,n,e){var r=e(2),o=e(79);r({target:"Array",stat:!0,forced:!e(86)((function(t){Array.from(t)}))},{from:o})},function(t,n,e){var r=e(64),o=e(46),i=e(80),a=e(81),u=e(39),c=e(47),f=e(83);t.exports=function(t){var n,e,s,l,p,h,v=o(t),g="function"==typeof this?this:Array,d=arguments.length,y=d>1?arguments[1]:void 0,x=void 0!==y,m=f(v),b=0;if(x&&(y=r(y,d>2?arguments[2]:void 0,2)),null==m||g==Array&&a(m))for(e=new g(n=u(v.length));n>b;b++)h=x?y(v[b],b):v[b],c(e,b,h);else for(p=(l=m.call(v)).next,e=new g;!(s=p.call(l)).done;b++)h=x?i(l,y,[s.value,b],!0):s.value,c(e,b,h);return e.length=b,e}},function(t,n,e){var r=e(20);t.exports=function(t,n,e,o){try{return o?n(r(e)[0],e[1]):n(e)}catch(n){var i=t.return;throw void 0!==i&&r(i.call(t)),n}}},function(t,n,e){var r=e(49),o=e(82),i=r("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||a[i]===t)}},function(t,n){t.exports={}},function(t,n,e){var r=e(84),o=e(82),i=e(49)("iterator");t.exports=function(t){if(null!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,n,e){var r=e(85),o=e(11),i=e(49)("toStringTag"),a="Arguments"==o(function(){return arguments}());t.exports=r?o:function(t){var n,e,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(e=function(t,n){try{return t[n]}catch(t){}}(n=Object(t),i))?e:a?o(n):"Object"==(r=o(n))&&"function"==typeof n.callee?"Arguments":r}},function(t,n,e){var r={};r[e(49)("toStringTag")]="z",t.exports="[object z]"===String(r)},function(t,n,e){var r=e(49)("iterator"),o=!1;try{var i=0,a={next:function(){return{done:!!i++}},return:function(){o=!0}};a[r]=function(){return this},Array.from(a,(function(){throw 2}))}catch(t){}t.exports=function(t,n){if(!n&&!o)return!1;var e=!1;try{var i={};i[r]=function(){return{next:function(){return{done:e=!0}}}},t(i)}catch(t){}return e}},function(t,n,e){var r=e(2),o=e(38).includes,i=e(57);r({target:"Array",proto:!0,forced:!e(67)("indexOf",{ACCESSORS:!0,1:0})},{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("includes")},function(t,n,e){var r=e(2),o=e(38).indexOf,i=e(66),a=e(67),u=[].indexOf,c=!!u&&1/[1].indexOf(1,-0)<0,f=i("indexOf"),s=a("indexOf",{ACCESSORS:!0,1:0});r({target:"Array",proto:!0,forced:c||!f||!s},{indexOf:function(t){return c?u.apply(this,arguments)||0:o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(9),o=e(57),i=e(82),a=e(25),u=e(90),c=a.set,f=a.getterFor("Array Iterator");t.exports=u(Array,"Array",(function(t,n){c(this,{type:"Array Iterator",target:r(t),index:0,kind:n})}),(function(){var t=f(this),n=t.target,e=t.kind,r=t.index++;return!n||r>=n.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==e?{value:r,done:!1}:"values"==e?{value:n[r],done:!1}:{value:[r,n[r]],done:!1}}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(t,n,e){var r=e(2),o=e(91),i=e(93),a=e(96),u=e(95),c=e(18),f=e(21),s=e(49),l=e(29),p=e(82),h=e(92),v=h.IteratorPrototype,g=h.BUGGY_SAFARI_ITERATORS,d=s("iterator"),y=function(){return this};t.exports=function(t,n,e,s,h,x,m){o(e,n,s);var b,S,E,w=function(t){if(t===h&&I)return I;if(!g&&t in A)return A[t];switch(t){case"keys":case"values":case"entries":return function(){return new e(this,t)}}return function(){return new e(this)}},O=n+" Iterator",R=!1,A=t.prototype,j=A[d]||A["@@iterator"]||h&&A[h],I=!g&&j||w(h),k="Array"==n&&A.entries||j;if(k&&(b=i(k.call(new t)),v!==Object.prototype&&b.next&&(l||i(b)===v||(a?a(b,v):"function"!=typeof b[d]&&c(b,d,y)),u(b,O,!0,!0),l&&(p[O]=y))),"values"==h&&j&&"values"!==j.name&&(R=!0,I=function(){return j.call(this)}),l&&!m||A[d]===I||c(A,d,I),p[n]=I,h)if(S={values:w("values"),keys:x?I:w("keys"),entries:w("entries")},m)for(E in S)(g||R||!(E in A))&&f(A,E,S[E]);else r({target:n,proto:!0,forced:g||R},S);return S}},function(t,n,e){var r=e(92).IteratorPrototype,o=e(58),i=e(8),a=e(95),u=e(82),c=function(){return this};t.exports=function(t,n,e){var f=n+" Iterator";return t.prototype=o(r,{next:i(1,e)}),a(t,f,!1,!0),u[f]=c,t}},function(t,n,e){var r,o,i,a=e(93),u=e(18),c=e(15),f=e(49),s=e(29),l=f("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(o=a(a(i)))!==Object.prototype&&(r=o):p=!0),null==r&&(r={}),s||c(r,l)||u(r,l,(function(){return this})),t.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},function(t,n,e){var r=e(15),o=e(46),i=e(27),a=e(94),u=i("IE_PROTO"),c=Object.prototype;t.exports=a?Object.getPrototypeOf:function(t){return t=o(t),r(t,u)?t[u]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?c:null}},function(t,n,e){var r=e(6);t.exports=!r((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},function(t,n,e){var r=e(19).f,o=e(15),i=e(49)("toStringTag");t.exports=function(t,n,e){t&&!o(t=e?t:t.prototype,i)&&r(t,i,{configurable:!0,value:n})}},function(t,n,e){var r=e(20),o=e(97);t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,n=!1,e={};try{(t=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(e,[]),n=e instanceof Array}catch(t){}return function(e,i){return r(e),o(i),n?t.call(e,i):e.__proto__=i,e}}():void 0)},function(t,n,e){var r=e(14);t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},function(t,n,e){var r=e(2),o=e(10),i=e(9),a=e(66),u=[].join,c=o!=Object,f=a("join",",");r({target:"Array",proto:!0,forced:c||!f},{join:function(t){return u.call(i(this),void 0===t?",":t)}})},function(t,n,e){var r=e(2),o=e(100);r({target:"Array",proto:!0,forced:o!==[].lastIndexOf},{lastIndexOf:o})},function(t,n,e){var r=e(9),o=e(40),i=e(39),a=e(66),u=e(67),c=Math.min,f=[].lastIndexOf,s=!!f&&1/[1].lastIndexOf(1,-0)<0,l=a("lastIndexOf"),p=u("indexOf",{ACCESSORS:!0,1:0}),h=s||!l||!p;t.exports=h?function(t){if(s)return f.apply(this,arguments)||0;var n=r(this),e=i(n.length),a=e-1;for(arguments.length>1&&(a=c(a,o(arguments[1]))),a<0&&(a=e+a);a>=0;a--)if(a in n&&n[a]===t)return a||0;return-1}:f},function(t,n,e){var r=e(2),o=e(63).map,i=e(52),a=e(67),u=i("map"),c=a("map");r({target:"Array",proto:!0,forced:!u||!c},{map:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(6),i=e(47);r({target:"Array",stat:!0,forced:o((function(){function t(){}return!(Array.of.call(t)instanceof t)}))},{of:function(){for(var t=0,n=arguments.length,e=new("function"==typeof this?this:Array)(n);n>t;)i(e,t,arguments[t++]);return e.length=n,e}})},function(t,n,e){var r=e(2),o=e(104).left,i=e(66),a=e(67),u=i("reduce"),c=a("reduce",{1:0});r({target:"Array",proto:!0,forced:!u||!c},{reduce:function(t){return o(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(65),o=e(46),i=e(10),a=e(39),u=function(t){return function(n,e,u,c){r(e);var f=o(n),s=i(f),l=a(f.length),p=t?l-1:0,h=t?-1:1;if(u<2)for(;;){if(p in s){c=s[p],p+=h;break}if(p+=h,t?p<0:l<=p)throw TypeError("Reduce of empty array with no initial value")}for(;t?p>=0:l>p;p+=h)p in s&&(c=e(c,s[p],p,f));return c}};t.exports={left:u(!1),right:u(!0)}},function(t,n,e){var r=e(2),o=e(104).right,i=e(66),a=e(67),u=i("reduceRight"),c=a("reduce",{1:0});r({target:"Array",proto:!0,forced:!u||!c},{reduceRight:function(t){return o(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(14),i=e(45),a=e(41),u=e(39),c=e(9),f=e(47),s=e(49),l=e(52),p=e(67),h=l("slice"),v=p("slice",{ACCESSORS:!0,0:0,1:2}),g=s("species"),d=[].slice,y=Math.max;r({target:"Array",proto:!0,forced:!h||!v},{slice:function(t,n){var e,r,s,l=c(this),p=u(l.length),h=a(t,p),v=a(void 0===n?p:n,p);if(i(l)&&("function"!=typeof(e=l.constructor)||e!==Array&&!i(e.prototype)?o(e)&&null===(e=e[g])&&(e=void 0):e=void 0,e===Array||void 0===e))return d.call(l,h,v);for(r=new(void 0===e?Array:e)(y(v-h,0)),s=0;h<v;h++,s++)h in l&&f(r,s,l[h]);return r.length=s,r}})},function(t,n,e){var r=e(2),o=e(63).some,i=e(66),a=e(67),u=i("some"),c=a("some");r({target:"Array",proto:!0,forced:!u||!c},{some:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){e(109)("Array")},function(t,n,e){var r=e(34),o=e(19),i=e(49),a=e(5),u=i("species");t.exports=function(t){var n=r(t),e=o.f;a&&n&&!n[u]&&e(n,u,{configurable:!0,get:function(){return this}})}},function(t,n,e){var r=e(2),o=e(41),i=e(40),a=e(39),u=e(46),c=e(48),f=e(47),s=e(52),l=e(67),p=s("splice"),h=l("splice",{ACCESSORS:!0,0:0,1:2}),v=Math.max,g=Math.min;r({target:"Array",proto:!0,forced:!p||!h},{splice:function(t,n){var e,r,s,l,p,h,d=u(this),y=a(d.length),x=o(t,y),m=arguments.length;if(0===m?e=r=0:1===m?(e=0,r=y-x):(e=m-2,r=g(v(i(n),0),y-x)),y+e-r>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(s=c(d,r),l=0;l<r;l++)(p=x+l)in d&&f(s,l,d[p]);if(s.length=r,e<r){for(l=x;l<y-r;l++)h=l+e,(p=l+r)in d?d[h]=d[p]:delete d[h];for(l=y;l>y-r+e;l--)delete d[l-1]}else if(e>r)for(l=y-r;l>x;l--)h=l+e-1,(p=l+r-1)in d?d[h]=d[p]:delete d[h];for(l=0;l<e;l++)d[l+x]=arguments[l+2];return d.length=y-r+e,s}})},function(t,n,e){e(57)("flat")},function(t,n,e){e(57)("flatMap")},function(t,n,e){var r=e(14),o=e(19),i=e(93),a=e(49)("hasInstance"),u=Function.prototype;a in u||o.f(u,a,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},function(t,n,e){var r=e(5),o=e(19).f,i=Function.prototype,a=i.toString,u=/^\s*function ([^ (]*)/;r&&!("name"in i)&&o(i,"name",{configurable:!0,get:function(){try{return a.call(this).match(u)[1]}catch(t){return""}}})},function(t,n,e){e(2)({global:!0},{globalThis:e(3)})},function(t,n,e){var r=e(2),o=e(34),i=e(6),a=o("JSON","stringify"),u=/[\uD800-\uDFFF]/g,c=/^[\uD800-\uDBFF]$/,f=/^[\uDC00-\uDFFF]$/,s=function(t,n,e){var r=e.charAt(n-1),o=e.charAt(n+1);return c.test(t)&&!f.test(o)||f.test(t)&&!c.test(r)?"\\u"+t.charCodeAt(0).toString(16):t},l=i((function(){return'"\\udf06\\ud834"'!==a("\udf06\ud834")||'"\\udead"'!==a("\udead")}));a&&r({target:"JSON",stat:!0,forced:l},{stringify:function(t,n,e){var r=a.apply(null,arguments);return"string"==typeof r?r.replace(u,s):r}})},function(t,n,e){var r=e(3);e(95)(r.JSON,"JSON",!0)},function(t,n,e){var r=e(119),o=e(125);t.exports=r("Map",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),o)},function(t,n,e){var r=e(2),o=e(3),i=e(44),a=e(21),u=e(120),c=e(122),f=e(123),s=e(14),l=e(6),p=e(86),h=e(95),v=e(124);t.exports=function(t,n,e){var g=-1!==t.indexOf("Map"),d=-1!==t.indexOf("Weak"),y=g?"set":"add",x=o[t],m=x&&x.prototype,b=x,S={},E=function(t){var n=m[t];a(m,t,"add"==t?function(t){return n.call(this,0===t?0:t),this}:"delete"==t?function(t){return!(d&&!s(t))&&n.call(this,0===t?0:t)}:"get"==t?function(t){return d&&!s(t)?void 0:n.call(this,0===t?0:t)}:"has"==t?function(t){return!(d&&!s(t))&&n.call(this,0===t?0:t)}:function(t,e){return n.call(this,0===t?0:t,e),this})};if(i(t,"function"!=typeof x||!(d||m.forEach&&!l((function(){(new x).entries().next()})))))b=e.getConstructor(n,t,g,y),u.REQUIRED=!0;else if(i(t,!0)){var w=new b,O=w[y](d?{}:-0,1)!=w,R=l((function(){w.has(1)})),A=p((function(t){new x(t)})),j=!d&&l((function(){for(var t=new x,n=5;n--;)t[y](n,n);return!t.has(-0)}));A||((b=n((function(n,e){f(n,b,t);var r=v(new x,n,b);return null!=e&&c(e,r[y],r,g),r}))).prototype=m,m.constructor=b),(R||j)&&(E("delete"),E("has"),g&&E("get")),(j||O)&&E(y),d&&m.clear&&delete m.clear}return S[t]=b,r({global:!0,forced:b!=x},S),h(b,t),d||e.setStrong(b,t,g),b}},function(t,n,e){var r=e(31),o=e(14),i=e(15),a=e(19).f,u=e(30),c=e(121),f=u("meta"),s=0,l=Object.isExtensible||function(){return!0},p=function(t){a(t,f,{value:{objectID:"O"+ ++s,weakData:{}}})},h=t.exports={REQUIRED:!1,fastKey:function(t,n){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,f)){if(!l(t))return"F";if(!n)return"E";p(t)}return t[f].objectID},getWeakData:function(t,n){if(!i(t,f)){if(!l(t))return!0;if(!n)return!1;p(t)}return t[f].weakData},onFreeze:function(t){return c&&h.REQUIRED&&l(t)&&!i(t,f)&&p(t),t}};r[f]=!0},function(t,n,e){var r=e(6);t.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(t,n,e){var r=e(20),o=e(81),i=e(39),a=e(64),u=e(83),c=e(80),f=function(t,n){this.stopped=t,this.result=n};(t.exports=function(t,n,e,s,l){var p,h,v,g,d,y,x,m=a(n,e,s?2:1);if(l)p=t;else{if("function"!=typeof(h=u(t)))throw TypeError("Target is not iterable");if(o(h)){for(v=0,g=i(t.length);g>v;v++)if((d=s?m(r(x=t[v])[0],x[1]):m(t[v]))&&d instanceof f)return d;return new f(!1)}p=h.call(t)}for(y=p.next;!(x=y.call(p)).done;)if("object"==typeof(d=c(p,m,x.value,s))&&d&&d instanceof f)return d;return new f(!1)}).stop=function(t){return new f(!0,t)}},function(t,n){t.exports=function(t,n,e){if(!(t instanceof n))throw TypeError("Incorrect "+(e?e+" ":"")+"invocation");return t}},function(t,n,e){var r=e(14),o=e(96);t.exports=function(t,n,e){var i,a;return o&&"function"==typeof(i=n.constructor)&&i!==e&&r(a=i.prototype)&&a!==e.prototype&&o(t,a),t}},function(t,n,e){var r=e(19).f,o=e(58),i=e(126),a=e(64),u=e(123),c=e(122),f=e(90),s=e(109),l=e(5),p=e(120).fastKey,h=e(25),v=h.set,g=h.getterFor;t.exports={getConstructor:function(t,n,e,f){var s=t((function(t,r){u(t,s,n),v(t,{type:n,index:o(null),first:void 0,last:void 0,size:0}),l||(t.size=0),null!=r&&c(r,t[f],t,e)})),h=g(n),d=function(t,n,e){var r,o,i=h(t),a=y(t,n);return a?a.value=e:(i.last=a={index:o=p(n,!0),key:n,value:e,previous:r=i.last,next:void 0,removed:!1},i.first||(i.first=a),r&&(r.next=a),l?i.size++:t.size++,"F"!==o&&(i.index[o]=a)),t},y=function(t,n){var e,r=h(t),o=p(n);if("F"!==o)return r.index[o];for(e=r.first;e;e=e.next)if(e.key==n)return e};return i(s.prototype,{clear:function(){for(var t=h(this),n=t.index,e=t.first;e;)e.removed=!0,e.previous&&(e.previous=e.previous.next=void 0),delete n[e.index],e=e.next;t.first=t.last=void 0,l?t.size=0:this.size=0},delete:function(t){var n=h(this),e=y(this,t);if(e){var r=e.next,o=e.previous;delete n.index[e.index],e.removed=!0,o&&(o.next=r),r&&(r.previous=o),n.first==e&&(n.first=r),n.last==e&&(n.last=o),l?n.size--:this.size--}return!!e},forEach:function(t){for(var n,e=h(this),r=a(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.next:e.first;)for(r(n.value,n.key,this);n&&n.removed;)n=n.previous},has:function(t){return!!y(this,t)}}),i(s.prototype,e?{get:function(t){var n=y(this,t);return n&&n.value},set:function(t,n){return d(this,0===t?0:t,n)}}:{add:function(t){return d(this,t=0===t?0:t,t)}}),l&&r(s.prototype,"size",{get:function(){return h(this).size}}),s},setStrong:function(t,n,e){var r=n+" Iterator",o=g(n),i=g(r);f(t,n,(function(t,n){v(this,{type:r,target:t,state:o(t),kind:n,last:void 0})}),(function(){for(var t=i(this),n=t.kind,e=t.last;e&&e.removed;)e=e.previous;return t.target&&(t.last=e=e?e.next:t.state.first)?"keys"==n?{value:e.key,done:!1}:"values"==n?{value:e.value,done:!1}:{value:[e.key,e.value],done:!1}:(t.target=void 0,{value:void 0,done:!0})}),e?"entries":"values",!e,!0),s(n)}}},function(t,n,e){var r=e(21);t.exports=function(t,n,e){for(var o in n)r(t,o,n[o],e);return t}},function(t,n,e){var r=e(5),o=e(3),i=e(44),a=e(21),u=e(15),c=e(11),f=e(124),s=e(13),l=e(6),p=e(58),h=e(36).f,v=e(4).f,g=e(19).f,d=e(128).trim,y=o.Number,x=y.prototype,m="Number"==c(p(x)),b=function(t){var n,e,r,o,i,a,u,c,f=s(t,!1);if("string"==typeof f&&f.length>2)if(43===(n=(f=d(f)).charCodeAt(0))||45===n){if(88===(e=f.charCodeAt(2))||120===e)return NaN}else if(48===n){switch(f.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+f}for(a=(i=f.slice(2)).length,u=0;u<a;u++)if((c=i.charCodeAt(u))<48||c>o)return NaN;return parseInt(i,r)}return+f};if(i("Number",!y(" 0o1")||!y("0b1")||y("+0x1"))){for(var S,E=function(t){var n=arguments.length<1?0:t,e=this;return e instanceof E&&(m?l((function(){x.valueOf.call(e)})):"Number"!=c(e))?f(new y(b(n)),e,E):b(n)},w=r?h(y):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),O=0;w.length>O;O++)u(y,S=w[O])&&!u(E,S)&&g(E,S,v(y,S));E.prototype=x,x.constructor=E,a(o,"Number",E)}},function(t,n,e){var r=e(12),o="["+e(129)+"]",i=RegExp("^"+o+o+"*"),a=RegExp(o+o+"*$"),u=function(t){return function(n){var e=String(r(n));return 1&t&&(e=e.replace(i,"")),2&t&&(e=e.replace(a,"")),e}};t.exports={start:u(1),end:u(2),trim:u(3)}},function(t,n){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},function(t,n,e){e(2)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},function(t,n,e){e(2)({target:"Number",stat:!0},{isFinite:e(132)})},function(t,n,e){var r=e(3).isFinite;t.exports=Number.isFinite||function(t){return"number"==typeof t&&r(t)}},function(t,n,e){e(2)({target:"Number",stat:!0},{isInteger:e(134)})},function(t,n,e){var r=e(14),o=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&o(t)===t}},function(t,n,e){e(2)({target:"Number",stat:!0},{isNaN:function(t){return t!=t}})},function(t,n,e){var r=e(2),o=e(134),i=Math.abs;r({target:"Number",stat:!0},{isSafeInteger:function(t){return o(t)&&i(t)<=9007199254740991}})},function(t,n,e){e(2)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,e){e(2)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,e){var r=e(2),o=e(140);r({target:"Number",stat:!0,forced:Number.parseFloat!=o},{parseFloat:o})},function(t,n,e){var r=e(3),o=e(128).trim,i=e(129),a=r.parseFloat,u=1/a(i+"-0")!=-1/0;t.exports=u?function(t){var n=o(String(t)),e=a(n);return 0===e&&"-"==n.charAt(0)?-0:e}:a},function(t,n,e){var r=e(2),o=e(142);r({target:"Number",stat:!0,forced:Number.parseInt!=o},{parseInt:o})},function(t,n,e){var r=e(3),o=e(128).trim,i=e(129),a=r.parseInt,u=/^[+-]?0[Xx]/,c=8!==a(i+"08")||22!==a(i+"0x16");t.exports=c?function(t,n){var e=o(String(t));return a(e,n>>>0||(u.test(e)?16:10))}:a},function(t,n,e){var r=e(2),o=e(40),i=e(144),a=e(145),u=e(6),c=1..toFixed,f=Math.floor,s=function(t,n,e){return 0===n?e:n%2==1?s(t,n-1,e*t):s(t*t,n/2,e)};r({target:"Number",proto:!0,forced:c&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!u((function(){c.call({})}))},{toFixed:function(t){var n,e,r,u,c=i(this),l=o(t),p=[0,0,0,0,0,0],h="",v="0",g=function(t,n){for(var e=-1,r=n;++e<6;)r+=t*p[e],p[e]=r%1e7,r=f(r/1e7)},d=function(t){for(var n=6,e=0;--n>=0;)e+=p[n],p[n]=f(e/t),e=e%t*1e7},y=function(){for(var t=6,n="";--t>=0;)if(""!==n||0===t||0!==p[t]){var e=String(p[t]);n=""===n?e:n+a.call("0",7-e.length)+e}return n};if(l<0||l>20)throw RangeError("Incorrect fraction digits");if(c!=c)return"NaN";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(h="-",c=-c),c>1e-21)if(e=(n=function(t){for(var n=0,e=t;e>=4096;)n+=12,e/=4096;for(;e>=2;)n+=1,e/=2;return n}(c*s(2,69,1))-69)<0?c*s(2,-n,1):c/s(2,n,1),e*=4503599627370496,(n=52-n)>0){for(g(0,e),r=l;r>=7;)g(1e7,0),r-=7;for(g(s(10,r,1),0),r=n-1;r>=23;)d(1<<23),r-=23;d(1<<r),g(1,1),d(2),v=y()}else g(0,e),g(1<<-n,0),v=y()+a.call("0",l);return v=l>0?h+((u=v.length)<=l?"0."+a.call("0",l-u)+v:v.slice(0,u-l)+"."+v.slice(u-l)):h+v}})},function(t,n,e){var r=e(11);t.exports=function(t){if("number"!=typeof t&&"Number"!=r(t))throw TypeError("Incorrect invocation");return+t}},function(t,n,e){var r=e(40),o=e(12);t.exports="".repeat||function(t){var n=String(o(this)),e="",i=r(t);if(i<0||i==1/0)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(n+=n))1&i&&(e+=n);return e}},function(t,n,e){var r=e(2),o=e(147);r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},function(t,n,e){var r=e(5),o=e(6),i=e(60),a=e(43),u=e(7),c=e(46),f=e(10),s=Object.assign,l=Object.defineProperty;t.exports=!s||o((function(){if(r&&1!==s({b:1},s(l({},"a",{enumerable:!0,get:function(){l(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},n={},e=Symbol();return t[e]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){n[t]=t})),7!=s({},t)[e]||"abcdefghijklmnopqrst"!=i(s({},n)).join("")}))?function(t,n){for(var e=c(t),o=arguments.length,s=1,l=a.f,p=u.f;o>s;)for(var h,v=f(arguments[s++]),g=l?i(v).concat(l(v)):i(v),d=g.length,y=0;d>y;)h=g[y++],r&&!p.call(v,h)||(e[h]=v[h]);return e}:s},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(65),c=e(19);o&&r({target:"Object",proto:!0,forced:i},{__defineGetter__:function(t,n){c.f(a(this),t,{get:u(n),enumerable:!0,configurable:!0})}})},function(t,n,e){var r=e(29),o=e(3),i=e(6);t.exports=r||!i((function(){var t=Math.random();__defineSetter__.call(null,t,(function(){})),delete o[t]}))},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(65),c=e(19);o&&r({target:"Object",proto:!0,forced:i},{__defineSetter__:function(t,n){c.f(a(this),t,{set:u(n),enumerable:!0,configurable:!0})}})},function(t,n,e){var r=e(2),o=e(152).entries;r({target:"Object",stat:!0},{entries:function(t){return o(t)}})},function(t,n,e){var r=e(5),o=e(60),i=e(9),a=e(7).f,u=function(t){return function(n){for(var e,u=i(n),c=o(u),f=c.length,s=0,l=[];f>s;)e=c[s++],r&&!a.call(u,e)||l.push(t?[e,u[e]]:u[e]);return l}};t.exports={entries:u(!0),values:u(!1)}},function(t,n,e){var r=e(2),o=e(121),i=e(6),a=e(14),u=e(120).onFreeze,c=Object.freeze;r({target:"Object",stat:!0,forced:i((function(){c(1)})),sham:!o},{freeze:function(t){return c&&a(t)?c(u(t)):t}})},function(t,n,e){var r=e(2),o=e(122),i=e(47);r({target:"Object",stat:!0},{fromEntries:function(t){var n={};return o(t,(function(t,e){i(n,t,e)}),void 0,!0),n}})},function(t,n,e){var r=e(2),o=e(6),i=e(9),a=e(4).f,u=e(5),c=o((function(){a(1)}));r({target:"Object",stat:!0,forced:!u||c,sham:!u},{getOwnPropertyDescriptor:function(t,n){return a(i(t),n)}})},function(t,n,e){var r=e(2),o=e(5),i=e(33),a=e(9),u=e(4),c=e(47);r({target:"Object",stat:!0,sham:!o},{getOwnPropertyDescriptors:function(t){for(var n,e,r=a(t),o=u.f,f=i(r),s={},l=0;f.length>l;)void 0!==(e=o(r,n=f[l++]))&&c(s,n,e);return s}})},function(t,n,e){var r=e(2),o=e(6),i=e(158).f;r({target:"Object",stat:!0,forced:o((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:i})},function(t,n,e){var r=e(9),o=e(36).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return a&&"[object Window]"==i.call(t)?function(t){try{return o(t)}catch(t){return a.slice()}}(t):o(r(t))}},function(t,n,e){var r=e(2),o=e(6),i=e(46),a=e(93),u=e(94);r({target:"Object",stat:!0,forced:o((function(){a(1)})),sham:!u},{getPrototypeOf:function(t){return a(i(t))}})},function(t,n,e){e(2)({target:"Object",stat:!0},{is:e(161)})},function(t,n){t.exports=Object.is||function(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,e){var r=e(2),o=e(6),i=e(14),a=Object.isExtensible;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isExtensible:function(t){return!!i(t)&&(!a||a(t))}})},function(t,n,e){var r=e(2),o=e(6),i=e(14),a=Object.isFrozen;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isFrozen:function(t){return!i(t)||!!a&&a(t)}})},function(t,n,e){var r=e(2),o=e(6),i=e(14),a=Object.isSealed;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isSealed:function(t){return!i(t)||!!a&&a(t)}})},function(t,n,e){var r=e(2),o=e(46),i=e(60);r({target:"Object",stat:!0,forced:e(6)((function(){i(1)}))},{keys:function(t){return i(o(t))}})},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(13),c=e(93),f=e(4).f;o&&r({target:"Object",proto:!0,forced:i},{__lookupGetter__:function(t){var n,e=a(this),r=u(t,!0);do{if(n=f(e,r))return n.get}while(e=c(e))}})},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(13),c=e(93),f=e(4).f;o&&r({target:"Object",proto:!0,forced:i},{__lookupSetter__:function(t){var n,e=a(this),r=u(t,!0);do{if(n=f(e,r))return n.set}while(e=c(e))}})},function(t,n,e){var r=e(2),o=e(14),i=e(120).onFreeze,a=e(121),u=e(6),c=Object.preventExtensions;r({target:"Object",stat:!0,forced:u((function(){c(1)})),sham:!a},{preventExtensions:function(t){return c&&o(t)?c(i(t)):t}})},function(t,n,e){var r=e(2),o=e(14),i=e(120).onFreeze,a=e(121),u=e(6),c=Object.seal;r({target:"Object",stat:!0,forced:u((function(){c(1)})),sham:!a},{seal:function(t){return c&&o(t)?c(i(t)):t}})},function(t,n,e){var r=e(85),o=e(21),i=e(171);r||o(Object.prototype,"toString",i,{unsafe:!0})},function(t,n,e){var r=e(85),o=e(84);t.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},function(t,n,e){var r=e(2),o=e(152).values;r({target:"Object",stat:!0},{values:function(t){return o(t)}})},function(t,n,e){var r,o,i,a,u=e(2),c=e(29),f=e(3),s=e(34),l=e(174),p=e(21),h=e(126),v=e(95),g=e(109),d=e(14),y=e(65),x=e(123),m=e(11),b=e(23),S=e(122),E=e(86),w=e(175),O=e(176).set,R=e(178),A=e(179),j=e(181),I=e(180),k=e(182),P=e(25),L=e(44),T=e(49),_=e(53),U=T("species"),N="Promise",C=P.get,F=P.set,M=P.getterFor(N),z=l,D=f.TypeError,q=f.document,B=f.process,W=s("fetch"),$=I.f,G=$,V="process"==m(B),X=!!(q&&q.createEvent&&f.dispatchEvent),Y=L(N,(function(){if(!(b(z)!==String(z))){if(66===_)return!0;if(!V&&"function"!=typeof PromiseRejectionEvent)return!0}if(c&&!z.prototype.finally)return!0;if(_>=51&&/native code/.test(z))return!1;var t=z.resolve(1),n=function(t){t((function(){}),(function(){}))};return(t.constructor={})[U]=n,!(t.then((function(){}))instanceof n)})),K=Y||!E((function(t){z.all(t).catch((function(){}))})),J=function(t){var n;return!(!d(t)||"function"!=typeof(n=t.then))&&n},H=function(t,n,e){if(!n.notified){n.notified=!0;var r=n.reactions;R((function(){for(var o=n.value,i=1==n.state,a=0;r.length>a;){var u,c,f,s=r[a++],l=i?s.ok:s.fail,p=s.resolve,h=s.reject,v=s.domain;try{l?(i||(2===n.rejection&&nt(t,n),n.rejection=1),!0===l?u=o:(v&&v.enter(),u=l(o),v&&(v.exit(),f=!0)),u===s.promise?h(D("Promise-chain cycle")):(c=J(u))?c.call(u,p,h):p(u)):h(o)}catch(t){v&&!f&&v.exit(),h(t)}}n.reactions=[],n.notified=!1,e&&!n.rejection&&Z(t,n)}))}},Q=function(t,n,e){var r,o;X?((r=q.createEvent("Event")).promise=n,r.reason=e,r.initEvent(t,!1,!0),f.dispatchEvent(r)):r={promise:n,reason:e},(o=f["on"+t])?o(r):"unhandledrejection"===t&&j("Unhandled promise rejection",e)},Z=function(t,n){O.call(f,(function(){var e,r=n.value;if(tt(n)&&(e=k((function(){V?B.emit("unhandledRejection",r,t):Q("unhandledrejection",t,r)})),n.rejection=V||tt(n)?2:1,e.error))throw e.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},nt=function(t,n){O.call(f,(function(){V?B.emit("rejectionHandled",t):Q("rejectionhandled",t,n.value)}))},et=function(t,n,e,r){return function(o){t(n,e,o,r)}},rt=function(t,n,e,r){n.done||(n.done=!0,r&&(n=r),n.value=e,n.state=2,H(t,n,!0))},ot=function(t,n,e,r){if(!n.done){n.done=!0,r&&(n=r);try{if(t===e)throw D("Promise can't be resolved itself");var o=J(e);o?R((function(){var r={done:!1};try{o.call(e,et(ot,t,r,n),et(rt,t,r,n))}catch(e){rt(t,r,e,n)}})):(n.value=e,n.state=1,H(t,n,!1))}catch(e){rt(t,{done:!1},e,n)}}};Y&&(z=function(t){x(this,z,N),y(t),r.call(this);var n=C(this);try{t(et(ot,this,n),et(rt,this,n))}catch(t){rt(this,n,t)}},(r=function(t){F(this,{type:N,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(z.prototype,{then:function(t,n){var e=M(this),r=$(w(this,z));return r.ok="function"!=typeof t||t,r.fail="function"==typeof n&&n,r.domain=V?B.domain:void 0,e.parent=!0,e.reactions.push(r),0!=e.state&&H(this,e,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r,n=C(t);this.promise=t,this.resolve=et(ot,t,n),this.reject=et(rt,t,n)},I.f=$=function(t){return t===z||t===i?new o(t):G(t)},c||"function"!=typeof l||(a=l.prototype.then,p(l.prototype,"then",(function(t,n){var e=this;return new z((function(t,n){a.call(e,t,n)})).then(t,n)}),{unsafe:!0}),"function"==typeof W&&u({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return A(z,W.apply(f,arguments))}}))),u({global:!0,wrap:!0,forced:Y},{Promise:z}),v(z,N,!1,!0),g(N),i=s(N),u({target:N,stat:!0,forced:Y},{reject:function(t){var n=$(this);return n.reject.call(void 0,t),n.promise}}),u({target:N,stat:!0,forced:c||Y},{resolve:function(t){return A(c&&this===i?z:this,t)}}),u({target:N,stat:!0,forced:K},{all:function(t){var n=this,e=$(n),r=e.resolve,o=e.reject,i=k((function(){var e=y(n.resolve),i=[],a=0,u=1;S(t,(function(t){var c=a++,f=!1;i.push(void 0),u++,e.call(n,t).then((function(t){f||(f=!0,i[c]=t,--u||r(i))}),o)})),--u||r(i)}));return i.error&&o(i.value),e.promise},race:function(t){var n=this,e=$(n),r=e.reject,o=k((function(){var o=y(n.resolve);S(t,(function(t){o.call(n,t).then(e.resolve,r)}))}));return o.error&&r(o.value),e.promise}})},function(t,n,e){var r=e(3);t.exports=r.Promise},function(t,n,e){var r=e(20),o=e(65),i=e(49)("species");t.exports=function(t,n){var e,a=r(t).constructor;return void 0===a||null==(e=r(a)[i])?n:o(e)}},function(t,n,e){var r,o,i,a=e(3),u=e(6),c=e(11),f=e(64),s=e(61),l=e(17),p=e(177),h=a.location,v=a.setImmediate,g=a.clearImmediate,d=a.process,y=a.MessageChannel,x=a.Dispatch,m=0,b={},S=function(t){if(b.hasOwnProperty(t)){var n=b[t];delete b[t],n()}},E=function(t){return function(){S(t)}},w=function(t){S(t.data)},O=function(t){a.postMessage(t+"",h.protocol+"//"+h.host)};v&&g||(v=function(t){for(var n=[],e=1;arguments.length>e;)n.push(arguments[e++]);return b[++m]=function(){("function"==typeof t?t:Function(t)).apply(void 0,n)},r(m),m},g=function(t){delete b[t]},"process"==c(d)?r=function(t){d.nextTick(E(t))}:x&&x.now?r=function(t){x.now(E(t))}:y&&!p?(i=(o=new y).port2,o.port1.onmessage=w,r=f(i.postMessage,i,1)):!a.addEventListener||"function"!=typeof postMessage||a.importScripts||u(O)||"file:"===h.protocol?r="onreadystatechange"in l("script")?function(t){s.appendChild(l("script")).onreadystatechange=function(){s.removeChild(this),S(t)}}:function(t){setTimeout(E(t),0)}:(r=O,a.addEventListener("message",w,!1))),t.exports={set:v,clear:g}},function(t,n,e){var r=e(54);t.exports=/(iphone|ipod|ipad).*applewebkit/i.test(r)},function(t,n,e){var r,o,i,a,u,c,f,s,l=e(3),p=e(4).f,h=e(11),v=e(176).set,g=e(177),d=l.MutationObserver||l.WebKitMutationObserver,y=l.process,x=l.Promise,m="process"==h(y),b=p(l,"queueMicrotask"),S=b&&b.value;S||(r=function(){var t,n;for(m&&(t=y.domain)&&t.exit();o;){n=o.fn,o=o.next;try{n()}catch(t){throw o?a():i=void 0,t}}i=void 0,t&&t.enter()},m?a=function(){y.nextTick(r)}:d&&!g?(u=!0,c=document.createTextNode(""),new d(r).observe(c,{characterData:!0}),a=function(){c.data=u=!u}):x&&x.resolve?(f=x.resolve(void 0),s=f.then,a=function(){s.call(f,r)}):a=function(){v.call(l,r)}),t.exports=S||function(t){var n={fn:t,next:void 0};i&&(i.next=n),o||(o=n,a()),i=n}},function(t,n,e){var r=e(20),o=e(14),i=e(180);t.exports=function(t,n){if(r(t),o(n)&&n.constructor===t)return n;var e=i.f(t);return(0,e.resolve)(n),e.promise}},function(t,n,e){var r=e(65),o=function(t){var n,e;this.promise=new t((function(t,r){if(void 0!==n||void 0!==e)throw TypeError("Bad Promise constructor");n=t,e=r})),this.resolve=r(n),this.reject=r(e)};t.exports.f=function(t){return new o(t)}},function(t,n,e){var r=e(3);t.exports=function(t,n){var e=r.console;e&&e.error&&(1===arguments.length?e.error(t):e.error(t,n))}},function(t,n){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,n,e){var r=e(2),o=e(65),i=e(180),a=e(182),u=e(122);r({target:"Promise",stat:!0},{allSettled:function(t){var n=this,e=i.f(n),r=e.resolve,c=e.reject,f=a((function(){var e=o(n.resolve),i=[],a=0,c=1;u(t,(function(t){var o=a++,u=!1;i.push(void 0),c++,e.call(n,t).then((function(t){u||(u=!0,i[o]={status:"fulfilled",value:t},--c||r(i))}),(function(t){u||(u=!0,i[o]={status:"rejected",reason:t},--c||r(i))}))})),--c||r(i)}));return f.error&&c(f.value),e.promise}})},function(t,n,e){var r=e(2),o=e(29),i=e(174),a=e(6),u=e(34),c=e(175),f=e(179),s=e(21);r({target:"Promise",proto:!0,real:!0,forced:!!i&&a((function(){i.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(t){var n=c(this,u("Promise")),e="function"==typeof t;return this.then(e?function(e){return f(n,t()).then((function(){return e}))}:t,e?function(e){return f(n,t()).then((function(){throw e}))}:t)}}),o||"function"!=typeof i||i.prototype.finally||s(i.prototype,"finally",u("Promise").prototype.finally)},function(t,n,e){var r=e(5),o=e(3),i=e(44),a=e(124),u=e(19).f,c=e(36).f,f=e(186),s=e(187),l=e(188),p=e(21),h=e(6),v=e(25).set,g=e(109),d=e(49)("match"),y=o.RegExp,x=y.prototype,m=/a/g,b=/a/g,S=new y(m)!==m,E=l.UNSUPPORTED_Y;if(r&&i("RegExp",!S||E||h((function(){return b[d]=!1,y(m)!=m||y(b)==b||"/a/i"!=y(m,"i")})))){for(var w=function(t,n){var e,r=this instanceof w,o=f(t),i=void 0===n;if(!r&&o&&t.constructor===w&&i)return t;S?o&&!i&&(t=t.source):t instanceof w&&(i&&(n=s.call(t)),t=t.source),E&&(e=!!n&&n.indexOf("y")>-1)&&(n=n.replace(/y/g,""));var u=a(S?new y(t,n):y(t,n),r?this:x,w);return E&&e&&v(u,{sticky:e}),u},O=function(t){t in w||u(w,t,{configurable:!0,get:function(){return y[t]},set:function(n){y[t]=n}})},R=c(y),A=0;R.length>A;)O(R[A++]);x.constructor=w,w.prototype=x,p(o,"RegExp",w)}g("RegExp")},function(t,n,e){var r=e(14),o=e(11),i=e(49)("match");t.exports=function(t){var n;return r(t)&&(void 0!==(n=t[i])?!!n:"RegExp"==o(t))}},function(t,n,e){var r=e(20);t.exports=function(){var t=r(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.dotAll&&(n+="s"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},function(t,n,e){var r=e(6);function o(t,n){return RegExp(t,n)}n.UNSUPPORTED_Y=r((function(){var t=o("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),n.BROKEN_CARET=r((function(){var t=o("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},function(t,n,e){var r=e(2),o=e(190);r({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},function(t,n,e){var r,o,i=e(187),a=e(188),u=RegExp.prototype.exec,c=String.prototype.replace,f=u,s=(r=/a/,o=/b*/g,u.call(r,"a"),u.call(o,"a"),0!==r.lastIndex||0!==o.lastIndex),l=a.UNSUPPORTED_Y||a.BROKEN_CARET,p=void 0!==/()??/.exec("")[1];(s||p||l)&&(f=function(t){var n,e,r,o,a=this,f=l&&a.sticky,h=i.call(a),v=a.source,g=0,d=t;return f&&(-1===(h=h.replace("y","")).indexOf("g")&&(h+="g"),d=String(t).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&"\n"!==t[a.lastIndex-1])&&(v="(?: "+v+")",d=" "+d,g++),e=new RegExp("^(?:"+v+")",h)),p&&(e=new RegExp("^"+v+"$(?!\\s)",h)),s&&(n=a.lastIndex),r=u.call(f?e:a,d),f?r?(r.input=r.input.slice(g),r[0]=r[0].slice(g),r.index=a.lastIndex,a.lastIndex+=r[0].length):a.lastIndex=0:s&&r&&(a.lastIndex=a.global?r.index+r[0].length:n),p&&r&&r.length>1&&c.call(r[0],e,(function(){for(o=1;o<arguments.length-2;o++)void 0===arguments[o]&&(r[o]=void 0)})),r}),t.exports=f},function(t,n,e){var r=e(5),o=e(19),i=e(187),a=e(188).UNSUPPORTED_Y;r&&("g"!=/./g.flags||a)&&o.f(RegExp.prototype,"flags",{configurable:!0,get:i})},function(t,n,e){var r=e(5),o=e(188).UNSUPPORTED_Y,i=e(19).f,a=e(25).get,u=RegExp.prototype;r&&o&&i(RegExp.prototype,"sticky",{configurable:!0,get:function(){if(this!==u){if(this instanceof RegExp)return!!a(this).sticky;throw TypeError("Incompatible receiver, RegExp required")}}})},function(t,n,e){e(189);var r,o,i=e(2),a=e(14),u=(r=!1,(o=/[ac]/).exec=function(){return r=!0,/./.exec.apply(this,arguments)},!0===o.test("abc")&&r),c=/./.test;i({target:"RegExp",proto:!0,forced:!u},{test:function(t){if("function"!=typeof this.exec)return c.call(this,t);var n=this.exec(t);if(null!==n&&!a(n))throw new Error("RegExp exec method returned something other than an Object or null");return!!n}})},function(t,n,e){var r=e(21),o=e(20),i=e(6),a=e(187),u=RegExp.prototype,c=u.toString,f=i((function(){return"/a/b"!=c.call({source:"a",flags:"b"})})),s="toString"!=c.name;(f||s)&&r(RegExp.prototype,"toString",(function(){var t=o(this),n=String(t.source),e=t.flags;return"/"+n+"/"+String(void 0===e&&t instanceof RegExp&&!("flags"in u)?a.call(t):e)}),{unsafe:!0})},function(t,n,e){var r=e(119),o=e(125);t.exports=r("Set",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),o)},function(t,n,e){var r=e(2),o=e(197).codeAt;r({target:"String",proto:!0},{codePointAt:function(t){return o(this,t)}})},function(t,n,e){var r=e(40),o=e(12),i=function(t){return function(n,e){var i,a,u=String(o(n)),c=r(e),f=u.length;return c<0||c>=f?t?"":void 0:(i=u.charCodeAt(c))<55296||i>56319||c+1===f||(a=u.charCodeAt(c+1))<56320||a>57343?t?u.charAt(c):i:t?u.slice(c,c+2):a-56320+(i-55296<<10)+65536}};t.exports={codeAt:i(!1),charAt:i(!0)}},function(t,n,e){var r,o=e(2),i=e(4).f,a=e(39),u=e(199),c=e(12),f=e(200),s=e(29),l="".endsWith,p=Math.min,h=f("endsWith");o({target:"String",proto:!0,forced:!!(s||h||(r=i(String.prototype,"endsWith"),!r||r.writable))&&!h},{endsWith:function(t){var n=String(c(this));u(t);var e=arguments.length>1?arguments[1]:void 0,r=a(n.length),o=void 0===e?r:p(a(e),r),i=String(t);return l?l.call(n,i,o):n.slice(o-i.length,o)===i}})},function(t,n,e){var r=e(186);t.exports=function(t){if(r(t))throw TypeError("The method doesn't accept regular expressions");return t}},function(t,n,e){var r=e(49)("match");t.exports=function(t){var n=/./;try{"/./"[t](n)}catch(e){try{return n[r]=!1,"/./"[t](n)}catch(t){}}return!1}},function(t,n,e){var r=e(2),o=e(41),i=String.fromCharCode,a=String.fromCodePoint;r({target:"String",stat:!0,forced:!!a&&1!=a.length},{fromCodePoint:function(t){for(var n,e=[],r=arguments.length,a=0;r>a;){if(n=+arguments[a++],o(n,1114111)!==n)throw RangeError(n+" is not a valid code point");e.push(n<65536?i(n):i(55296+((n-=65536)>>10),n%1024+56320))}return e.join("")}})},function(t,n,e){var r=e(2),o=e(199),i=e(12);r({target:"String",proto:!0,forced:!e(200)("includes")},{includes:function(t){return!!~String(i(this)).indexOf(o(t),arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(197).charAt,o=e(25),i=e(90),a=o.set,u=o.getterFor("String Iterator");i(String,"String",(function(t){a(this,{type:"String Iterator",string:String(t),index:0})}),(function(){var t,n=u(this),e=n.string,o=n.index;return o>=e.length?{value:void 0,done:!0}:(t=r(e,o),n.index+=t.length,{value:t,done:!1})}))},function(t,n,e){var r=e(205),o=e(20),i=e(39),a=e(12),u=e(206),c=e(207);r("match",1,(function(t,n,e){return[function(n){var e=a(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,e):new RegExp(n)[t](String(e))},function(t){var r=e(n,t,this);if(r.done)return r.value;var a=o(t),f=String(this);if(!a.global)return c(a,f);var s=a.unicode;a.lastIndex=0;for(var l,p=[],h=0;null!==(l=c(a,f));){var v=String(l[0]);p[h]=v,""===v&&(a.lastIndex=u(f,i(a.lastIndex),s)),h++}return 0===h?null:p}]}))},function(t,n,e){e(189);var r=e(21),o=e(6),i=e(49),a=e(190),u=e(18),c=i("species"),f=!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$<a>")})),s="$0"==="a".replace(/./,"$0"),l=i("replace"),p=!!/./[l]&&""===/./[l]("a","$0"),h=!o((function(){var t=/(?:)/,n=t.exec;t.exec=function(){return n.apply(this,arguments)};var e="ab".split(t);return 2!==e.length||"a"!==e[0]||"b"!==e[1]}));t.exports=function(t,n,e,l){var v=i(t),g=!o((function(){var n={};return n[v]=function(){return 7},7!=""[t](n)})),d=g&&!o((function(){var n=!1,e=/a/;return"split"===t&&((e={}).constructor={},e.constructor[c]=function(){return e},e.flags="",e[v]=/./[v]),e.exec=function(){return n=!0,null},e[v](""),!n}));if(!g||!d||"replace"===t&&(!f||!s||p)||"split"===t&&!h){var y=/./[v],x=e(v,""[t],(function(t,n,e,r,o){return n.exec===a?g&&!o?{done:!0,value:y.call(n,e,r)}:{done:!0,value:t.call(e,n,r)}:{done:!1}}),{REPLACE_KEEPS_$0:s,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:p}),m=x[0],b=x[1];r(String.prototype,t,m),r(RegExp.prototype,v,2==n?function(t,n){return b.call(t,this,n)}:function(t){return b.call(t,this)})}l&&u(RegExp.prototype[v],"sham",!0)}},function(t,n,e){var r=e(197).charAt;t.exports=function(t,n,e){return n+(e?r(t,n).length:1)}},function(t,n,e){var r=e(11),o=e(190);t.exports=function(t,n){var e=t.exec;if("function"==typeof e){var i=e.call(t,n);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw TypeError("RegExp#exec called on incompatible receiver");return o.call(t,n)}},function(t,n,e){var r=e(2),o=e(91),i=e(12),a=e(39),u=e(65),c=e(20),f=e(11),s=e(186),l=e(187),p=e(18),h=e(6),v=e(49),g=e(175),d=e(206),y=e(25),x=e(29),m=v("matchAll"),b=y.set,S=y.getterFor("RegExp String Iterator"),E=RegExp.prototype,w=E.exec,O="".matchAll,R=!!O&&!h((function(){"a".matchAll(/./)})),A=o((function(t,n,e,r){b(this,{type:"RegExp String Iterator",regexp:t,string:n,global:e,unicode:r,done:!1})}),"RegExp String",(function(){var t=S(this);if(t.done)return{value:void 0,done:!0};var n=t.regexp,e=t.string,r=function(t,n){var e,r=t.exec;if("function"==typeof r){if("object"!=typeof(e=r.call(t,n)))throw TypeError("Incorrect exec result");return e}return w.call(t,n)}(n,e);return null===r?{value:void 0,done:t.done=!0}:t.global?(""==String(r[0])&&(n.lastIndex=d(e,a(n.lastIndex),t.unicode)),{value:r,done:!1}):(t.done=!0,{value:r,done:!1})})),j=function(t){var n,e,r,o,i,u,f=c(this),s=String(t);return n=g(f,RegExp),void 0===(e=f.flags)&&f instanceof RegExp&&!("flags"in E)&&(e=l.call(f)),r=void 0===e?"":String(e),o=new n(n===RegExp?f.source:f,r),i=!!~r.indexOf("g"),u=!!~r.indexOf("u"),o.lastIndex=a(f.lastIndex),new A(o,s,i,u)};r({target:"String",proto:!0,forced:R},{matchAll:function(t){var n,e,r,o=i(this);if(null!=t){if(s(t)&&!~String(i("flags"in E?t.flags:l.call(t))).indexOf("g"))throw TypeError("`.matchAll` does not allow non-global regexes");if(R)return O.apply(o,arguments);if(void 0===(e=t[m])&&x&&"RegExp"==f(t)&&(e=j),null!=e)return u(e).call(t,o)}else if(R)return O.apply(o,arguments);return n=String(o),r=new RegExp(t,"g"),x?j.call(r,n):r[m](n)}}),x||m in E||p(E,m,j)},function(t,n,e){var r=e(2),o=e(210).end;r({target:"String",proto:!0,forced:e(211)},{padEnd:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(39),o=e(145),i=e(12),a=Math.ceil,u=function(t){return function(n,e,u){var c,f,s=String(i(n)),l=s.length,p=void 0===u?" ":String(u),h=r(e);return h<=l||""==p?s:(c=h-l,(f=o.call(p,a(c/p.length))).length>c&&(f=f.slice(0,c)),t?s+f:f+s)}};t.exports={start:u(!1),end:u(!0)}},function(t,n,e){var r=e(54);t.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(r)},function(t,n,e){var r=e(2),o=e(210).start;r({target:"String",proto:!0,forced:e(211)},{padStart:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(9),i=e(39);r({target:"String",stat:!0},{raw:function(t){for(var n=o(t.raw),e=i(n.length),r=arguments.length,a=[],u=0;e>u;)a.push(String(n[u++])),u<r&&a.push(String(arguments[u]));return a.join("")}})},function(t,n,e){e(2)({target:"String",proto:!0},{repeat:e(145)})},function(t,n,e){var r=e(205),o=e(20),i=e(46),a=e(39),u=e(40),c=e(12),f=e(206),s=e(207),l=Math.max,p=Math.min,h=Math.floor,v=/\$([$&'`]|\d\d?|<[^>]*>)/g,g=/\$([$&'`]|\d\d?)/g;r("replace",2,(function(t,n,e,r){var d=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,y=r.REPLACE_KEEPS_$0,x=d?"$":"$0";return[function(e,r){var o=c(this),i=null==e?void 0:e[t];return void 0!==i?i.call(e,o,r):n.call(String(o),e,r)},function(t,r){if(!d&&y||"string"==typeof r&&-1===r.indexOf(x)){var i=e(n,t,this,r);if(i.done)return i.value}var c=o(t),h=String(this),v="function"==typeof r;v||(r=String(r));var g=c.global;if(g){var b=c.unicode;c.lastIndex=0}for(var S=[];;){var E=s(c,h);if(null===E)break;if(S.push(E),!g)break;""===String(E[0])&&(c.lastIndex=f(h,a(c.lastIndex),b))}for(var w,O="",R=0,A=0;A<S.length;A++){E=S[A];for(var j=String(E[0]),I=l(p(u(E.index),h.length),0),k=[],P=1;P<E.length;P++)k.push(void 0===(w=E[P])?w:String(w));var L=E.groups;if(v){var T=[j].concat(k,I,h);void 0!==L&&T.push(L);var _=String(r.apply(void 0,T))}else _=m(j,h,I,k,L,r);I>=R&&(O+=h.slice(R,I)+_,R=I+j.length)}return O+h.slice(R)}];function m(t,e,r,o,a,u){var c=r+t.length,f=o.length,s=g;return void 0!==a&&(a=i(a),s=v),n.call(u,s,(function(n,i){var u;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,r);case"'":return e.slice(c);case"<":u=a[i.slice(1,-1)];break;default:var s=+i;if(0===s)return n;if(s>f){var l=h(s/10);return 0===l?n:l<=f?void 0===o[l-1]?i.charAt(1):o[l-1]+i.charAt(1):n}u=o[s-1]}return void 0===u?"":u}))}}))},function(t,n,e){var r=e(205),o=e(20),i=e(12),a=e(161),u=e(207);r("search",1,(function(t,n,e){return[function(n){var e=i(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,e):new RegExp(n)[t](String(e))},function(t){var r=e(n,t,this);if(r.done)return r.value;var i=o(t),c=String(this),f=i.lastIndex;a(f,0)||(i.lastIndex=0);var s=u(i,c);return a(i.lastIndex,f)||(i.lastIndex=f),null===s?-1:s.index}]}))},function(t,n,e){var r=e(205),o=e(186),i=e(20),a=e(12),u=e(175),c=e(206),f=e(39),s=e(207),l=e(190),p=e(6),h=[].push,v=Math.min,g=!p((function(){return!RegExp(4294967295,"y")}));r("split",2,(function(t,n,e){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,e){var r=String(a(this)),i=void 0===e?4294967295:e>>>0;if(0===i)return[];if(void 0===t)return[r];if(!o(t))return n.call(r,t,i);for(var u,c,f,s=[],p=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),v=0,g=new RegExp(t.source,p+"g");(u=l.call(g,r))&&!((c=g.lastIndex)>v&&(s.push(r.slice(v,u.index)),u.length>1&&u.index<r.length&&h.apply(s,u.slice(1)),f=u[0].length,v=c,s.length>=i));)g.lastIndex===u.index&&g.lastIndex++;return v===r.length?!f&&g.test("")||s.push(""):s.push(r.slice(v)),s.length>i?s.slice(0,i):s}:"0".split(void 0,0).length?function(t,e){return void 0===t&&0===e?[]:n.call(this,t,e)}:n,[function(n,e){var o=a(this),i=null==n?void 0:n[t];return void 0!==i?i.call(n,o,e):r.call(String(o),n,e)},function(t,o){var a=e(r,t,this,o,r!==n);if(a.done)return a.value;var l=i(t),p=String(this),h=u(l,RegExp),d=l.unicode,y=(l.ignoreCase?"i":"")+(l.multiline?"m":"")+(l.unicode?"u":"")+(g?"y":"g"),x=new h(g?l:"^(?:"+l.source+")",y),m=void 0===o?4294967295:o>>>0;if(0===m)return[];if(0===p.length)return null===s(x,p)?[p]:[];for(var b=0,S=0,E=[];S<p.length;){x.lastIndex=g?S:0;var w,O=s(x,g?p:p.slice(S));if(null===O||(w=v(f(x.lastIndex+(g?0:S)),p.length))===b)S=c(p,S,d);else{if(E.push(p.slice(b,S)),E.length===m)return E;for(var R=1;R<=O.length-1;R++)if(E.push(O[R]),E.length===m)return E;S=b=w}}return E.push(p.slice(b)),E}]}),!g)},function(t,n,e){var r,o=e(2),i=e(4).f,a=e(39),u=e(199),c=e(12),f=e(200),s=e(29),l="".startsWith,p=Math.min,h=f("startsWith");o({target:"String",proto:!0,forced:!!(s||h||(r=i(String.prototype,"startsWith"),!r||r.writable))&&!h},{startsWith:function(t){var n=String(c(this));u(t);var e=a(p(arguments.length>1?arguments[1]:void 0,n.length)),r=String(t);return l?l.call(n,r,e):n.slice(e,e+r.length)===r}})},function(t,n,e){var r=e(2),o=e(128).trim;r({target:"String",proto:!0,forced:e(220)("trim")},{trim:function(){return o(this)}})},function(t,n,e){var r=e(6),o=e(129);t.exports=function(t){return r((function(){return!!o[t]()||"​…᠎"!="​…᠎"[t]()||o[t].name!==t}))}},function(t,n,e){var r=e(2),o=e(128).end,i=e(220)("trimEnd"),a=i?function(){return o(this)}:"".trimEnd;r({target:"String",proto:!0,forced:i},{trimEnd:a,trimRight:a})},function(t,n,e){var r=e(2),o=e(128).start,i=e(220)("trimStart"),a=i?function(){return o(this)}:"".trimStart;r({target:"String",proto:!0,forced:i},{trimStart:a,trimLeft:a})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("anchor")},{anchor:function(t){return o(this,"a","name",t)}})},function(t,n,e){var r=e(12),o=/"/g;t.exports=function(t,n,e,i){var a=String(r(t)),u="<"+n;return""!==e&&(u+=" "+e+'="'+String(i).replace(o,"&quot;")+'"'),u+">"+a+"</"+n+">"}},function(t,n,e){var r=e(6);t.exports=function(t){return r((function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3}))}},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("big")},{big:function(){return o(this,"big","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("blink")},{blink:function(){return o(this,"blink","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("bold")},{bold:function(){return o(this,"b","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("fixed")},{fixed:function(){return o(this,"tt","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("fontcolor")},{fontcolor:function(t){return o(this,"font","color",t)}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("fontsize")},{fontsize:function(t){return o(this,"font","size",t)}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("italics")},{italics:function(){return o(this,"i","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("link")},{link:function(t){return o(this,"a","href",t)}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("small")},{small:function(){return o(this,"small","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("strike")},{strike:function(){return o(this,"strike","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("sub")},{sub:function(){return o(this,"sub","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("sup")},{sup:function(){return o(this,"sup","","")}})},function(t,n,e){var r,o=e(3),i=e(126),a=e(120),u=e(119),c=e(239),f=e(14),s=e(25).enforce,l=e(26),p=!o.ActiveXObject&&"ActiveXObject"in o,h=Object.isExtensible,v=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},g=t.exports=u("WeakMap",v,c);if(l&&p){r=c.getConstructor(v,"WeakMap",!0),a.REQUIRED=!0;var d=g.prototype,y=d.delete,x=d.has,m=d.get,b=d.set;i(d,{delete:function(t){if(f(t)&&!h(t)){var n=s(this);return n.frozen||(n.frozen=new r),y.call(this,t)||n.frozen.delete(t)}return y.call(this,t)},has:function(t){if(f(t)&&!h(t)){var n=s(this);return n.frozen||(n.frozen=new r),x.call(this,t)||n.frozen.has(t)}return x.call(this,t)},get:function(t){if(f(t)&&!h(t)){var n=s(this);return n.frozen||(n.frozen=new r),x.call(this,t)?m.call(this,t):n.frozen.get(t)}return m.call(this,t)},set:function(t,n){if(f(t)&&!h(t)){var e=s(this);e.frozen||(e.frozen=new r),x.call(this,t)?b.call(this,t,n):e.frozen.set(t,n)}else b.call(this,t,n);return this}})}},function(t,n,e){var r=e(126),o=e(120).getWeakData,i=e(20),a=e(14),u=e(123),c=e(122),f=e(63),s=e(15),l=e(25),p=l.set,h=l.getterFor,v=f.find,g=f.findIndex,d=0,y=function(t){return t.frozen||(t.frozen=new x)},x=function(){this.entries=[]},m=function(t,n){return v(t.entries,(function(t){return t[0]===n}))};x.prototype={get:function(t){var n=m(this,t);if(n)return n[1]},has:function(t){return!!m(this,t)},set:function(t,n){var e=m(this,t);e?e[1]=n:this.entries.push([t,n])},delete:function(t){var n=g(this.entries,(function(n){return n[0]===t}));return~n&&this.entries.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,e,f){var l=t((function(t,r){u(t,l,n),p(t,{type:n,id:d++,frozen:void 0}),null!=r&&c(r,t[f],t,e)})),v=h(n),g=function(t,n,e){var r=v(t),a=o(i(n),!0);return!0===a?y(r).set(n,e):a[r.id]=e,t};return r(l.prototype,{delete:function(t){var n=v(this);if(!a(t))return!1;var e=o(t);return!0===e?y(n).delete(t):e&&s(e,n.id)&&delete e[n.id]},has:function(t){var n=v(this);if(!a(t))return!1;var e=o(t);return!0===e?y(n).has(t):e&&s(e,n.id)}}),r(l.prototype,e?{get:function(t){var n=v(this);if(a(t)){var e=o(t);return!0===e?y(n).get(t):e?e[n.id]:void 0}},set:function(t,n){return g(this,t,n)}}:{add:function(t){return g(this,t,!0)}}),l}}},function(t,n,e){e(119)("WeakSet",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),e(239))},function(t,n,e){var r=e(3),o=e(242),i=e(77),a=e(18);for(var u in o){var c=r[u],f=c&&c.prototype;if(f&&f.forEach!==i)try{a(f,"forEach",i)}catch(t){f.forEach=i}}},function(t,n){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,n,e){e(203);var r,o=e(2),i=e(5),a=e(244),u=e(3),c=e(59),f=e(21),s=e(123),l=e(15),p=e(147),h=e(79),v=e(197).codeAt,g=e(245),d=e(95),y=e(246),x=e(25),m=u.URL,b=y.URLSearchParams,S=y.getState,E=x.set,w=x.getterFor("URL"),O=Math.floor,R=Math.pow,A=/[A-Za-z]/,j=/[\d+-.A-Za-z]/,I=/\d/,k=/^(0x|0X)/,P=/^[0-7]+$/,L=/^\d+$/,T=/^[\dA-Fa-f]+$/,_=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,U=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,C=/[\u0009\u000A\u000D]/g,F=function(t,n){var e,r,o;if("["==n.charAt(0)){if("]"!=n.charAt(n.length-1))return"Invalid host";if(!(e=z(n.slice(1,-1))))return"Invalid host";t.host=e}else if(X(t)){if(n=g(n),_.test(n))return"Invalid host";if(null===(e=M(n)))return"Invalid host";t.host=e}else{if(U.test(n))return"Invalid host";for(e="",r=h(n),o=0;o<r.length;o++)e+=G(r[o],q);t.host=e}},M=function(t){var n,e,r,o,i,a,u,c=t.split(".");if(c.length&&""==c[c.length-1]&&c.pop(),(n=c.length)>4)return t;for(e=[],r=0;r<n;r++){if(""==(o=c[r]))return t;if(i=10,o.length>1&&"0"==o.charAt(0)&&(i=k.test(o)?16:8,o=o.slice(8==i?1:2)),""===o)a=0;else{if(!(10==i?L:8==i?P:T).test(o))return t;a=parseInt(o,i)}e.push(a)}for(r=0;r<n;r++)if(a=e[r],r==n-1){if(a>=R(256,5-n))return null}else if(a>255)return null;for(u=e.pop(),r=0;r<e.length;r++)u+=e[r]*R(256,3-r);return u},z=function(t){var n,e,r,o,i,a,u,c=[0,0,0,0,0,0,0,0],f=0,s=null,l=0,p=function(){return t.charAt(l)};if(":"==p()){if(":"!=t.charAt(1))return;l+=2,s=++f}for(;p();){if(8==f)return;if(":"!=p()){for(n=e=0;e<4&&T.test(p());)n=16*n+parseInt(p(),16),l++,e++;if("."==p()){if(0==e)return;if(l-=e,f>6)return;for(r=0;p();){if(o=null,r>0){if(!("."==p()&&r<4))return;l++}if(!I.test(p()))return;for(;I.test(p());){if(i=parseInt(p(),10),null===o)o=i;else{if(0==o)return;o=10*o+i}if(o>255)return;l++}c[f]=256*c[f]+o,2!=++r&&4!=r||f++}if(4!=r)return;break}if(":"==p()){if(l++,!p())return}else if(p())return;c[f++]=n}else{if(null!==s)return;l++,s=++f}}if(null!==s)for(a=f-s,f=7;0!=f&&a>0;)u=c[f],c[f--]=c[s+a-1],c[s+--a]=u;else if(8!=f)return;return c},D=function(t){var n,e,r,o;if("number"==typeof t){for(n=[],e=0;e<4;e++)n.unshift(t%256),t=O(t/256);return n.join(".")}if("object"==typeof t){for(n="",r=function(t){for(var n=null,e=1,r=null,o=0,i=0;i<8;i++)0!==t[i]?(o>e&&(n=r,e=o),r=null,o=0):(null===r&&(r=i),++o);return o>e&&(n=r,e=o),n}(t),e=0;e<8;e++)o&&0===t[e]||(o&&(o=!1),r===e?(n+=e?":":"::",o=!0):(n+=t[e].toString(16),e<7&&(n+=":")));return"["+n+"]"}return t},q={},B=p({},q,{" ":1,'"':1,"<":1,">":1,"`":1}),W=p({},B,{"#":1,"?":1,"{":1,"}":1}),$=p({},W,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,n){var e=v(t,0);return e>32&&e<127&&!l(n,t)?t:encodeURIComponent(t)},V={ftp:21,file:null,http:80,https:443,ws:80,wss:443},X=function(t){return l(V,t.scheme)},Y=function(t){return""!=t.username||""!=t.password},K=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},J=function(t,n){var e;return 2==t.length&&A.test(t.charAt(0))&&(":"==(e=t.charAt(1))||!n&&"|"==e)},H=function(t){var n;return t.length>1&&J(t.slice(0,2))&&(2==t.length||"/"===(n=t.charAt(2))||"\\"===n||"?"===n||"#"===n)},Q=function(t){var n=t.path,e=n.length;!e||"file"==t.scheme&&1==e&&J(n[0],!0)||n.pop()},Z=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},nt={},et={},rt={},ot={},it={},at={},ut={},ct={},ft={},st={},lt={},pt={},ht={},vt={},gt={},dt={},yt={},xt={},mt={},bt={},St=function(t,n,e,o){var i,a,u,c,f,s=e||tt,p=0,v="",g=!1,d=!1,y=!1;for(e||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,n=n.replace(N,"")),n=n.replace(C,""),i=h(n);p<=i.length;){switch(a=i[p],s){case tt:if(!a||!A.test(a)){if(e)return"Invalid scheme";s=et;continue}v+=a.toLowerCase(),s=nt;break;case nt:if(a&&(j.test(a)||"+"==a||"-"==a||"."==a))v+=a.toLowerCase();else{if(":"!=a){if(e)return"Invalid scheme";v="",s=et,p=0;continue}if(e&&(X(t)!=l(V,v)||"file"==v&&(Y(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=v,e)return void(X(t)&&V[t.scheme]==t.port&&(t.port=null));v="","file"==t.scheme?s=ht:X(t)&&o&&o.scheme==t.scheme?s=rt:X(t)?s=ut:"/"==i[p+1]?(s=ot,p++):(t.cannotBeABaseURL=!0,t.path.push(""),s=xt)}break;case et:if(!o||o.cannotBeABaseURL&&"#"!=a)return"Invalid scheme";if(o.cannotBeABaseURL&&"#"==a){t.scheme=o.scheme,t.path=o.path.slice(),t.query=o.query,t.fragment="",t.cannotBeABaseURL=!0,s=bt;break}s="file"==o.scheme?ht:it;continue;case rt:if("/"!=a||"/"!=i[p+1]){s=it;continue}s=ct,p++;break;case ot:if("/"==a){s=ft;break}s=yt;continue;case it:if(t.scheme=o.scheme,a==r)t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.query=o.query;else if("/"==a||"\\"==a&&X(t))s=at;else if("?"==a)t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.query="",s=mt;else{if("#"!=a){t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.path.pop(),s=yt;continue}t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.query=o.query,t.fragment="",s=bt}break;case at:if(!X(t)||"/"!=a&&"\\"!=a){if("/"!=a){t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,s=yt;continue}s=ft}else s=ct;break;case ut:if(s=ct,"/"!=a||"/"!=v.charAt(p+1))continue;p++;break;case ct:if("/"!=a&&"\\"!=a){s=ft;continue}break;case ft:if("@"==a){g&&(v="%40"+v),g=!0,u=h(v);for(var x=0;x<u.length;x++){var m=u[x];if(":"!=m||y){var b=G(m,$);y?t.password+=b:t.username+=b}else y=!0}v=""}else if(a==r||"/"==a||"?"==a||"#"==a||"\\"==a&&X(t)){if(g&&""==v)return"Invalid authority";p-=h(v).length+1,v="",s=st}else v+=a;break;case st:case lt:if(e&&"file"==t.scheme){s=gt;continue}if(":"!=a||d){if(a==r||"/"==a||"?"==a||"#"==a||"\\"==a&&X(t)){if(X(t)&&""==v)return"Invalid host";if(e&&""==v&&(Y(t)||null!==t.port))return;if(c=F(t,v))return c;if(v="",s=dt,e)return;continue}"["==a?d=!0:"]"==a&&(d=!1),v+=a}else{if(""==v)return"Invalid host";if(c=F(t,v))return c;if(v="",s=pt,e==lt)return}break;case pt:if(!I.test(a)){if(a==r||"/"==a||"?"==a||"#"==a||"\\"==a&&X(t)||e){if(""!=v){var S=parseInt(v,10);if(S>65535)return"Invalid port";t.port=X(t)&&S===V[t.scheme]?null:S,v=""}if(e)return;s=dt;continue}return"Invalid port"}v+=a;break;case ht:if(t.scheme="file","/"==a||"\\"==a)s=vt;else{if(!o||"file"!=o.scheme){s=yt;continue}if(a==r)t.host=o.host,t.path=o.path.slice(),t.query=o.query;else if("?"==a)t.host=o.host,t.path=o.path.slice(),t.query="",s=mt;else{if("#"!=a){H(i.slice(p).join(""))||(t.host=o.host,t.path=o.path.slice(),Q(t)),s=yt;continue}t.host=o.host,t.path=o.path.slice(),t.query=o.query,t.fragment="",s=bt}}break;case vt:if("/"==a||"\\"==a){s=gt;break}o&&"file"==o.scheme&&!H(i.slice(p).join(""))&&(J(o.path[0],!0)?t.path.push(o.path[0]):t.host=o.host),s=yt;continue;case gt:if(a==r||"/"==a||"\\"==a||"?"==a||"#"==a){if(!e&&J(v))s=yt;else if(""==v){if(t.host="",e)return;s=dt}else{if(c=F(t,v))return c;if("localhost"==t.host&&(t.host=""),e)return;v="",s=dt}continue}v+=a;break;case dt:if(X(t)){if(s=yt,"/"!=a&&"\\"!=a)continue}else if(e||"?"!=a)if(e||"#"!=a){if(a!=r&&(s=yt,"/"!=a))continue}else t.fragment="",s=bt;else t.query="",s=mt;break;case yt:if(a==r||"/"==a||"\\"==a&&X(t)||!e&&("?"==a||"#"==a)){if(".."===(f=(f=v).toLowerCase())||"%2e."===f||".%2e"===f||"%2e%2e"===f?(Q(t),"/"==a||"\\"==a&&X(t)||t.path.push("")):Z(v)?"/"==a||"\\"==a&&X(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&J(v)&&(t.host&&(t.host=""),v=v.charAt(0)+":"),t.path.push(v)),v="","file"==t.scheme&&(a==r||"?"==a||"#"==a))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==a?(t.query="",s=mt):"#"==a&&(t.fragment="",s=bt)}else v+=G(a,W);break;case xt:"?"==a?(t.query="",s=mt):"#"==a?(t.fragment="",s=bt):a!=r&&(t.path[0]+=G(a,q));break;case mt:e||"#"!=a?a!=r&&("'"==a&&X(t)?t.query+="%27":t.query+="#"==a?"%23":G(a,q)):(t.fragment="",s=bt);break;case bt:a!=r&&(t.fragment+=G(a,B))}p++}},Et=function(t){var n,e,r=s(this,Et,"URL"),o=arguments.length>1?arguments[1]:void 0,a=String(t),u=E(r,{type:"URL"});if(void 0!==o)if(o instanceof Et)n=w(o);else if(e=St(n={},String(o)))throw TypeError(e);if(e=St(u,a,null,n))throw TypeError(e);var c=u.searchParams=new b,f=S(c);f.updateSearchParams(u.query),f.updateURL=function(){u.query=String(c)||null},i||(r.href=Ot.call(r),r.origin=Rt.call(r),r.protocol=At.call(r),r.username=jt.call(r),r.password=It.call(r),r.host=kt.call(r),r.hostname=Pt.call(r),r.port=Lt.call(r),r.pathname=Tt.call(r),r.search=_t.call(r),r.searchParams=Ut.call(r),r.hash=Nt.call(r))},wt=Et.prototype,Ot=function(){var t=w(this),n=t.scheme,e=t.username,r=t.password,o=t.host,i=t.port,a=t.path,u=t.query,c=t.fragment,f=n+":";return null!==o?(f+="//",Y(t)&&(f+=e+(r?":"+r:"")+"@"),f+=D(o),null!==i&&(f+=":"+i)):"file"==n&&(f+="//"),f+=t.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==u&&(f+="?"+u),null!==c&&(f+="#"+c),f},Rt=function(){var t=w(this),n=t.scheme,e=t.port;if("blob"==n)try{return new URL(n.path[0]).origin}catch(t){return"null"}return"file"!=n&&X(t)?n+"://"+D(t.host)+(null!==e?":"+e:""):"null"},At=function(){return w(this).scheme+":"},jt=function(){return w(this).username},It=function(){return w(this).password},kt=function(){var t=w(this),n=t.host,e=t.port;return null===n?"":null===e?D(n):D(n)+":"+e},Pt=function(){var t=w(this).host;return null===t?"":D(t)},Lt=function(){var t=w(this).port;return null===t?"":String(t)},Tt=function(){var t=w(this),n=t.path;return t.cannotBeABaseURL?n[0]:n.length?"/"+n.join("/"):""},_t=function(){var t=w(this).query;return t?"?"+t:""},Ut=function(){return w(this).searchParams},Nt=function(){var t=w(this).fragment;return t?"#"+t:""},Ct=function(t,n){return{get:t,set:n,configurable:!0,enumerable:!0}};if(i&&c(wt,{href:Ct(Ot,(function(t){var n=w(this),e=String(t),r=St(n,e);if(r)throw TypeError(r);S(n.searchParams).updateSearchParams(n.query)})),origin:Ct(Rt),protocol:Ct(At,(function(t){var n=w(this);St(n,String(t)+":",tt)})),username:Ct(jt,(function(t){var n=w(this),e=h(String(t));if(!K(n)){n.username="";for(var r=0;r<e.length;r++)n.username+=G(e[r],$)}})),password:Ct(It,(function(t){var n=w(this),e=h(String(t));if(!K(n)){n.password="";for(var r=0;r<e.length;r++)n.password+=G(e[r],$)}})),host:Ct(kt,(function(t){var n=w(this);n.cannotBeABaseURL||St(n,String(t),st)})),hostname:Ct(Pt,(function(t){var n=w(this);n.cannotBeABaseURL||St(n,String(t),lt)})),port:Ct(Lt,(function(t){var n=w(this);K(n)||(""==(t=String(t))?n.port=null:St(n,t,pt))})),pathname:Ct(Tt,(function(t){var n=w(this);n.cannotBeABaseURL||(n.path=[],St(n,t+"",dt))})),search:Ct(_t,(function(t){var n=w(this);""==(t=String(t))?n.query=null:("?"==t.charAt(0)&&(t=t.slice(1)),n.query="",St(n,t,mt)),S(n.searchParams).updateSearchParams(n.query)})),searchParams:Ct(Ut),hash:Ct(Nt,(function(t){var n=w(this);""!=(t=String(t))?("#"==t.charAt(0)&&(t=t.slice(1)),n.fragment="",St(n,t,bt)):n.fragment=null}))}),f(wt,"toJSON",(function(){return Ot.call(this)}),{enumerable:!0}),f(wt,"toString",(function(){return Ot.call(this)}),{enumerable:!0}),m){var Ft=m.createObjectURL,Mt=m.revokeObjectURL;Ft&&f(Et,"createObjectURL",(function(t){return Ft.apply(m,arguments)})),Mt&&f(Et,"revokeObjectURL",(function(t){return Mt.apply(m,arguments)}))}d(Et,"URL"),o({global:!0,forced:!a,sham:!i},{URL:Et})},function(t,n,e){var r=e(6),o=e(49),i=e(29),a=o("iterator");t.exports=!r((function(){var t=new URL("b?a=1&b=2&c=3","http://a"),n=t.searchParams,e="";return t.pathname="c%20d",n.forEach((function(t,r){n.delete("b"),e+=r+t})),i&&!t.toJSON||!n.sort||"http://a/c%20d?a=1&c=3"!==t.href||"3"!==n.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!n[a]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==e||"x"!==new URL("http://x",void 0).host}))},function(t,n,e){var r=/[^\0-\u007E]/,o=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",a=Math.floor,u=String.fromCharCode,c=function(t){return t+22+75*(t<26)},f=function(t,n,e){var r=0;for(t=e?a(t/700):t>>1,t+=a(t/n);t>455;r+=36)t=a(t/35);return a(r+36*t/(t+38))},s=function(t){var n,e,r=[],o=(t=function(t){for(var n=[],e=0,r=t.length;e<r;){var o=t.charCodeAt(e++);if(o>=55296&&o<=56319&&e<r){var i=t.charCodeAt(e++);56320==(64512&i)?n.push(((1023&o)<<10)+(1023&i)+65536):(n.push(o),e--)}else n.push(o)}return n}(t)).length,s=128,l=0,p=72;for(n=0;n<t.length;n++)(e=t[n])<128&&r.push(u(e));var h=r.length,v=h;for(h&&r.push("-");v<o;){var g=2147483647;for(n=0;n<t.length;n++)(e=t[n])>=s&&e<g&&(g=e);var d=v+1;if(g-s>a((2147483647-l)/d))throw RangeError(i);for(l+=(g-s)*d,s=g,n=0;n<t.length;n++){if((e=t[n])<s&&++l>2147483647)throw RangeError(i);if(e==s){for(var y=l,x=36;;x+=36){var m=x<=p?1:x>=p+26?26:x-p;if(y<m)break;var b=y-m,S=36-m;r.push(u(c(m+b%S))),y=a(b/S)}r.push(u(c(y))),p=f(l,d,v==h),l=0,++v}}++l,++s}return r.join("")};t.exports=function(t){var n,e,i=[],a=t.toLowerCase().replace(o,".").split(".");for(n=0;n<a.length;n++)e=a[n],i.push(r.test(e)?"xn--"+s(e):e);return i.join(".")}},function(t,n,e){e(89);var r=e(2),o=e(34),i=e(244),a=e(21),u=e(126),c=e(95),f=e(91),s=e(25),l=e(123),p=e(15),h=e(64),v=e(84),g=e(20),d=e(14),y=e(58),x=e(8),m=e(247),b=e(83),S=e(49),E=o("fetch"),w=o("Headers"),O=S("iterator"),R=s.set,A=s.getterFor("URLSearchParams"),j=s.getterFor("URLSearchParamsIterator"),I=/\+/g,k=Array(4),P=function(t){return k[t-1]||(k[t-1]=RegExp("((?:%[\\da-f]{2}){"+t+"})","gi"))},L=function(t){try{return decodeURIComponent(t)}catch(n){return t}},T=function(t){var n=t.replace(I," "),e=4;try{return decodeURIComponent(n)}catch(t){for(;e;)n=n.replace(P(e--),L);return n}},_=/[!'()~]|%20/g,U={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},N=function(t){return U[t]},C=function(t){return encodeURIComponent(t).replace(_,N)},F=function(t,n){if(n)for(var e,r,o=n.split("&"),i=0;i<o.length;)(e=o[i++]).length&&(r=e.split("="),t.push({key:T(r.shift()),value:T(r.join("="))}))},M=function(t){this.entries.length=0,F(this.entries,t)},z=function(t,n){if(t<n)throw TypeError("Not enough arguments")},D=f((function(t,n){R(this,{type:"URLSearchParamsIterator",iterator:m(A(t).entries),kind:n})}),"Iterator",(function(){var t=j(this),n=t.kind,e=t.iterator.next(),r=e.value;return e.done||(e.value="keys"===n?r.key:"values"===n?r.value:[r.key,r.value]),e})),q=function(){l(this,q,"URLSearchParams");var t,n,e,r,o,i,a,u,c,f=arguments.length>0?arguments[0]:void 0,s=this,h=[];if(R(s,{type:"URLSearchParams",entries:h,updateURL:function(){},updateSearchParams:M}),void 0!==f)if(d(f))if("function"==typeof(t=b(f)))for(e=(n=t.call(f)).next;!(r=e.call(n)).done;){if((a=(i=(o=m(g(r.value))).next).call(o)).done||(u=i.call(o)).done||!i.call(o).done)throw TypeError("Expected sequence with length 2");h.push({key:a.value+"",value:u.value+""})}else for(c in f)p(f,c)&&h.push({key:c,value:f[c]+""});else F(h,"string"==typeof f?"?"===f.charAt(0)?f.slice(1):f:f+"")},B=q.prototype;u(B,{append:function(t,n){z(arguments.length,2);var e=A(this);e.entries.push({key:t+"",value:n+""}),e.updateURL()},delete:function(t){z(arguments.length,1);for(var n=A(this),e=n.entries,r=t+"",o=0;o<e.length;)e[o].key===r?e.splice(o,1):o++;n.updateURL()},get:function(t){z(arguments.length,1);for(var n=A(this).entries,e=t+"",r=0;r<n.length;r++)if(n[r].key===e)return n[r].value;return null},getAll:function(t){z(arguments.length,1);for(var n=A(this).entries,e=t+"",r=[],o=0;o<n.length;o++)n[o].key===e&&r.push(n[o].value);return r},has:function(t){z(arguments.length,1);for(var n=A(this).entries,e=t+"",r=0;r<n.length;)if(n[r++].key===e)return!0;return!1},set:function(t,n){z(arguments.length,1);for(var e,r=A(this),o=r.entries,i=!1,a=t+"",u=n+"",c=0;c<o.length;c++)(e=o[c]).key===a&&(i?o.splice(c--,1):(i=!0,e.value=u));i||o.push({key:a,value:u}),r.updateURL()},sort:function(){var t,n,e,r=A(this),o=r.entries,i=o.slice();for(o.length=0,e=0;e<i.length;e++){for(t=i[e],n=0;n<e;n++)if(o[n].key>t.key){o.splice(n,0,t);break}n===e&&o.push(t)}r.updateURL()},forEach:function(t){for(var n,e=A(this).entries,r=h(t,arguments.length>1?arguments[1]:void 0,3),o=0;o<e.length;)r((n=e[o++]).value,n.key,this)},keys:function(){return new D(this,"keys")},values:function(){return new D(this,"values")},entries:function(){return new D(this,"entries")}},{enumerable:!0}),a(B,O,B.entries),a(B,"toString",(function(){for(var t,n=A(this).entries,e=[],r=0;r<n.length;)t=n[r++],e.push(C(t.key)+"="+C(t.value));return e.join("&")}),{enumerable:!0}),c(q,"URLSearchParams"),r({global:!0,forced:!i},{URLSearchParams:q}),i||"function"!=typeof E||"function"!=typeof w||r({global:!0,enumerable:!0,forced:!0},{fetch:function(t){var n,e,r,o=[t];return arguments.length>1&&(n=arguments[1],d(n)&&(e=n.body,"URLSearchParams"===v(e)&&((r=n.headers?new w(n.headers):new w).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),n=y(n,{body:x(0,String(e)),headers:x(0,r)}))),o.push(n)),E.apply(this,o)}}),t.exports={URLSearchParams:q,getState:A}},function(t,n,e){var r=e(20),o=e(83);t.exports=function(t){var n=o(t);if("function"!=typeof n)throw TypeError(String(t)+" is not iterable");return r(n.call(t))}},function(t,n,e){e(2)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})}])}();
+
+//!fetch 3.0.0, global "this" must be replaced with "window"
+// IIFE version
+!function(t){"use strict";var e="URLSearchParams"in self,r="Symbol"in self&&"iterator"in Symbol,o="FileReader"in self&&"Blob"in self&&function(){try{return new Blob,!0}catch(t){return!1}}(),n="FormData"in self,i="ArrayBuffer"in self;if(i)var s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],a=ArrayBuffer.isView||function(t){return t&&s.indexOf(Object.prototype.toString.call(t))>-1};function h(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function u(t){return"string"!=typeof t&&(t=String(t)),t}function f(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return r&&(e[Symbol.iterator]=function(){return e}),e}function d(t){this.map={},t instanceof d?t.forEach((function(t,e){this.append(e,t)}),this):Array.isArray(t)?t.forEach((function(t){this.append(t[0],t[1])}),this):t&&Object.getOwnPropertyNames(t).forEach((function(e){this.append(e,t[e])}),this)}function c(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function p(t){return new Promise((function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}}))}function y(t){var e=new FileReader,r=p(e);return e.readAsArrayBuffer(t),r}function l(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(t){var r;this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:n&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:e&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():i&&o&&((r=t)&&DataView.prototype.isPrototypeOf(r))?(this._bodyArrayBuffer=l(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):i&&(ArrayBuffer.prototype.isPrototypeOf(t)||a(t))?this._bodyArrayBuffer=l(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=c(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?c(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(y)}),this.text=function(){var t,e,r,o=c(this);if(o)return o;if(this._bodyBlob)return t=this._bodyBlob,e=new FileReader,r=p(e),e.readAsText(t),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),o=0;o<e.length;o++)r[o]=String.fromCharCode(e[o]);return r.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},n&&(this.formData=function(){return this.text().then(v)}),this.json=function(){return this.text().then(JSON.parse)},this}d.prototype.append=function(t,e){t=h(t),e=u(e);var r=this.map[t];this.map[t]=r?r+", "+e:e},d.prototype.delete=function(t){delete this.map[h(t)]},d.prototype.get=function(t){return t=h(t),this.has(t)?this.map[t]:null},d.prototype.has=function(t){return this.map.hasOwnProperty(h(t))},d.prototype.set=function(t,e){this.map[h(t)]=u(e)},d.prototype.forEach=function(t,e){for(var r in this.map)this.map.hasOwnProperty(r)&&t.call(e,this.map[r],r,this)},d.prototype.keys=function(){var t=[];return this.forEach((function(e,r){t.push(r)})),f(t)},d.prototype.values=function(){var t=[];return this.forEach((function(e){t.push(e)})),f(t)},d.prototype.entries=function(){var t=[];return this.forEach((function(e,r){t.push([r,e])})),f(t)},r&&(d.prototype[Symbol.iterator]=d.prototype.entries);var m=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function w(t,e){var r,o,n=(e=e||{}).body;if(t instanceof w){if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new d(t.headers)),this.method=t.method,this.mode=t.mode,this.signal=t.signal,n||null==t._bodyInit||(n=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||"same-origin",!e.headers&&this.headers||(this.headers=new d(e.headers)),this.method=(r=e.method||this.method||"GET",o=r.toUpperCase(),m.indexOf(o)>-1?o:r),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function v(t){var e=new FormData;return t.trim().split("&").forEach((function(t){if(t){var r=t.split("="),o=r.shift().replace(/\+/g," "),n=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(o),decodeURIComponent(n))}})),e}function E(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new d(e.headers),this.url=e.url||"",this._initBody(t)}w.prototype.clone=function(){return new w(this,{body:this._bodyInit})},b.call(w.prototype),b.call(E.prototype),E.prototype.clone=function(){return new E(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new d(this.headers),url:this.url})},E.error=function(){var t=new E(null,{status:0,statusText:""});return t.type="error",t};var A=[301,302,303,307,308];E.redirect=function(t,e){if(-1===A.indexOf(e))throw new RangeError("Invalid status code");return new E(null,{status:e,headers:{location:t}})},t.DOMException=self.DOMException;try{new t.DOMException}catch(e){t.DOMException=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack},t.DOMException.prototype=Object.create(Error.prototype),t.DOMException.prototype.constructor=t.DOMException}function _(e,r){return new Promise((function(n,i){var s=new w(e,r);if(s.signal&&s.signal.aborted)return i(new t.DOMException("Aborted","AbortError"));var a=new XMLHttpRequest;function h(){a.abort()}a.onload=function(){var t,e,r={status:a.status,statusText:a.statusText,headers:(t=a.getAllResponseHeaders()||"",e=new d,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach((function(t){var r=t.split(":"),o=r.shift().trim();if(o){var n=r.join(":").trim();e.append(o,n)}})),e)};r.url="responseURL"in a?a.responseURL:r.headers.get("X-Request-URL");var o="response"in a?a.response:a.responseText;n(new E(o,r))},a.onerror=function(){i(new TypeError("Network request failed"))},a.ontimeout=function(){i(new TypeError("Network request failed"))},a.onabort=function(){i(new t.DOMException("Aborted","AbortError"))},a.open(s.method,s.url,!0),"include"===s.credentials?a.withCredentials=!0:"omit"===s.credentials&&(a.withCredentials=!1),"responseType"in a&&o&&(a.responseType="blob"),s.headers.forEach((function(t,e){a.setRequestHeader(e,t)})),s.signal&&(s.signal.addEventListener("abort",h),a.onreadystatechange=function(){4===a.readyState&&s.signal.removeEventListener("abort",h)}),a.send(void 0===s._bodyInit?null:s._bodyInit)}))}_.polyfill=!0,self.fetch||(self.fetch=_,self.Headers=d,self.Request=w,self.Response=E),t.Headers=d,t.Request=w,t.Response=E,t.fetch=_}({});
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/css-shim.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/css-shim.js
new file mode 100644
index 0000000..e951e2d
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/css-shim.js
@@ -0,0 +1 @@
+var __assign=this&&this.__assign||function(){return __assign=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var s in t=arguments[r])Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s]);return e},__assign.apply(this,arguments)},StyleNode=function(){this.start=0,this.end=0,this.previous=null,this.parent=null,this.rules=null,this.parsedCssText="",this.cssText="",this.atRule=!1,this.type=0,this.keyframesName="",this.selector="",this.parsedSelector=""};function parse(e){return parseCss(lex(e=clean(e)),e)}function clean(e){return e.replace(RX.comments,"").replace(RX.port,"")}function lex(e){var t=new StyleNode;t.start=0,t.end=e.length;for(var r=t,n=0,s=e.length;n<s;n++)if(e[n]===OPEN_BRACE){r.rules||(r.rules=[]);var o=r,a=o.rules[o.rules.length-1]||null;(r=new StyleNode).start=n+1,r.parent=o,r.previous=a,o.rules.push(r)}else e[n]===CLOSE_BRACE&&(r.end=n+1,r=r.parent||t);return t}function parseCss(e,t){var r=t.substring(e.start,e.end-1);if(e.parsedCssText=e.cssText=r.trim(),e.parent){var n=e.previous?e.previous.end:e.parent.start;r=(r=(r=_expandUnicodeEscapes(r=t.substring(n,e.start-1))).replace(RX.multipleSpaces," ")).substring(r.lastIndexOf(";")+1);var s=e.parsedSelector=e.selector=r.trim();e.atRule=0===s.indexOf(AT_START),e.atRule?0===s.indexOf(MEDIA_START)?e.type=types.MEDIA_RULE:s.match(RX.keyframesRule)&&(e.type=types.KEYFRAMES_RULE,e.keyframesName=e.selector.split(RX.multipleSpaces).pop()):0===s.indexOf(VAR_START)?e.type=types.MIXIN_RULE:e.type=types.STYLE_RULE}var o=e.rules;if(o)for(var a=0,i=o.length,l=void 0;a<i&&(l=o[a]);a++)parseCss(l,t);return e}function _expandUnicodeEscapes(e){return e.replace(/\\([0-9a-f]{1,6})\s/gi,(function(){for(var e=arguments[1],t=6-e.length;t--;)e="0"+e;return"\\"+e}))}var types={STYLE_RULE:1,KEYFRAMES_RULE:7,MEDIA_RULE:4,MIXIN_RULE:1e3},OPEN_BRACE="{",CLOSE_BRACE="}",RX={comments:/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,port:/@import[^;]*;/gim,customProp:/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,mixinProp:/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,mixinApply:/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,varApply:/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,keyframesRule:/^@[^\s]*keyframes/,multipleSpaces:/\s+/g},VAR_START="--",MEDIA_START="@media",AT_START="@",VAR_USAGE_START=/\bvar\(/,VAR_ASSIGN_START=/\B--[\w-]+\s*:/,COMMENTS=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,TRAILING_LINES=/^[\t ]+\n/gm;function findRegex(e,t,r){e.lastIndex=0;var n=t.substring(r).match(e);if(n){var s=r+n.index;return{start:s,end:s+n[0].length}}return null}function resolveVar(e,t,r){return e[t]?e[t]:r?executeTemplate(r,e):""}function findVarEndIndex(e,t){for(var r=0,n=t;n<e.length;n++){var s=e[n];if("("===s)r++;else if(")"===s&&--r<=0)return n+1}return n}function parseVar(e,t){var r=findRegex(VAR_USAGE_START,e,t);if(!r)return null;var n=findVarEndIndex(e,r.start),s=e.substring(r.end,n-1).split(","),o=s[0],a=s.slice(1);return{start:r.start,end:n,propName:o.trim(),fallback:a.length>0?a.join(",").trim():void 0}}function compileVar(e,t,r){var n=parseVar(e,r);if(!n)return t.push(e.substring(r,e.length)),e.length;var s=n.propName,o=null!=n.fallback?compileTemplate(n.fallback):void 0;return t.push(e.substring(r,n.start),(function(e){return resolveVar(e,s,o)})),n.end}function executeTemplate(e,t){for(var r="",n=0;n<e.length;n++){var s=e[n];r+="string"==typeof s?s:s(t)}return r}function findEndValue(e,t){for(var r=!1,n=!1,s=t;s<e.length;s++){var o=e[s];if(r)n&&'"'===o&&(r=!1),n||"'"!==o||(r=!1);else if('"'===o)r=!0,n=!0;else if("'"===o)r=!0,n=!1;else{if(";"===o)return s+1;if("}"===o)return s}}return s}function removeCustomAssigns(e){for(var t="",r=0;;){var n=findRegex(VAR_ASSIGN_START,e,r),s=n?n.start:e.length;if(t+=e.substring(r,s),!n)break;r=findEndValue(e,s)}return t}function compileTemplate(e){var t=0;e=removeCustomAssigns(e=e.replace(COMMENTS,"")).replace(TRAILING_LINES,"");for(var r=[];t<e.length;)t=compileVar(e,r,t);return r}function resolveValues(e){var t={};e.forEach((function(e){e.declarations.forEach((function(e){t[e.prop]=e.value}))}));for(var r={},n=Object.entries(t),s=function(e){var t=!1;if(n.forEach((function(e){var n=e[0],s=executeTemplate(e[1],r);s!==r[n]&&(r[n]=s,t=!0)})),!t)return"break"},o=0;o<10;o++){if("break"===s())break}return r}function getSelectors(e,t){if(void 0===t&&(t=0),!e.rules)return[];var r=[];return e.rules.filter((function(e){return e.type===types.STYLE_RULE})).forEach((function(e){var n=getDeclarations(e.cssText);n.length>0&&e.parsedSelector.split(",").forEach((function(e){e=e.trim(),r.push({selector:e,declarations:n,specificity:computeSpecificity(),nu:t})})),t++})),r}function computeSpecificity(e){return 1}var IMPORTANT="!important",FIND_DECLARATIONS=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gm;function getDeclarations(e){for(var t,r=[];t=FIND_DECLARATIONS.exec(e.trim());){var n=normalizeValue(t[2]),s=n.value,o=n.important;r.push({prop:t[1].trim(),value:compileTemplate(s),important:o})}return r}function normalizeValue(e){var t=(e=e.replace(/\s+/gim," ").trim()).endsWith(IMPORTANT);return t&&(e=e.slice(0,e.length-IMPORTANT.length).trim()),{value:e,important:t}}function getActiveSelectors(e,t,r){var n=[],s=getScopesForElement(t,e);return r.forEach((function(e){return n.push(e)})),s.forEach((function(e){return n.push(e)})),sortSelectors(getSelectorsForScopes(n).filter((function(t){return matches(e,t.selector)})))}function getScopesForElement(e,t){for(var r=[];t;){var n=e.get(t);n&&r.push(n),t=t.parentElement}return r}function getSelectorsForScopes(e){var t=[];return e.forEach((function(e){t.push.apply(t,e.selectors)})),t}function sortSelectors(e){return e.sort((function(e,t){return e.specificity===t.specificity?e.nu-t.nu:e.specificity-t.specificity})),e}function matches(e,t){return":root"===t||"html"===t||e.matches(t)}function parseCSS(e){var t=parse(e),r=compileTemplate(e);return{original:e,template:r,selectors:getSelectors(t),usesCssVars:r.length>1}}function addGlobalStyle(e,t){if(e.some((function(e){return e.styleEl===t})))return!1;var r=parseCSS(t.textContent);return r.styleEl=t,e.push(r),!0}function updateGlobalScopes(e){var t=resolveValues(getSelectorsForScopes(e));e.forEach((function(e){e.usesCssVars&&(e.styleEl.textContent=executeTemplate(e.template,t))}))}function reScope(e,t){var r=e.template.map((function(r){return"string"==typeof r?replaceScope(r,e.scopeId,t):r})),n=e.selectors.map((function(r){return __assign(__assign({},r),{selector:replaceScope(r.selector,e.scopeId,t)})}));return __assign(__assign({},e),{template:r,selectors:n,scopeId:t})}function replaceScope(e,t,r){return e=replaceAll(e,"\\.".concat(t),".".concat(r))}function replaceAll(e,t,r){return e.replace(new RegExp(t,"g"),r)}function loadDocument(e,t){return loadDocumentStyles(e,t),loadDocumentLinks(e,t).then((function(){updateGlobalScopes(t)}))}function startWatcher(e,t){"undefined"!=typeof MutationObserver&&new MutationObserver((function(){loadDocumentStyles(e,t)&&updateGlobalScopes(t)})).observe(document.head,{childList:!0})}function loadDocumentLinks(e,t){for(var r=[],n=e.querySelectorAll('link[rel="stylesheet"][href]:not([data-no-shim])'),s=0;s<n.length;s++)r.push(addGlobalLink(e,t,n[s]));return Promise.all(r)}function loadDocumentStyles(e,t){return Array.from(e.querySelectorAll("style:not([data-styles]):not([data-no-shim])")).map((function(e){return addGlobalStyle(t,e)})).some(Boolean)}function addGlobalLink(e,t,r){var n=r.href;return fetch(n).then((function(e){return e.text()})).then((function(s){if(hasCssVariables(s)&&r.parentNode){hasRelativeUrls(s)&&(s=fixRelativeUrls(s,n));var o=e.createElement("style");o.setAttribute("data-styles",""),o.textContent=s,addGlobalStyle(t,o),r.parentNode.insertBefore(o,r),r.remove()}})).catch((function(e){console.error(e)}))}var CSS_VARIABLE_REGEXP=/[\s;{]--[-a-zA-Z0-9]+\s*:/m;function hasCssVariables(e){return e.indexOf("var(")>-1||CSS_VARIABLE_REGEXP.test(e)}var CSS_URL_REGEXP=/url[\s]*\([\s]*['"]?(?!(?:https?|data)\:|\/)([^\'\"\)]*)[\s]*['"]?\)[\s]*/gim;function hasRelativeUrls(e){return CSS_URL_REGEXP.lastIndex=0,CSS_URL_REGEXP.test(e)}function fixRelativeUrls(e,t){var r=t.replace(/[^/]*$/,"");return e.replace(CSS_URL_REGEXP,(function(e,t){var n=r+t;return e.replace(t,n)}))}var CustomStyle=function(){function e(e,t){this.win=e,this.doc=t,this.count=0,this.hostStyleMap=new WeakMap,this.hostScopeMap=new WeakMap,this.globalScopes=[],this.scopesMap=new Map,this.didInit=!1}return e.prototype.i=function(){var e=this;return this.didInit||!this.win.requestAnimationFrame?Promise.resolve():(this.didInit=!0,new Promise((function(t){e.win.requestAnimationFrame((function(){startWatcher(e.doc,e.globalScopes),loadDocument(e.doc,e.globalScopes).then((function(){return t()}))}))})))},e.prototype.addLink=function(e){var t=this;return addGlobalLink(this.doc,this.globalScopes,e).then((function(){t.updateGlobal()}))},e.prototype.addGlobalStyle=function(e){addGlobalStyle(this.globalScopes,e)&&this.updateGlobal()},e.prototype.createHostStyle=function(e,t,r,n){if(this.hostScopeMap.has(e))throw new Error("host style already created");var s=this.registerHostTemplate(r,t,n),o=this.doc.createElement("style");return o.setAttribute("data-no-shim",""),s.usesCssVars?n?(o["s-sc"]=t="".concat(s.scopeId,"-").concat(this.count),o.textContent="/*needs update*/",this.hostStyleMap.set(e,o),this.hostScopeMap.set(e,reScope(s,t)),this.count++):(s.styleEl=o,s.usesCssVars||(o.textContent=executeTemplate(s.template,{})),this.globalScopes.push(s),this.updateGlobal(),this.hostScopeMap.set(e,s)):o.textContent=r,o},e.prototype.removeHost=function(e){var t=this.hostStyleMap.get(e);t&&t.remove(),this.hostStyleMap.delete(e),this.hostScopeMap.delete(e)},e.prototype.updateHost=function(e){var t=this.hostScopeMap.get(e);if(t&&t.usesCssVars&&t.isScoped){var r=this.hostStyleMap.get(e);if(r){var n=resolveValues(getActiveSelectors(e,this.hostScopeMap,this.globalScopes));r.textContent=executeTemplate(t.template,n)}}},e.prototype.updateGlobal=function(){updateGlobalScopes(this.globalScopes)},e.prototype.registerHostTemplate=function(e,t,r){var n=this.scopesMap.get(t);return n||((n=parseCSS(e)).scopeId=t,n.isScoped=r,this.scopesMap.set(t,n)),n},e}();!function(e){!e||e.__cssshim||e.CSS&&e.CSS.supports&&e.CSS.supports("color","var(--c)")||(e.__cssshim=new CustomStyle(e,e.document))}("undefined"!=typeof window&&window);
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/dom.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/dom.js
new file mode 100644
index 0000000..e5b2981
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/dom.js
@@ -0,0 +1,79 @@
+(function(){
+  /*
+    Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+    This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+    The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+    The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+    Code distributed by Google as part of the polymer project is also
+    subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+  */
+  'use strict';var aa=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function g(a){var b=aa.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function l(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}
+  function n(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
+  function p(a,b,d){d=void 0===d?new Set:d;for(var c=a;c;){if(c.nodeType===Node.ELEMENT_NODE){var e=c;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){c=e.import;if(c instanceof Node&&!d.has(c))for(d.add(c),c=c.firstChild;c;c=c.nextSibling)p(c,b,d);c=n(a,e);continue}else if("template"===f){c=n(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)p(e,b,d)}c=c.firstChild?c.firstChild:n(a,c)}}function r(a,b,d){a[b]=d};function u(){this.a=new Map;this.g=new Map;this.c=[];this.f=[];this.b=!1}function ba(a,b,d){a.a.set(b,d);a.g.set(d.constructorFunction,d)}function ca(a,b){a.b=!0;a.c.push(b)}function da(a,b){a.b=!0;a.f.push(b)}function v(a,b){a.b&&p(b,function(b){return w(a,b)})}function w(a,b){if(a.b&&!b.__CE_patched){b.__CE_patched=!0;for(var d=0;d<a.c.length;d++)a.c[d](b);for(d=0;d<a.f.length;d++)a.f[d](b)}}
+  function x(a,b){var d=[];p(b,function(b){return d.push(b)});for(b=0;b<d.length;b++){var c=d[b];1===c.__CE_state?a.connectedCallback(c):y(a,c)}}function z(a,b){var d=[];p(b,function(b){return d.push(b)});for(b=0;b<d.length;b++){var c=d[b];1===c.__CE_state&&a.disconnectedCallback(c)}}
+  function A(a,b,d){d=void 0===d?{}:d;var c=d.u||new Set,e=d.i||function(b){return y(a,b)},f=[];p(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var d=b.import;d instanceof Node&&(d.__CE_isImportDocument=!0,d.__CE_hasRegistry=!0);d&&"complete"===d.readyState?d.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var d=b.import;if(!d.__CE_documentLoadHandled){d.__CE_documentLoadHandled=!0;var f=new Set(c);f.delete(d);A(a,d,{u:f,i:e})}})}else f.push(b)},c);if(a.b)for(b=
+  0;b<f.length;b++)w(a,f[b]);for(b=0;b<f.length;b++)e(f[b])}
+  function y(a,b){if(void 0===b.__CE_state){var d=b.ownerDocument;if(d.defaultView||d.__CE_isImportDocument&&d.__CE_hasRegistry)if(d=a.a.get(b.localName)){d.constructionStack.push(b);var c=d.constructorFunction;try{try{if(new c!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{d.constructionStack.pop()}}catch(t){throw b.__CE_state=2,t;}b.__CE_state=1;b.__CE_definition=d;if(d.attributeChangedCallback)for(d=d.observedAttributes,c=0;c<d.length;c++){var e=
+  d[c],f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}l(b)&&a.connectedCallback(b)}}}u.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};u.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
+  u.prototype.attributeChangedCallback=function(a,b,d,c,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,d,c,e)};function B(a){var b=document;this.c=a;this.a=b;this.b=void 0;A(this.c,this.a);"loading"===this.a.readyState&&(this.b=new MutationObserver(this.f.bind(this)),this.b.observe(this.a,{childList:!0,subtree:!0}))}function C(a){a.b&&a.b.disconnect()}B.prototype.f=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||C(this);for(b=0;b<a.length;b++)for(var d=a[b].addedNodes,c=0;c<d.length;c++)A(this.c,d[c])};function ea(){var a=this;this.b=this.a=void 0;this.c=new Promise(function(b){a.b=b;a.a&&b(a.a)})}function D(a){if(a.a)throw Error("Already resolved.");a.a=void 0;a.b&&a.b(void 0)};function E(a){this.c=!1;this.a=a;this.j=new Map;this.f=function(b){return b()};this.b=!1;this.g=[];this.o=new B(a)}
+  E.prototype.l=function(a,b){var d=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!g(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.a.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.c)throw Error("A custom element is already being defined.");this.c=!0;try{var c=function(b){var a=e[b];if(void 0!==a&&!(a instanceof Function))throw Error("The '"+b+"' callback must be a function.");
+  return a},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=c("connectedCallback");var t=c("disconnectedCallback");var k=c("adoptedCallback");var h=c("attributeChangedCallback");var m=b.observedAttributes||[]}catch(q){return}finally{this.c=!1}b={localName:a,constructorFunction:b,connectedCallback:f,disconnectedCallback:t,adoptedCallback:k,attributeChangedCallback:h,observedAttributes:m,constructionStack:[]};ba(this.a,
+  a,b);this.g.push(b);this.b||(this.b=!0,this.f(function(){return fa(d)}))};E.prototype.i=function(a){A(this.a,a)};
+  function fa(a){if(!1!==a.b){a.b=!1;for(var b=a.g,d=[],c=new Map,e=0;e<b.length;e++)c.set(b[e].localName,[]);A(a.a,document,{i:function(b){if(void 0===b.__CE_state){var e=b.localName,f=c.get(e);f?f.push(b):a.a.a.get(e)&&d.push(b)}}});for(e=0;e<d.length;e++)y(a.a,d[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=c.get(f.localName);for(var t=0;t<f.length;t++)y(a.a,f[t]);(e=a.j.get(e))&&D(e)}}}E.prototype.get=function(a){if(a=this.a.a.get(a))return a.constructorFunction};
+  E.prototype.m=function(a){if(!g(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.j.get(a);if(b)return b.c;b=new ea;this.j.set(a,b);this.a.a.get(a)&&!this.g.some(function(b){return b.localName===a})&&D(b);return b.c};E.prototype.s=function(a){C(this.o);var b=this.f;this.f=function(d){return a(function(){return b(d)})}};window.CustomElementRegistry=E;E.prototype.define=E.prototype.l;E.prototype.upgrade=E.prototype.i;E.prototype.get=E.prototype.get;
+  E.prototype.whenDefined=E.prototype.m;E.prototype.polyfillWrapFlushCallback=E.prototype.s;var F=window.Document.prototype.createElement,G=window.Document.prototype.createElementNS,ha=window.Document.prototype.importNode,ia=window.Document.prototype.prepend,ja=window.Document.prototype.append,ka=window.DocumentFragment.prototype.prepend,la=window.DocumentFragment.prototype.append,H=window.Node.prototype.cloneNode,I=window.Node.prototype.appendChild,J=window.Node.prototype.insertBefore,K=window.Node.prototype.removeChild,L=window.Node.prototype.replaceChild,M=Object.getOwnPropertyDescriptor(window.Node.prototype,
+  "textContent"),N=window.Element.prototype.attachShadow,O=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),P=window.Element.prototype.getAttribute,Q=window.Element.prototype.setAttribute,R=window.Element.prototype.removeAttribute,S=window.Element.prototype.getAttributeNS,T=window.Element.prototype.setAttributeNS,U=window.Element.prototype.removeAttributeNS,ma=window.Element.prototype.insertAdjacentElement,na=window.Element.prototype.insertAdjacentHTML,oa=window.Element.prototype.prepend,
+  pa=window.Element.prototype.append,V=window.Element.prototype.before,qa=window.Element.prototype.after,ra=window.Element.prototype.replaceWith,sa=window.Element.prototype.remove,ta=window.HTMLElement,W=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),ua=window.HTMLElement.prototype.insertAdjacentElement,va=window.HTMLElement.prototype.insertAdjacentHTML;var wa=new function(){};function xa(){var a=X;window.HTMLElement=function(){function b(){var b=this.constructor,c=a.g.get(b);if(!c)throw Error("The custom element being constructed was not registered with `customElements`.");var e=c.constructionStack;if(0===e.length)return e=F.call(document,c.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=c,w(a,e),e;c=e.length-1;var f=e[c];if(f===wa)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
+  e[c]=wa;Object.setPrototypeOf(f,b.prototype);w(a,f);return f}b.prototype=ta.prototype;Object.defineProperty(b.prototype,"constructor",{writable:!0,configurable:!0,enumerable:!1,value:b});return b}()};function Y(a,b,d){function c(b){return function(d){for(var e=[],c=0;c<arguments.length;++c)e[c]=arguments[c];c=[];for(var f=[],m=0;m<e.length;m++){var q=e[m];q instanceof Element&&l(q)&&f.push(q);if(q instanceof DocumentFragment)for(q=q.firstChild;q;q=q.nextSibling)c.push(q);else c.push(q)}b.apply(this,e);for(e=0;e<f.length;e++)z(a,f[e]);if(l(this))for(e=0;e<c.length;e++)f=c[e],f instanceof Element&&x(a,f)}}void 0!==d.h&&(b.prepend=c(d.h));void 0!==d.append&&(b.append=c(d.append))};function ya(){var a=X;r(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var d=a.a.get(b);if(d)return new d.constructorFunction}b=F.call(this,b);w(a,b);return b});r(Document.prototype,"importNode",function(b,d){b=ha.call(this,b,!!d);this.__CE_hasRegistry?A(a,b):v(a,b);return b});r(Document.prototype,"createElementNS",function(b,d){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var c=a.a.get(d);if(c)return new c.constructorFunction}b=G.call(this,b,
+  d);w(a,b);return b});Y(a,Document.prototype,{h:ia,append:ja})};function za(){function a(a,c){Object.defineProperty(a,"textContent",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(a){if(this.nodeType===Node.TEXT_NODE)c.set.call(this,a);else{var d=void 0;if(this.firstChild){var e=this.childNodes,k=e.length;if(0<k&&l(this)){d=Array(k);for(var h=0;h<k;h++)d[h]=e[h]}}c.set.call(this,a);if(d)for(a=0;a<d.length;a++)z(b,d[a])}}})}var b=X;r(Node.prototype,"insertBefore",function(a,c){if(a instanceof DocumentFragment){var e=Array.prototype.slice.apply(a.childNodes);
+  a=J.call(this,a,c);if(l(this))for(c=0;c<e.length;c++)x(b,e[c]);return a}e=l(a);c=J.call(this,a,c);e&&z(b,a);l(this)&&x(b,a);return c});r(Node.prototype,"appendChild",function(a){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);a=I.call(this,a);if(l(this))for(var e=0;e<c.length;e++)x(b,c[e]);return a}c=l(a);e=I.call(this,a);c&&z(b,a);l(this)&&x(b,a);return e});r(Node.prototype,"cloneNode",function(a){a=H.call(this,!!a);this.ownerDocument.__CE_hasRegistry?A(b,a):v(b,
+  a);return a});r(Node.prototype,"removeChild",function(a){var c=l(a),e=K.call(this,a);c&&z(b,a);return e});r(Node.prototype,"replaceChild",function(a,c){if(a instanceof DocumentFragment){var e=Array.prototype.slice.apply(a.childNodes);a=L.call(this,a,c);if(l(this))for(z(b,c),c=0;c<e.length;c++)x(b,e[c]);return a}e=l(a);var f=L.call(this,a,c),d=l(this);d&&z(b,c);e&&z(b,a);d&&x(b,a);return f});M&&M.get?a(Node.prototype,M):ca(b,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){for(var a=[],
+  b=0;b<this.childNodes.length;b++){var f=this.childNodes[b];f.nodeType!==Node.COMMENT_NODE&&a.push(f.textContent)}return a.join("")},set:function(a){for(;this.firstChild;)K.call(this,this.firstChild);null!=a&&""!==a&&I.call(this,document.createTextNode(a))}})})};function Aa(a){function b(b){return function(e){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];d=[];for(var k=[],h=0;h<c.length;h++){var m=c[h];m instanceof Element&&l(m)&&k.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)d.push(m);else d.push(m)}b.apply(this,c);for(c=0;c<k.length;c++)z(a,k[c]);if(l(this))for(c=0;c<d.length;c++)k=d[c],k instanceof Element&&x(a,k)}}var d=Element.prototype;void 0!==V&&(d.before=b(V));void 0!==V&&(d.after=b(qa));void 0!==ra&&
+  r(d,"replaceWith",function(b){for(var e=[],c=0;c<arguments.length;++c)e[c]=arguments[c];c=[];for(var d=[],k=0;k<e.length;k++){var h=e[k];h instanceof Element&&l(h)&&d.push(h);if(h instanceof DocumentFragment)for(h=h.firstChild;h;h=h.nextSibling)c.push(h);else c.push(h)}k=l(this);ra.apply(this,e);for(e=0;e<d.length;e++)z(a,d[e]);if(k)for(z(a,this),e=0;e<c.length;e++)d=c[e],d instanceof Element&&x(a,d)});void 0!==sa&&r(d,"remove",function(){var b=l(this);sa.call(this);b&&z(a,this)})};function Ba(){function a(a,b){Object.defineProperty(a,"innerHTML",{enumerable:b.enumerable,configurable:!0,get:b.get,set:function(a){var e=this,d=void 0;l(this)&&(d=[],p(this,function(a){a!==e&&d.push(a)}));b.set.call(this,a);if(d)for(var f=0;f<d.length;f++){var t=d[f];1===t.__CE_state&&c.disconnectedCallback(t)}this.ownerDocument.__CE_hasRegistry?A(c,this):v(c,this);return a}})}function b(a,b){r(a,"insertAdjacentElement",function(a,e){var d=l(e);a=b.call(this,a,e);d&&z(c,e);l(a)&&x(c,e);return a})}
+  function d(a,b){function e(a,b){for(var e=[];a!==b;a=a.nextSibling)e.push(a);for(b=0;b<e.length;b++)A(c,e[b])}r(a,"insertAdjacentHTML",function(a,c){a=a.toLowerCase();if("beforebegin"===a){var d=this.previousSibling;b.call(this,a,c);e(d||this.parentNode.firstChild,this)}else if("afterbegin"===a)d=this.firstChild,b.call(this,a,c),e(this.firstChild,d);else if("beforeend"===a)d=this.lastChild,b.call(this,a,c),e(d||this.firstChild,null);else if("afterend"===a)d=this.nextSibling,b.call(this,a,c),e(this.nextSibling,
+  d);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}var c=X;N&&r(Element.prototype,"attachShadow",function(a){a=N.call(this,a);var b=c;if(b.b&&!a.__CE_patched){a.__CE_patched=!0;for(var e=0;e<b.c.length;e++)b.c[e](a)}return this.__CE_shadowRoot=a});O&&O.get?a(Element.prototype,O):W&&W.get?a(HTMLElement.prototype,W):da(c,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){return H.call(this,!0).innerHTML},
+  set:function(a){var b="template"===this.localName,c=b?this.content:this,e=G.call(document,this.namespaceURI,this.localName);for(e.innerHTML=a;0<c.childNodes.length;)K.call(c,c.childNodes[0]);for(a=b?e.content:e;0<a.childNodes.length;)I.call(c,a.childNodes[0])}})});r(Element.prototype,"setAttribute",function(a,b){if(1!==this.__CE_state)return Q.call(this,a,b);var e=P.call(this,a);Q.call(this,a,b);b=P.call(this,a);c.attributeChangedCallback(this,a,e,b,null)});r(Element.prototype,"setAttributeNS",function(a,
+  b,d){if(1!==this.__CE_state)return T.call(this,a,b,d);var e=S.call(this,a,b);T.call(this,a,b,d);d=S.call(this,a,b);c.attributeChangedCallback(this,b,e,d,a)});r(Element.prototype,"removeAttribute",function(a){if(1!==this.__CE_state)return R.call(this,a);var b=P.call(this,a);R.call(this,a);null!==b&&c.attributeChangedCallback(this,a,b,null,null)});r(Element.prototype,"removeAttributeNS",function(a,b){if(1!==this.__CE_state)return U.call(this,a,b);var d=S.call(this,a,b);U.call(this,a,b);var e=S.call(this,
+  a,b);d!==e&&c.attributeChangedCallback(this,b,d,e,a)});ua?b(HTMLElement.prototype,ua):ma?b(Element.prototype,ma):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");va?d(HTMLElement.prototype,va):na?d(Element.prototype,na):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");Y(c,Element.prototype,{h:oa,append:pa});Aa(c)};var Z=window.customElements;if(!Z||Z.forcePolyfill||"function"!=typeof Z.define||"function"!=typeof Z.get){var X=new u;xa();ya();Y(X,DocumentFragment.prototype,{h:ka,append:la});za();Ba();document.__CE_hasRegistry=!0;var customElements=new E(X);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};
+}).call(self);
+
+// Polyfill document.baseURI
+"string"!==typeof document.baseURI&&Object.defineProperty(Document.prototype,"baseURI",{enumerable:!0,configurable:!0,get:function(){var a=document.querySelector("base");return a&&a.href?a.href:document.URL}});
+
+// Polyfill CustomEvent
+"function"!==typeof window.CustomEvent&&(window.CustomEvent=function(c,a){a=a||{bubbles:!1,cancelable:!1,detail:void 0};var b=document.createEvent("CustomEvent");b.initCustomEvent(c,a.bubbles,a.cancelable,a.detail);return b},window.CustomEvent.prototype=window.Event.prototype);
+
+// Event.composedPath
+(function(b,c,d){b.composedPath||(b.composedPath=function(){if(this.path)return this.path;var a=this.target;for(this.path=[];null!==a.parentNode;)this.path.push(a),a=a.parentNode;this.path.push(c,d);return this.path})})(Event.prototype,document,window);
+
+/*!
+Element.closest and Element.matches
+https://github.com/jonathantneal/closest
+Creative Commons Zero v1.0 Universal
+*/
+(function(a){"function"!==typeof a.matches&&(a.matches=a.msMatchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||function(a){a=(this.document||this.ownerDocument).querySelectorAll(a);for(var b=0;a[b]&&a[b]!==this;)++b;return!!a[b]});"function"!==typeof a.closest&&(a.closest=function(a){for(var b=this;b&&1===b.nodeType;){if(b.matches(a))return b;b=b.parentNode}return null})})(window.Element.prototype);
+
+/*!
+Element.getRootNode()
+*/
+(function(c){function d(a){a=b(a);return a&&11===a.nodeType?d(a.host):a}function b(a){return a&&a.parentNode?b(a.parentNode):a}"function"!==typeof c.getRootNode&&(c.getRootNode=function(a){return a&&a.composed?d(this):b(this)})})(Element.prototype);
+
+/*!
+Element.isConnected()
+*/
+(function(a){"isConnected"in a||Object.defineProperty(a,"isConnected",{configurable:!0,enumerable:!0,get:function(){var a=this.getRootNode({composed:!0});return a&&9===a.nodeType}})})(Element.prototype);
+
+/*!
+Element.remove()
+*/
+(function(b){b.forEach(function(a){a.hasOwnProperty("remove")||Object.defineProperty(a,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){null!==this.parentNode&&this.parentNode.removeChild(this)}})})})([Element.prototype,CharacterData.prototype,DocumentType.prototype]);
+
+/*!
+Element.classList
+*/
+!function(e){'classList'in e||Object.defineProperty(e,"classList",{get:function(){var e=this,t=(e.getAttribute("class")||"").replace(/^\s+|\s$/g,"").split(/\s+/g);function n(){t.length>0?e.setAttribute("class",t.join(" ")):e.removeAttribute("class")}return""===t[0]&&t.splice(0,1),t.toggle=function(e,i){void 0!==i?i?t.add(e):t.remove(e):-1!==t.indexOf(e)?t.splice(t.indexOf(e),1):t.push(e),n()},t.add=function(){for(var e=[].slice.call(arguments),i=0,s=e.length;i<s;i++)-1===t.indexOf(e[i])&&t.push(e[i]);n()},t.remove=function(){for(var e=[].slice.call(arguments),i=0,s=e.length;i<s;i++)-1!==t.indexOf(e[i])&&t.splice(t.indexOf(e[i]),1);n()},t.item=function(e){return t[e]},t.contains=function(e){return-1!==t.indexOf(e)},t.replace=function(e,i){-1!==t.indexOf(e)&&t.splice(t.indexOf(e),1,i),n()},t.value=e.getAttribute("class")||"",t}})}(Element.prototype);
+
+/*!
+DOMTokenList
+*/
+(function(b){try{document.body.classList.add()}catch(e){var c=b.add,d=b.remove;b.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])};b.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])}}})(DOMTokenList.prototype);
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/es5-html-element.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/es5-html-element.js
new file mode 100644
index 0000000..2943b42
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/es5-html-element.js
@@ -0,0 +1 @@
+(function(){if("undefined"!==typeof window&&void 0!==window.Reflect&&void 0!==window.customElements){var a=HTMLElement;window.HTMLElement=function(){return Reflect.construct(a,[],this.constructor)};HTMLElement.prototype=a.prototype;HTMLElement.prototype.constructor=HTMLElement;Object.setPrototypeOf(HTMLElement,a)}})();
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/index.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/index.js
new file mode 100644
index 0000000..36c32de
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/index.js
@@ -0,0 +1,34 @@
+export function applyPolyfills() {
+  var promises = [];
+  if (typeof window !== 'undefined') {
+    var win = window;
+
+    if (!win.customElements ||
+      (win.Element && (!win.Element.prototype.closest || !win.Element.prototype.matches || !win.Element.prototype.remove || !win.Element.prototype.getRootNode))) {
+      promises.push(import(/* webpackChunkName: "polyfills-dom" */ './dom.js'));
+    }
+
+    var checkIfURLIsSupported = function() {
+      try {
+        var u = new URL('b', 'http://a');
+        u.pathname = 'c%20d';
+        return (u.href === 'http://a/c%20d') && u.searchParams;
+      } catch (e) {
+        return false;
+      }
+    };
+
+    if (
+      'function' !== typeof Object.assign || !Object.entries ||
+      !Array.prototype.find || !Array.prototype.includes ||
+      !String.prototype.startsWith || !String.prototype.endsWith ||
+      (win.NodeList && !win.NodeList.prototype.forEach) ||
+      !win.fetch ||
+      !checkIfURLIsSupported() ||
+      typeof WeakMap == 'undefined'
+    ) {
+      promises.push(import(/* webpackChunkName: "polyfills-core-js" */ './core-js.js'));
+    }
+  }
+  return Promise.all(promises);
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/system.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/system.js
new file mode 100644
index 0000000..dc6f9af
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/polyfills/system.js
@@ -0,0 +1,6 @@
+/**
+ * SystemJS 4.0.2
+ * MANUAL PATCH: remove script.crossOrigin = "anonymous"
+ * MANUAL PATCH: add conditionally apply, n.System=n.System||new u
+ */
+!function(){var e="undefined"!=typeof self,n=e?self:global;var t;if("undefined"!=typeof document){var e=document.querySelector("base[href]");e&&(t=e.href)}if(!t&&"undefined"!=typeof location){var e=(t=location.href.split("#")[0].split("?")[0]).lastIndexOf("/");-1!==e&&(t=t.slice(0,e+1))}var r=/\\/g,o="undefined"!=typeof Symbol,i=o&&Symbol.toStringTag,c=o?Symbol():"@";function u(){this[c]={}}var s=u.prototype;var l;s.import=function(e,n){var t=this;return Promise.resolve(t.resolve(e,n)).then(function(e){var n=function e(n,t,r){var o=n[c][t];if(o)return o;var u=[],s=Object.create(null);i&&Object.defineProperty(s,i,{value:"Module"});var l=Promise.resolve().then(function(){return n.instantiate(t,r)}).then(function(e){if(!e)throw Error("Module "+t+" did not instantiate");var r=e[1](function(e,n){o.h=!0;var t=!1;if("object"!=typeof e)e in s&&s[e]===n||(s[e]=n,t=!0);else for(var n in e){var r=e[n];n in s&&s[n]===r||(s[n]=r,t=!0)}if(t)for(var e=0;e<u.length;e++)u[e](s);return n},2===e[1].length?{import:function(e){return n.import(e,t)},meta:n.createContext(t)}:void 0);return o.e=r.execute||function(){},[e[0],r.setters||[]]});var f=l.then(function(r){return Promise.all(r[0].map(function(o,i){var c=r[1][i];return Promise.resolve(n.resolve(o,t)).then(function(r){var o=e(n,r,t);return Promise.resolve(o.I).then(function(){return c&&(o.i.push(c),!o.h&&o.I||c(o.n)),o})})})).then(function(e){o.d=e})});return f.catch(function(e){o.e=null,o.er=e}),o=n[c][t]={id:t,i:u,n:s,I:l,L:f,h:!1,d:void 0,e:void 0,er:void 0,E:void 0,C:void 0}}(t,e);return n.C||function(e,n){return n.C=function e(n,t,r){if(!r[t.id])return r[t.id]=!0,Promise.resolve(t.L).then(function(){return Promise.all(t.d.map(function(t){return e(n,t,r)}))})}(e,n,{}).then(function(){return function e(n,t,r){if(r[t.id])return;if(r[t.id]=!0,!t.e){if(t.er)throw t.er;return t.E?t.E:void 0}var o;return t.d.forEach(function(t){{var i=e(n,t,r);i&&(o=o||[]).push(i)}}),o?Promise.all(o).then(i):i();function i(){try{var e=t.e.call(f);if(e)return e=e.then(function(){t.C=t.n,t.E=null}),t.E=t.E||e;t.C=t.n}catch(e){throw t.er=e,e}finally{t.L=t.I=void 0,t.e=null}}}(e,n,{})}).then(function(){return n.n})}(t,n)})},s.createContext=function(e){return{url:e}},s.register=function(e,n){l=[e,n]},s.getRegister=function(){var e=l;return l=void 0,e};var f=Object.freeze(Object.create(null));n.System=n.System||new u;var d=s.register;s.register=function(e,n){d.call(this,e,n)},s.instantiate=function(e,n){var t=this;return".json"===e.substr(-5)?fetch(e).then(function(e){return e.text()}).then(function(e){return[[],function(n){return{execute:function(){n("default",JSON.parse(e))}}}]}):new Promise(function(r,o){var i;function c(n){n.filename===e&&(i=n.error)}window.addEventListener("error",c);var u=document.createElement("script");u.charset="utf-8",u.async=!0,u.addEventListener("error",function(){window.removeEventListener("error",c),o(Error("Error loading "+e+(n?" from "+n:"")))}),u.addEventListener("load",function(){window.removeEventListener("error",c),document.head.removeChild(u),i?o(i):r(t.getRegister())}),u.src=e,document.head.appendChild(u)})},e&&"function"==typeof importScripts&&(s.instantiate=function(e){var n=this;return new Promise(function(t,r){try{importScripts(e)}catch(e){r(e)}t(n.getRegister())})}),s.resolve=function(e,n){var o=function(e,n){if(-1!==e.indexOf("\\")&&(e=e.replace(r,"/")),"/"===e[0]&&"/"===e[1])return n.slice(0,n.indexOf(":")+1)+e;if("."===e[0]&&("/"===e[1]||"."===e[1]&&("/"===e[2]||2===e.length&&(e+="/"))||1===e.length&&(e+="/"))||"/"===e[0]){var t=n.slice(0,n.indexOf(":")+1);var r;if(r="/"===n[t.length+1]?"file:"!==t?(r=n.slice(t.length+2)).slice(r.indexOf("/")+1):n.slice(8):n.slice(t.length+("/"===n[t.length])),"/"===e[0])return n.slice(0,n.length-r.length-1)+e;var o=r.slice(0,r.lastIndexOf("/")+1)+e,i=[];var c=-1;for(var e=0;e<o.length;e++)-1!==c?"/"===o[e]&&(i.push(o.slice(c,e+1)),c=-1):"."===o[e]?"."!==o[e+1]||"/"!==o[e+2]&&e+2!==o.length?"/"===o[e+1]||e+1===o.length?e+=1:c=e:(i.pop(),e+=2):c=e;return-1!==c&&i.push(o.slice(c)),n.slice(0,n.length-r.length)+i.join("")}}(e,n||t);if(!o){if(-1!==e.indexOf(":"))return Promise.resolve(e);throw Error('Cannot resolve "'+e+(n?'" from '+n:'"'))}return Promise.resolve(o)}}();
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-action-sheet.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-action-sheet.entry.js
new file mode 100644
index 0000000..fc5d68b
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-action-sheet.entry.js
@@ -0,0 +1,42 @@
+import { r as registerInstance, c as createEvent, h, g as getElement } from './index-1c5c47b4.js';
+
+const actionSheetCss = ":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:-apple-system, BlinkMacSystemFont, \"Helvetica Neue\", \"Roboto\", sans-serif}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0);-webkit-transition:400ms background-color cubic-bezier(.36,.66,.04,1);transition:400ms background-color cubic-bezier(.36,.66,.04,1)}.wrapper.open{background-color:rgba(0, 0, 0, 0.32)}.title{color:#999;height:23px;line-height:23px;padding-bottom:17px;-webkit-padding-end:16px;padding-inline-end:16px;-webkit-padding-start:16px;padding-inline-start:16px;padding-left:16px;padding-right:16px;padding-top:20px}.content{width:568px;-ms-flex-item-align:end;align-self:flex-end;background-color:#fff;-webkit-transition:400ms -webkit-transform cubic-bezier(.36,.66,.04,1);transition:400ms -webkit-transform cubic-bezier(.36,.66,.04,1);transition:400ms transform cubic-bezier(.36,.66,.04,1);transition:400ms transform cubic-bezier(.36,.66,.04,1), 400ms -webkit-transform cubic-bezier(.36,.66,.04,1);-webkit-transform:translateY(100%);transform:translateY(100%)}.wrapper.open .content{-webkit-transform:translateY(0%);transform:translateY(0%)}@media only screen and (max-width: 568px){.content{width:100%}}.action-sheet-option{cursor:pointer;height:52px;line-height:52px}.action-sheet-button{color:rgb(38, 38, 38);font-size:16px;-webkit-padding-end:16px;padding-inline-end:16px;-webkit-padding-start:16px;padding-inline-start:16px;padding-left:16px;padding-right:16px;padding-top:0px}.action-sheet-button:hover{background-color:#F6F6F6}";
+
+const PWAActionSheet = class {
+  constructor(hostRef) {
+    registerInstance(this, hostRef);
+    this.onSelection = createEvent(this, "onSelection", 7);
+    this.header = undefined;
+    this.cancelable = true;
+    this.options = [];
+    this.open = false;
+  }
+  componentDidLoad() {
+    requestAnimationFrame(() => {
+      this.open = true;
+    });
+  }
+  dismiss() {
+    if (this.cancelable) {
+      this.close();
+    }
+  }
+  close() {
+    this.open = false;
+    setTimeout(() => {
+      this.el.parentNode.removeChild(this.el);
+    }, 500);
+  }
+  handleOptionClick(e, i) {
+    e.stopPropagation();
+    this.onSelection.emit(i);
+    this.close();
+  }
+  render() {
+    return (h("div", { class: `wrapper${this.open ? ' open' : ''}`, onClick: () => this.dismiss() }, h("div", { class: "content" }, h("div", { class: "title" }, this.header), this.options.map((option, i) => h("div", { class: "action-sheet-option", onClick: (e) => this.handleOptionClick(e, i) }, h("div", { class: "action-sheet-button" }, option.title))))));
+  }
+  get el() { return getElement(this); }
+};
+PWAActionSheet.style = actionSheetCss;
+
+export { PWAActionSheet as pwa_action_sheet };
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-camera-modal-instance.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-camera-modal-instance.entry.js
new file mode 100644
index 0000000..eb58c62
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-camera-modal-instance.entry.js
@@ -0,0 +1,41 @@
+import { r as registerInstance, c as createEvent, h, g as getElement } from './index-1c5c47b4.js';
+
+const cameraModalInstanceCss = ":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict;--inset-width:600px;--inset-height:600px}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0.15)}.content{-webkit-box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);width:var(--inset-width);height:var(--inset-height);max-height:100%}@media only screen and (max-width: 600px){.content{width:100%;height:100%}}";
+
+const PWACameraModal = class {
+  constructor(hostRef) {
+    registerInstance(this, hostRef);
+    this.onPhoto = createEvent(this, "onPhoto", 7);
+    this.noDeviceError = createEvent(this, "noDeviceError", 7);
+    this.handlePhoto = async (photo) => {
+      this.onPhoto.emit(photo);
+    };
+    this.handleNoDeviceError = async (photo) => {
+      this.noDeviceError.emit(photo);
+    };
+    this.facingMode = 'user';
+    this.hidePicker = false;
+    this.noDevicesText = 'No camera found';
+    this.noDevicesButtonText = 'Choose image';
+  }
+  handleBackdropClick(e) {
+    if (e.target !== this.el) {
+      this.onPhoto.emit(null);
+    }
+  }
+  handleComponentClick(e) {
+    e.stopPropagation();
+  }
+  handleBackdropKeyUp(e) {
+    if (e.key === "Escape") {
+      this.onPhoto.emit(null);
+    }
+  }
+  render() {
+    return (h("div", { class: "wrapper", onClick: e => this.handleBackdropClick(e) }, h("div", { class: "content" }, h("pwa-camera", { onClick: e => this.handleComponentClick(e), facingMode: this.facingMode, hidePicker: this.hidePicker, handlePhoto: this.handlePhoto, handleNoDeviceError: this.handleNoDeviceError, noDevicesButtonText: this.noDevicesButtonText, noDevicesText: this.noDevicesText }))));
+  }
+  get el() { return getElement(this); }
+};
+PWACameraModal.style = cameraModalInstanceCss;
+
+export { PWACameraModal as pwa_camera_modal_instance };
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-camera-modal.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-camera-modal.entry.js
new file mode 100644
index 0000000..7467fe2
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-camera-modal.entry.js
@@ -0,0 +1,43 @@
+import { r as registerInstance, c as createEvent, h } from './index-1c5c47b4.js';
+
+const cameraModalCss = ":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0.15)}.content{-webkit-box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);width:600px;height:600px}";
+
+const PWACameraModal = class {
+  constructor(hostRef) {
+    registerInstance(this, hostRef);
+    this.onPhoto = createEvent(this, "onPhoto", 7);
+    this.noDeviceError = createEvent(this, "noDeviceError", 7);
+    this.facingMode = 'user';
+    this.hidePicker = false;
+  }
+  async present() {
+    const camera = document.createElement('pwa-camera-modal-instance');
+    camera.facingMode = this.facingMode;
+    camera.hidePicker = this.hidePicker;
+    camera.addEventListener('onPhoto', async (e) => {
+      if (!this._modal) {
+        return;
+      }
+      const photo = e.detail;
+      this.onPhoto.emit(photo);
+    });
+    camera.addEventListener('noDeviceError', async (e) => {
+      this.noDeviceError.emit(e);
+    });
+    document.body.append(camera);
+    this._modal = camera;
+  }
+  async dismiss() {
+    if (!this._modal) {
+      return;
+    }
+    this._modal && this._modal.parentNode.removeChild(this._modal);
+    this._modal = null;
+  }
+  render() {
+    return (h("div", null));
+  }
+};
+PWACameraModal.style = cameraModalCss;
+
+export { PWACameraModal as pwa_camera_modal };
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-camera.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-camera.entry.js
new file mode 100644
index 0000000..43b8c21
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-camera.entry.js
@@ -0,0 +1,481 @@
+import { r as registerInstance, f as forceUpdate, h, g as getElement } from './index-1c5c47b4.js';
+
+/**
+ * MediaStream ImageCapture polyfill
+ *
+ * @license
+ * Copyright 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+let ImageCapture = window.ImageCapture;
+if (typeof ImageCapture === 'undefined') {
+  ImageCapture = class {
+    /**
+     * TODO https://www.w3.org/TR/image-capture/#constructors
+     *
+     * @param {MediaStreamTrack} videoStreamTrack - A MediaStreamTrack of the 'video' kind
+     */
+    constructor(videoStreamTrack) {
+      if (videoStreamTrack.kind !== 'video')
+        throw new DOMException('NotSupportedError');
+      this._videoStreamTrack = videoStreamTrack;
+      if (!('readyState' in this._videoStreamTrack)) {
+        // Polyfill for Firefox
+        this._videoStreamTrack.readyState = 'live';
+      }
+      // MediaStream constructor not available until Chrome 55 - https://www.chromestatus.com/feature/5912172546752512
+      this._previewStream = new MediaStream([videoStreamTrack]);
+      this.videoElement = document.createElement('video');
+      this.videoElementPlaying = new Promise(resolve => {
+        this.videoElement.addEventListener('playing', resolve);
+      });
+      if (HTMLMediaElement) {
+        this.videoElement.srcObject = this._previewStream; // Safari 11 doesn't allow use of createObjectURL for MediaStream
+      }
+      else {
+        this.videoElement.src = URL.createObjectURL(this._previewStream);
+      }
+      this.videoElement.muted = true;
+      this.videoElement.setAttribute('playsinline', ''); // Required by Safari on iOS 11. See https://webkit.org/blog/6784
+      this.videoElement.play();
+      this.canvasElement = document.createElement('canvas');
+      // TODO Firefox has https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas
+      this.canvas2dContext = this.canvasElement.getContext('2d');
+    }
+    /**
+     * https://w3c.github.io/mediacapture-image/index.html#dom-imagecapture-videostreamtrack
+     * @return {MediaStreamTrack} The MediaStreamTrack passed into the constructor
+     */
+    get videoStreamTrack() {
+      return this._videoStreamTrack;
+    }
+    /**
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-getphotocapabilities
+     * @return {Promise<PhotoCapabilities>} Fulfilled promise with
+     * [PhotoCapabilities](https://www.w3.org/TR/image-capture/#idl-def-photocapabilities)
+     * object on success, rejected promise on failure
+     */
+    getPhotoCapabilities() {
+      return new Promise(function executorGPC(resolve, reject) {
+        // TODO see https://github.com/w3c/mediacapture-image/issues/97
+        const MediaSettingsRange = {
+          current: 0, min: 0, max: 0,
+        };
+        resolve({
+          exposureCompensation: MediaSettingsRange,
+          exposureMode: 'none',
+          fillLightMode: ['none'],
+          focusMode: 'none',
+          imageHeight: MediaSettingsRange,
+          imageWidth: MediaSettingsRange,
+          iso: MediaSettingsRange,
+          redEyeReduction: false,
+          whiteBalanceMode: 'none',
+          zoom: MediaSettingsRange,
+        });
+        reject(new DOMException('OperationError'));
+      });
+    }
+    /**
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-setoptions
+     * @param {Object} photoSettings - Photo settings dictionary, https://www.w3.org/TR/image-capture/#idl-def-photosettings
+     * @return {Promise<void>} Fulfilled promise on success, rejected promise on failure
+     */
+    setOptions(_photoSettings = {}) {
+      return new Promise(function executorSO(_resolve, _reject) {
+        // TODO
+      });
+    }
+    /**
+     * TODO
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-takephoto
+     * @return {Promise<Blob>} Fulfilled promise with [Blob](https://www.w3.org/TR/FileAPI/#blob)
+     * argument on success; rejected promise on failure
+     */
+    takePhoto() {
+      const self = this;
+      return new Promise(function executorTP(resolve, reject) {
+        // `If the readyState of the MediaStreamTrack provided in the constructor is not live,
+        // return a promise rejected with a new DOMException whose name is "InvalidStateError".`
+        if (self._videoStreamTrack.readyState !== 'live') {
+          return reject(new DOMException('InvalidStateError'));
+        }
+        self.videoElementPlaying.then(() => {
+          try {
+            self.canvasElement.width = self.videoElement.videoWidth;
+            self.canvasElement.height = self.videoElement.videoHeight;
+            self.canvas2dContext.drawImage(self.videoElement, 0, 0);
+            self.canvasElement.toBlob(resolve);
+          }
+          catch (error) {
+            reject(new DOMException('UnknownError'));
+          }
+        });
+      });
+    }
+    /**
+     * Implements https://www.w3.org/TR/image-capture/#dom-imagecapture-grabframe
+     * @return {Promise<ImageBitmap>} Fulfilled promise with
+     * [ImageBitmap](https://www.w3.org/TR/html51/webappapis.html#webappapis-images)
+     * argument on success; rejected promise on failure
+     */
+    grabFrame() {
+      const self = this;
+      return new Promise(function executorGF(resolve, reject) {
+        // `If the readyState of the MediaStreamTrack provided in the constructor is not live,
+        // return a promise rejected with a new DOMException whose name is "InvalidStateError".`
+        if (self._videoStreamTrack.readyState !== 'live') {
+          return reject(new DOMException('InvalidStateError'));
+        }
+        self.videoElementPlaying.then(() => {
+          try {
+            self.canvasElement.width = self.videoElement.videoWidth;
+            self.canvasElement.height = self.videoElement.videoHeight;
+            self.canvas2dContext.drawImage(self.videoElement, 0, 0);
+            // TODO polyfill https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmapFactories/createImageBitmap for IE
+            resolve(window.createImageBitmap(self.canvasElement));
+          }
+          catch (error) {
+            reject(new DOMException('UnknownError'));
+          }
+        });
+      });
+    }
+  };
+}
+window.ImageCapture = ImageCapture;
+
+const cameraCss = ":host{--header-height:4em;--footer-height:9em;--header-height-landscape:3em;--footer-height-landscape:6em;--shutter-size:6em;--icon-size-header:1.5em;--icon-size-footer:2.5em;--margin-size-header:1.5em;--margin-size-footer:2.0em;font-family:-apple-system, BlinkMacSystemFont,\n    “Segoe UI”, “Roboto”, “Droid Sans”, “Helvetica Neue”, sans-serif;display:block;width:100%;height:100%}.items{-webkit-box-sizing:border-box;box-sizing:border-box;display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.items .item{-ms-flex:1;flex:1;text-align:center}.items .item:first-child{text-align:left}.items .item:last-child{text-align:right}.camera-wrapper{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;height:100%}.camera-header{color:white;background-color:black;height:var(--header-height)}.camera-header .items{padding:var(--margin-size-header)}.camera-footer{position:relative;color:white;background-color:black;height:var(--footer-height)}.camera-footer .items{padding:var(--margin-size-footer)}@media (max-height: 375px){.camera-header{--header-height:var(--header-height-landscape)}.camera-footer{--footer-height:var(--footer-height-landscape)}.camera-footer .shutter{--shutter-size:4em}}.camera-video{position:relative;-ms-flex:1;flex:1;overflow:hidden;background-color:black}video{width:100%;height:100%;max-height:100%;min-height:100%;-o-object-fit:cover;object-fit:cover;background-color:black}.pick-image{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;left:var(--margin-size-footer);top:0;height:100%;width:var(--icon-size-footer);color:white}.pick-image input{visibility:hidden}.pick-image svg{cursor:pointer;fill:white;width:var(--icon-size-footer);height:var(--icon-size-footer)}.shutter{position:absolute;left:50%;top:50%;width:var(--shutter-size);height:var(--shutter-size);margin-top:calc(var(--shutter-size) / -2);margin-left:calc(var(--shutter-size) / -2);border-radius:100%;background-color:#c6cdd8;padding:12px;-webkit-box-sizing:border-box;box-sizing:border-box}.shutter:active .shutter-button{background-color:#9da9bb}.shutter-button{background-color:white;border-radius:100%;width:100%;height:100%}.rotate{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;right:var(--margin-size-footer);top:0;height:100%;width:var(--icon-size-footer);color:white}.rotate img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.shutter-overlay{z-index:5;position:absolute;width:100%;height:100%;background-color:black}.error{width:100%;height:100%;color:white;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.no-device{background-color:black;-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;color:white}.no-device label{cursor:pointer;background:#fff;border-radius:6px;padding:6px 8px;color:black}.no-device input{visibility:hidden;height:0;margin-top:16px}.accept{background-color:black;-ms-flex:1;flex:1;overflow:hidden}.accept .accept-image{width:100%;height:100%;max-height:100%;background-position:center center;background-size:cover;background-repeat:no-repeat}.close img{cursor:pointer;width:var(--icon-size-header);height:var(--icon-size-header)}.flash img{width:var(--icon-size-header);height:var(--icon-size-header)}.accept-use img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.accept-cancel img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.offscreen-image-render{top:0;left:0;visibility:hidden;pointer-events:none;width:100%;height:100%}";
+
+const CameraPWA = class {
+  constructor(hostRef) {
+    registerInstance(this, hostRef);
+    // Whether the device has multiple cameras (front/back)
+    this.hasMultipleCameras = false;
+    // Whether the device has flash support
+    this.hasFlash = false;
+    // Flash modes for camera
+    this.flashModes = [];
+    // Current flash mode
+    this.flashMode = 'off';
+    this.handlePickFile = (_e) => {
+    };
+    this.handleShutterClick = (_e) => {
+      console.debug('shutter click');
+      this.capture();
+    };
+    this.handleRotateClick = (_e) => {
+      this.rotate();
+    };
+    this.handleClose = (_e) => {
+      this.handlePhoto && this.handlePhoto(null);
+    };
+    this.handleFlashClick = (_e) => {
+      this.cycleFlash();
+    };
+    this.handleCancelPhoto = (_e) => {
+      const track = this.stream && this.stream.getTracks()[0];
+      let c = track && track.getConstraints();
+      this.photo = null;
+      this.photoSrc = null;
+      if (c) {
+        this.initCamera({
+          video: {
+            facingMode: c.facingMode
+          }
+        });
+      }
+      else {
+        this.initCamera();
+      }
+    };
+    this.handleAcceptPhoto = (_e) => {
+      this.handlePhoto && this.handlePhoto(this.photo);
+    };
+    this.handleFileInputChange = async (e) => {
+      const input = e.target;
+      const file = input.files[0];
+      try {
+        const orientation = await this.getOrientation(file);
+        console.debug('Got orientation', orientation);
+        this.photoOrientation = orientation;
+      }
+      catch (e) {
+      }
+      this.handlePhoto && this.handlePhoto(file);
+    };
+    this.handleVideoMetadata = (e) => {
+      console.debug('Video metadata', e);
+    };
+    this.facingMode = 'user';
+    this.handlePhoto = undefined;
+    this.hidePicker = false;
+    this.handleNoDeviceError = undefined;
+    this.noDevicesText = 'No camera found';
+    this.noDevicesButtonText = 'Choose image';
+    this.photo = undefined;
+    this.photoSrc = undefined;
+    this.showShutterOverlay = false;
+    this.flashIndex = 0;
+    this.hasCamera = null;
+    this.rotation = 0;
+    this.deviceError = null;
+  }
+  async componentDidLoad() {
+    this.defaultConstraints = {
+      video: {
+        facingMode: this.facingMode
+      }
+    };
+    // Figure out how many cameras we have
+    await this.queryDevices();
+    // Initialize the camera
+    await this.initCamera();
+  }
+  disconnectedCallback() {
+    this.stopStream();
+    this.photoSrc && URL.revokeObjectURL(this.photoSrc);
+  }
+  hasImageCapture() {
+    return 'ImageCapture' in window;
+  }
+  /**
+   * Query the list of connected devices and figure out how many video inputs we have.
+   */
+  async queryDevices() {
+    try {
+      const devices = await navigator.mediaDevices.enumerateDevices();
+      const videoDevices = devices.filter(d => d.kind == 'videoinput');
+      this.hasCamera = !!videoDevices.length;
+      this.hasMultipleCameras = videoDevices.length > 1;
+    }
+    catch (e) {
+      this.deviceError = e;
+    }
+  }
+  async initCamera(constraints) {
+    if (!constraints) {
+      constraints = this.defaultConstraints;
+    }
+    try {
+      const stream = await navigator.mediaDevices.getUserMedia(Object.assign({ video: true, audio: false }, constraints));
+      this.initStream(stream);
+    }
+    catch (e) {
+      this.deviceError = e;
+      this.handleNoDeviceError && this.handleNoDeviceError(e);
+    }
+  }
+  async initStream(stream) {
+    this.stream = stream;
+    this.videoElement.srcObject = stream;
+    if (this.hasImageCapture()) {
+      this.imageCapture = new window.ImageCapture(stream.getVideoTracks()[0]);
+      await this.initPhotoCapabilities(this.imageCapture);
+    }
+    else {
+      this.deviceError = 'No image capture';
+      this.handleNoDeviceError && this.handleNoDeviceError();
+    }
+    // Always re-render
+    forceUpdate(this.el);
+  }
+  async initPhotoCapabilities(imageCapture) {
+    const c = await imageCapture.getPhotoCapabilities();
+    if (c.fillLightMode && c.fillLightMode.length > 1) {
+      this.flashModes = c.fillLightMode.map(m => m);
+      // Try to recall the current flash mode
+      if (this.flashMode) {
+        this.flashMode = this.flashModes[this.flashModes.indexOf(this.flashMode)] || 'off';
+        this.flashIndex = this.flashModes.indexOf(this.flashMode) || 0;
+      }
+      else {
+        this.flashIndex = 0;
+      }
+    }
+  }
+  stopStream() {
+    if (this.videoElement) {
+      this.videoElement.srcObject = null;
+    }
+    this.stream && this.stream.getTracks().forEach(track => track.stop());
+  }
+  async capture() {
+    if (this.hasImageCapture()) {
+      try {
+        const photo = await this.imageCapture.takePhoto({
+          fillLightMode: this.flashModes.length > 1 ? this.flashMode : undefined
+        });
+        await this.flashScreen();
+        this.promptAccept(photo);
+      }
+      catch (e) {
+        console.error('Unable to take photo!', e);
+      }
+    }
+    this.stopStream();
+  }
+  async promptAccept(photo) {
+    this.photo = photo;
+    const orientation = await this.getOrientation(photo);
+    console.debug('Got orientation', orientation);
+    this.photoOrientation = orientation;
+    if (orientation) {
+      switch (orientation) {
+        case 1:
+        case 2:
+          this.rotation = 0;
+          break;
+        case 3:
+        case 4:
+          this.rotation = 180;
+          break;
+        case 5:
+        case 6:
+          this.rotation = 90;
+          break;
+        case 7:
+        case 8:
+          this.rotation = 270;
+          break;
+      }
+    }
+    this.photoSrc = URL.createObjectURL(photo);
+  }
+  getOrientation(file) {
+    return new Promise(resolve => {
+      const reader = new FileReader();
+      reader.onload = (event) => {
+        const view = new DataView(event.target.result);
+        if (view.getUint16(0, false) !== 0xFFD8) {
+          return resolve(-2);
+        }
+        const length = view.byteLength;
+        let offset = 2;
+        while (offset < length) {
+          const marker = view.getUint16(offset, false);
+          offset += 2;
+          if (marker === 0xFFE1) {
+            if (view.getUint32(offset += 2, false) !== 0x45786966) {
+              return resolve(-1);
+            }
+            const little = view.getUint16(offset += 6, false) === 0x4949;
+            offset += view.getUint32(offset + 4, little);
+            const tags = view.getUint16(offset, little);
+            offset += 2;
+            for (let i = 0; i < tags; i++) {
+              if (view.getUint16(offset + (i * 12), little) === 0x0112) {
+                return resolve(view.getUint16(offset + (i * 12) + 8, little));
+              }
+            }
+          }
+          else if ((marker & 0xFF00) !== 0xFF00) {
+            break;
+          }
+          else {
+            offset += view.getUint16(offset, false);
+          }
+        }
+        return resolve(-1);
+      };
+      reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
+    });
+  }
+  rotate() {
+    this.stopStream();
+    const track = this.stream && this.stream.getTracks()[0];
+    if (!track) {
+      return;
+    }
+    let c = track.getConstraints();
+    let facingMode = c.facingMode;
+    if (!facingMode) {
+      let c = track.getCapabilities();
+      if (c.facingMode) {
+        facingMode = c.facingMode[0];
+      }
+    }
+    if (facingMode === 'environment') {
+      this.initCamera({
+        video: {
+          facingMode: 'user'
+        }
+      });
+    }
+    else {
+      this.initCamera({
+        video: {
+          facingMode: 'environment'
+        }
+      });
+    }
+  }
+  setFlashMode(mode) {
+    console.debug('New flash mode: ', mode);
+    this.flashMode = mode;
+  }
+  cycleFlash() {
+    if (this.flashModes.length > 0) {
+      this.flashIndex = (this.flashIndex + 1) % this.flashModes.length;
+      this.setFlashMode(this.flashModes[this.flashIndex]);
+    }
+  }
+  async flashScreen() {
+    return new Promise((resolve, _reject) => {
+      this.showShutterOverlay = true;
+      setTimeout(() => {
+        this.showShutterOverlay = false;
+        resolve();
+      }, 100);
+    });
+  }
+  iconExit() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M402.2,134L378,109.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L139.6,109.8 c-1.6-1.6-4.1-1.6-5.7,0L109.8,134c-1.6,1.6-1.6,4.1,0,5.7l113.5,113.5c1.6,1.6,1.6,4.1,0,5.7L109.8,372.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l113.5-113.5c1.6-1.6,4.1-1.6,5.7,0l113.5,113.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l113.5-113.5C403.7,138.1,403.7,135.5,402.2,134z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconPhotos() {
+    return (h("svg", { xmlns: 'http://www.w3.org/2000/svg', width: '512', height: '512', viewBox: '0 0 512 512' }, h("path", { d: 'M450.29,112H142c-34,0-62,27.51-62,61.33V418.67C80,452.49,108,480,142,480H450c34,0,62-26.18,62-60V173.33C512,139.51,484.32,112,450.29,112Zm-77.15,61.34a46,46,0,1,1-46.28,46A46.19,46.19,0,0,1,373.14,173.33Zm-231.55,276c-17,0-29.86-13.75-29.86-30.66V353.85l90.46-80.79a46.54,46.54,0,0,1,63.44,1.83L328.27,337l-113,112.33ZM480,418.67a30.67,30.67,0,0,1-30.71,30.66H259L376.08,333a46.24,46.24,0,0,1,59.44-.16L480,370.59Z' }), h("path", { d: 'M384,32H64A64,64,0,0,0,0,96V352a64.11,64.11,0,0,0,48,62V152a72,72,0,0,1,72-72H446A64.11,64.11,0,0,0,384,32Z' })));
+  }
+  iconConfirm() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%232CD865' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_1_'%3E%3Cg%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M208,301.4l-55.4-55.5c-1.5-1.5-4-1.6-5.6-0.1l-23.4,22.3c-1.6,1.6-1.7,4.1-0.1,5.7l81.6,81.4 c3.1,3.1,8.2,3.1,11.3,0l171.8-171.7c1.6-1.6,1.6-4.2-0.1-5.7l-23.4-22.3c-1.6-1.5-4.1-1.5-5.6,0.1L213.7,301.4 C212.1,303,209.6,303,208,301.4z'/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconReverseCamera() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M352,0H160C72,0,0,72,0,160v192c0,88,72,160,160,160h192c88,0,160-72,160-160V160C512,72,440,0,352,0z M356.7,365.8l-3.7,3.3c-27,23.2-61.4,35.9-96.8,35.9c-72.4,0-135.8-54.7-147-125.6c-0.3-1.9-2-3.3-3.9-3.3H64 c-3.3,0-5.2-3.8-3.2-6.4l61.1-81.4c1.6-2.1,4.7-2.1,6.4-0.1l63.3,81.4c2,2.6,0.2,6.5-3.2,6.5h-40.6c-2.5,0-4.5,2.4-3.9,4.8 c11.5,51.5,59.2,90.6,112.4,90.6c26.4,0,51.8-9.7,73.7-27.9l3.1-2.5c1.6-1.3,3.9-1.1,5.3,0.3l18.5,18.6 C358.5,361.6,358.4,364.3,356.7,365.8z M451.4,245.6l-61,83.5c-1.6,2.2-4.8,2.2-6.4,0.1l-63.3-83.3c-2-2.6-0.1-6.4,3.2-6.4h40.8 c2.5,0,4.4-2.3,3.9-4.8c-5.1-24.2-17.8-46.5-36.5-63.7c-21.2-19.4-48.2-30.1-76-30.1c-26.5,0-52.6,9.7-73.7,27.3l-3.1,2.5 c-1.6,1.3-3.9,1.2-5.4-0.3l-18.5-18.5c-1.6-1.6-1.5-4.3,0.2-5.9l3.5-3.1c27-23.2,61.4-35.9,96.8-35.9c38,0,73.9,13.7,101.2,38.7 c23.2,21.1,40.3,55.2,45.7,90.1c0.3,1.9,1.9,3.4,3.9,3.4h41.3C451.4,239.2,453.3,243,451.4,245.6z'/%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconRetake() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%23727A87' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M394.2,142L370,117.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L147.6,117.8 c-1.6-1.6-4.1-1.6-5.7,0L117.8,142c-1.6,1.6-1.6,4.1,0,5.7l105.5,105.5c1.6,1.6,1.6,4.1,0,5.7L117.8,364.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l105.5-105.5c1.6-1.6,4.1-1.6,5.7,0l105.5,105.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l105.5-105.5C395.7,146.1,395.7,143.5,394.2,142z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconFlashOff() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cg%3E%3Cpath class='st0' d='M498,483.7L42.3,28L14,56.4l149.8,149.8L91,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9c1.6,0,2.7,1.3,2.4,2.7 L197.6,507c-1,4.4,5.8,6.9,8.9,3.2l118.6-142.8L469.6,512L498,483.7z'/%3E%3Cpath class='st0' d='M449,218.2c2.5-3,0.1-7.2-3.9-7.2H301.2c-1.6,0-2.7-1.3-2.4-2.7L342.4,5c1-4.4-5.8-6.9-8.9-3.2L214.9,144.6 l161.3,161.3L449,218.2z'/%3E%3C/g%3E%3C/svg%3E`;
+  }
+  iconFlashOn() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3C/svg%3E`;
+  }
+  iconFlashAuto() {
+    return `data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3Cg%3E%3Cpath class='st0' d='M321.3,186l74-186H438l74,186h-43.5l-11.9-32.5h-80.9l-12,32.5H321.3z M415.8,47.9l-27.2,70.7h54.9l-27.2-70.7 H415.8z'/%3E%3C/g%3E%3C/svg%3E`;
+  }
+  render() {
+    // const acceptStyles = { transform: `rotate(${-this.rotation}deg)` };
+    const acceptStyles = {};
+    return (h("div", { class: "camera-wrapper" }, h("div", { class: "camera-header" }, h("section", { class: "items" }, h("div", { class: "item close", onClick: e => this.handleClose(e) }, h("img", { src: this.iconExit() })), h("div", { class: "item flash", onClick: e => this.handleFlashClick(e) }, this.flashModes.length > 0 && (h("div", null, this.flashMode == 'off' ? h("img", { src: this.iconFlashOff() }) : '', this.flashMode == 'auto' ? h("img", { src: this.iconFlashAuto() }) : '', this.flashMode == 'flash' ? h("img", { src: this.iconFlashOn() }) : ''))))), (this.hasCamera === false || !!this.deviceError) && (h("div", { class: "no-device" }, h("h2", null, this.noDevicesText), h("label", { htmlFor: "_pwa-elements-camera-input" }, this.noDevicesButtonText), h("input", { type: "file", id: "_pwa-elements-camera-input", onChange: this.handleFileInputChange, accept: "image/*", class: "select-file-button" }))), this.photoSrc ? (h("div", { class: "accept" }, h("div", { class: "accept-image", style: Object.assign({ backgroundImage: `url(${this.photoSrc})` }, acceptStyles) }))) : (h("div", { class: "camera-video" }, this.showShutterOverlay && (h("div", { class: "shutter-overlay" })), this.hasImageCapture() ? (h("video", { ref: (el) => this.videoElement = el, onLoadedMetaData: this.handleVideoMetadata, autoplay: true, playsinline: true })) : (h("canvas", { ref: (el) => this.canvasElement = el, width: "100%", height: "100%" })), h("canvas", { class: "offscreen-image-render", ref: e => this.offscreenCanvas = e, width: "100%", height: "100%" }))), this.hasCamera && (h("div", { class: "camera-footer" }, !this.photo ? ([
+      !this.hidePicker && (h("div", { class: "pick-image", onClick: this.handlePickFile }, h("label", { htmlFor: "_pwa-elements-file-pick" }, this.iconPhotos()), h("input", { type: "file", id: "_pwa-elements-file-pick", onChange: this.handleFileInputChange, accept: "image/*", class: "pick-image-button" }))),
+      h("div", { class: "shutter", onClick: this.handleShutterClick }, h("div", { class: "shutter-button" })),
+      h("div", { class: "rotate", onClick: this.handleRotateClick }, h("img", { src: this.iconReverseCamera() })),
+    ]) : (h("section", { class: "items" }, h("div", { class: "item accept-cancel", onClick: e => this.handleCancelPhoto(e) }, h("img", { src: this.iconRetake() })), h("div", { class: "item accept-use", onClick: e => this.handleAcceptPhoto(e) }, h("img", { src: this.iconConfirm() }))))))));
+  }
+  static get assetsDirs() { return ["icons"]; }
+  get el() { return getElement(this); }
+};
+CameraPWA.style = cameraCss;
+
+export { CameraPWA as pwa_camera };
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-toast.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-toast.entry.js
new file mode 100644
index 0000000..45f5539
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/esm/pwa-toast.entry.js
@@ -0,0 +1,45 @@
+import { r as registerInstance, h, g as getElement, H as Host } from './index-1c5c47b4.js';
+
+const toastCss = ":host{position:fixed;bottom:20px;left:0;right:0;display:-ms-flexbox;display:flex;opacity:0}:host(.in){-webkit-transition:opacity 300ms;transition:opacity 300ms;opacity:1}:host(.out){-webkit-transition:opacity 1s;transition:opacity 1s;opacity:0}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.toast{font-family:-apple-system, system-ui, \"Helvetica Neue\", Roboto, sans-serif;background-color:#eee;color:black;border-radius:5px;padding:10px 15px;font-size:14px;font-weight:500;-webkit-box-shadow:0px 1px 2px rgba(0, 0, 0, 0.20);box-shadow:0px 1px 2px rgba(0, 0, 0, 0.20)}";
+
+const PWAToast = class {
+  constructor(hostRef) {
+    registerInstance(this, hostRef);
+    this.message = undefined;
+    this.duration = 2000;
+    this.closing = null;
+  }
+  hostData() {
+    const classes = {
+      out: !!this.closing
+    };
+    if (this.closing !== null) {
+      classes['in'] = !this.closing;
+    }
+    return {
+      class: classes
+    };
+  }
+  componentDidLoad() {
+    setTimeout(() => {
+      this.closing = false;
+    });
+    setTimeout(() => {
+      this.close();
+    }, this.duration);
+  }
+  close() {
+    this.closing = true;
+    setTimeout(() => {
+      this.el.parentNode.removeChild(this.el);
+    }, 1000);
+  }
+  __stencil_render() {
+    return (h("div", { class: "wrapper" }, h("div", { class: "toast" }, this.message)));
+  }
+  get el() { return getElement(this); }
+  render() { return h(Host, this.hostData(), this.__stencil_render()); }
+};
+PWAToast.style = toastCss;
+
+export { PWAToast as pwa_toast };
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/index.cjs.js b/frontend/node_modules/@ionic/pwa-elements/dist/index.cjs.js
new file mode 100644
index 0000000..8a61f38
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/index.cjs.js
@@ -0,0 +1 @@
+module.exports = require('./cjs/index.cjs.js');
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/index.js b/frontend/node_modules/@ionic/pwa-elements/dist/index.js
new file mode 100644
index 0000000..e4839b6
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/index.js
@@ -0,0 +1 @@
+export * from './esm-es5/index.js';
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/confirm.svg b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/confirm.svg
new file mode 100644
index 0000000..1213fd9
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/confirm.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<circle fill="#2CD865" cx="256" cy="256" r="256"/>
+<g id="Icon_1_">
+	<g>
+		<g>
+			<path fill="#FFFFFF" d="M208,301.4l-55.4-55.5c-1.5-1.5-4-1.6-5.6-0.1l-23.4,22.3c-1.6,1.6-1.7,4.1-0.1,5.7l81.6,81.4
+				c3.1,3.1,8.2,3.1,11.3,0l171.8-171.7c1.6-1.6,1.6-4.2-0.1-5.7l-23.4-22.3c-1.6-1.5-4.1-1.5-5.6,0.1L213.7,301.4
+				C212.1,303,209.6,303,208,301.4z"/>
+		</g>
+	</g>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/exit.svg b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/exit.svg
new file mode 100644
index 0000000..be96592
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/exit.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g id="Icon_5_">
+	<g>
+		<path fill="#FFFFFF" d="M402.2,134L378,109.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L139.6,109.8
+			c-1.6-1.6-4.1-1.6-5.7,0L109.8,134c-1.6,1.6-1.6,4.1,0,5.7l113.5,113.5c1.6,1.6,1.6,4.1,0,5.7L109.8,372.4c-1.6,1.6-1.6,4.1,0,5.7
+			l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l113.5-113.5c1.6-1.6,4.1-1.6,5.7,0l113.5,113.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1
+			c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l113.5-113.5C403.7,138.1,403.7,135.5,402.2,134z"/>
+	</g>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/flash-auto.svg b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/flash-auto.svg
new file mode 100644
index 0000000..c388e86
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/flash-auto.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFFFFF;}
+</style>
+<path class="st0" d="M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9
+	c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z"/>
+<g>
+	<path class="st0" d="M321.3,186l74-186H438l74,186h-43.5l-11.9-32.5h-80.9l-12,32.5H321.3z M415.8,47.9l-27.2,70.7h54.9l-27.2-70.7
+		H415.8z"/>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/flash-off.svg b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/flash-off.svg
new file mode 100644
index 0000000..98b2599
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/flash-off.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFFFFF;}
+</style>
+<g>
+	<path class="st0" d="M498,483.7L42.3,28L14,56.4l149.8,149.8L91,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9c1.6,0,2.7,1.3,2.4,2.7
+		L197.6,507c-1,4.4,5.8,6.9,8.9,3.2l118.6-142.8L469.6,512L498,483.7z"/>
+	<path class="st0" d="M449,218.2c2.5-3,0.1-7.2-3.9-7.2H301.2c-1.6,0-2.7-1.3-2.4-2.7L342.4,5c1-4.4-5.8-6.9-8.9-3.2L214.9,144.6
+		l161.3,161.3L449,218.2z"/>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/flash-on.svg b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/flash-on.svg
new file mode 100644
index 0000000..e045c08
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/flash-on.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFFFFF;}
+</style>
+<path class="st0" d="M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9
+	c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z"/>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/retake.svg b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/retake.svg
new file mode 100644
index 0000000..04fc2a0
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/retake.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<circle fill="#727A87" cx="256" cy="256" r="256"/>
+<g id="Icon_5_">
+	<g>
+		<path fill="#FFFFFF" d="M394.2,142L370,117.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L147.6,117.8
+			c-1.6-1.6-4.1-1.6-5.7,0L117.8,142c-1.6,1.6-1.6,4.1,0,5.7l105.5,105.5c1.6,1.6,1.6,4.1,0,5.7L117.8,364.4c-1.6,1.6-1.6,4.1,0,5.7
+			l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l105.5-105.5c1.6-1.6,4.1-1.6,5.7,0l105.5,105.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1
+			c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l105.5-105.5C395.7,146.1,395.7,143.5,394.2,142z"/>
+	</g>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/reverse-camera.svg b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/reverse-camera.svg
new file mode 100644
index 0000000..ec09076
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/icons/reverse-camera.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<g>
+	<path fill="#FFFFFF" d="M352,0H160C72,0,0,72,0,160v192c0,88,72,160,160,160h192c88,0,160-72,160-160V160C512,72,440,0,352,0z
+		 M356.7,365.8l-3.7,3.3c-27,23.2-61.4,35.9-96.8,35.9c-72.4,0-135.8-54.7-147-125.6c-0.3-1.9-2-3.3-3.9-3.3H64
+		c-3.3,0-5.2-3.8-3.2-6.4l61.1-81.4c1.6-2.1,4.7-2.1,6.4-0.1l63.3,81.4c2,2.6,0.2,6.5-3.2,6.5h-40.6c-2.5,0-4.5,2.4-3.9,4.8
+		c11.5,51.5,59.2,90.6,112.4,90.6c26.4,0,51.8-9.7,73.7-27.9l3.1-2.5c1.6-1.3,3.9-1.1,5.3,0.3l18.5,18.6
+		C358.5,361.6,358.4,364.3,356.7,365.8z M451.4,245.6l-61,83.5c-1.6,2.2-4.8,2.2-6.4,0.1l-63.3-83.3c-2-2.6-0.1-6.4,3.2-6.4h40.8
+		c2.5,0,4.4-2.3,3.9-4.8c-5.1-24.2-17.8-46.5-36.5-63.7c-21.2-19.4-48.2-30.1-76-30.1c-26.5,0-52.6,9.7-73.7,27.3l-3.1,2.5
+		c-1.6,1.3-3.9,1.2-5.4-0.3l-18.5-18.5c-1.6-1.6-1.5-4.3,0.2-5.9l3.5-3.1c27-23.2,61.4-35.9,96.8-35.9c38,0,73.9,13.7,101.2,38.7
+		c23.2,21.1,40.3,55.2,45.7,90.1c0.3,1.9,1.9,3.4,3.9,3.4h41.3C451.4,239.2,453.3,243,451.4,245.6z"/>
+</g>
+</svg>
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/index.esm.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/index.esm.js
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/ionicpwaelements.esm.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/ionicpwaelements.esm.js
new file mode 100644
index 0000000..d94b4e1
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/ionicpwaelements.esm.js
@@ -0,0 +1 @@
+import{p as e,b as o}from"./p-386e91ad.js";export{s as setNonce}from"./p-386e91ad.js";(()=>{const o=import.meta.url,a={};return""!==o&&(a.resourcesUrl=new URL(".",o).href),e(a)})().then((e=>o([["p-3bb700a2",[[1,"pwa-camera-modal",{facingMode:[1,"facing-mode"],hidePicker:[4,"hide-picker"],present:[64],dismiss:[64]}]]],["p-d0cae4dc",[[1,"pwa-action-sheet",{header:[1],cancelable:[4],options:[16],open:[32]}]]],["p-b57f4873",[[1,"pwa-toast",{message:[1],duration:[2],closing:[32]}]]],["p-665001c2",[[1,"pwa-camera",{facingMode:[1,"facing-mode"],handlePhoto:[16],hidePicker:[4,"hide-picker"],handleNoDeviceError:[16],noDevicesText:[1,"no-devices-text"],noDevicesButtonText:[1,"no-devices-button-text"],photo:[32],photoSrc:[32],showShutterOverlay:[32],flashIndex:[32],hasCamera:[32],rotation:[32],deviceError:[32]}]]],["p-d212ae1d",[[1,"pwa-camera-modal-instance",{facingMode:[1,"facing-mode"],hidePicker:[4,"hide-picker"],noDevicesText:[1,"no-devices-text"],noDevicesButtonText:[1,"no-devices-button-text"]},[[16,"keyup","handleBackdropKeyUp"]]]]]],e)));
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/ionicpwaelements.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/ionicpwaelements.js
new file mode 100644
index 0000000..8a51cfe
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/ionicpwaelements.js
@@ -0,0 +1,131 @@
+
+'use strict';
+(function () {
+  var currentScript = document.currentScript;
+
+  // Safari 10 support type="module" but still download and executes the nomodule script
+  if (!currentScript || !currentScript.hasAttribute('nomodule') || !('onbeforeload' in currentScript)) {
+
+  /**
+ * core-js 3.6.5
+ * https://github.com/zloirock/core-js
+ * License: http://rock.mit-license.org
+ * © 2019 Denis Pushkarev (zloirock.ru)
+ */
+!function(t){"use strict";!function(t){var n={};function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var o in t)e.d(r,o,function(n){return t[n]}.bind(null,o));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=0)}([function(t,n,e){e(1),e(55),e(62),e(68),e(70),e(71),e(72),e(73),e(75),e(76),e(78),e(87),e(88),e(89),e(98),e(99),e(101),e(102),e(103),e(105),e(106),e(107),e(108),e(110),e(111),e(112),e(113),e(114),e(115),e(116),e(117),e(118),e(127),e(130),e(131),e(133),e(135),e(136),e(137),e(138),e(139),e(141),e(143),e(146),e(148),e(150),e(151),e(153),e(154),e(155),e(156),e(157),e(159),e(160),e(162),e(163),e(164),e(165),e(166),e(167),e(168),e(169),e(170),e(172),e(173),e(183),e(184),e(185),e(189),e(191),e(192),e(193),e(194),e(195),e(196),e(198),e(201),e(202),e(203),e(204),e(208),e(209),e(212),e(213),e(214),e(215),e(216),e(217),e(218),e(219),e(221),e(222),e(223),e(226),e(227),e(228),e(229),e(230),e(231),e(232),e(233),e(234),e(235),e(236),e(237),e(238),e(240),e(241),e(243),e(248),t.exports=e(246)},function(t,n,e){var r=e(2),o=e(6),i=e(45),a=e(14),u=e(46),c=e(39),f=e(47),s=e(48),l=e(52),p=e(49),h=e(53),v=p("isConcatSpreadable"),g=h>=51||!o((function(){var t=[];return t[v]=!1,t.concat()[0]!==t})),d=l("concat"),y=function(t){if(!a(t))return!1;var n=t[v];return void 0!==n?!!n:i(t)};r({target:"Array",proto:!0,forced:!g||!d},{concat:function(t){var n,e,r,o,i,a=u(this),l=s(a,0),p=0;for(n=-1,r=arguments.length;n<r;n++)if(i=-1===n?a:arguments[n],y(i)){if(p+(o=c(i.length))>9007199254740991)throw TypeError("Maximum allowed index exceeded");for(e=0;e<o;e++,p++)e in i&&f(l,p,i[e])}else{if(p>=9007199254740991)throw TypeError("Maximum allowed index exceeded");f(l,p++,i)}return l.length=p,l}})},function(t,n,e){var r=e(3),o=e(4).f,i=e(18),a=e(21),u=e(22),c=e(32),f=e(44);t.exports=function(t,n){var e,s,l,p,h,v=t.target,g=t.global,d=t.stat;if(e=g?r:d?r[v]||u(v,{}):(r[v]||{}).prototype)for(s in n){if(p=n[s],l=t.noTargetGet?(h=o(e,s))&&h.value:e[s],!f(g?s:v+(d?".":"#")+s,t.forced)&&void 0!==l){if(typeof p==typeof l)continue;c(p,l)}(t.sham||l&&l.sham)&&i(p,"sham",!0),a(e,s,p,t)}}},function(t,n){var e=function(t){return t&&t.Math==Math&&t};t.exports=e("object"==typeof globalThis&&globalThis)||e("object"==typeof window&&window)||e("object"==typeof self&&self)||e("object"==typeof global&&global)||Function("return this")()},function(t,n,e){var r=e(5),o=e(7),i=e(8),a=e(9),u=e(13),c=e(15),f=e(16),s=Object.getOwnPropertyDescriptor;n.f=r?s:function(t,n){if(t=a(t),n=u(n,!0),f)try{return s(t,n)}catch(t){}if(c(t,n))return i(!o.f.call(t,n),t[n])}},function(t,n,e){var r=e(6);t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);n.f=i?function(t){var n=o(this,t);return!!n&&n.enumerable}:r},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n,e){var r=e(10),o=e(12);t.exports=function(t){return r(o(t))}},function(t,n,e){var r=e(6),o=e(11),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},function(t,n){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,n,e){var r=e(14);t.exports=function(t,n){if(!r(t))return t;var e,o;if(n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;if("function"==typeof(e=t.valueOf)&&!r(o=e.call(t)))return o;if(!n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},function(t,n,e){var r=e(5),o=e(6),i=e(17);t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,n,e){var r=e(3),o=e(14),i=r.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},function(t,n,e){var r=e(5),o=e(19),i=e(8);t.exports=r?function(t,n,e){return o.f(t,n,i(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(5),o=e(16),i=e(20),a=e(13),u=Object.defineProperty;n.f=r?u:function(t,n,e){if(i(t),n=a(n,!0),i(e),o)try{return u(t,n,e)}catch(t){}if("get"in e||"set"in e)throw TypeError("Accessors not supported");return"value"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(14);t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},function(t,n,e){var r=e(3),o=e(18),i=e(15),a=e(22),u=e(23),c=e(25),f=c.get,s=c.enforce,l=String(String).split("String");(t.exports=function(t,n,e,u){var c=!!u&&!!u.unsafe,f=!!u&&!!u.enumerable,p=!!u&&!!u.noTargetGet;"function"==typeof e&&("string"!=typeof n||i(e,"name")||o(e,"name",n),s(e).source=l.join("string"==typeof n?n:"")),t!==r?(c?!p&&t[n]&&(f=!0):delete t[n],f?t[n]=e:o(t,n,e)):f?t[n]=e:a(n,e)})(Function.prototype,"toString",(function(){return"function"==typeof this&&f(this).source||u(this)}))},function(t,n,e){var r=e(3),o=e(18);t.exports=function(t,n){try{o(r,t,n)}catch(e){r[t]=n}return n}},function(t,n,e){var r=e(24),o=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(t){return o.call(t)}),t.exports=r.inspectSource},function(t,n,e){var r=e(3),o=e(22),i=r["__core-js_shared__"]||o("__core-js_shared__",{});t.exports=i},function(t,n,e){var r,o,i,a=e(26),u=e(3),c=e(14),f=e(18),s=e(15),l=e(27),p=e(31),h=u.WeakMap;if(a){var v=new h,g=v.get,d=v.has,y=v.set;r=function(t,n){return y.call(v,t,n),n},o=function(t){return g.call(v,t)||{}},i=function(t){return d.call(v,t)}}else{var x=l("state");p[x]=!0,r=function(t,n){return f(t,x,n),n},o=function(t){return s(t,x)?t[x]:{}},i=function(t){return s(t,x)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(n){var e;if(!c(n)||(e=o(n)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return e}}}},function(t,n,e){var r=e(3),o=e(23),i=r.WeakMap;t.exports="function"==typeof i&&/native code/.test(o(i))},function(t,n,e){var r=e(28),o=e(30),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,n,e){var r=e(29),o=e(24);(t.exports=function(t,n){return o[t]||(o[t]=void 0!==n?n:{})})("versions",[]).push({version:"3.6.5",mode:r?"pure":"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})},function(t,n){t.exports=!1},function(t,n){var e=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++e+r).toString(36)}},function(t,n){t.exports={}},function(t,n,e){var r=e(15),o=e(33),i=e(4),a=e(19);t.exports=function(t,n){for(var e=o(n),u=a.f,c=i.f,f=0;f<e.length;f++){var s=e[f];r(t,s)||u(t,s,c(n,s))}}},function(t,n,e){var r=e(34),o=e(36),i=e(43),a=e(20);t.exports=r("Reflect","ownKeys")||function(t){var n=o.f(a(t)),e=i.f;return e?n.concat(e(t)):n}},function(t,n,e){var r=e(35),o=e(3),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,n){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][n]||o[t]&&o[t][n]}},function(t,n,e){var r=e(3);t.exports=r},function(t,n,e){var r=e(37),o=e(42).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,n,e){var r=e(15),o=e(9),i=e(38).indexOf,a=e(31);t.exports=function(t,n){var e,u=o(t),c=0,f=[];for(e in u)!r(a,e)&&r(u,e)&&f.push(e);for(;n.length>c;)r(u,e=n[c++])&&(~i(f,e)||f.push(e));return f}},function(t,n,e){var r=e(9),o=e(39),i=e(41),a=function(t){return function(n,e,a){var u,c=r(n),f=o(c.length),s=i(a,f);if(t&&e!=e){for(;f>s;)if((u=c[s++])!=u)return!0}else for(;f>s;s++)if((t||s in c)&&c[s]===e)return t||s||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},function(t,n,e){var r=e(40),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},function(t,n,e){var r=e(40),o=Math.max,i=Math.min;t.exports=function(t,n){var e=r(t);return e<0?o(e+n,0):i(e,n)}},function(t,n){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,e){var r=e(6),o=/#|\.prototype\./,i=function(t,n){var e=u[a(t)];return e==f||e!=c&&("function"==typeof n?r(n):!!n)},a=i.normalize=function(t){return String(t).replace(o,".").toLowerCase()},u=i.data={},c=i.NATIVE="N",f=i.POLYFILL="P";t.exports=i},function(t,n,e){var r=e(11);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,n,e){var r=e(12);t.exports=function(t){return Object(r(t))}},function(t,n,e){var r=e(13),o=e(19),i=e(8);t.exports=function(t,n,e){var a=r(n);a in t?o.f(t,a,i(0,e)):t[a]=e}},function(t,n,e){var r=e(14),o=e(45),i=e(49)("species");t.exports=function(t,n){var e;return o(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!o(e.prototype)?r(e)&&null===(e=e[i])&&(e=void 0):e=void 0),new(void 0===e?Array:e)(0===n?0:n)}},function(t,n,e){var r=e(3),o=e(28),i=e(15),a=e(30),u=e(50),c=e(51),f=o("wks"),s=r.Symbol,l=c?s:s&&s.withoutSetter||a;t.exports=function(t){return i(f,t)||(u&&i(s,t)?f[t]=s[t]:f[t]=l("Symbol."+t)),f[t]}},function(t,n,e){var r=e(6);t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},function(t,n,e){var r=e(50);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,n,e){var r=e(6),o=e(49),i=e(53),a=o("species");t.exports=function(t){return i>=51||!r((function(){var n=[];return(n.constructor={})[a]=function(){return{foo:1}},1!==n[t](Boolean).foo}))}},function(t,n,e){var r,o,i=e(3),a=e(54),u=i.process,c=u&&u.versions,f=c&&c.v8;f?o=(r=f.split("."))[0]+r[1]:a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=r[1]),t.exports=o&&+o},function(t,n,e){var r=e(34);t.exports=r("navigator","userAgent")||""},function(t,n,e){var r=e(2),o=e(56),i=e(57);r({target:"Array",proto:!0},{copyWithin:o}),i("copyWithin")},function(t,n,e){var r=e(46),o=e(41),i=e(39),a=Math.min;t.exports=[].copyWithin||function(t,n){var e=r(this),u=i(e.length),c=o(t,u),f=o(n,u),s=arguments.length>2?arguments[2]:void 0,l=a((void 0===s?u:o(s,u))-f,u-c),p=1;for(f<c&&c<f+l&&(p=-1,f+=l-1,c+=l-1);l-- >0;)f in e?e[c]=e[f]:delete e[c],c+=p,f+=p;return e}},function(t,n,e){var r=e(49),o=e(58),i=e(19),a=r("unscopables"),u=Array.prototype;null==u[a]&&i.f(u,a,{configurable:!0,value:o(null)}),t.exports=function(t){u[a][t]=!0}},function(t,n,e){var r,o=e(20),i=e(59),a=e(42),u=e(31),c=e(61),f=e(17),s=e(27),l=s("IE_PROTO"),p=function(){},h=function(t){return"<script>"+t+"<\/script>"},v=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(t){}var t,n;v=r?function(t){t.write(h("")),t.close();var n=t.parentWindow.Object;return t=null,n}(r):((n=f("iframe")).style.display="none",c.appendChild(n),n.src=String("javascript:"),(t=n.contentWindow.document).open(),t.write(h("document.F=Object")),t.close(),t.F);for(var e=a.length;e--;)delete v.prototype[a[e]];return v()};u[l]=!0,t.exports=Object.create||function(t,n){var e;return null!==t?(p.prototype=o(t),e=new p,p.prototype=null,e[l]=t):e=v(),void 0===n?e:i(e,n)}},function(t,n,e){var r=e(5),o=e(19),i=e(20),a=e(60);t.exports=r?Object.defineProperties:function(t,n){i(t);for(var e,r=a(n),u=r.length,c=0;u>c;)o.f(t,e=r[c++],n[e]);return t}},function(t,n,e){var r=e(37),o=e(42);t.exports=Object.keys||function(t){return r(t,o)}},function(t,n,e){var r=e(34);t.exports=r("document","documentElement")},function(t,n,e){var r=e(2),o=e(63).every,i=e(66),a=e(67),u=i("every"),c=a("every");r({target:"Array",proto:!0,forced:!u||!c},{every:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(64),o=e(10),i=e(46),a=e(39),u=e(48),c=[].push,f=function(t){var n=1==t,e=2==t,f=3==t,s=4==t,l=6==t,p=5==t||l;return function(h,v,g,d){for(var y,x,m=i(h),b=o(m),S=r(v,g,3),E=a(b.length),w=0,O=d||u,R=n?O(h,E):e?O(h,0):void 0;E>w;w++)if((p||w in b)&&(x=S(y=b[w],w,m),t))if(n)R[w]=x;else if(x)switch(t){case 3:return!0;case 5:return y;case 6:return w;case 2:c.call(R,y)}else if(s)return!1;return l?-1:f||s?s:R}};t.exports={forEach:f(0),map:f(1),filter:f(2),some:f(3),every:f(4),find:f(5),findIndex:f(6)}},function(t,n,e){var r=e(65);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 0:return function(){return t.call(n)};case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,o){return t.call(n,e,r,o)}}return function(){return t.apply(n,arguments)}}},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,n,e){var r=e(6);t.exports=function(t,n){var e=[][t];return!!e&&r((function(){e.call(null,n||function(){throw 1},1)}))}},function(t,n,e){var r=e(5),o=e(6),i=e(15),a=Object.defineProperty,u={},c=function(t){throw t};t.exports=function(t,n){if(i(u,t))return u[t];n||(n={});var e=[][t],f=!!i(n,"ACCESSORS")&&n.ACCESSORS,s=i(n,0)?n[0]:c,l=i(n,1)?n[1]:void 0;return u[t]=!!e&&!o((function(){if(f&&!r)return!0;var t={length:-1};f?a(t,1,{enumerable:!0,get:c}):t[1]=1,e.call(t,s,l)}))}},function(t,n,e){var r=e(2),o=e(69),i=e(57);r({target:"Array",proto:!0},{fill:o}),i("fill")},function(t,n,e){var r=e(46),o=e(41),i=e(39);t.exports=function(t){for(var n=r(this),e=i(n.length),a=arguments.length,u=o(a>1?arguments[1]:void 0,e),c=a>2?arguments[2]:void 0,f=void 0===c?e:o(c,e);f>u;)n[u++]=t;return n}},function(t,n,e){var r=e(2),o=e(63).filter,i=e(52),a=e(67),u=i("filter"),c=a("filter");r({target:"Array",proto:!0,forced:!u||!c},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(63).find,i=e(57),a=e(67),u=!0,c=a("find");"find"in[]&&Array(1).find((function(){u=!1})),r({target:"Array",proto:!0,forced:u||!c},{find:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("find")},function(t,n,e){var r=e(2),o=e(63).findIndex,i=e(57),a=e(67),u=!0,c=a("findIndex");"findIndex"in[]&&Array(1).findIndex((function(){u=!1})),r({target:"Array",proto:!0,forced:u||!c},{findIndex:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("findIndex")},function(t,n,e){var r=e(2),o=e(74),i=e(46),a=e(39),u=e(40),c=e(48);r({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,n=i(this),e=a(n.length),r=c(n,0);return r.length=o(r,n,n,e,0,void 0===t?1:u(t)),r}})},function(t,n,e){var r=e(45),o=e(39),i=e(64),a=function(t,n,e,u,c,f,s,l){for(var p,h=c,v=0,g=!!s&&i(s,l,3);v<u;){if(v in e){if(p=g?g(e[v],v,n):e[v],f>0&&r(p))h=a(t,n,p,o(p.length),h,f-1)-1;else{if(h>=9007199254740991)throw TypeError("Exceed the acceptable array length");t[h]=p}h++}v++}return h};t.exports=a},function(t,n,e){var r=e(2),o=e(74),i=e(46),a=e(39),u=e(65),c=e(48);r({target:"Array",proto:!0},{flatMap:function(t){var n,e=i(this),r=a(e.length);return u(t),(n=c(e,0)).length=o(n,e,e,r,0,1,t,arguments.length>1?arguments[1]:void 0),n}})},function(t,n,e){var r=e(2),o=e(77);r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},function(t,n,e){var r=e(63).forEach,o=e(66),i=e(67),a=o("forEach"),u=i("forEach");t.exports=a&&u?[].forEach:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}},function(t,n,e){var r=e(2),o=e(79);r({target:"Array",stat:!0,forced:!e(86)((function(t){Array.from(t)}))},{from:o})},function(t,n,e){var r=e(64),o=e(46),i=e(80),a=e(81),u=e(39),c=e(47),f=e(83);t.exports=function(t){var n,e,s,l,p,h,v=o(t),g="function"==typeof this?this:Array,d=arguments.length,y=d>1?arguments[1]:void 0,x=void 0!==y,m=f(v),b=0;if(x&&(y=r(y,d>2?arguments[2]:void 0,2)),null==m||g==Array&&a(m))for(e=new g(n=u(v.length));n>b;b++)h=x?y(v[b],b):v[b],c(e,b,h);else for(p=(l=m.call(v)).next,e=new g;!(s=p.call(l)).done;b++)h=x?i(l,y,[s.value,b],!0):s.value,c(e,b,h);return e.length=b,e}},function(t,n,e){var r=e(20);t.exports=function(t,n,e,o){try{return o?n(r(e)[0],e[1]):n(e)}catch(n){var i=t.return;throw void 0!==i&&r(i.call(t)),n}}},function(t,n,e){var r=e(49),o=e(82),i=r("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||a[i]===t)}},function(t,n){t.exports={}},function(t,n,e){var r=e(84),o=e(82),i=e(49)("iterator");t.exports=function(t){if(null!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,n,e){var r=e(85),o=e(11),i=e(49)("toStringTag"),a="Arguments"==o(function(){return arguments}());t.exports=r?o:function(t){var n,e,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(e=function(t,n){try{return t[n]}catch(t){}}(n=Object(t),i))?e:a?o(n):"Object"==(r=o(n))&&"function"==typeof n.callee?"Arguments":r}},function(t,n,e){var r={};r[e(49)("toStringTag")]="z",t.exports="[object z]"===String(r)},function(t,n,e){var r=e(49)("iterator"),o=!1;try{var i=0,a={next:function(){return{done:!!i++}},return:function(){o=!0}};a[r]=function(){return this},Array.from(a,(function(){throw 2}))}catch(t){}t.exports=function(t,n){if(!n&&!o)return!1;var e=!1;try{var i={};i[r]=function(){return{next:function(){return{done:e=!0}}}},t(i)}catch(t){}return e}},function(t,n,e){var r=e(2),o=e(38).includes,i=e(57);r({target:"Array",proto:!0,forced:!e(67)("indexOf",{ACCESSORS:!0,1:0})},{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("includes")},function(t,n,e){var r=e(2),o=e(38).indexOf,i=e(66),a=e(67),u=[].indexOf,c=!!u&&1/[1].indexOf(1,-0)<0,f=i("indexOf"),s=a("indexOf",{ACCESSORS:!0,1:0});r({target:"Array",proto:!0,forced:c||!f||!s},{indexOf:function(t){return c?u.apply(this,arguments)||0:o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(9),o=e(57),i=e(82),a=e(25),u=e(90),c=a.set,f=a.getterFor("Array Iterator");t.exports=u(Array,"Array",(function(t,n){c(this,{type:"Array Iterator",target:r(t),index:0,kind:n})}),(function(){var t=f(this),n=t.target,e=t.kind,r=t.index++;return!n||r>=n.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==e?{value:r,done:!1}:"values"==e?{value:n[r],done:!1}:{value:[r,n[r]],done:!1}}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},function(t,n,e){var r=e(2),o=e(91),i=e(93),a=e(96),u=e(95),c=e(18),f=e(21),s=e(49),l=e(29),p=e(82),h=e(92),v=h.IteratorPrototype,g=h.BUGGY_SAFARI_ITERATORS,d=s("iterator"),y=function(){return this};t.exports=function(t,n,e,s,h,x,m){o(e,n,s);var b,S,E,w=function(t){if(t===h&&I)return I;if(!g&&t in A)return A[t];switch(t){case"keys":case"values":case"entries":return function(){return new e(this,t)}}return function(){return new e(this)}},O=n+" Iterator",R=!1,A=t.prototype,j=A[d]||A["@@iterator"]||h&&A[h],I=!g&&j||w(h),k="Array"==n&&A.entries||j;if(k&&(b=i(k.call(new t)),v!==Object.prototype&&b.next&&(l||i(b)===v||(a?a(b,v):"function"!=typeof b[d]&&c(b,d,y)),u(b,O,!0,!0),l&&(p[O]=y))),"values"==h&&j&&"values"!==j.name&&(R=!0,I=function(){return j.call(this)}),l&&!m||A[d]===I||c(A,d,I),p[n]=I,h)if(S={values:w("values"),keys:x?I:w("keys"),entries:w("entries")},m)for(E in S)(g||R||!(E in A))&&f(A,E,S[E]);else r({target:n,proto:!0,forced:g||R},S);return S}},function(t,n,e){var r=e(92).IteratorPrototype,o=e(58),i=e(8),a=e(95),u=e(82),c=function(){return this};t.exports=function(t,n,e){var f=n+" Iterator";return t.prototype=o(r,{next:i(1,e)}),a(t,f,!1,!0),u[f]=c,t}},function(t,n,e){var r,o,i,a=e(93),u=e(18),c=e(15),f=e(49),s=e(29),l=f("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(o=a(a(i)))!==Object.prototype&&(r=o):p=!0),null==r&&(r={}),s||c(r,l)||u(r,l,(function(){return this})),t.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},function(t,n,e){var r=e(15),o=e(46),i=e(27),a=e(94),u=i("IE_PROTO"),c=Object.prototype;t.exports=a?Object.getPrototypeOf:function(t){return t=o(t),r(t,u)?t[u]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?c:null}},function(t,n,e){var r=e(6);t.exports=!r((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},function(t,n,e){var r=e(19).f,o=e(15),i=e(49)("toStringTag");t.exports=function(t,n,e){t&&!o(t=e?t:t.prototype,i)&&r(t,i,{configurable:!0,value:n})}},function(t,n,e){var r=e(20),o=e(97);t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,n=!1,e={};try{(t=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(e,[]),n=e instanceof Array}catch(t){}return function(e,i){return r(e),o(i),n?t.call(e,i):e.__proto__=i,e}}():void 0)},function(t,n,e){var r=e(14);t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},function(t,n,e){var r=e(2),o=e(10),i=e(9),a=e(66),u=[].join,c=o!=Object,f=a("join",",");r({target:"Array",proto:!0,forced:c||!f},{join:function(t){return u.call(i(this),void 0===t?",":t)}})},function(t,n,e){var r=e(2),o=e(100);r({target:"Array",proto:!0,forced:o!==[].lastIndexOf},{lastIndexOf:o})},function(t,n,e){var r=e(9),o=e(40),i=e(39),a=e(66),u=e(67),c=Math.min,f=[].lastIndexOf,s=!!f&&1/[1].lastIndexOf(1,-0)<0,l=a("lastIndexOf"),p=u("indexOf",{ACCESSORS:!0,1:0}),h=s||!l||!p;t.exports=h?function(t){if(s)return f.apply(this,arguments)||0;var n=r(this),e=i(n.length),a=e-1;for(arguments.length>1&&(a=c(a,o(arguments[1]))),a<0&&(a=e+a);a>=0;a--)if(a in n&&n[a]===t)return a||0;return-1}:f},function(t,n,e){var r=e(2),o=e(63).map,i=e(52),a=e(67),u=i("map"),c=a("map");r({target:"Array",proto:!0,forced:!u||!c},{map:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(6),i=e(47);r({target:"Array",stat:!0,forced:o((function(){function t(){}return!(Array.of.call(t)instanceof t)}))},{of:function(){for(var t=0,n=arguments.length,e=new("function"==typeof this?this:Array)(n);n>t;)i(e,t,arguments[t++]);return e.length=n,e}})},function(t,n,e){var r=e(2),o=e(104).left,i=e(66),a=e(67),u=i("reduce"),c=a("reduce",{1:0});r({target:"Array",proto:!0,forced:!u||!c},{reduce:function(t){return o(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(65),o=e(46),i=e(10),a=e(39),u=function(t){return function(n,e,u,c){r(e);var f=o(n),s=i(f),l=a(f.length),p=t?l-1:0,h=t?-1:1;if(u<2)for(;;){if(p in s){c=s[p],p+=h;break}if(p+=h,t?p<0:l<=p)throw TypeError("Reduce of empty array with no initial value")}for(;t?p>=0:l>p;p+=h)p in s&&(c=e(c,s[p],p,f));return c}};t.exports={left:u(!1),right:u(!0)}},function(t,n,e){var r=e(2),o=e(104).right,i=e(66),a=e(67),u=i("reduceRight"),c=a("reduce",{1:0});r({target:"Array",proto:!0,forced:!u||!c},{reduceRight:function(t){return o(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(14),i=e(45),a=e(41),u=e(39),c=e(9),f=e(47),s=e(49),l=e(52),p=e(67),h=l("slice"),v=p("slice",{ACCESSORS:!0,0:0,1:2}),g=s("species"),d=[].slice,y=Math.max;r({target:"Array",proto:!0,forced:!h||!v},{slice:function(t,n){var e,r,s,l=c(this),p=u(l.length),h=a(t,p),v=a(void 0===n?p:n,p);if(i(l)&&("function"!=typeof(e=l.constructor)||e!==Array&&!i(e.prototype)?o(e)&&null===(e=e[g])&&(e=void 0):e=void 0,e===Array||void 0===e))return d.call(l,h,v);for(r=new(void 0===e?Array:e)(y(v-h,0)),s=0;h<v;h++,s++)h in l&&f(r,s,l[h]);return r.length=s,r}})},function(t,n,e){var r=e(2),o=e(63).some,i=e(66),a=e(67),u=i("some"),c=a("some");r({target:"Array",proto:!0,forced:!u||!c},{some:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){e(109)("Array")},function(t,n,e){var r=e(34),o=e(19),i=e(49),a=e(5),u=i("species");t.exports=function(t){var n=r(t),e=o.f;a&&n&&!n[u]&&e(n,u,{configurable:!0,get:function(){return this}})}},function(t,n,e){var r=e(2),o=e(41),i=e(40),a=e(39),u=e(46),c=e(48),f=e(47),s=e(52),l=e(67),p=s("splice"),h=l("splice",{ACCESSORS:!0,0:0,1:2}),v=Math.max,g=Math.min;r({target:"Array",proto:!0,forced:!p||!h},{splice:function(t,n){var e,r,s,l,p,h,d=u(this),y=a(d.length),x=o(t,y),m=arguments.length;if(0===m?e=r=0:1===m?(e=0,r=y-x):(e=m-2,r=g(v(i(n),0),y-x)),y+e-r>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(s=c(d,r),l=0;l<r;l++)(p=x+l)in d&&f(s,l,d[p]);if(s.length=r,e<r){for(l=x;l<y-r;l++)h=l+e,(p=l+r)in d?d[h]=d[p]:delete d[h];for(l=y;l>y-r+e;l--)delete d[l-1]}else if(e>r)for(l=y-r;l>x;l--)h=l+e-1,(p=l+r-1)in d?d[h]=d[p]:delete d[h];for(l=0;l<e;l++)d[l+x]=arguments[l+2];return d.length=y-r+e,s}})},function(t,n,e){e(57)("flat")},function(t,n,e){e(57)("flatMap")},function(t,n,e){var r=e(14),o=e(19),i=e(93),a=e(49)("hasInstance"),u=Function.prototype;a in u||o.f(u,a,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},function(t,n,e){var r=e(5),o=e(19).f,i=Function.prototype,a=i.toString,u=/^\s*function ([^ (]*)/;r&&!("name"in i)&&o(i,"name",{configurable:!0,get:function(){try{return a.call(this).match(u)[1]}catch(t){return""}}})},function(t,n,e){e(2)({global:!0},{globalThis:e(3)})},function(t,n,e){var r=e(2),o=e(34),i=e(6),a=o("JSON","stringify"),u=/[\uD800-\uDFFF]/g,c=/^[\uD800-\uDBFF]$/,f=/^[\uDC00-\uDFFF]$/,s=function(t,n,e){var r=e.charAt(n-1),o=e.charAt(n+1);return c.test(t)&&!f.test(o)||f.test(t)&&!c.test(r)?"\\u"+t.charCodeAt(0).toString(16):t},l=i((function(){return'"\\udf06\\ud834"'!==a("\udf06\ud834")||'"\\udead"'!==a("\udead")}));a&&r({target:"JSON",stat:!0,forced:l},{stringify:function(t,n,e){var r=a.apply(null,arguments);return"string"==typeof r?r.replace(u,s):r}})},function(t,n,e){var r=e(3);e(95)(r.JSON,"JSON",!0)},function(t,n,e){var r=e(119),o=e(125);t.exports=r("Map",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),o)},function(t,n,e){var r=e(2),o=e(3),i=e(44),a=e(21),u=e(120),c=e(122),f=e(123),s=e(14),l=e(6),p=e(86),h=e(95),v=e(124);t.exports=function(t,n,e){var g=-1!==t.indexOf("Map"),d=-1!==t.indexOf("Weak"),y=g?"set":"add",x=o[t],m=x&&x.prototype,b=x,S={},E=function(t){var n=m[t];a(m,t,"add"==t?function(t){return n.call(this,0===t?0:t),this}:"delete"==t?function(t){return!(d&&!s(t))&&n.call(this,0===t?0:t)}:"get"==t?function(t){return d&&!s(t)?void 0:n.call(this,0===t?0:t)}:"has"==t?function(t){return!(d&&!s(t))&&n.call(this,0===t?0:t)}:function(t,e){return n.call(this,0===t?0:t,e),this})};if(i(t,"function"!=typeof x||!(d||m.forEach&&!l((function(){(new x).entries().next()})))))b=e.getConstructor(n,t,g,y),u.REQUIRED=!0;else if(i(t,!0)){var w=new b,O=w[y](d?{}:-0,1)!=w,R=l((function(){w.has(1)})),A=p((function(t){new x(t)})),j=!d&&l((function(){for(var t=new x,n=5;n--;)t[y](n,n);return!t.has(-0)}));A||((b=n((function(n,e){f(n,b,t);var r=v(new x,n,b);return null!=e&&c(e,r[y],r,g),r}))).prototype=m,m.constructor=b),(R||j)&&(E("delete"),E("has"),g&&E("get")),(j||O)&&E(y),d&&m.clear&&delete m.clear}return S[t]=b,r({global:!0,forced:b!=x},S),h(b,t),d||e.setStrong(b,t,g),b}},function(t,n,e){var r=e(31),o=e(14),i=e(15),a=e(19).f,u=e(30),c=e(121),f=u("meta"),s=0,l=Object.isExtensible||function(){return!0},p=function(t){a(t,f,{value:{objectID:"O"+ ++s,weakData:{}}})},h=t.exports={REQUIRED:!1,fastKey:function(t,n){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,f)){if(!l(t))return"F";if(!n)return"E";p(t)}return t[f].objectID},getWeakData:function(t,n){if(!i(t,f)){if(!l(t))return!0;if(!n)return!1;p(t)}return t[f].weakData},onFreeze:function(t){return c&&h.REQUIRED&&l(t)&&!i(t,f)&&p(t),t}};r[f]=!0},function(t,n,e){var r=e(6);t.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(t,n,e){var r=e(20),o=e(81),i=e(39),a=e(64),u=e(83),c=e(80),f=function(t,n){this.stopped=t,this.result=n};(t.exports=function(t,n,e,s,l){var p,h,v,g,d,y,x,m=a(n,e,s?2:1);if(l)p=t;else{if("function"!=typeof(h=u(t)))throw TypeError("Target is not iterable");if(o(h)){for(v=0,g=i(t.length);g>v;v++)if((d=s?m(r(x=t[v])[0],x[1]):m(t[v]))&&d instanceof f)return d;return new f(!1)}p=h.call(t)}for(y=p.next;!(x=y.call(p)).done;)if("object"==typeof(d=c(p,m,x.value,s))&&d&&d instanceof f)return d;return new f(!1)}).stop=function(t){return new f(!0,t)}},function(t,n){t.exports=function(t,n,e){if(!(t instanceof n))throw TypeError("Incorrect "+(e?e+" ":"")+"invocation");return t}},function(t,n,e){var r=e(14),o=e(96);t.exports=function(t,n,e){var i,a;return o&&"function"==typeof(i=n.constructor)&&i!==e&&r(a=i.prototype)&&a!==e.prototype&&o(t,a),t}},function(t,n,e){var r=e(19).f,o=e(58),i=e(126),a=e(64),u=e(123),c=e(122),f=e(90),s=e(109),l=e(5),p=e(120).fastKey,h=e(25),v=h.set,g=h.getterFor;t.exports={getConstructor:function(t,n,e,f){var s=t((function(t,r){u(t,s,n),v(t,{type:n,index:o(null),first:void 0,last:void 0,size:0}),l||(t.size=0),null!=r&&c(r,t[f],t,e)})),h=g(n),d=function(t,n,e){var r,o,i=h(t),a=y(t,n);return a?a.value=e:(i.last=a={index:o=p(n,!0),key:n,value:e,previous:r=i.last,next:void 0,removed:!1},i.first||(i.first=a),r&&(r.next=a),l?i.size++:t.size++,"F"!==o&&(i.index[o]=a)),t},y=function(t,n){var e,r=h(t),o=p(n);if("F"!==o)return r.index[o];for(e=r.first;e;e=e.next)if(e.key==n)return e};return i(s.prototype,{clear:function(){for(var t=h(this),n=t.index,e=t.first;e;)e.removed=!0,e.previous&&(e.previous=e.previous.next=void 0),delete n[e.index],e=e.next;t.first=t.last=void 0,l?t.size=0:this.size=0},delete:function(t){var n=h(this),e=y(this,t);if(e){var r=e.next,o=e.previous;delete n.index[e.index],e.removed=!0,o&&(o.next=r),r&&(r.previous=o),n.first==e&&(n.first=r),n.last==e&&(n.last=o),l?n.size--:this.size--}return!!e},forEach:function(t){for(var n,e=h(this),r=a(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.next:e.first;)for(r(n.value,n.key,this);n&&n.removed;)n=n.previous},has:function(t){return!!y(this,t)}}),i(s.prototype,e?{get:function(t){var n=y(this,t);return n&&n.value},set:function(t,n){return d(this,0===t?0:t,n)}}:{add:function(t){return d(this,t=0===t?0:t,t)}}),l&&r(s.prototype,"size",{get:function(){return h(this).size}}),s},setStrong:function(t,n,e){var r=n+" Iterator",o=g(n),i=g(r);f(t,n,(function(t,n){v(this,{type:r,target:t,state:o(t),kind:n,last:void 0})}),(function(){for(var t=i(this),n=t.kind,e=t.last;e&&e.removed;)e=e.previous;return t.target&&(t.last=e=e?e.next:t.state.first)?"keys"==n?{value:e.key,done:!1}:"values"==n?{value:e.value,done:!1}:{value:[e.key,e.value],done:!1}:(t.target=void 0,{value:void 0,done:!0})}),e?"entries":"values",!e,!0),s(n)}}},function(t,n,e){var r=e(21);t.exports=function(t,n,e){for(var o in n)r(t,o,n[o],e);return t}},function(t,n,e){var r=e(5),o=e(3),i=e(44),a=e(21),u=e(15),c=e(11),f=e(124),s=e(13),l=e(6),p=e(58),h=e(36).f,v=e(4).f,g=e(19).f,d=e(128).trim,y=o.Number,x=y.prototype,m="Number"==c(p(x)),b=function(t){var n,e,r,o,i,a,u,c,f=s(t,!1);if("string"==typeof f&&f.length>2)if(43===(n=(f=d(f)).charCodeAt(0))||45===n){if(88===(e=f.charCodeAt(2))||120===e)return NaN}else if(48===n){switch(f.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+f}for(a=(i=f.slice(2)).length,u=0;u<a;u++)if((c=i.charCodeAt(u))<48||c>o)return NaN;return parseInt(i,r)}return+f};if(i("Number",!y(" 0o1")||!y("0b1")||y("+0x1"))){for(var S,E=function(t){var n=arguments.length<1?0:t,e=this;return e instanceof E&&(m?l((function(){x.valueOf.call(e)})):"Number"!=c(e))?f(new y(b(n)),e,E):b(n)},w=r?h(y):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),O=0;w.length>O;O++)u(y,S=w[O])&&!u(E,S)&&g(E,S,v(y,S));E.prototype=x,x.constructor=E,a(o,"Number",E)}},function(t,n,e){var r=e(12),o="["+e(129)+"]",i=RegExp("^"+o+o+"*"),a=RegExp(o+o+"*$"),u=function(t){return function(n){var e=String(r(n));return 1&t&&(e=e.replace(i,"")),2&t&&(e=e.replace(a,"")),e}};t.exports={start:u(1),end:u(2),trim:u(3)}},function(t,n){t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},function(t,n,e){e(2)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},function(t,n,e){e(2)({target:"Number",stat:!0},{isFinite:e(132)})},function(t,n,e){var r=e(3).isFinite;t.exports=Number.isFinite||function(t){return"number"==typeof t&&r(t)}},function(t,n,e){e(2)({target:"Number",stat:!0},{isInteger:e(134)})},function(t,n,e){var r=e(14),o=Math.floor;t.exports=function(t){return!r(t)&&isFinite(t)&&o(t)===t}},function(t,n,e){e(2)({target:"Number",stat:!0},{isNaN:function(t){return t!=t}})},function(t,n,e){var r=e(2),o=e(134),i=Math.abs;r({target:"Number",stat:!0},{isSafeInteger:function(t){return o(t)&&i(t)<=9007199254740991}})},function(t,n,e){e(2)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,e){e(2)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,e){var r=e(2),o=e(140);r({target:"Number",stat:!0,forced:Number.parseFloat!=o},{parseFloat:o})},function(t,n,e){var r=e(3),o=e(128).trim,i=e(129),a=r.parseFloat,u=1/a(i+"-0")!=-1/0;t.exports=u?function(t){var n=o(String(t)),e=a(n);return 0===e&&"-"==n.charAt(0)?-0:e}:a},function(t,n,e){var r=e(2),o=e(142);r({target:"Number",stat:!0,forced:Number.parseInt!=o},{parseInt:o})},function(t,n,e){var r=e(3),o=e(128).trim,i=e(129),a=r.parseInt,u=/^[+-]?0[Xx]/,c=8!==a(i+"08")||22!==a(i+"0x16");t.exports=c?function(t,n){var e=o(String(t));return a(e,n>>>0||(u.test(e)?16:10))}:a},function(t,n,e){var r=e(2),o=e(40),i=e(144),a=e(145),u=e(6),c=1..toFixed,f=Math.floor,s=function(t,n,e){return 0===n?e:n%2==1?s(t,n-1,e*t):s(t*t,n/2,e)};r({target:"Number",proto:!0,forced:c&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!u((function(){c.call({})}))},{toFixed:function(t){var n,e,r,u,c=i(this),l=o(t),p=[0,0,0,0,0,0],h="",v="0",g=function(t,n){for(var e=-1,r=n;++e<6;)r+=t*p[e],p[e]=r%1e7,r=f(r/1e7)},d=function(t){for(var n=6,e=0;--n>=0;)e+=p[n],p[n]=f(e/t),e=e%t*1e7},y=function(){for(var t=6,n="";--t>=0;)if(""!==n||0===t||0!==p[t]){var e=String(p[t]);n=""===n?e:n+a.call("0",7-e.length)+e}return n};if(l<0||l>20)throw RangeError("Incorrect fraction digits");if(c!=c)return"NaN";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(h="-",c=-c),c>1e-21)if(e=(n=function(t){for(var n=0,e=t;e>=4096;)n+=12,e/=4096;for(;e>=2;)n+=1,e/=2;return n}(c*s(2,69,1))-69)<0?c*s(2,-n,1):c/s(2,n,1),e*=4503599627370496,(n=52-n)>0){for(g(0,e),r=l;r>=7;)g(1e7,0),r-=7;for(g(s(10,r,1),0),r=n-1;r>=23;)d(1<<23),r-=23;d(1<<r),g(1,1),d(2),v=y()}else g(0,e),g(1<<-n,0),v=y()+a.call("0",l);return v=l>0?h+((u=v.length)<=l?"0."+a.call("0",l-u)+v:v.slice(0,u-l)+"."+v.slice(u-l)):h+v}})},function(t,n,e){var r=e(11);t.exports=function(t){if("number"!=typeof t&&"Number"!=r(t))throw TypeError("Incorrect invocation");return+t}},function(t,n,e){var r=e(40),o=e(12);t.exports="".repeat||function(t){var n=String(o(this)),e="",i=r(t);if(i<0||i==1/0)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(n+=n))1&i&&(e+=n);return e}},function(t,n,e){var r=e(2),o=e(147);r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},function(t,n,e){var r=e(5),o=e(6),i=e(60),a=e(43),u=e(7),c=e(46),f=e(10),s=Object.assign,l=Object.defineProperty;t.exports=!s||o((function(){if(r&&1!==s({b:1},s(l({},"a",{enumerable:!0,get:function(){l(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},n={},e=Symbol();return t[e]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){n[t]=t})),7!=s({},t)[e]||"abcdefghijklmnopqrst"!=i(s({},n)).join("")}))?function(t,n){for(var e=c(t),o=arguments.length,s=1,l=a.f,p=u.f;o>s;)for(var h,v=f(arguments[s++]),g=l?i(v).concat(l(v)):i(v),d=g.length,y=0;d>y;)h=g[y++],r&&!p.call(v,h)||(e[h]=v[h]);return e}:s},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(65),c=e(19);o&&r({target:"Object",proto:!0,forced:i},{__defineGetter__:function(t,n){c.f(a(this),t,{get:u(n),enumerable:!0,configurable:!0})}})},function(t,n,e){var r=e(29),o=e(3),i=e(6);t.exports=r||!i((function(){var t=Math.random();__defineSetter__.call(null,t,(function(){})),delete o[t]}))},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(65),c=e(19);o&&r({target:"Object",proto:!0,forced:i},{__defineSetter__:function(t,n){c.f(a(this),t,{set:u(n),enumerable:!0,configurable:!0})}})},function(t,n,e){var r=e(2),o=e(152).entries;r({target:"Object",stat:!0},{entries:function(t){return o(t)}})},function(t,n,e){var r=e(5),o=e(60),i=e(9),a=e(7).f,u=function(t){return function(n){for(var e,u=i(n),c=o(u),f=c.length,s=0,l=[];f>s;)e=c[s++],r&&!a.call(u,e)||l.push(t?[e,u[e]]:u[e]);return l}};t.exports={entries:u(!0),values:u(!1)}},function(t,n,e){var r=e(2),o=e(121),i=e(6),a=e(14),u=e(120).onFreeze,c=Object.freeze;r({target:"Object",stat:!0,forced:i((function(){c(1)})),sham:!o},{freeze:function(t){return c&&a(t)?c(u(t)):t}})},function(t,n,e){var r=e(2),o=e(122),i=e(47);r({target:"Object",stat:!0},{fromEntries:function(t){var n={};return o(t,(function(t,e){i(n,t,e)}),void 0,!0),n}})},function(t,n,e){var r=e(2),o=e(6),i=e(9),a=e(4).f,u=e(5),c=o((function(){a(1)}));r({target:"Object",stat:!0,forced:!u||c,sham:!u},{getOwnPropertyDescriptor:function(t,n){return a(i(t),n)}})},function(t,n,e){var r=e(2),o=e(5),i=e(33),a=e(9),u=e(4),c=e(47);r({target:"Object",stat:!0,sham:!o},{getOwnPropertyDescriptors:function(t){for(var n,e,r=a(t),o=u.f,f=i(r),s={},l=0;f.length>l;)void 0!==(e=o(r,n=f[l++]))&&c(s,n,e);return s}})},function(t,n,e){var r=e(2),o=e(6),i=e(158).f;r({target:"Object",stat:!0,forced:o((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:i})},function(t,n,e){var r=e(9),o=e(36).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return a&&"[object Window]"==i.call(t)?function(t){try{return o(t)}catch(t){return a.slice()}}(t):o(r(t))}},function(t,n,e){var r=e(2),o=e(6),i=e(46),a=e(93),u=e(94);r({target:"Object",stat:!0,forced:o((function(){a(1)})),sham:!u},{getPrototypeOf:function(t){return a(i(t))}})},function(t,n,e){e(2)({target:"Object",stat:!0},{is:e(161)})},function(t,n){t.exports=Object.is||function(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,e){var r=e(2),o=e(6),i=e(14),a=Object.isExtensible;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isExtensible:function(t){return!!i(t)&&(!a||a(t))}})},function(t,n,e){var r=e(2),o=e(6),i=e(14),a=Object.isFrozen;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isFrozen:function(t){return!i(t)||!!a&&a(t)}})},function(t,n,e){var r=e(2),o=e(6),i=e(14),a=Object.isSealed;r({target:"Object",stat:!0,forced:o((function(){a(1)}))},{isSealed:function(t){return!i(t)||!!a&&a(t)}})},function(t,n,e){var r=e(2),o=e(46),i=e(60);r({target:"Object",stat:!0,forced:e(6)((function(){i(1)}))},{keys:function(t){return i(o(t))}})},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(13),c=e(93),f=e(4).f;o&&r({target:"Object",proto:!0,forced:i},{__lookupGetter__:function(t){var n,e=a(this),r=u(t,!0);do{if(n=f(e,r))return n.get}while(e=c(e))}})},function(t,n,e){var r=e(2),o=e(5),i=e(149),a=e(46),u=e(13),c=e(93),f=e(4).f;o&&r({target:"Object",proto:!0,forced:i},{__lookupSetter__:function(t){var n,e=a(this),r=u(t,!0);do{if(n=f(e,r))return n.set}while(e=c(e))}})},function(t,n,e){var r=e(2),o=e(14),i=e(120).onFreeze,a=e(121),u=e(6),c=Object.preventExtensions;r({target:"Object",stat:!0,forced:u((function(){c(1)})),sham:!a},{preventExtensions:function(t){return c&&o(t)?c(i(t)):t}})},function(t,n,e){var r=e(2),o=e(14),i=e(120).onFreeze,a=e(121),u=e(6),c=Object.seal;r({target:"Object",stat:!0,forced:u((function(){c(1)})),sham:!a},{seal:function(t){return c&&o(t)?c(i(t)):t}})},function(t,n,e){var r=e(85),o=e(21),i=e(171);r||o(Object.prototype,"toString",i,{unsafe:!0})},function(t,n,e){var r=e(85),o=e(84);t.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},function(t,n,e){var r=e(2),o=e(152).values;r({target:"Object",stat:!0},{values:function(t){return o(t)}})},function(t,n,e){var r,o,i,a,u=e(2),c=e(29),f=e(3),s=e(34),l=e(174),p=e(21),h=e(126),v=e(95),g=e(109),d=e(14),y=e(65),x=e(123),m=e(11),b=e(23),S=e(122),E=e(86),w=e(175),O=e(176).set,R=e(178),A=e(179),j=e(181),I=e(180),k=e(182),P=e(25),L=e(44),T=e(49),_=e(53),U=T("species"),N="Promise",C=P.get,F=P.set,M=P.getterFor(N),z=l,D=f.TypeError,q=f.document,B=f.process,W=s("fetch"),$=I.f,G=$,V="process"==m(B),X=!!(q&&q.createEvent&&f.dispatchEvent),Y=L(N,(function(){if(!(b(z)!==String(z))){if(66===_)return!0;if(!V&&"function"!=typeof PromiseRejectionEvent)return!0}if(c&&!z.prototype.finally)return!0;if(_>=51&&/native code/.test(z))return!1;var t=z.resolve(1),n=function(t){t((function(){}),(function(){}))};return(t.constructor={})[U]=n,!(t.then((function(){}))instanceof n)})),K=Y||!E((function(t){z.all(t).catch((function(){}))})),J=function(t){var n;return!(!d(t)||"function"!=typeof(n=t.then))&&n},H=function(t,n,e){if(!n.notified){n.notified=!0;var r=n.reactions;R((function(){for(var o=n.value,i=1==n.state,a=0;r.length>a;){var u,c,f,s=r[a++],l=i?s.ok:s.fail,p=s.resolve,h=s.reject,v=s.domain;try{l?(i||(2===n.rejection&&nt(t,n),n.rejection=1),!0===l?u=o:(v&&v.enter(),u=l(o),v&&(v.exit(),f=!0)),u===s.promise?h(D("Promise-chain cycle")):(c=J(u))?c.call(u,p,h):p(u)):h(o)}catch(t){v&&!f&&v.exit(),h(t)}}n.reactions=[],n.notified=!1,e&&!n.rejection&&Z(t,n)}))}},Q=function(t,n,e){var r,o;X?((r=q.createEvent("Event")).promise=n,r.reason=e,r.initEvent(t,!1,!0),f.dispatchEvent(r)):r={promise:n,reason:e},(o=f["on"+t])?o(r):"unhandledrejection"===t&&j("Unhandled promise rejection",e)},Z=function(t,n){O.call(f,(function(){var e,r=n.value;if(tt(n)&&(e=k((function(){V?B.emit("unhandledRejection",r,t):Q("unhandledrejection",t,r)})),n.rejection=V||tt(n)?2:1,e.error))throw e.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},nt=function(t,n){O.call(f,(function(){V?B.emit("rejectionHandled",t):Q("rejectionhandled",t,n.value)}))},et=function(t,n,e,r){return function(o){t(n,e,o,r)}},rt=function(t,n,e,r){n.done||(n.done=!0,r&&(n=r),n.value=e,n.state=2,H(t,n,!0))},ot=function(t,n,e,r){if(!n.done){n.done=!0,r&&(n=r);try{if(t===e)throw D("Promise can't be resolved itself");var o=J(e);o?R((function(){var r={done:!1};try{o.call(e,et(ot,t,r,n),et(rt,t,r,n))}catch(e){rt(t,r,e,n)}})):(n.value=e,n.state=1,H(t,n,!1))}catch(e){rt(t,{done:!1},e,n)}}};Y&&(z=function(t){x(this,z,N),y(t),r.call(this);var n=C(this);try{t(et(ot,this,n),et(rt,this,n))}catch(t){rt(this,n,t)}},(r=function(t){F(this,{type:N,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=h(z.prototype,{then:function(t,n){var e=M(this),r=$(w(this,z));return r.ok="function"!=typeof t||t,r.fail="function"==typeof n&&n,r.domain=V?B.domain:void 0,e.parent=!0,e.reactions.push(r),0!=e.state&&H(this,e,!1),r.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new r,n=C(t);this.promise=t,this.resolve=et(ot,t,n),this.reject=et(rt,t,n)},I.f=$=function(t){return t===z||t===i?new o(t):G(t)},c||"function"!=typeof l||(a=l.prototype.then,p(l.prototype,"then",(function(t,n){var e=this;return new z((function(t,n){a.call(e,t,n)})).then(t,n)}),{unsafe:!0}),"function"==typeof W&&u({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return A(z,W.apply(f,arguments))}}))),u({global:!0,wrap:!0,forced:Y},{Promise:z}),v(z,N,!1,!0),g(N),i=s(N),u({target:N,stat:!0,forced:Y},{reject:function(t){var n=$(this);return n.reject.call(void 0,t),n.promise}}),u({target:N,stat:!0,forced:c||Y},{resolve:function(t){return A(c&&this===i?z:this,t)}}),u({target:N,stat:!0,forced:K},{all:function(t){var n=this,e=$(n),r=e.resolve,o=e.reject,i=k((function(){var e=y(n.resolve),i=[],a=0,u=1;S(t,(function(t){var c=a++,f=!1;i.push(void 0),u++,e.call(n,t).then((function(t){f||(f=!0,i[c]=t,--u||r(i))}),o)})),--u||r(i)}));return i.error&&o(i.value),e.promise},race:function(t){var n=this,e=$(n),r=e.reject,o=k((function(){var o=y(n.resolve);S(t,(function(t){o.call(n,t).then(e.resolve,r)}))}));return o.error&&r(o.value),e.promise}})},function(t,n,e){var r=e(3);t.exports=r.Promise},function(t,n,e){var r=e(20),o=e(65),i=e(49)("species");t.exports=function(t,n){var e,a=r(t).constructor;return void 0===a||null==(e=r(a)[i])?n:o(e)}},function(t,n,e){var r,o,i,a=e(3),u=e(6),c=e(11),f=e(64),s=e(61),l=e(17),p=e(177),h=a.location,v=a.setImmediate,g=a.clearImmediate,d=a.process,y=a.MessageChannel,x=a.Dispatch,m=0,b={},S=function(t){if(b.hasOwnProperty(t)){var n=b[t];delete b[t],n()}},E=function(t){return function(){S(t)}},w=function(t){S(t.data)},O=function(t){a.postMessage(t+"",h.protocol+"//"+h.host)};v&&g||(v=function(t){for(var n=[],e=1;arguments.length>e;)n.push(arguments[e++]);return b[++m]=function(){("function"==typeof t?t:Function(t)).apply(void 0,n)},r(m),m},g=function(t){delete b[t]},"process"==c(d)?r=function(t){d.nextTick(E(t))}:x&&x.now?r=function(t){x.now(E(t))}:y&&!p?(i=(o=new y).port2,o.port1.onmessage=w,r=f(i.postMessage,i,1)):!a.addEventListener||"function"!=typeof postMessage||a.importScripts||u(O)||"file:"===h.protocol?r="onreadystatechange"in l("script")?function(t){s.appendChild(l("script")).onreadystatechange=function(){s.removeChild(this),S(t)}}:function(t){setTimeout(E(t),0)}:(r=O,a.addEventListener("message",w,!1))),t.exports={set:v,clear:g}},function(t,n,e){var r=e(54);t.exports=/(iphone|ipod|ipad).*applewebkit/i.test(r)},function(t,n,e){var r,o,i,a,u,c,f,s,l=e(3),p=e(4).f,h=e(11),v=e(176).set,g=e(177),d=l.MutationObserver||l.WebKitMutationObserver,y=l.process,x=l.Promise,m="process"==h(y),b=p(l,"queueMicrotask"),S=b&&b.value;S||(r=function(){var t,n;for(m&&(t=y.domain)&&t.exit();o;){n=o.fn,o=o.next;try{n()}catch(t){throw o?a():i=void 0,t}}i=void 0,t&&t.enter()},m?a=function(){y.nextTick(r)}:d&&!g?(u=!0,c=document.createTextNode(""),new d(r).observe(c,{characterData:!0}),a=function(){c.data=u=!u}):x&&x.resolve?(f=x.resolve(void 0),s=f.then,a=function(){s.call(f,r)}):a=function(){v.call(l,r)}),t.exports=S||function(t){var n={fn:t,next:void 0};i&&(i.next=n),o||(o=n,a()),i=n}},function(t,n,e){var r=e(20),o=e(14),i=e(180);t.exports=function(t,n){if(r(t),o(n)&&n.constructor===t)return n;var e=i.f(t);return(0,e.resolve)(n),e.promise}},function(t,n,e){var r=e(65),o=function(t){var n,e;this.promise=new t((function(t,r){if(void 0!==n||void 0!==e)throw TypeError("Bad Promise constructor");n=t,e=r})),this.resolve=r(n),this.reject=r(e)};t.exports.f=function(t){return new o(t)}},function(t,n,e){var r=e(3);t.exports=function(t,n){var e=r.console;e&&e.error&&(1===arguments.length?e.error(t):e.error(t,n))}},function(t,n){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,n,e){var r=e(2),o=e(65),i=e(180),a=e(182),u=e(122);r({target:"Promise",stat:!0},{allSettled:function(t){var n=this,e=i.f(n),r=e.resolve,c=e.reject,f=a((function(){var e=o(n.resolve),i=[],a=0,c=1;u(t,(function(t){var o=a++,u=!1;i.push(void 0),c++,e.call(n,t).then((function(t){u||(u=!0,i[o]={status:"fulfilled",value:t},--c||r(i))}),(function(t){u||(u=!0,i[o]={status:"rejected",reason:t},--c||r(i))}))})),--c||r(i)}));return f.error&&c(f.value),e.promise}})},function(t,n,e){var r=e(2),o=e(29),i=e(174),a=e(6),u=e(34),c=e(175),f=e(179),s=e(21);r({target:"Promise",proto:!0,real:!0,forced:!!i&&a((function(){i.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(t){var n=c(this,u("Promise")),e="function"==typeof t;return this.then(e?function(e){return f(n,t()).then((function(){return e}))}:t,e?function(e){return f(n,t()).then((function(){throw e}))}:t)}}),o||"function"!=typeof i||i.prototype.finally||s(i.prototype,"finally",u("Promise").prototype.finally)},function(t,n,e){var r=e(5),o=e(3),i=e(44),a=e(124),u=e(19).f,c=e(36).f,f=e(186),s=e(187),l=e(188),p=e(21),h=e(6),v=e(25).set,g=e(109),d=e(49)("match"),y=o.RegExp,x=y.prototype,m=/a/g,b=/a/g,S=new y(m)!==m,E=l.UNSUPPORTED_Y;if(r&&i("RegExp",!S||E||h((function(){return b[d]=!1,y(m)!=m||y(b)==b||"/a/i"!=y(m,"i")})))){for(var w=function(t,n){var e,r=this instanceof w,o=f(t),i=void 0===n;if(!r&&o&&t.constructor===w&&i)return t;S?o&&!i&&(t=t.source):t instanceof w&&(i&&(n=s.call(t)),t=t.source),E&&(e=!!n&&n.indexOf("y")>-1)&&(n=n.replace(/y/g,""));var u=a(S?new y(t,n):y(t,n),r?this:x,w);return E&&e&&v(u,{sticky:e}),u},O=function(t){t in w||u(w,t,{configurable:!0,get:function(){return y[t]},set:function(n){y[t]=n}})},R=c(y),A=0;R.length>A;)O(R[A++]);x.constructor=w,w.prototype=x,p(o,"RegExp",w)}g("RegExp")},function(t,n,e){var r=e(14),o=e(11),i=e(49)("match");t.exports=function(t){var n;return r(t)&&(void 0!==(n=t[i])?!!n:"RegExp"==o(t))}},function(t,n,e){var r=e(20);t.exports=function(){var t=r(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.dotAll&&(n+="s"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},function(t,n,e){var r=e(6);function o(t,n){return RegExp(t,n)}n.UNSUPPORTED_Y=r((function(){var t=o("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),n.BROKEN_CARET=r((function(){var t=o("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},function(t,n,e){var r=e(2),o=e(190);r({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},function(t,n,e){var r,o,i=e(187),a=e(188),u=RegExp.prototype.exec,c=String.prototype.replace,f=u,s=(r=/a/,o=/b*/g,u.call(r,"a"),u.call(o,"a"),0!==r.lastIndex||0!==o.lastIndex),l=a.UNSUPPORTED_Y||a.BROKEN_CARET,p=void 0!==/()??/.exec("")[1];(s||p||l)&&(f=function(t){var n,e,r,o,a=this,f=l&&a.sticky,h=i.call(a),v=a.source,g=0,d=t;return f&&(-1===(h=h.replace("y","")).indexOf("g")&&(h+="g"),d=String(t).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&"\n"!==t[a.lastIndex-1])&&(v="(?: "+v+")",d=" "+d,g++),e=new RegExp("^(?:"+v+")",h)),p&&(e=new RegExp("^"+v+"$(?!\\s)",h)),s&&(n=a.lastIndex),r=u.call(f?e:a,d),f?r?(r.input=r.input.slice(g),r[0]=r[0].slice(g),r.index=a.lastIndex,a.lastIndex+=r[0].length):a.lastIndex=0:s&&r&&(a.lastIndex=a.global?r.index+r[0].length:n),p&&r&&r.length>1&&c.call(r[0],e,(function(){for(o=1;o<arguments.length-2;o++)void 0===arguments[o]&&(r[o]=void 0)})),r}),t.exports=f},function(t,n,e){var r=e(5),o=e(19),i=e(187),a=e(188).UNSUPPORTED_Y;r&&("g"!=/./g.flags||a)&&o.f(RegExp.prototype,"flags",{configurable:!0,get:i})},function(t,n,e){var r=e(5),o=e(188).UNSUPPORTED_Y,i=e(19).f,a=e(25).get,u=RegExp.prototype;r&&o&&i(RegExp.prototype,"sticky",{configurable:!0,get:function(){if(this!==u){if(this instanceof RegExp)return!!a(this).sticky;throw TypeError("Incompatible receiver, RegExp required")}}})},function(t,n,e){e(189);var r,o,i=e(2),a=e(14),u=(r=!1,(o=/[ac]/).exec=function(){return r=!0,/./.exec.apply(this,arguments)},!0===o.test("abc")&&r),c=/./.test;i({target:"RegExp",proto:!0,forced:!u},{test:function(t){if("function"!=typeof this.exec)return c.call(this,t);var n=this.exec(t);if(null!==n&&!a(n))throw new Error("RegExp exec method returned something other than an Object or null");return!!n}})},function(t,n,e){var r=e(21),o=e(20),i=e(6),a=e(187),u=RegExp.prototype,c=u.toString,f=i((function(){return"/a/b"!=c.call({source:"a",flags:"b"})})),s="toString"!=c.name;(f||s)&&r(RegExp.prototype,"toString",(function(){var t=o(this),n=String(t.source),e=t.flags;return"/"+n+"/"+String(void 0===e&&t instanceof RegExp&&!("flags"in u)?a.call(t):e)}),{unsafe:!0})},function(t,n,e){var r=e(119),o=e(125);t.exports=r("Set",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),o)},function(t,n,e){var r=e(2),o=e(197).codeAt;r({target:"String",proto:!0},{codePointAt:function(t){return o(this,t)}})},function(t,n,e){var r=e(40),o=e(12),i=function(t){return function(n,e){var i,a,u=String(o(n)),c=r(e),f=u.length;return c<0||c>=f?t?"":void 0:(i=u.charCodeAt(c))<55296||i>56319||c+1===f||(a=u.charCodeAt(c+1))<56320||a>57343?t?u.charAt(c):i:t?u.slice(c,c+2):a-56320+(i-55296<<10)+65536}};t.exports={codeAt:i(!1),charAt:i(!0)}},function(t,n,e){var r,o=e(2),i=e(4).f,a=e(39),u=e(199),c=e(12),f=e(200),s=e(29),l="".endsWith,p=Math.min,h=f("endsWith");o({target:"String",proto:!0,forced:!!(s||h||(r=i(String.prototype,"endsWith"),!r||r.writable))&&!h},{endsWith:function(t){var n=String(c(this));u(t);var e=arguments.length>1?arguments[1]:void 0,r=a(n.length),o=void 0===e?r:p(a(e),r),i=String(t);return l?l.call(n,i,o):n.slice(o-i.length,o)===i}})},function(t,n,e){var r=e(186);t.exports=function(t){if(r(t))throw TypeError("The method doesn't accept regular expressions");return t}},function(t,n,e){var r=e(49)("match");t.exports=function(t){var n=/./;try{"/./"[t](n)}catch(e){try{return n[r]=!1,"/./"[t](n)}catch(t){}}return!1}},function(t,n,e){var r=e(2),o=e(41),i=String.fromCharCode,a=String.fromCodePoint;r({target:"String",stat:!0,forced:!!a&&1!=a.length},{fromCodePoint:function(t){for(var n,e=[],r=arguments.length,a=0;r>a;){if(n=+arguments[a++],o(n,1114111)!==n)throw RangeError(n+" is not a valid code point");e.push(n<65536?i(n):i(55296+((n-=65536)>>10),n%1024+56320))}return e.join("")}})},function(t,n,e){var r=e(2),o=e(199),i=e(12);r({target:"String",proto:!0,forced:!e(200)("includes")},{includes:function(t){return!!~String(i(this)).indexOf(o(t),arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(197).charAt,o=e(25),i=e(90),a=o.set,u=o.getterFor("String Iterator");i(String,"String",(function(t){a(this,{type:"String Iterator",string:String(t),index:0})}),(function(){var t,n=u(this),e=n.string,o=n.index;return o>=e.length?{value:void 0,done:!0}:(t=r(e,o),n.index+=t.length,{value:t,done:!1})}))},function(t,n,e){var r=e(205),o=e(20),i=e(39),a=e(12),u=e(206),c=e(207);r("match",1,(function(t,n,e){return[function(n){var e=a(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,e):new RegExp(n)[t](String(e))},function(t){var r=e(n,t,this);if(r.done)return r.value;var a=o(t),f=String(this);if(!a.global)return c(a,f);var s=a.unicode;a.lastIndex=0;for(var l,p=[],h=0;null!==(l=c(a,f));){var v=String(l[0]);p[h]=v,""===v&&(a.lastIndex=u(f,i(a.lastIndex),s)),h++}return 0===h?null:p}]}))},function(t,n,e){e(189);var r=e(21),o=e(6),i=e(49),a=e(190),u=e(18),c=i("species"),f=!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$<a>")})),s="$0"==="a".replace(/./,"$0"),l=i("replace"),p=!!/./[l]&&""===/./[l]("a","$0"),h=!o((function(){var t=/(?:)/,n=t.exec;t.exec=function(){return n.apply(this,arguments)};var e="ab".split(t);return 2!==e.length||"a"!==e[0]||"b"!==e[1]}));t.exports=function(t,n,e,l){var v=i(t),g=!o((function(){var n={};return n[v]=function(){return 7},7!=""[t](n)})),d=g&&!o((function(){var n=!1,e=/a/;return"split"===t&&((e={}).constructor={},e.constructor[c]=function(){return e},e.flags="",e[v]=/./[v]),e.exec=function(){return n=!0,null},e[v](""),!n}));if(!g||!d||"replace"===t&&(!f||!s||p)||"split"===t&&!h){var y=/./[v],x=e(v,""[t],(function(t,n,e,r,o){return n.exec===a?g&&!o?{done:!0,value:y.call(n,e,r)}:{done:!0,value:t.call(e,n,r)}:{done:!1}}),{REPLACE_KEEPS_$0:s,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:p}),m=x[0],b=x[1];r(String.prototype,t,m),r(RegExp.prototype,v,2==n?function(t,n){return b.call(t,this,n)}:function(t){return b.call(t,this)})}l&&u(RegExp.prototype[v],"sham",!0)}},function(t,n,e){var r=e(197).charAt;t.exports=function(t,n,e){return n+(e?r(t,n).length:1)}},function(t,n,e){var r=e(11),o=e(190);t.exports=function(t,n){var e=t.exec;if("function"==typeof e){var i=e.call(t,n);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw TypeError("RegExp#exec called on incompatible receiver");return o.call(t,n)}},function(t,n,e){var r=e(2),o=e(91),i=e(12),a=e(39),u=e(65),c=e(20),f=e(11),s=e(186),l=e(187),p=e(18),h=e(6),v=e(49),g=e(175),d=e(206),y=e(25),x=e(29),m=v("matchAll"),b=y.set,S=y.getterFor("RegExp String Iterator"),E=RegExp.prototype,w=E.exec,O="".matchAll,R=!!O&&!h((function(){"a".matchAll(/./)})),A=o((function(t,n,e,r){b(this,{type:"RegExp String Iterator",regexp:t,string:n,global:e,unicode:r,done:!1})}),"RegExp String",(function(){var t=S(this);if(t.done)return{value:void 0,done:!0};var n=t.regexp,e=t.string,r=function(t,n){var e,r=t.exec;if("function"==typeof r){if("object"!=typeof(e=r.call(t,n)))throw TypeError("Incorrect exec result");return e}return w.call(t,n)}(n,e);return null===r?{value:void 0,done:t.done=!0}:t.global?(""==String(r[0])&&(n.lastIndex=d(e,a(n.lastIndex),t.unicode)),{value:r,done:!1}):(t.done=!0,{value:r,done:!1})})),j=function(t){var n,e,r,o,i,u,f=c(this),s=String(t);return n=g(f,RegExp),void 0===(e=f.flags)&&f instanceof RegExp&&!("flags"in E)&&(e=l.call(f)),r=void 0===e?"":String(e),o=new n(n===RegExp?f.source:f,r),i=!!~r.indexOf("g"),u=!!~r.indexOf("u"),o.lastIndex=a(f.lastIndex),new A(o,s,i,u)};r({target:"String",proto:!0,forced:R},{matchAll:function(t){var n,e,r,o=i(this);if(null!=t){if(s(t)&&!~String(i("flags"in E?t.flags:l.call(t))).indexOf("g"))throw TypeError("`.matchAll` does not allow non-global regexes");if(R)return O.apply(o,arguments);if(void 0===(e=t[m])&&x&&"RegExp"==f(t)&&(e=j),null!=e)return u(e).call(t,o)}else if(R)return O.apply(o,arguments);return n=String(o),r=new RegExp(t,"g"),x?j.call(r,n):r[m](n)}}),x||m in E||p(E,m,j)},function(t,n,e){var r=e(2),o=e(210).end;r({target:"String",proto:!0,forced:e(211)},{padEnd:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(39),o=e(145),i=e(12),a=Math.ceil,u=function(t){return function(n,e,u){var c,f,s=String(i(n)),l=s.length,p=void 0===u?" ":String(u),h=r(e);return h<=l||""==p?s:(c=h-l,(f=o.call(p,a(c/p.length))).length>c&&(f=f.slice(0,c)),t?s+f:f+s)}};t.exports={start:u(!1),end:u(!0)}},function(t,n,e){var r=e(54);t.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(r)},function(t,n,e){var r=e(2),o=e(210).start;r({target:"String",proto:!0,forced:e(211)},{padStart:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,n,e){var r=e(2),o=e(9),i=e(39);r({target:"String",stat:!0},{raw:function(t){for(var n=o(t.raw),e=i(n.length),r=arguments.length,a=[],u=0;e>u;)a.push(String(n[u++])),u<r&&a.push(String(arguments[u]));return a.join("")}})},function(t,n,e){e(2)({target:"String",proto:!0},{repeat:e(145)})},function(t,n,e){var r=e(205),o=e(20),i=e(46),a=e(39),u=e(40),c=e(12),f=e(206),s=e(207),l=Math.max,p=Math.min,h=Math.floor,v=/\$([$&'`]|\d\d?|<[^>]*>)/g,g=/\$([$&'`]|\d\d?)/g;r("replace",2,(function(t,n,e,r){var d=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,y=r.REPLACE_KEEPS_$0,x=d?"$":"$0";return[function(e,r){var o=c(this),i=null==e?void 0:e[t];return void 0!==i?i.call(e,o,r):n.call(String(o),e,r)},function(t,r){if(!d&&y||"string"==typeof r&&-1===r.indexOf(x)){var i=e(n,t,this,r);if(i.done)return i.value}var c=o(t),h=String(this),v="function"==typeof r;v||(r=String(r));var g=c.global;if(g){var b=c.unicode;c.lastIndex=0}for(var S=[];;){var E=s(c,h);if(null===E)break;if(S.push(E),!g)break;""===String(E[0])&&(c.lastIndex=f(h,a(c.lastIndex),b))}for(var w,O="",R=0,A=0;A<S.length;A++){E=S[A];for(var j=String(E[0]),I=l(p(u(E.index),h.length),0),k=[],P=1;P<E.length;P++)k.push(void 0===(w=E[P])?w:String(w));var L=E.groups;if(v){var T=[j].concat(k,I,h);void 0!==L&&T.push(L);var _=String(r.apply(void 0,T))}else _=m(j,h,I,k,L,r);I>=R&&(O+=h.slice(R,I)+_,R=I+j.length)}return O+h.slice(R)}];function m(t,e,r,o,a,u){var c=r+t.length,f=o.length,s=g;return void 0!==a&&(a=i(a),s=v),n.call(u,s,(function(n,i){var u;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,r);case"'":return e.slice(c);case"<":u=a[i.slice(1,-1)];break;default:var s=+i;if(0===s)return n;if(s>f){var l=h(s/10);return 0===l?n:l<=f?void 0===o[l-1]?i.charAt(1):o[l-1]+i.charAt(1):n}u=o[s-1]}return void 0===u?"":u}))}}))},function(t,n,e){var r=e(205),o=e(20),i=e(12),a=e(161),u=e(207);r("search",1,(function(t,n,e){return[function(n){var e=i(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,e):new RegExp(n)[t](String(e))},function(t){var r=e(n,t,this);if(r.done)return r.value;var i=o(t),c=String(this),f=i.lastIndex;a(f,0)||(i.lastIndex=0);var s=u(i,c);return a(i.lastIndex,f)||(i.lastIndex=f),null===s?-1:s.index}]}))},function(t,n,e){var r=e(205),o=e(186),i=e(20),a=e(12),u=e(175),c=e(206),f=e(39),s=e(207),l=e(190),p=e(6),h=[].push,v=Math.min,g=!p((function(){return!RegExp(4294967295,"y")}));r("split",2,(function(t,n,e){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,e){var r=String(a(this)),i=void 0===e?4294967295:e>>>0;if(0===i)return[];if(void 0===t)return[r];if(!o(t))return n.call(r,t,i);for(var u,c,f,s=[],p=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),v=0,g=new RegExp(t.source,p+"g");(u=l.call(g,r))&&!((c=g.lastIndex)>v&&(s.push(r.slice(v,u.index)),u.length>1&&u.index<r.length&&h.apply(s,u.slice(1)),f=u[0].length,v=c,s.length>=i));)g.lastIndex===u.index&&g.lastIndex++;return v===r.length?!f&&g.test("")||s.push(""):s.push(r.slice(v)),s.length>i?s.slice(0,i):s}:"0".split(void 0,0).length?function(t,e){return void 0===t&&0===e?[]:n.call(this,t,e)}:n,[function(n,e){var o=a(this),i=null==n?void 0:n[t];return void 0!==i?i.call(n,o,e):r.call(String(o),n,e)},function(t,o){var a=e(r,t,this,o,r!==n);if(a.done)return a.value;var l=i(t),p=String(this),h=u(l,RegExp),d=l.unicode,y=(l.ignoreCase?"i":"")+(l.multiline?"m":"")+(l.unicode?"u":"")+(g?"y":"g"),x=new h(g?l:"^(?:"+l.source+")",y),m=void 0===o?4294967295:o>>>0;if(0===m)return[];if(0===p.length)return null===s(x,p)?[p]:[];for(var b=0,S=0,E=[];S<p.length;){x.lastIndex=g?S:0;var w,O=s(x,g?p:p.slice(S));if(null===O||(w=v(f(x.lastIndex+(g?0:S)),p.length))===b)S=c(p,S,d);else{if(E.push(p.slice(b,S)),E.length===m)return E;for(var R=1;R<=O.length-1;R++)if(E.push(O[R]),E.length===m)return E;S=b=w}}return E.push(p.slice(b)),E}]}),!g)},function(t,n,e){var r,o=e(2),i=e(4).f,a=e(39),u=e(199),c=e(12),f=e(200),s=e(29),l="".startsWith,p=Math.min,h=f("startsWith");o({target:"String",proto:!0,forced:!!(s||h||(r=i(String.prototype,"startsWith"),!r||r.writable))&&!h},{startsWith:function(t){var n=String(c(this));u(t);var e=a(p(arguments.length>1?arguments[1]:void 0,n.length)),r=String(t);return l?l.call(n,r,e):n.slice(e,e+r.length)===r}})},function(t,n,e){var r=e(2),o=e(128).trim;r({target:"String",proto:!0,forced:e(220)("trim")},{trim:function(){return o(this)}})},function(t,n,e){var r=e(6),o=e(129);t.exports=function(t){return r((function(){return!!o[t]()||"​…᠎"!="​…᠎"[t]()||o[t].name!==t}))}},function(t,n,e){var r=e(2),o=e(128).end,i=e(220)("trimEnd"),a=i?function(){return o(this)}:"".trimEnd;r({target:"String",proto:!0,forced:i},{trimEnd:a,trimRight:a})},function(t,n,e){var r=e(2),o=e(128).start,i=e(220)("trimStart"),a=i?function(){return o(this)}:"".trimStart;r({target:"String",proto:!0,forced:i},{trimStart:a,trimLeft:a})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("anchor")},{anchor:function(t){return o(this,"a","name",t)}})},function(t,n,e){var r=e(12),o=/"/g;t.exports=function(t,n,e,i){var a=String(r(t)),u="<"+n;return""!==e&&(u+=" "+e+'="'+String(i).replace(o,"&quot;")+'"'),u+">"+a+"</"+n+">"}},function(t,n,e){var r=e(6);t.exports=function(t){return r((function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3}))}},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("big")},{big:function(){return o(this,"big","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("blink")},{blink:function(){return o(this,"blink","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("bold")},{bold:function(){return o(this,"b","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("fixed")},{fixed:function(){return o(this,"tt","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("fontcolor")},{fontcolor:function(t){return o(this,"font","color",t)}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("fontsize")},{fontsize:function(t){return o(this,"font","size",t)}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("italics")},{italics:function(){return o(this,"i","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("link")},{link:function(t){return o(this,"a","href",t)}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("small")},{small:function(){return o(this,"small","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("strike")},{strike:function(){return o(this,"strike","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("sub")},{sub:function(){return o(this,"sub","","")}})},function(t,n,e){var r=e(2),o=e(224);r({target:"String",proto:!0,forced:e(225)("sup")},{sup:function(){return o(this,"sup","","")}})},function(t,n,e){var r,o=e(3),i=e(126),a=e(120),u=e(119),c=e(239),f=e(14),s=e(25).enforce,l=e(26),p=!o.ActiveXObject&&"ActiveXObject"in o,h=Object.isExtensible,v=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},g=t.exports=u("WeakMap",v,c);if(l&&p){r=c.getConstructor(v,"WeakMap",!0),a.REQUIRED=!0;var d=g.prototype,y=d.delete,x=d.has,m=d.get,b=d.set;i(d,{delete:function(t){if(f(t)&&!h(t)){var n=s(this);return n.frozen||(n.frozen=new r),y.call(this,t)||n.frozen.delete(t)}return y.call(this,t)},has:function(t){if(f(t)&&!h(t)){var n=s(this);return n.frozen||(n.frozen=new r),x.call(this,t)||n.frozen.has(t)}return x.call(this,t)},get:function(t){if(f(t)&&!h(t)){var n=s(this);return n.frozen||(n.frozen=new r),x.call(this,t)?m.call(this,t):n.frozen.get(t)}return m.call(this,t)},set:function(t,n){if(f(t)&&!h(t)){var e=s(this);e.frozen||(e.frozen=new r),x.call(this,t)?b.call(this,t,n):e.frozen.set(t,n)}else b.call(this,t,n);return this}})}},function(t,n,e){var r=e(126),o=e(120).getWeakData,i=e(20),a=e(14),u=e(123),c=e(122),f=e(63),s=e(15),l=e(25),p=l.set,h=l.getterFor,v=f.find,g=f.findIndex,d=0,y=function(t){return t.frozen||(t.frozen=new x)},x=function(){this.entries=[]},m=function(t,n){return v(t.entries,(function(t){return t[0]===n}))};x.prototype={get:function(t){var n=m(this,t);if(n)return n[1]},has:function(t){return!!m(this,t)},set:function(t,n){var e=m(this,t);e?e[1]=n:this.entries.push([t,n])},delete:function(t){var n=g(this.entries,(function(n){return n[0]===t}));return~n&&this.entries.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,e,f){var l=t((function(t,r){u(t,l,n),p(t,{type:n,id:d++,frozen:void 0}),null!=r&&c(r,t[f],t,e)})),v=h(n),g=function(t,n,e){var r=v(t),a=o(i(n),!0);return!0===a?y(r).set(n,e):a[r.id]=e,t};return r(l.prototype,{delete:function(t){var n=v(this);if(!a(t))return!1;var e=o(t);return!0===e?y(n).delete(t):e&&s(e,n.id)&&delete e[n.id]},has:function(t){var n=v(this);if(!a(t))return!1;var e=o(t);return!0===e?y(n).has(t):e&&s(e,n.id)}}),r(l.prototype,e?{get:function(t){var n=v(this);if(a(t)){var e=o(t);return!0===e?y(n).get(t):e?e[n.id]:void 0}},set:function(t,n){return g(this,t,n)}}:{add:function(t){return g(this,t,!0)}}),l}}},function(t,n,e){e(119)("WeakSet",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),e(239))},function(t,n,e){var r=e(3),o=e(242),i=e(77),a=e(18);for(var u in o){var c=r[u],f=c&&c.prototype;if(f&&f.forEach!==i)try{a(f,"forEach",i)}catch(t){f.forEach=i}}},function(t,n){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,n,e){e(203);var r,o=e(2),i=e(5),a=e(244),u=e(3),c=e(59),f=e(21),s=e(123),l=e(15),p=e(147),h=e(79),v=e(197).codeAt,g=e(245),d=e(95),y=e(246),x=e(25),m=u.URL,b=y.URLSearchParams,S=y.getState,E=x.set,w=x.getterFor("URL"),O=Math.floor,R=Math.pow,A=/[A-Za-z]/,j=/[\d+-.A-Za-z]/,I=/\d/,k=/^(0x|0X)/,P=/^[0-7]+$/,L=/^\d+$/,T=/^[\dA-Fa-f]+$/,_=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,U=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,N=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,C=/[\u0009\u000A\u000D]/g,F=function(t,n){var e,r,o;if("["==n.charAt(0)){if("]"!=n.charAt(n.length-1))return"Invalid host";if(!(e=z(n.slice(1,-1))))return"Invalid host";t.host=e}else if(X(t)){if(n=g(n),_.test(n))return"Invalid host";if(null===(e=M(n)))return"Invalid host";t.host=e}else{if(U.test(n))return"Invalid host";for(e="",r=h(n),o=0;o<r.length;o++)e+=G(r[o],q);t.host=e}},M=function(t){var n,e,r,o,i,a,u,c=t.split(".");if(c.length&&""==c[c.length-1]&&c.pop(),(n=c.length)>4)return t;for(e=[],r=0;r<n;r++){if(""==(o=c[r]))return t;if(i=10,o.length>1&&"0"==o.charAt(0)&&(i=k.test(o)?16:8,o=o.slice(8==i?1:2)),""===o)a=0;else{if(!(10==i?L:8==i?P:T).test(o))return t;a=parseInt(o,i)}e.push(a)}for(r=0;r<n;r++)if(a=e[r],r==n-1){if(a>=R(256,5-n))return null}else if(a>255)return null;for(u=e.pop(),r=0;r<e.length;r++)u+=e[r]*R(256,3-r);return u},z=function(t){var n,e,r,o,i,a,u,c=[0,0,0,0,0,0,0,0],f=0,s=null,l=0,p=function(){return t.charAt(l)};if(":"==p()){if(":"!=t.charAt(1))return;l+=2,s=++f}for(;p();){if(8==f)return;if(":"!=p()){for(n=e=0;e<4&&T.test(p());)n=16*n+parseInt(p(),16),l++,e++;if("."==p()){if(0==e)return;if(l-=e,f>6)return;for(r=0;p();){if(o=null,r>0){if(!("."==p()&&r<4))return;l++}if(!I.test(p()))return;for(;I.test(p());){if(i=parseInt(p(),10),null===o)o=i;else{if(0==o)return;o=10*o+i}if(o>255)return;l++}c[f]=256*c[f]+o,2!=++r&&4!=r||f++}if(4!=r)return;break}if(":"==p()){if(l++,!p())return}else if(p())return;c[f++]=n}else{if(null!==s)return;l++,s=++f}}if(null!==s)for(a=f-s,f=7;0!=f&&a>0;)u=c[f],c[f--]=c[s+a-1],c[s+--a]=u;else if(8!=f)return;return c},D=function(t){var n,e,r,o;if("number"==typeof t){for(n=[],e=0;e<4;e++)n.unshift(t%256),t=O(t/256);return n.join(".")}if("object"==typeof t){for(n="",r=function(t){for(var n=null,e=1,r=null,o=0,i=0;i<8;i++)0!==t[i]?(o>e&&(n=r,e=o),r=null,o=0):(null===r&&(r=i),++o);return o>e&&(n=r,e=o),n}(t),e=0;e<8;e++)o&&0===t[e]||(o&&(o=!1),r===e?(n+=e?":":"::",o=!0):(n+=t[e].toString(16),e<7&&(n+=":")));return"["+n+"]"}return t},q={},B=p({},q,{" ":1,'"':1,"<":1,">":1,"`":1}),W=p({},B,{"#":1,"?":1,"{":1,"}":1}),$=p({},W,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),G=function(t,n){var e=v(t,0);return e>32&&e<127&&!l(n,t)?t:encodeURIComponent(t)},V={ftp:21,file:null,http:80,https:443,ws:80,wss:443},X=function(t){return l(V,t.scheme)},Y=function(t){return""!=t.username||""!=t.password},K=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},J=function(t,n){var e;return 2==t.length&&A.test(t.charAt(0))&&(":"==(e=t.charAt(1))||!n&&"|"==e)},H=function(t){var n;return t.length>1&&J(t.slice(0,2))&&(2==t.length||"/"===(n=t.charAt(2))||"\\"===n||"?"===n||"#"===n)},Q=function(t){var n=t.path,e=n.length;!e||"file"==t.scheme&&1==e&&J(n[0],!0)||n.pop()},Z=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},nt={},et={},rt={},ot={},it={},at={},ut={},ct={},ft={},st={},lt={},pt={},ht={},vt={},gt={},dt={},yt={},xt={},mt={},bt={},St=function(t,n,e,o){var i,a,u,c,f,s=e||tt,p=0,v="",g=!1,d=!1,y=!1;for(e||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,n=n.replace(N,"")),n=n.replace(C,""),i=h(n);p<=i.length;){switch(a=i[p],s){case tt:if(!a||!A.test(a)){if(e)return"Invalid scheme";s=et;continue}v+=a.toLowerCase(),s=nt;break;case nt:if(a&&(j.test(a)||"+"==a||"-"==a||"."==a))v+=a.toLowerCase();else{if(":"!=a){if(e)return"Invalid scheme";v="",s=et,p=0;continue}if(e&&(X(t)!=l(V,v)||"file"==v&&(Y(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=v,e)return void(X(t)&&V[t.scheme]==t.port&&(t.port=null));v="","file"==t.scheme?s=ht:X(t)&&o&&o.scheme==t.scheme?s=rt:X(t)?s=ut:"/"==i[p+1]?(s=ot,p++):(t.cannotBeABaseURL=!0,t.path.push(""),s=xt)}break;case et:if(!o||o.cannotBeABaseURL&&"#"!=a)return"Invalid scheme";if(o.cannotBeABaseURL&&"#"==a){t.scheme=o.scheme,t.path=o.path.slice(),t.query=o.query,t.fragment="",t.cannotBeABaseURL=!0,s=bt;break}s="file"==o.scheme?ht:it;continue;case rt:if("/"!=a||"/"!=i[p+1]){s=it;continue}s=ct,p++;break;case ot:if("/"==a){s=ft;break}s=yt;continue;case it:if(t.scheme=o.scheme,a==r)t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.query=o.query;else if("/"==a||"\\"==a&&X(t))s=at;else if("?"==a)t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.query="",s=mt;else{if("#"!=a){t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.path.pop(),s=yt;continue}t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,t.path=o.path.slice(),t.query=o.query,t.fragment="",s=bt}break;case at:if(!X(t)||"/"!=a&&"\\"!=a){if("/"!=a){t.username=o.username,t.password=o.password,t.host=o.host,t.port=o.port,s=yt;continue}s=ft}else s=ct;break;case ut:if(s=ct,"/"!=a||"/"!=v.charAt(p+1))continue;p++;break;case ct:if("/"!=a&&"\\"!=a){s=ft;continue}break;case ft:if("@"==a){g&&(v="%40"+v),g=!0,u=h(v);for(var x=0;x<u.length;x++){var m=u[x];if(":"!=m||y){var b=G(m,$);y?t.password+=b:t.username+=b}else y=!0}v=""}else if(a==r||"/"==a||"?"==a||"#"==a||"\\"==a&&X(t)){if(g&&""==v)return"Invalid authority";p-=h(v).length+1,v="",s=st}else v+=a;break;case st:case lt:if(e&&"file"==t.scheme){s=gt;continue}if(":"!=a||d){if(a==r||"/"==a||"?"==a||"#"==a||"\\"==a&&X(t)){if(X(t)&&""==v)return"Invalid host";if(e&&""==v&&(Y(t)||null!==t.port))return;if(c=F(t,v))return c;if(v="",s=dt,e)return;continue}"["==a?d=!0:"]"==a&&(d=!1),v+=a}else{if(""==v)return"Invalid host";if(c=F(t,v))return c;if(v="",s=pt,e==lt)return}break;case pt:if(!I.test(a)){if(a==r||"/"==a||"?"==a||"#"==a||"\\"==a&&X(t)||e){if(""!=v){var S=parseInt(v,10);if(S>65535)return"Invalid port";t.port=X(t)&&S===V[t.scheme]?null:S,v=""}if(e)return;s=dt;continue}return"Invalid port"}v+=a;break;case ht:if(t.scheme="file","/"==a||"\\"==a)s=vt;else{if(!o||"file"!=o.scheme){s=yt;continue}if(a==r)t.host=o.host,t.path=o.path.slice(),t.query=o.query;else if("?"==a)t.host=o.host,t.path=o.path.slice(),t.query="",s=mt;else{if("#"!=a){H(i.slice(p).join(""))||(t.host=o.host,t.path=o.path.slice(),Q(t)),s=yt;continue}t.host=o.host,t.path=o.path.slice(),t.query=o.query,t.fragment="",s=bt}}break;case vt:if("/"==a||"\\"==a){s=gt;break}o&&"file"==o.scheme&&!H(i.slice(p).join(""))&&(J(o.path[0],!0)?t.path.push(o.path[0]):t.host=o.host),s=yt;continue;case gt:if(a==r||"/"==a||"\\"==a||"?"==a||"#"==a){if(!e&&J(v))s=yt;else if(""==v){if(t.host="",e)return;s=dt}else{if(c=F(t,v))return c;if("localhost"==t.host&&(t.host=""),e)return;v="",s=dt}continue}v+=a;break;case dt:if(X(t)){if(s=yt,"/"!=a&&"\\"!=a)continue}else if(e||"?"!=a)if(e||"#"!=a){if(a!=r&&(s=yt,"/"!=a))continue}else t.fragment="",s=bt;else t.query="",s=mt;break;case yt:if(a==r||"/"==a||"\\"==a&&X(t)||!e&&("?"==a||"#"==a)){if(".."===(f=(f=v).toLowerCase())||"%2e."===f||".%2e"===f||"%2e%2e"===f?(Q(t),"/"==a||"\\"==a&&X(t)||t.path.push("")):Z(v)?"/"==a||"\\"==a&&X(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&J(v)&&(t.host&&(t.host=""),v=v.charAt(0)+":"),t.path.push(v)),v="","file"==t.scheme&&(a==r||"?"==a||"#"==a))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==a?(t.query="",s=mt):"#"==a&&(t.fragment="",s=bt)}else v+=G(a,W);break;case xt:"?"==a?(t.query="",s=mt):"#"==a?(t.fragment="",s=bt):a!=r&&(t.path[0]+=G(a,q));break;case mt:e||"#"!=a?a!=r&&("'"==a&&X(t)?t.query+="%27":t.query+="#"==a?"%23":G(a,q)):(t.fragment="",s=bt);break;case bt:a!=r&&(t.fragment+=G(a,B))}p++}},Et=function(t){var n,e,r=s(this,Et,"URL"),o=arguments.length>1?arguments[1]:void 0,a=String(t),u=E(r,{type:"URL"});if(void 0!==o)if(o instanceof Et)n=w(o);else if(e=St(n={},String(o)))throw TypeError(e);if(e=St(u,a,null,n))throw TypeError(e);var c=u.searchParams=new b,f=S(c);f.updateSearchParams(u.query),f.updateURL=function(){u.query=String(c)||null},i||(r.href=Ot.call(r),r.origin=Rt.call(r),r.protocol=At.call(r),r.username=jt.call(r),r.password=It.call(r),r.host=kt.call(r),r.hostname=Pt.call(r),r.port=Lt.call(r),r.pathname=Tt.call(r),r.search=_t.call(r),r.searchParams=Ut.call(r),r.hash=Nt.call(r))},wt=Et.prototype,Ot=function(){var t=w(this),n=t.scheme,e=t.username,r=t.password,o=t.host,i=t.port,a=t.path,u=t.query,c=t.fragment,f=n+":";return null!==o?(f+="//",Y(t)&&(f+=e+(r?":"+r:"")+"@"),f+=D(o),null!==i&&(f+=":"+i)):"file"==n&&(f+="//"),f+=t.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==u&&(f+="?"+u),null!==c&&(f+="#"+c),f},Rt=function(){var t=w(this),n=t.scheme,e=t.port;if("blob"==n)try{return new URL(n.path[0]).origin}catch(t){return"null"}return"file"!=n&&X(t)?n+"://"+D(t.host)+(null!==e?":"+e:""):"null"},At=function(){return w(this).scheme+":"},jt=function(){return w(this).username},It=function(){return w(this).password},kt=function(){var t=w(this),n=t.host,e=t.port;return null===n?"":null===e?D(n):D(n)+":"+e},Pt=function(){var t=w(this).host;return null===t?"":D(t)},Lt=function(){var t=w(this).port;return null===t?"":String(t)},Tt=function(){var t=w(this),n=t.path;return t.cannotBeABaseURL?n[0]:n.length?"/"+n.join("/"):""},_t=function(){var t=w(this).query;return t?"?"+t:""},Ut=function(){return w(this).searchParams},Nt=function(){var t=w(this).fragment;return t?"#"+t:""},Ct=function(t,n){return{get:t,set:n,configurable:!0,enumerable:!0}};if(i&&c(wt,{href:Ct(Ot,(function(t){var n=w(this),e=String(t),r=St(n,e);if(r)throw TypeError(r);S(n.searchParams).updateSearchParams(n.query)})),origin:Ct(Rt),protocol:Ct(At,(function(t){var n=w(this);St(n,String(t)+":",tt)})),username:Ct(jt,(function(t){var n=w(this),e=h(String(t));if(!K(n)){n.username="";for(var r=0;r<e.length;r++)n.username+=G(e[r],$)}})),password:Ct(It,(function(t){var n=w(this),e=h(String(t));if(!K(n)){n.password="";for(var r=0;r<e.length;r++)n.password+=G(e[r],$)}})),host:Ct(kt,(function(t){var n=w(this);n.cannotBeABaseURL||St(n,String(t),st)})),hostname:Ct(Pt,(function(t){var n=w(this);n.cannotBeABaseURL||St(n,String(t),lt)})),port:Ct(Lt,(function(t){var n=w(this);K(n)||(""==(t=String(t))?n.port=null:St(n,t,pt))})),pathname:Ct(Tt,(function(t){var n=w(this);n.cannotBeABaseURL||(n.path=[],St(n,t+"",dt))})),search:Ct(_t,(function(t){var n=w(this);""==(t=String(t))?n.query=null:("?"==t.charAt(0)&&(t=t.slice(1)),n.query="",St(n,t,mt)),S(n.searchParams).updateSearchParams(n.query)})),searchParams:Ct(Ut),hash:Ct(Nt,(function(t){var n=w(this);""!=(t=String(t))?("#"==t.charAt(0)&&(t=t.slice(1)),n.fragment="",St(n,t,bt)):n.fragment=null}))}),f(wt,"toJSON",(function(){return Ot.call(this)}),{enumerable:!0}),f(wt,"toString",(function(){return Ot.call(this)}),{enumerable:!0}),m){var Ft=m.createObjectURL,Mt=m.revokeObjectURL;Ft&&f(Et,"createObjectURL",(function(t){return Ft.apply(m,arguments)})),Mt&&f(Et,"revokeObjectURL",(function(t){return Mt.apply(m,arguments)}))}d(Et,"URL"),o({global:!0,forced:!a,sham:!i},{URL:Et})},function(t,n,e){var r=e(6),o=e(49),i=e(29),a=o("iterator");t.exports=!r((function(){var t=new URL("b?a=1&b=2&c=3","http://a"),n=t.searchParams,e="";return t.pathname="c%20d",n.forEach((function(t,r){n.delete("b"),e+=r+t})),i&&!t.toJSON||!n.sort||"http://a/c%20d?a=1&c=3"!==t.href||"3"!==n.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!n[a]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==e||"x"!==new URL("http://x",void 0).host}))},function(t,n,e){var r=/[^\0-\u007E]/,o=/[.\u3002\uFF0E\uFF61]/g,i="Overflow: input needs wider integers to process",a=Math.floor,u=String.fromCharCode,c=function(t){return t+22+75*(t<26)},f=function(t,n,e){var r=0;for(t=e?a(t/700):t>>1,t+=a(t/n);t>455;r+=36)t=a(t/35);return a(r+36*t/(t+38))},s=function(t){var n,e,r=[],o=(t=function(t){for(var n=[],e=0,r=t.length;e<r;){var o=t.charCodeAt(e++);if(o>=55296&&o<=56319&&e<r){var i=t.charCodeAt(e++);56320==(64512&i)?n.push(((1023&o)<<10)+(1023&i)+65536):(n.push(o),e--)}else n.push(o)}return n}(t)).length,s=128,l=0,p=72;for(n=0;n<t.length;n++)(e=t[n])<128&&r.push(u(e));var h=r.length,v=h;for(h&&r.push("-");v<o;){var g=2147483647;for(n=0;n<t.length;n++)(e=t[n])>=s&&e<g&&(g=e);var d=v+1;if(g-s>a((2147483647-l)/d))throw RangeError(i);for(l+=(g-s)*d,s=g,n=0;n<t.length;n++){if((e=t[n])<s&&++l>2147483647)throw RangeError(i);if(e==s){for(var y=l,x=36;;x+=36){var m=x<=p?1:x>=p+26?26:x-p;if(y<m)break;var b=y-m,S=36-m;r.push(u(c(m+b%S))),y=a(b/S)}r.push(u(c(y))),p=f(l,d,v==h),l=0,++v}}++l,++s}return r.join("")};t.exports=function(t){var n,e,i=[],a=t.toLowerCase().replace(o,".").split(".");for(n=0;n<a.length;n++)e=a[n],i.push(r.test(e)?"xn--"+s(e):e);return i.join(".")}},function(t,n,e){e(89);var r=e(2),o=e(34),i=e(244),a=e(21),u=e(126),c=e(95),f=e(91),s=e(25),l=e(123),p=e(15),h=e(64),v=e(84),g=e(20),d=e(14),y=e(58),x=e(8),m=e(247),b=e(83),S=e(49),E=o("fetch"),w=o("Headers"),O=S("iterator"),R=s.set,A=s.getterFor("URLSearchParams"),j=s.getterFor("URLSearchParamsIterator"),I=/\+/g,k=Array(4),P=function(t){return k[t-1]||(k[t-1]=RegExp("((?:%[\\da-f]{2}){"+t+"})","gi"))},L=function(t){try{return decodeURIComponent(t)}catch(n){return t}},T=function(t){var n=t.replace(I," "),e=4;try{return decodeURIComponent(n)}catch(t){for(;e;)n=n.replace(P(e--),L);return n}},_=/[!'()~]|%20/g,U={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},N=function(t){return U[t]},C=function(t){return encodeURIComponent(t).replace(_,N)},F=function(t,n){if(n)for(var e,r,o=n.split("&"),i=0;i<o.length;)(e=o[i++]).length&&(r=e.split("="),t.push({key:T(r.shift()),value:T(r.join("="))}))},M=function(t){this.entries.length=0,F(this.entries,t)},z=function(t,n){if(t<n)throw TypeError("Not enough arguments")},D=f((function(t,n){R(this,{type:"URLSearchParamsIterator",iterator:m(A(t).entries),kind:n})}),"Iterator",(function(){var t=j(this),n=t.kind,e=t.iterator.next(),r=e.value;return e.done||(e.value="keys"===n?r.key:"values"===n?r.value:[r.key,r.value]),e})),q=function(){l(this,q,"URLSearchParams");var t,n,e,r,o,i,a,u,c,f=arguments.length>0?arguments[0]:void 0,s=this,h=[];if(R(s,{type:"URLSearchParams",entries:h,updateURL:function(){},updateSearchParams:M}),void 0!==f)if(d(f))if("function"==typeof(t=b(f)))for(e=(n=t.call(f)).next;!(r=e.call(n)).done;){if((a=(i=(o=m(g(r.value))).next).call(o)).done||(u=i.call(o)).done||!i.call(o).done)throw TypeError("Expected sequence with length 2");h.push({key:a.value+"",value:u.value+""})}else for(c in f)p(f,c)&&h.push({key:c,value:f[c]+""});else F(h,"string"==typeof f?"?"===f.charAt(0)?f.slice(1):f:f+"")},B=q.prototype;u(B,{append:function(t,n){z(arguments.length,2);var e=A(this);e.entries.push({key:t+"",value:n+""}),e.updateURL()},delete:function(t){z(arguments.length,1);for(var n=A(this),e=n.entries,r=t+"",o=0;o<e.length;)e[o].key===r?e.splice(o,1):o++;n.updateURL()},get:function(t){z(arguments.length,1);for(var n=A(this).entries,e=t+"",r=0;r<n.length;r++)if(n[r].key===e)return n[r].value;return null},getAll:function(t){z(arguments.length,1);for(var n=A(this).entries,e=t+"",r=[],o=0;o<n.length;o++)n[o].key===e&&r.push(n[o].value);return r},has:function(t){z(arguments.length,1);for(var n=A(this).entries,e=t+"",r=0;r<n.length;)if(n[r++].key===e)return!0;return!1},set:function(t,n){z(arguments.length,1);for(var e,r=A(this),o=r.entries,i=!1,a=t+"",u=n+"",c=0;c<o.length;c++)(e=o[c]).key===a&&(i?o.splice(c--,1):(i=!0,e.value=u));i||o.push({key:a,value:u}),r.updateURL()},sort:function(){var t,n,e,r=A(this),o=r.entries,i=o.slice();for(o.length=0,e=0;e<i.length;e++){for(t=i[e],n=0;n<e;n++)if(o[n].key>t.key){o.splice(n,0,t);break}n===e&&o.push(t)}r.updateURL()},forEach:function(t){for(var n,e=A(this).entries,r=h(t,arguments.length>1?arguments[1]:void 0,3),o=0;o<e.length;)r((n=e[o++]).value,n.key,this)},keys:function(){return new D(this,"keys")},values:function(){return new D(this,"values")},entries:function(){return new D(this,"entries")}},{enumerable:!0}),a(B,O,B.entries),a(B,"toString",(function(){for(var t,n=A(this).entries,e=[],r=0;r<n.length;)t=n[r++],e.push(C(t.key)+"="+C(t.value));return e.join("&")}),{enumerable:!0}),c(q,"URLSearchParams"),r({global:!0,forced:!i},{URLSearchParams:q}),i||"function"!=typeof E||"function"!=typeof w||r({global:!0,enumerable:!0,forced:!0},{fetch:function(t){var n,e,r,o=[t];return arguments.length>1&&(n=arguments[1],d(n)&&(e=n.body,"URLSearchParams"===v(e)&&((r=n.headers?new w(n.headers):new w).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),n=y(n,{body:x(0,String(e)),headers:x(0,r)}))),o.push(n)),E.apply(this,o)}}),t.exports={URLSearchParams:q,getState:A}},function(t,n,e){var r=e(20),o=e(83);t.exports=function(t){var n=o(t);if("function"!=typeof n)throw TypeError(String(t)+" is not iterable");return r(n.call(t))}},function(t,n,e){e(2)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})}])}();
+
+//!fetch 3.0.0, global "this" must be replaced with "window"
+// IIFE version
+!function(t){"use strict";var e="URLSearchParams"in self,r="Symbol"in self&&"iterator"in Symbol,o="FileReader"in self&&"Blob"in self&&function(){try{return new Blob,!0}catch(t){return!1}}(),n="FormData"in self,i="ArrayBuffer"in self;if(i)var s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],a=ArrayBuffer.isView||function(t){return t&&s.indexOf(Object.prototype.toString.call(t))>-1};function h(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function u(t){return"string"!=typeof t&&(t=String(t)),t}function f(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return r&&(e[Symbol.iterator]=function(){return e}),e}function d(t){this.map={},t instanceof d?t.forEach((function(t,e){this.append(e,t)}),this):Array.isArray(t)?t.forEach((function(t){this.append(t[0],t[1])}),this):t&&Object.getOwnPropertyNames(t).forEach((function(e){this.append(e,t[e])}),this)}function c(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function p(t){return new Promise((function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}}))}function y(t){var e=new FileReader,r=p(e);return e.readAsArrayBuffer(t),r}function l(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(t){var r;this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:n&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:e&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():i&&o&&((r=t)&&DataView.prototype.isPrototypeOf(r))?(this._bodyArrayBuffer=l(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):i&&(ArrayBuffer.prototype.isPrototypeOf(t)||a(t))?this._bodyArrayBuffer=l(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=c(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?c(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(y)}),this.text=function(){var t,e,r,o=c(this);if(o)return o;if(this._bodyBlob)return t=this._bodyBlob,e=new FileReader,r=p(e),e.readAsText(t),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),o=0;o<e.length;o++)r[o]=String.fromCharCode(e[o]);return r.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},n&&(this.formData=function(){return this.text().then(v)}),this.json=function(){return this.text().then(JSON.parse)},this}d.prototype.append=function(t,e){t=h(t),e=u(e);var r=this.map[t];this.map[t]=r?r+", "+e:e},d.prototype.delete=function(t){delete this.map[h(t)]},d.prototype.get=function(t){return t=h(t),this.has(t)?this.map[t]:null},d.prototype.has=function(t){return this.map.hasOwnProperty(h(t))},d.prototype.set=function(t,e){this.map[h(t)]=u(e)},d.prototype.forEach=function(t,e){for(var r in this.map)this.map.hasOwnProperty(r)&&t.call(e,this.map[r],r,this)},d.prototype.keys=function(){var t=[];return this.forEach((function(e,r){t.push(r)})),f(t)},d.prototype.values=function(){var t=[];return this.forEach((function(e){t.push(e)})),f(t)},d.prototype.entries=function(){var t=[];return this.forEach((function(e,r){t.push([r,e])})),f(t)},r&&(d.prototype[Symbol.iterator]=d.prototype.entries);var m=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function w(t,e){var r,o,n=(e=e||{}).body;if(t instanceof w){if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new d(t.headers)),this.method=t.method,this.mode=t.mode,this.signal=t.signal,n||null==t._bodyInit||(n=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||"same-origin",!e.headers&&this.headers||(this.headers=new d(e.headers)),this.method=(r=e.method||this.method||"GET",o=r.toUpperCase(),m.indexOf(o)>-1?o:r),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function v(t){var e=new FormData;return t.trim().split("&").forEach((function(t){if(t){var r=t.split("="),o=r.shift().replace(/\+/g," "),n=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(o),decodeURIComponent(n))}})),e}function E(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new d(e.headers),this.url=e.url||"",this._initBody(t)}w.prototype.clone=function(){return new w(this,{body:this._bodyInit})},b.call(w.prototype),b.call(E.prototype),E.prototype.clone=function(){return new E(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new d(this.headers),url:this.url})},E.error=function(){var t=new E(null,{status:0,statusText:""});return t.type="error",t};var A=[301,302,303,307,308];E.redirect=function(t,e){if(-1===A.indexOf(e))throw new RangeError("Invalid status code");return new E(null,{status:e,headers:{location:t}})},t.DOMException=self.DOMException;try{new t.DOMException}catch(e){t.DOMException=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack},t.DOMException.prototype=Object.create(Error.prototype),t.DOMException.prototype.constructor=t.DOMException}function _(e,r){return new Promise((function(n,i){var s=new w(e,r);if(s.signal&&s.signal.aborted)return i(new t.DOMException("Aborted","AbortError"));var a=new XMLHttpRequest;function h(){a.abort()}a.onload=function(){var t,e,r={status:a.status,statusText:a.statusText,headers:(t=a.getAllResponseHeaders()||"",e=new d,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach((function(t){var r=t.split(":"),o=r.shift().trim();if(o){var n=r.join(":").trim();e.append(o,n)}})),e)};r.url="responseURL"in a?a.responseURL:r.headers.get("X-Request-URL");var o="response"in a?a.response:a.responseText;n(new E(o,r))},a.onerror=function(){i(new TypeError("Network request failed"))},a.ontimeout=function(){i(new TypeError("Network request failed"))},a.onabort=function(){i(new t.DOMException("Aborted","AbortError"))},a.open(s.method,s.url,!0),"include"===s.credentials?a.withCredentials=!0:"omit"===s.credentials&&(a.withCredentials=!1),"responseType"in a&&o&&(a.responseType="blob"),s.headers.forEach((function(t,e){a.setRequestHeader(e,t)})),s.signal&&(s.signal.addEventListener("abort",h),a.onreadystatechange=function(){4===a.readyState&&s.signal.removeEventListener("abort",h)}),a.send(void 0===s._bodyInit?null:s._bodyInit)}))}_.polyfill=!0,self.fetch||(self.fetch=_,self.Headers=d,self.Request=w,self.Response=E),t.Headers=d,t.Request=w,t.Response=E,t.fetch=_}({});
+
+(function(){
+  /*
+    Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+    This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+    The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+    The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+    Code distributed by Google as part of the polymer project is also
+    subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+  */
+  'use strict';var aa=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function g(a){var b=aa.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function l(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}
+  function n(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
+  function p(a,b,d){d=void 0===d?new Set:d;for(var c=a;c;){if(c.nodeType===Node.ELEMENT_NODE){var e=c;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){c=e.import;if(c instanceof Node&&!d.has(c))for(d.add(c),c=c.firstChild;c;c=c.nextSibling)p(c,b,d);c=n(a,e);continue}else if("template"===f){c=n(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)p(e,b,d)}c=c.firstChild?c.firstChild:n(a,c)}}function r(a,b,d){a[b]=d};function u(){this.a=new Map;this.g=new Map;this.c=[];this.f=[];this.b=!1}function ba(a,b,d){a.a.set(b,d);a.g.set(d.constructorFunction,d)}function ca(a,b){a.b=!0;a.c.push(b)}function da(a,b){a.b=!0;a.f.push(b)}function v(a,b){a.b&&p(b,function(b){return w(a,b)})}function w(a,b){if(a.b&&!b.__CE_patched){b.__CE_patched=!0;for(var d=0;d<a.c.length;d++)a.c[d](b);for(d=0;d<a.f.length;d++)a.f[d](b)}}
+  function x(a,b){var d=[];p(b,function(b){return d.push(b)});for(b=0;b<d.length;b++){var c=d[b];1===c.__CE_state?a.connectedCallback(c):y(a,c)}}function z(a,b){var d=[];p(b,function(b){return d.push(b)});for(b=0;b<d.length;b++){var c=d[b];1===c.__CE_state&&a.disconnectedCallback(c)}}
+  function A(a,b,d){d=void 0===d?{}:d;var c=d.u||new Set,e=d.i||function(b){return y(a,b)},f=[];p(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var d=b.import;d instanceof Node&&(d.__CE_isImportDocument=!0,d.__CE_hasRegistry=!0);d&&"complete"===d.readyState?d.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var d=b.import;if(!d.__CE_documentLoadHandled){d.__CE_documentLoadHandled=!0;var f=new Set(c);f.delete(d);A(a,d,{u:f,i:e})}})}else f.push(b)},c);if(a.b)for(b=
+  0;b<f.length;b++)w(a,f[b]);for(b=0;b<f.length;b++)e(f[b])}
+  function y(a,b){if(void 0===b.__CE_state){var d=b.ownerDocument;if(d.defaultView||d.__CE_isImportDocument&&d.__CE_hasRegistry)if(d=a.a.get(b.localName)){d.constructionStack.push(b);var c=d.constructorFunction;try{try{if(new c!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{d.constructionStack.pop()}}catch(t){throw b.__CE_state=2,t;}b.__CE_state=1;b.__CE_definition=d;if(d.attributeChangedCallback)for(d=d.observedAttributes,c=0;c<d.length;c++){var e=
+  d[c],f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}l(b)&&a.connectedCallback(b)}}}u.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};u.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
+  u.prototype.attributeChangedCallback=function(a,b,d,c,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,d,c,e)};function B(a){var b=document;this.c=a;this.a=b;this.b=void 0;A(this.c,this.a);"loading"===this.a.readyState&&(this.b=new MutationObserver(this.f.bind(this)),this.b.observe(this.a,{childList:!0,subtree:!0}))}function C(a){a.b&&a.b.disconnect()}B.prototype.f=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||C(this);for(b=0;b<a.length;b++)for(var d=a[b].addedNodes,c=0;c<d.length;c++)A(this.c,d[c])};function ea(){var a=this;this.b=this.a=void 0;this.c=new Promise(function(b){a.b=b;a.a&&b(a.a)})}function D(a){if(a.a)throw Error("Already resolved.");a.a=void 0;a.b&&a.b(void 0)};function E(a){this.c=!1;this.a=a;this.j=new Map;this.f=function(b){return b()};this.b=!1;this.g=[];this.o=new B(a)}
+  E.prototype.l=function(a,b){var d=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!g(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.a.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.c)throw Error("A custom element is already being defined.");this.c=!0;try{var c=function(b){var a=e[b];if(void 0!==a&&!(a instanceof Function))throw Error("The '"+b+"' callback must be a function.");
+  return a},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=c("connectedCallback");var t=c("disconnectedCallback");var k=c("adoptedCallback");var h=c("attributeChangedCallback");var m=b.observedAttributes||[]}catch(q){return}finally{this.c=!1}b={localName:a,constructorFunction:b,connectedCallback:f,disconnectedCallback:t,adoptedCallback:k,attributeChangedCallback:h,observedAttributes:m,constructionStack:[]};ba(this.a,
+  a,b);this.g.push(b);this.b||(this.b=!0,this.f(function(){return fa(d)}))};E.prototype.i=function(a){A(this.a,a)};
+  function fa(a){if(!1!==a.b){a.b=!1;for(var b=a.g,d=[],c=new Map,e=0;e<b.length;e++)c.set(b[e].localName,[]);A(a.a,document,{i:function(b){if(void 0===b.__CE_state){var e=b.localName,f=c.get(e);f?f.push(b):a.a.a.get(e)&&d.push(b)}}});for(e=0;e<d.length;e++)y(a.a,d[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=c.get(f.localName);for(var t=0;t<f.length;t++)y(a.a,f[t]);(e=a.j.get(e))&&D(e)}}}E.prototype.get=function(a){if(a=this.a.a.get(a))return a.constructorFunction};
+  E.prototype.m=function(a){if(!g(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.j.get(a);if(b)return b.c;b=new ea;this.j.set(a,b);this.a.a.get(a)&&!this.g.some(function(b){return b.localName===a})&&D(b);return b.c};E.prototype.s=function(a){C(this.o);var b=this.f;this.f=function(d){return a(function(){return b(d)})}};window.CustomElementRegistry=E;E.prototype.define=E.prototype.l;E.prototype.upgrade=E.prototype.i;E.prototype.get=E.prototype.get;
+  E.prototype.whenDefined=E.prototype.m;E.prototype.polyfillWrapFlushCallback=E.prototype.s;var F=window.Document.prototype.createElement,G=window.Document.prototype.createElementNS,ha=window.Document.prototype.importNode,ia=window.Document.prototype.prepend,ja=window.Document.prototype.append,ka=window.DocumentFragment.prototype.prepend,la=window.DocumentFragment.prototype.append,H=window.Node.prototype.cloneNode,I=window.Node.prototype.appendChild,J=window.Node.prototype.insertBefore,K=window.Node.prototype.removeChild,L=window.Node.prototype.replaceChild,M=Object.getOwnPropertyDescriptor(window.Node.prototype,
+  "textContent"),N=window.Element.prototype.attachShadow,O=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),P=window.Element.prototype.getAttribute,Q=window.Element.prototype.setAttribute,R=window.Element.prototype.removeAttribute,S=window.Element.prototype.getAttributeNS,T=window.Element.prototype.setAttributeNS,U=window.Element.prototype.removeAttributeNS,ma=window.Element.prototype.insertAdjacentElement,na=window.Element.prototype.insertAdjacentHTML,oa=window.Element.prototype.prepend,
+  pa=window.Element.prototype.append,V=window.Element.prototype.before,qa=window.Element.prototype.after,ra=window.Element.prototype.replaceWith,sa=window.Element.prototype.remove,ta=window.HTMLElement,W=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),ua=window.HTMLElement.prototype.insertAdjacentElement,va=window.HTMLElement.prototype.insertAdjacentHTML;var wa=new function(){};function xa(){var a=X;window.HTMLElement=function(){function b(){var b=this.constructor,c=a.g.get(b);if(!c)throw Error("The custom element being constructed was not registered with `customElements`.");var e=c.constructionStack;if(0===e.length)return e=F.call(document,c.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=c,w(a,e),e;c=e.length-1;var f=e[c];if(f===wa)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
+  e[c]=wa;Object.setPrototypeOf(f,b.prototype);w(a,f);return f}b.prototype=ta.prototype;Object.defineProperty(b.prototype,"constructor",{writable:!0,configurable:!0,enumerable:!1,value:b});return b}()};function Y(a,b,d){function c(b){return function(d){for(var e=[],c=0;c<arguments.length;++c)e[c]=arguments[c];c=[];for(var f=[],m=0;m<e.length;m++){var q=e[m];q instanceof Element&&l(q)&&f.push(q);if(q instanceof DocumentFragment)for(q=q.firstChild;q;q=q.nextSibling)c.push(q);else c.push(q)}b.apply(this,e);for(e=0;e<f.length;e++)z(a,f[e]);if(l(this))for(e=0;e<c.length;e++)f=c[e],f instanceof Element&&x(a,f)}}void 0!==d.h&&(b.prepend=c(d.h));void 0!==d.append&&(b.append=c(d.append))};function ya(){var a=X;r(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var d=a.a.get(b);if(d)return new d.constructorFunction}b=F.call(this,b);w(a,b);return b});r(Document.prototype,"importNode",function(b,d){b=ha.call(this,b,!!d);this.__CE_hasRegistry?A(a,b):v(a,b);return b});r(Document.prototype,"createElementNS",function(b,d){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var c=a.a.get(d);if(c)return new c.constructorFunction}b=G.call(this,b,
+  d);w(a,b);return b});Y(a,Document.prototype,{h:ia,append:ja})};function za(){function a(a,c){Object.defineProperty(a,"textContent",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(a){if(this.nodeType===Node.TEXT_NODE)c.set.call(this,a);else{var d=void 0;if(this.firstChild){var e=this.childNodes,k=e.length;if(0<k&&l(this)){d=Array(k);for(var h=0;h<k;h++)d[h]=e[h]}}c.set.call(this,a);if(d)for(a=0;a<d.length;a++)z(b,d[a])}}})}var b=X;r(Node.prototype,"insertBefore",function(a,c){if(a instanceof DocumentFragment){var e=Array.prototype.slice.apply(a.childNodes);
+  a=J.call(this,a,c);if(l(this))for(c=0;c<e.length;c++)x(b,e[c]);return a}e=l(a);c=J.call(this,a,c);e&&z(b,a);l(this)&&x(b,a);return c});r(Node.prototype,"appendChild",function(a){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);a=I.call(this,a);if(l(this))for(var e=0;e<c.length;e++)x(b,c[e]);return a}c=l(a);e=I.call(this,a);c&&z(b,a);l(this)&&x(b,a);return e});r(Node.prototype,"cloneNode",function(a){a=H.call(this,!!a);this.ownerDocument.__CE_hasRegistry?A(b,a):v(b,
+  a);return a});r(Node.prototype,"removeChild",function(a){var c=l(a),e=K.call(this,a);c&&z(b,a);return e});r(Node.prototype,"replaceChild",function(a,c){if(a instanceof DocumentFragment){var e=Array.prototype.slice.apply(a.childNodes);a=L.call(this,a,c);if(l(this))for(z(b,c),c=0;c<e.length;c++)x(b,e[c]);return a}e=l(a);var f=L.call(this,a,c),d=l(this);d&&z(b,c);e&&z(b,a);d&&x(b,a);return f});M&&M.get?a(Node.prototype,M):ca(b,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){for(var a=[],
+  b=0;b<this.childNodes.length;b++){var f=this.childNodes[b];f.nodeType!==Node.COMMENT_NODE&&a.push(f.textContent)}return a.join("")},set:function(a){for(;this.firstChild;)K.call(this,this.firstChild);null!=a&&""!==a&&I.call(this,document.createTextNode(a))}})})};function Aa(a){function b(b){return function(e){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];d=[];for(var k=[],h=0;h<c.length;h++){var m=c[h];m instanceof Element&&l(m)&&k.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)d.push(m);else d.push(m)}b.apply(this,c);for(c=0;c<k.length;c++)z(a,k[c]);if(l(this))for(c=0;c<d.length;c++)k=d[c],k instanceof Element&&x(a,k)}}var d=Element.prototype;void 0!==V&&(d.before=b(V));void 0!==V&&(d.after=b(qa));void 0!==ra&&
+  r(d,"replaceWith",function(b){for(var e=[],c=0;c<arguments.length;++c)e[c]=arguments[c];c=[];for(var d=[],k=0;k<e.length;k++){var h=e[k];h instanceof Element&&l(h)&&d.push(h);if(h instanceof DocumentFragment)for(h=h.firstChild;h;h=h.nextSibling)c.push(h);else c.push(h)}k=l(this);ra.apply(this,e);for(e=0;e<d.length;e++)z(a,d[e]);if(k)for(z(a,this),e=0;e<c.length;e++)d=c[e],d instanceof Element&&x(a,d)});void 0!==sa&&r(d,"remove",function(){var b=l(this);sa.call(this);b&&z(a,this)})};function Ba(){function a(a,b){Object.defineProperty(a,"innerHTML",{enumerable:b.enumerable,configurable:!0,get:b.get,set:function(a){var e=this,d=void 0;l(this)&&(d=[],p(this,function(a){a!==e&&d.push(a)}));b.set.call(this,a);if(d)for(var f=0;f<d.length;f++){var t=d[f];1===t.__CE_state&&c.disconnectedCallback(t)}this.ownerDocument.__CE_hasRegistry?A(c,this):v(c,this);return a}})}function b(a,b){r(a,"insertAdjacentElement",function(a,e){var d=l(e);a=b.call(this,a,e);d&&z(c,e);l(a)&&x(c,e);return a})}
+  function d(a,b){function e(a,b){for(var e=[];a!==b;a=a.nextSibling)e.push(a);for(b=0;b<e.length;b++)A(c,e[b])}r(a,"insertAdjacentHTML",function(a,c){a=a.toLowerCase();if("beforebegin"===a){var d=this.previousSibling;b.call(this,a,c);e(d||this.parentNode.firstChild,this)}else if("afterbegin"===a)d=this.firstChild,b.call(this,a,c),e(this.firstChild,d);else if("beforeend"===a)d=this.lastChild,b.call(this,a,c),e(d||this.firstChild,null);else if("afterend"===a)d=this.nextSibling,b.call(this,a,c),e(this.nextSibling,
+  d);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}var c=X;N&&r(Element.prototype,"attachShadow",function(a){a=N.call(this,a);var b=c;if(b.b&&!a.__CE_patched){a.__CE_patched=!0;for(var e=0;e<b.c.length;e++)b.c[e](a)}return this.__CE_shadowRoot=a});O&&O.get?a(Element.prototype,O):W&&W.get?a(HTMLElement.prototype,W):da(c,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){return H.call(this,!0).innerHTML},
+  set:function(a){var b="template"===this.localName,c=b?this.content:this,e=G.call(document,this.namespaceURI,this.localName);for(e.innerHTML=a;0<c.childNodes.length;)K.call(c,c.childNodes[0]);for(a=b?e.content:e;0<a.childNodes.length;)I.call(c,a.childNodes[0])}})});r(Element.prototype,"setAttribute",function(a,b){if(1!==this.__CE_state)return Q.call(this,a,b);var e=P.call(this,a);Q.call(this,a,b);b=P.call(this,a);c.attributeChangedCallback(this,a,e,b,null)});r(Element.prototype,"setAttributeNS",function(a,
+  b,d){if(1!==this.__CE_state)return T.call(this,a,b,d);var e=S.call(this,a,b);T.call(this,a,b,d);d=S.call(this,a,b);c.attributeChangedCallback(this,b,e,d,a)});r(Element.prototype,"removeAttribute",function(a){if(1!==this.__CE_state)return R.call(this,a);var b=P.call(this,a);R.call(this,a);null!==b&&c.attributeChangedCallback(this,a,b,null,null)});r(Element.prototype,"removeAttributeNS",function(a,b){if(1!==this.__CE_state)return U.call(this,a,b);var d=S.call(this,a,b);U.call(this,a,b);var e=S.call(this,
+  a,b);d!==e&&c.attributeChangedCallback(this,b,d,e,a)});ua?b(HTMLElement.prototype,ua):ma?b(Element.prototype,ma):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");va?d(HTMLElement.prototype,va):na?d(Element.prototype,na):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");Y(c,Element.prototype,{h:oa,append:pa});Aa(c)};var Z=window.customElements;if(!Z||Z.forcePolyfill||"function"!=typeof Z.define||"function"!=typeof Z.get){var X=new u;xa();ya();Y(X,DocumentFragment.prototype,{h:ka,append:la});za();Ba();document.__CE_hasRegistry=!0;var customElements=new E(X);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};
+}).call(self);
+
+// Polyfill document.baseURI
+"string"!==typeof document.baseURI&&Object.defineProperty(Document.prototype,"baseURI",{enumerable:!0,configurable:!0,get:function(){var a=document.querySelector("base");return a&&a.href?a.href:document.URL}});
+
+// Polyfill CustomEvent
+"function"!==typeof window.CustomEvent&&(window.CustomEvent=function(c,a){a=a||{bubbles:!1,cancelable:!1,detail:void 0};var b=document.createEvent("CustomEvent");b.initCustomEvent(c,a.bubbles,a.cancelable,a.detail);return b},window.CustomEvent.prototype=window.Event.prototype);
+
+// Event.composedPath
+(function(b,c,d){b.composedPath||(b.composedPath=function(){if(this.path)return this.path;var a=this.target;for(this.path=[];null!==a.parentNode;)this.path.push(a),a=a.parentNode;this.path.push(c,d);return this.path})})(Event.prototype,document,window);
+
+/*!
+Element.closest and Element.matches
+https://github.com/jonathantneal/closest
+Creative Commons Zero v1.0 Universal
+*/
+(function(a){"function"!==typeof a.matches&&(a.matches=a.msMatchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||function(a){a=(this.document||this.ownerDocument).querySelectorAll(a);for(var b=0;a[b]&&a[b]!==this;)++b;return!!a[b]});"function"!==typeof a.closest&&(a.closest=function(a){for(var b=this;b&&1===b.nodeType;){if(b.matches(a))return b;b=b.parentNode}return null})})(window.Element.prototype);
+
+/*!
+Element.getRootNode()
+*/
+(function(c){function d(a){a=b(a);return a&&11===a.nodeType?d(a.host):a}function b(a){return a&&a.parentNode?b(a.parentNode):a}"function"!==typeof c.getRootNode&&(c.getRootNode=function(a){return a&&a.composed?d(this):b(this)})})(Element.prototype);
+
+/*!
+Element.isConnected()
+*/
+(function(a){"isConnected"in a||Object.defineProperty(a,"isConnected",{configurable:!0,enumerable:!0,get:function(){var a=this.getRootNode({composed:!0});return a&&9===a.nodeType}})})(Element.prototype);
+
+/*!
+Element.remove()
+*/
+(function(b){b.forEach(function(a){a.hasOwnProperty("remove")||Object.defineProperty(a,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){null!==this.parentNode&&this.parentNode.removeChild(this)}})})})([Element.prototype,CharacterData.prototype,DocumentType.prototype]);
+
+/*!
+Element.classList
+*/
+!function(e){'classList'in e||Object.defineProperty(e,"classList",{get:function(){var e=this,t=(e.getAttribute("class")||"").replace(/^\s+|\s$/g,"").split(/\s+/g);function n(){t.length>0?e.setAttribute("class",t.join(" ")):e.removeAttribute("class")}return""===t[0]&&t.splice(0,1),t.toggle=function(e,i){void 0!==i?i?t.add(e):t.remove(e):-1!==t.indexOf(e)?t.splice(t.indexOf(e),1):t.push(e),n()},t.add=function(){for(var e=[].slice.call(arguments),i=0,s=e.length;i<s;i++)-1===t.indexOf(e[i])&&t.push(e[i]);n()},t.remove=function(){for(var e=[].slice.call(arguments),i=0,s=e.length;i<s;i++)-1!==t.indexOf(e[i])&&t.splice(t.indexOf(e[i]),1);n()},t.item=function(e){return t[e]},t.contains=function(e){return-1!==t.indexOf(e)},t.replace=function(e,i){-1!==t.indexOf(e)&&t.splice(t.indexOf(e),1,i),n()},t.value=e.getAttribute("class")||"",t}})}(Element.prototype);
+
+/*!
+DOMTokenList
+*/
+(function(b){try{document.body.classList.add()}catch(e){var c=b.add,d=b.remove;b.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])};b.remove=function(){for(var a=0;a<arguments.length;a++)d.call(this,arguments[a])}}})(DOMTokenList.prototype);
+
+(function(){if("undefined"!==typeof window&&void 0!==window.Reflect&&void 0!==window.customElements){var a=HTMLElement;window.HTMLElement=function(){return Reflect.construct(a,[],this.constructor)};HTMLElement.prototype=a.prototype;HTMLElement.prototype.constructor=HTMLElement;Object.setPrototypeOf(HTMLElement,a)}})();
+/**
+ * SystemJS 4.0.2
+ * MANUAL PATCH: remove script.crossOrigin = "anonymous"
+ * MANUAL PATCH: add conditionally apply, n.System=n.System||new u
+ */
+!function(){var e="undefined"!=typeof self,n=e?self:global;var t;if("undefined"!=typeof document){var e=document.querySelector("base[href]");e&&(t=e.href)}if(!t&&"undefined"!=typeof location){var e=(t=location.href.split("#")[0].split("?")[0]).lastIndexOf("/");-1!==e&&(t=t.slice(0,e+1))}var r=/\\/g,o="undefined"!=typeof Symbol,i=o&&Symbol.toStringTag,c=o?Symbol():"@";function u(){this[c]={}}var s=u.prototype;var l;s.import=function(e,n){var t=this;return Promise.resolve(t.resolve(e,n)).then(function(e){var n=function e(n,t,r){var o=n[c][t];if(o)return o;var u=[],s=Object.create(null);i&&Object.defineProperty(s,i,{value:"Module"});var l=Promise.resolve().then(function(){return n.instantiate(t,r)}).then(function(e){if(!e)throw Error("Module "+t+" did not instantiate");var r=e[1](function(e,n){o.h=!0;var t=!1;if("object"!=typeof e)e in s&&s[e]===n||(s[e]=n,t=!0);else for(var n in e){var r=e[n];n in s&&s[n]===r||(s[n]=r,t=!0)}if(t)for(var e=0;e<u.length;e++)u[e](s);return n},2===e[1].length?{import:function(e){return n.import(e,t)},meta:n.createContext(t)}:void 0);return o.e=r.execute||function(){},[e[0],r.setters||[]]});var f=l.then(function(r){return Promise.all(r[0].map(function(o,i){var c=r[1][i];return Promise.resolve(n.resolve(o,t)).then(function(r){var o=e(n,r,t);return Promise.resolve(o.I).then(function(){return c&&(o.i.push(c),!o.h&&o.I||c(o.n)),o})})})).then(function(e){o.d=e})});return f.catch(function(e){o.e=null,o.er=e}),o=n[c][t]={id:t,i:u,n:s,I:l,L:f,h:!1,d:void 0,e:void 0,er:void 0,E:void 0,C:void 0}}(t,e);return n.C||function(e,n){return n.C=function e(n,t,r){if(!r[t.id])return r[t.id]=!0,Promise.resolve(t.L).then(function(){return Promise.all(t.d.map(function(t){return e(n,t,r)}))})}(e,n,{}).then(function(){return function e(n,t,r){if(r[t.id])return;if(r[t.id]=!0,!t.e){if(t.er)throw t.er;return t.E?t.E:void 0}var o;return t.d.forEach(function(t){{var i=e(n,t,r);i&&(o=o||[]).push(i)}}),o?Promise.all(o).then(i):i();function i(){try{var e=t.e.call(f);if(e)return e=e.then(function(){t.C=t.n,t.E=null}),t.E=t.E||e;t.C=t.n}catch(e){throw t.er=e,e}finally{t.L=t.I=void 0,t.e=null}}}(e,n,{})}).then(function(){return n.n})}(t,n)})},s.createContext=function(e){return{url:e}},s.register=function(e,n){l=[e,n]},s.getRegister=function(){var e=l;return l=void 0,e};var f=Object.freeze(Object.create(null));n.System=n.System||new u;var d=s.register;s.register=function(e,n){d.call(this,e,n)},s.instantiate=function(e,n){var t=this;return".json"===e.substr(-5)?fetch(e).then(function(e){return e.text()}).then(function(e){return[[],function(n){return{execute:function(){n("default",JSON.parse(e))}}}]}):new Promise(function(r,o){var i;function c(n){n.filename===e&&(i=n.error)}window.addEventListener("error",c);var u=document.createElement("script");u.charset="utf-8",u.async=!0,u.addEventListener("error",function(){window.removeEventListener("error",c),o(Error("Error loading "+e+(n?" from "+n:"")))}),u.addEventListener("load",function(){window.removeEventListener("error",c),document.head.removeChild(u),i?o(i):r(t.getRegister())}),u.src=e,document.head.appendChild(u)})},e&&"function"==typeof importScripts&&(s.instantiate=function(e){var n=this;return new Promise(function(t,r){try{importScripts(e)}catch(e){r(e)}t(n.getRegister())})}),s.resolve=function(e,n){var o=function(e,n){if(-1!==e.indexOf("\\")&&(e=e.replace(r,"/")),"/"===e[0]&&"/"===e[1])return n.slice(0,n.indexOf(":")+1)+e;if("."===e[0]&&("/"===e[1]||"."===e[1]&&("/"===e[2]||2===e.length&&(e+="/"))||1===e.length&&(e+="/"))||"/"===e[0]){var t=n.slice(0,n.indexOf(":")+1);var r;if(r="/"===n[t.length+1]?"file:"!==t?(r=n.slice(t.length+2)).slice(r.indexOf("/")+1):n.slice(8):n.slice(t.length+("/"===n[t.length])),"/"===e[0])return n.slice(0,n.length-r.length-1)+e;var o=r.slice(0,r.lastIndexOf("/")+1)+e,i=[];var c=-1;for(var e=0;e<o.length;e++)-1!==c?"/"===o[e]&&(i.push(o.slice(c,e+1)),c=-1):"."===o[e]?"."!==o[e+1]||"/"!==o[e+2]&&e+2!==o.length?"/"===o[e+1]||e+1===o.length?e+=1:c=e:(i.pop(),e+=2):c=e;return-1!==c&&i.push(o.slice(c)),n.slice(0,n.length-r.length)+i.join("")}}(e,n||t);if(!o){if(-1!==e.indexOf(":"))return Promise.resolve(e);throw Error('Cannot resolve "'+e+(n?'" from '+n:'"'))}return Promise.resolve(o)}}();
+
+  // Figure out currentScript (for IE11, since it does not support currentScript)
+  var regex = /\/ionicpwaelements(\.esm)?\.js($|\?|#)/;
+  var scriptElm = currentScript || Array.from(document.querySelectorAll('script')).find(function(s) {
+    return regex.test(s.src) || s.getAttribute('data-stencil-namespace') === "ionicpwaelements";
+  });
+
+  var resourcesUrl = scriptElm ? scriptElm.getAttribute('data-resources-url') || scriptElm.src : '';
+  var start = function() {
+    // if src is not present then origin is "null", and new URL() throws TypeError: Failed to construct 'URL': Invalid base URL
+    var url = new URL('./p-00206cb0.system.js', new URL(resourcesUrl, window.location.origin !== 'null' ? window.location.origin : undefined));
+    System.import(url.href);
+  };
+
+  if (window.__cssshim) {
+    window.__cssshim.i().then(start);
+  } else {
+    start();
+  }
+
+  // Note: using .call(window) here because the self-executing function needs
+  // to be scoped to the window object for the ES6Promise polyfill to work
+  }
+}).call(window);
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-00206cb0.system.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-00206cb0.system.js
new file mode 100644
index 0000000..35a0739
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-00206cb0.system.js
@@ -0,0 +1 @@
+System.register(["./p-335782c2.system.js"],(function(e,t){"use strict";var n,o;return{setters:[function(t){n=t.p;o=t.b;e("setNonce",t.s)}],execute:function(){var e=function(){var e=t.meta.url;var o={};if(e!==""){o.resourcesUrl=new URL(".",e).href}return n(o)};e().then((function(e){return o([["p-1b81a39d.system",[[1,"pwa-camera-modal",{facingMode:[1,"facing-mode"],hidePicker:[4,"hide-picker"],present:[64],dismiss:[64]}]]],["p-5b57434a.system",[[1,"pwa-action-sheet",{header:[1],cancelable:[4],options:[16],open:[32]}]]],["p-db3c6183.system",[[1,"pwa-toast",{message:[1],duration:[2],closing:[32]}]]],["p-fab2e7af.system",[[1,"pwa-camera",{facingMode:[1,"facing-mode"],handlePhoto:[16],hidePicker:[4,"hide-picker"],handleNoDeviceError:[16],noDevicesText:[1,"no-devices-text"],noDevicesButtonText:[1,"no-devices-button-text"],photo:[32],photoSrc:[32],showShutterOverlay:[32],flashIndex:[32],hasCamera:[32],rotation:[32],deviceError:[32]}]]],["p-550557d3.system",[[1,"pwa-camera-modal-instance",{facingMode:[1,"facing-mode"],hidePicker:[4,"hide-picker"],noDevicesText:[1,"no-devices-text"],noDevicesButtonText:[1,"no-devices-button-text"]},[[16,"keyup","handleBackdropKeyUp"]]]]]],e)}))}}}));
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-1b81a39d.system.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-1b81a39d.system.entry.js
new file mode 100644
index 0000000..a4d2cf1
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-1b81a39d.system.entry.js
@@ -0,0 +1 @@
+var __awaiter=this&&this.__awaiter||function(t,e,n,r){function i(t){return t instanceof n?t:new n((function(e){e(t)}))}return new(n||(n=Promise))((function(n,o){function a(t){try{c(r.next(t))}catch(t){o(t)}}function s(t){try{c(r["throw"](t))}catch(t){o(t)}}function c(t){t.done?n(t.value):i(t.value).then(a,s)}c((r=r.apply(t,e||[])).next())}))};var __generator=this&&this.__generator||function(t,e){var n={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,i,o,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol==="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(t){return function(e){return c([t,e])}}function c(s){if(r)throw new TypeError("Generator is already executing.");while(a&&(a=0,s[0]&&(n=0)),n)try{if(r=1,i&&(o=s[0]&2?i["return"]:s[0]?i["throw"]||((o=i["return"])&&o.call(i),0):i.next)&&!(o=o.call(i,s[1])).done)return o;if(i=0,o)s=[s[0]&2,o.value];switch(s[0]){case 0:case 1:o=s;break;case 4:n.label++;return{value:s[1],done:false};case 5:n.label++;i=s[1];s=[0];continue;case 7:s=n.ops.pop();n.trys.pop();continue;default:if(!(o=n.trys,o=o.length>0&&o[o.length-1])&&(s[0]===6||s[0]===2)){n=0;continue}if(s[0]===3&&(!o||s[1]>o[0]&&s[1]<o[3])){n.label=s[1];break}if(s[0]===6&&n.label<o[1]){n.label=o[1];o=s;break}if(o&&n.label<o[2]){n.label=o[2];n.ops.push(s);break}if(o[2])n.ops.pop();n.trys.pop();continue}s=e.call(t,n)}catch(t){s=[6,t];i=0}finally{r=o=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:true}}};System.register(["./p-335782c2.system.js"],(function(t){"use strict";var e,n,r;return{setters:[function(t){e=t.r;n=t.c;r=t.h}],execute:function(){var i=":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0.15)}.content{-webkit-box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);width:600px;height:600px}";var o=t("pwa_camera_modal",function(){function t(t){e(this,t);this.onPhoto=n(this,"onPhoto",7);this.noDeviceError=n(this,"noDeviceError",7);this.facingMode="user";this.hidePicker=false}t.prototype.present=function(){return __awaiter(this,void 0,void 0,(function(){var t;var e=this;return __generator(this,(function(n){t=document.createElement("pwa-camera-modal-instance");t.facingMode=this.facingMode;t.hidePicker=this.hidePicker;t.addEventListener("onPhoto",(function(t){return __awaiter(e,void 0,void 0,(function(){var e;return __generator(this,(function(n){if(!this._modal){return[2]}e=t.detail;this.onPhoto.emit(e);return[2]}))}))}));t.addEventListener("noDeviceError",(function(t){return __awaiter(e,void 0,void 0,(function(){return __generator(this,(function(e){this.noDeviceError.emit(t);return[2]}))}))}));document.body.append(t);this._modal=t;return[2]}))}))};t.prototype.dismiss=function(){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(t){if(!this._modal){return[2]}this._modal&&this._modal.parentNode.removeChild(this._modal);this._modal=null;return[2]}))}))};t.prototype.render=function(){return r("div",null)};return t}());o.style=i}}}));
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-335782c2.system.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-335782c2.system.js
new file mode 100644
index 0000000..dd4178f
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-335782c2.system.js
@@ -0,0 +1,2 @@
+var __extends=this&&this.__extends||function(){var e=function(n,t){e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,n){e.__proto__=n}||function(e,n){for(var t in n)if(Object.prototype.hasOwnProperty.call(n,t))e[t]=n[t]};return e(n,t)};return function(n,t){if(typeof t!=="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");e(n,t);function r(){this.constructor=n}n.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}();var __awaiter=this&&this.__awaiter||function(e,n,t,r){function a(e){return e instanceof t?e:new t((function(n){n(e)}))}return new(t||(t=Promise))((function(t,i){function l(e){try{s(r.next(e))}catch(e){i(e)}}function o(e){try{s(r["throw"](e))}catch(e){i(e)}}function s(e){e.done?t(e.value):a(e.value).then(l,o)}s((r=r.apply(e,n||[])).next())}))};var __generator=this&&this.__generator||function(e,n){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},r,a,i,l;return l={next:o(0),throw:o(1),return:o(2)},typeof Symbol==="function"&&(l[Symbol.iterator]=function(){return this}),l;function o(e){return function(n){return s([e,n])}}function s(o){if(r)throw new TypeError("Generator is already executing.");while(l&&(l=0,o[0]&&(t=0)),t)try{if(r=1,a&&(i=o[0]&2?a["return"]:o[0]?a["throw"]||((i=a["return"])&&i.call(a),0):a.next)&&!(i=i.call(a,o[1])).done)return i;if(a=0,i)o=[o[0]&2,i.value];switch(o[0]){case 0:case 1:i=o;break;case 4:t.label++;return{value:o[1],done:false};case 5:t.label++;a=o[1];o=[0];continue;case 7:o=t.ops.pop();t.trys.pop();continue;default:if(!(i=t.trys,i=i.length>0&&i[i.length-1])&&(o[0]===6||o[0]===2)){t=0;continue}if(o[0]===3&&(!i||o[1]>i[0]&&o[1]<i[3])){t.label=o[1];break}if(o[0]===6&&t.label<i[1]){t.label=i[1];i=o;break}if(i&&t.label<i[2]){t.label=i[2];t.ops.push(o);break}if(i[2])t.ops.pop();t.trys.pop();continue}o=n.call(e,t)}catch(e){o=[6,e];a=0}finally{r=i=0}if(o[0]&5)throw o[1];return{value:o[0]?o[1]:void 0,done:true}}};var __spreadArray=this&&this.__spreadArray||function(e,n,t){if(t||arguments.length===2)for(var r=0,a=n.length,i;r<a;r++){if(i||!(r in n)){if(!i)i=Array.prototype.slice.call(n,0,r);i[r]=n[r]}}return e.concat(i||Array.prototype.slice.call(n))};System.register([],(function(e,n){"use strict";return{execute:function(){var t=this;var r="ionicpwaelements";var a;var i;var l=false;var o=false;var s=function(e,n){if(n===void 0){n=""}{return function(){return}}};var u=function(e,n){{return function(){return}}};var f="{visibility:hidden}.hydrated{visibility:inherit}";var c={};var $="http://www.w3.org/2000/svg";var v="http://www.w3.org/1999/xhtml";var d=function(e){return e!=null};var p=function(e){e=typeof e;return e==="object"||e==="function"};function h(e){var n,t,r;return(r=(t=(n=e.head)===null||n===void 0?void 0:n.querySelector('meta[name="csp-nonce"]'))===null||t===void 0?void 0:t.getAttribute("content"))!==null&&r!==void 0?r:undefined}var m=e("h",(function(e,n){var t=[];for(var r=2;r<arguments.length;r++){t[r-2]=arguments[r]}var a=null;var i=false;var l=false;var o=[];var s=function(n){for(var t=0;t<n.length;t++){a=n[t];if(Array.isArray(a)){s(a)}else if(a!=null&&typeof a!=="boolean"){if(i=typeof e!=="function"&&!p(a)){a=String(a)}if(i&&l){o[o.length-1].$text$+=a}else{o.push(i?g(null,a):a)}l=i}}};s(t);if(n){{var u=n.className||n.class;if(u){n.class=typeof u!=="object"?u:Object.keys(u).filter((function(e){return u[e]})).join(" ")}}}var f=g(e,null);f.$attrs$=n;if(o.length>0){f.$children$=o}return f}));var g=function(e,n){var t={$flags$:0,$tag$:e,$text$:n,$elm$:null,$children$:null};{t.$attrs$=null}return t};var y=e("H",{});var b=function(e){return e&&e.$tag$===y};var w=function(e,n){if(e!=null&&!p(e)){if(n&4){return e==="false"?false:e===""||!!e}if(n&2){return parseFloat(e)}if(n&1){return String(e)}return e}return e};var _=e("g",(function(e){return ve(e).$hostElement$}));var S=e("c",(function(e,n,t){var r=_(e);return{emit:function(e){return N(r,n,{bubbles:!!(t&4),composed:!!(t&2),cancelable:!!(t&1),detail:e})}}}));var N=function(e,n,t){var r=Se.ce(n,t);e.dispatchEvent(r);return r};var R=new WeakMap;var x=function(e,n,t){var r=be.get(e);if(Re&&t){r=r||new CSSStyleSheet;if(typeof r==="string"){r=n}else{r.replaceSync(n)}}else{r=n}be.set(e,r)};var L=function(e,n,t,r){var a;var i=j(n);var l=be.get(i);e=e.nodeType===11?e:_e;if(l){if(typeof l==="string"){e=e.head||e;var o=R.get(e);var s=void 0;if(!o){R.set(e,o=new Set)}if(!o.has(i)){{{s=_e.createElement("style");s.innerHTML=l}var u=(a=Se.$nonce$)!==null&&a!==void 0?a:h(_e);if(u!=null){s.setAttribute("nonce",u)}e.insertBefore(s,e.querySelector("link"))}if(o){o.add(i)}}}else if(!e.adoptedStyleSheets.includes(l)){e.adoptedStyleSheets=__spreadArray(__spreadArray([],e.adoptedStyleSheets,true),[l],false)}}return i};var P=function(e){var n=e.$cmpMeta$;var t=e.$hostElement$;var r=n.$flags$;var a=s("attachStyles",n.$tagName$);var i=L(t.shadowRoot?t.shadowRoot:t.getRootNode(),n);if(r&10){t["s-sc"]=i;t.classList.add(i+"-h")}a()};var j=function(e,n){return"sc-"+e.$tagName$};var C=function(e,n,t,r,a,i){if(t!==r){var l=he(e,n);var o=n.toLowerCase();if(n==="class"){var s=e.classList;var u=A(t);var f=A(r);s.remove.apply(s,u.filter((function(e){return e&&!f.includes(e)})));s.add.apply(s,f.filter((function(e){return e&&!u.includes(e)})))}else if(n==="style"){{for(var c in t){if(!r||r[c]==null){if(c.includes("-")){e.style.removeProperty(c)}else{e.style[c]=""}}}}for(var c in r){if(!t||r[c]!==t[c]){if(c.includes("-")){e.style.setProperty(c,r[c])}else{e.style[c]=r[c]}}}}else if(n==="ref"){if(r){r(e)}}else if(!l&&n[0]==="o"&&n[1]==="n"){if(n[2]==="-"){n=n.slice(3)}else if(he(we,o)){n=o.slice(2)}else{n=o[2]+n.slice(3)}if(t){Se.rel(e,n,t,false)}if(r){Se.ael(e,n,r,false)}}else{var $=p(r);if((l||$&&r!==null)&&!a){try{if(!e.tagName.includes("-")){var v=r==null?"":r;if(n==="list"){l=false}else if(t==null||e[n]!=v){e[n]=v}}else{e[n]=r}}catch(e){}}if(r==null||r===false){if(r!==false||e.getAttribute(n)===""){{e.removeAttribute(n)}}}else if((!l||i&4||a)&&!$){r=r===true?"":r;{e.setAttribute(n,r)}}}}};var E=/\s/;var A=function(e){return!e?[]:e.split(E)};var O=function(e,n,t,r){var a=n.$elm$.nodeType===11&&n.$elm$.host?n.$elm$.host:n.$elm$;var i=e&&e.$attrs$||c;var l=n.$attrs$||c;{for(r in i){if(!(r in l)){C(a,r,i[r],undefined,t,n.$flags$)}}}for(r in l){C(a,r,i[r],l[r],t,n.$flags$)}};var M=function(e,n,t,r){var i=n.$children$[t];var o=0;var s;var u;if(i.$text$!==null){s=i.$elm$=_e.createTextNode(i.$text$)}else{if(!l){l=i.$tag$==="svg"}s=i.$elm$=_e.createElementNS(l?$:v,i.$tag$);if(l&&i.$tag$==="foreignObject"){l=false}{O(null,i,l)}if(d(a)&&s["s-si"]!==a){s.classList.add(s["s-si"]=a)}if(i.$children$){for(o=0;o<i.$children$.length;++o){u=M(e,i,o);if(u){s.appendChild(u)}}}{if(i.$tag$==="svg"){l=false}else if(s.tagName==="foreignObject"){l=true}}}return s};var k=function(e,n,t,r,a,l){var o=e;var s;if(o.shadowRoot&&o.tagName===i){o=o.shadowRoot}for(;a<=l;++a){if(r[a]){s=M(null,t,a);if(s){r[a].$elm$=s;o.insertBefore(s,n)}}}};var I=function(e,n,t){for(var r=n;r<=t;++r){var a=e[r];if(a){var i=a.$elm$;B(a);if(i){i.remove()}}}};var T=function(e,n,t,r){var a=0;var i=0;var l=n.length-1;var o=n[0];var s=n[l];var u=r.length-1;var f=r[0];var c=r[u];var $;while(a<=l&&i<=u){if(o==null){o=n[++a]}else if(s==null){s=n[--l]}else if(f==null){f=r[++i]}else if(c==null){c=r[--u]}else if(q(o,f)){z(o,f);o=n[++a];f=r[++i]}else if(q(s,c)){z(s,c);s=n[--l];c=r[--u]}else if(q(o,c)){z(o,c);e.insertBefore(o.$elm$,s.$elm$.nextSibling);o=n[++a];c=r[--u]}else if(q(s,f)){z(s,f);e.insertBefore(s.$elm$,o.$elm$);s=n[--l];f=r[++i]}else{{$=M(n&&n[i],t,i);f=r[++i]}if($){{o.$elm$.parentNode.insertBefore($,o.$elm$)}}}}if(a>l){k(e,r[u+1]==null?null:r[u+1].$elm$,t,r,i,u)}else if(i>u){I(n,a,l)}};var q=function(e,n){if(e.$tag$===n.$tag$){return true}return false};var z=function(e,n){var t=n.$elm$=e.$elm$;var r=e.$children$;var a=n.$children$;var i=n.$tag$;var o=n.$text$;if(o===null){{l=i==="svg"?true:i==="foreignObject"?false:l}{{O(e,n,l)}}if(r!==null&&a!==null){T(t,r,n,a)}else if(a!==null){if(e.$text$!==null){t.textContent=""}k(t,null,n,a,0,a.length-1)}else if(r!==null){I(r,0,r.length-1)}if(l&&i==="svg"){l=false}}else if(e.$text$!==o){t.data=o}};var B=function(e){{e.$attrs$&&e.$attrs$.ref&&e.$attrs$.ref(null);e.$children$&&e.$children$.map(B)}};var U=function(e,n){var t=e.$hostElement$;var r=e.$vnode$||g(null,null);var l=b(n)?n:m(null,null,n);i=t.tagName;l.$tag$=null;l.$flags$|=4;e.$vnode$=l;l.$elm$=r.$elm$=t.shadowRoot||t;{a=t["s-sc"]}z(r,l)};var H=function(e,n){if(n&&!e.$onRenderResolve$&&n["s-p"]){n["s-p"].push(new Promise((function(n){return e.$onRenderResolve$=n})))}};var V=function(e,n){{e.$flags$|=16}if(e.$flags$&4){e.$flags$|=512;return}H(e,e.$ancestorComponent$);var t=function(){return F(e,n)};return Ae(t)};var F=function(e,n){var t=s("scheduleUpdate",e.$cmpMeta$.$tagName$);var r=e.$lazyInstance$;var a;if(n){{e.$flags$|=256;if(e.$queuedListeners$){e.$queuedListeners$.map((function(e){var n=e[0],t=e[1];return Y(r,n,t)}));e.$queuedListeners$=undefined}}}t();return W(a,(function(){return G(e,r,n)}))};var W=function(e,n){return D(e)?e.then(n):n()};var D=function(e){return e instanceof Promise||e&&e.then&&typeof e.then==="function"};var G=function(e,n,r){return __awaiter(t,void 0,void 0,(function(){var t,a,i,l,o,u,f;return __generator(this,(function(c){a=e.$hostElement$;i=s("update",e.$cmpMeta$.$tagName$);l=a["s-rc"];if(r){P(e)}o=s("render",e.$cmpMeta$.$tagName$);{J(e,n)}if(l){l.map((function(e){return e()}));a["s-rc"]=undefined}o();i();{u=(t=a["s-p"])!==null&&t!==void 0?t:[];f=function(){return K(e)};if(u.length===0){f()}else{Promise.all(u).then(f);e.$flags$|=4;u.length=0}}return[2]}))}))};var J=function(e,n,t){try{n=n.render();{e.$flags$&=~16}{e.$flags$|=2}{{{U(e,n)}}}}catch(n){me(n,e.$hostElement$)}return null};var K=function(e){var n=e.$cmpMeta$.$tagName$;var t=e.$hostElement$;var r=s("postUpdate",n);var a=e.$lazyInstance$;var i=e.$ancestorComponent$;if(!(e.$flags$&64)){e.$flags$|=64;{Z(t)}{Y(a,"componentDidLoad")}r();{e.$onReadyResolve$(t);if(!i){X()}}}else{r()}{e.$onInstanceResolve$(t)}{if(e.$onRenderResolve$){e.$onRenderResolve$();e.$onRenderResolve$=undefined}if(e.$flags$&512){Ee((function(){return V(e,false)}))}e.$flags$&=~(4|512)}};var Q=e("f",(function(e){{var n=ve(e);var t=n.$hostElement$.isConnected;if(t&&(n.$flags$&(2|16))===2){V(n,false)}return t}}));var X=function(e){{Z(_e.documentElement)}Ee((function(){return N(we,"appload",{detail:{namespace:r}})}))};var Y=function(e,n,t){if(e&&e[n]){try{return e[n](t)}catch(e){me(e)}}return undefined};var Z=function(e){return e.classList.add("hydrated")};var ee=function(e,n){return ve(e).$instanceValues$.get(n)};var ne=function(e,n,t,r){var a=ve(e);var i=a.$instanceValues$.get(n);var l=a.$flags$;var o=a.$lazyInstance$;t=w(t,r.$members$[n][0]);var s=Number.isNaN(i)&&Number.isNaN(t);var u=t!==i&&!s;if((!(l&8)||i===undefined)&&u){a.$instanceValues$.set(n,t);if(o){if((l&(2|16))===2){V(a,false)}}}};var te=function(e,n,t){if(n.$members$){var r=Object.entries(n.$members$);var a=e.prototype;r.map((function(e){var r=e[0],i=e[1][0];if(i&31||t&2&&i&32){Object.defineProperty(a,r,{get:function(){return ee(this,r)},set:function(e){ne(this,r,e,n)},configurable:true,enumerable:true})}else if(t&1&&i&64){Object.defineProperty(a,r,{value:function(){var e=[];for(var n=0;n<arguments.length;n++){e[n]=arguments[n]}var t=ve(this);return t.$onInstancePromise$.then((function(){var n;return(n=t.$lazyInstance$)[r].apply(n,e)}))}})}}));if(t&1){var i=new Map;a.attributeChangedCallback=function(e,n,t){var r=this;Se.jmp((function(){var n=i.get(e);if(r.hasOwnProperty(n)){t=r[n];delete r[n]}else if(a.hasOwnProperty(n)&&typeof r[n]==="number"&&r[n]==t){return}r[n]=t===null&&typeof r[n]==="boolean"?false:t}))};e.observedAttributes=r.filter((function(e){var n=e[0],t=e[1];return t[0]&15})).map((function(e){var n=e[0],t=e[1];var r=t[1]||n;i.set(r,n);return r}))}}return e};var re=function(e,n,r,a,i){return __awaiter(t,void 0,void 0,(function(){var e,t,a,l,o,f,c;return __generator(this,(function($){switch($.label){case 0:if(!((n.$flags$&32)===0))return[3,3];n.$flags$|=32;i=ye(r);if(!i.then)return[3,2];e=u();return[4,i];case 1:i=$.sent();e();$.label=2;case 2:if(!i.isProxied){te(i,r,2);i.isProxied=true}t=s("createInstance",r.$tagName$);{n.$flags$|=8}try{new i(n)}catch(e){me(e)}{n.$flags$&=~8}t();if(i.style){a=i.style;l=j(r);if(!be.has(l)){o=s("registerStyles",r.$tagName$);x(l,a,!!(r.$flags$&1));o()}}$.label=3;case 3:f=n.$ancestorComponent$;c=function(){return V(n,true)};if(f&&f["s-rc"]){f["s-rc"].push(c)}else{c()}return[2]}}))}))};var ae=function(e){if((Se.$flags$&1)===0){var n=ve(e);var t=n.$cmpMeta$;var r=s("connectedCallback",t.$tagName$);if(!(n.$flags$&1)){n.$flags$|=1;{var a=e;while(a=a.parentNode||a.host){if(a["s-p"]){H(n,n.$ancestorComponent$=a);break}}}if(t.$members$){Object.entries(t.$members$).map((function(n){var t=n[0],r=n[1][0];if(r&31&&e.hasOwnProperty(t)){var a=e[t];delete e[t];e[t]=a}}))}{re(e,n,t)}}else{oe(e,n,t.$listeners$)}r()}};var ie=function(e){if((Se.$flags$&1)===0){var n=ve(e);var t=n.$lazyInstance$;{if(n.$rmListeners$){n.$rmListeners$.map((function(e){return e()}));n.$rmListeners$=undefined}}{Y(t,"disconnectedCallback")}}};var le=e("b",(function(e,n){if(n===void 0){n={}}var t;var r=s();var a=[];var i=n.exclude||[];var l=we.customElements;var o=_e.head;var u=o.querySelector("meta[charset]");var c=_e.createElement("style");var $=[];var v;var d=true;Object.assign(Se,n);Se.$resourcesUrl$=new URL(n.resourcesUrl||"./",_e.baseURI).href;e.map((function(e){e[1].map((function(n){var t={$flags$:n[0],$tagName$:n[1],$members$:n[2],$listeners$:n[3]};{t.$members$=n[2]}{t.$listeners$=n[3]}var r=t.$tagName$;var o=function(e){__extends(n,e);function n(n){var r=e.call(this,n)||this;n=r;pe(n,t);if(t.$flags$&1){{{n.attachShadow({mode:"open"})}}}return r}n.prototype.connectedCallback=function(){var e=this;if(v){clearTimeout(v);v=null}if(d){$.push(this)}else{Se.jmp((function(){return ae(e)}))}};n.prototype.disconnectedCallback=function(){var e=this;Se.jmp((function(){return ie(e)}))};n.prototype.componentOnReady=function(){return ve(this).$onReadyPromise$};return n}(HTMLElement);t.$lazyBundleId$=e[0];if(!i.includes(r)&&!l.get(r)){a.push(r);l.define(r,te(o,t,1))}}))}));{c.innerHTML=a+f;c.setAttribute("data-styles","");var p=(t=Se.$nonce$)!==null&&t!==void 0?t:h(_e);if(p!=null){c.setAttribute("nonce",p)}o.insertBefore(c,u?u.nextSibling:o.firstChild)}d=false;if($.length){$.map((function(e){return e.connectedCallback()}))}else{{Se.jmp((function(){return v=setTimeout(X,30)}))}}r()}));var oe=function(e,n,t,r){if(t){t.map((function(t){var r=t[0],a=t[1],i=t[2];var l=ue(e,r);var o=se(n,i);var s=fe(r);Se.ael(l,a,o,s);(n.$rmListeners$=n.$rmListeners$||[]).push((function(){return Se.rel(l,a,o,s)}))}))}};var se=function(e,n){return function(t){try{{if(e.$flags$&256){e.$lazyInstance$[n](t)}else{(e.$queuedListeners$=e.$queuedListeners$||[]).push([n,t])}}}catch(e){me(e)}}};var ue=function(e,n){if(n&16)return _e.body;return e};var fe=function(e){return(e&2)!==0};var ce=e("s",(function(e){return Se.$nonce$=e}));var $e=new WeakMap;var ve=function(e){return $e.get(e)};var de=e("r",(function(e,n){return $e.set(n.$lazyInstance$=e,n)}));var pe=function(e,n){var t={$flags$:0,$hostElement$:e,$cmpMeta$:n,$instanceValues$:new Map};{t.$onInstancePromise$=new Promise((function(e){return t.$onInstanceResolve$=e}))}{t.$onReadyPromise$=new Promise((function(e){return t.$onReadyResolve$=e}));e["s-p"]=[];e["s-rc"]=[]}oe(e,t,n.$listeners$);return $e.set(e,t)};var he=function(e,n){return n in e};var me=function(e,n){return(0,console.error)(e,n)};var ge=new Map;var ye=function(e,t,r){var a=e.$tagName$.replace(/-/g,"_");var i=e.$lazyBundleId$;var l=ge.get(i);if(l){return l[a]}
+/*!__STENCIL_STATIC_IMPORT_SWITCH__*/return n.import("./".concat(i,".entry.js").concat("")).then((function(e){{ge.set(i,e)}return e[a]}),me)};var be=new Map;var we=typeof window!=="undefined"?window:{};var _e=we.document||{head:{}};var Se={$flags$:0,$resourcesUrl$:"",jmp:function(e){return e()},raf:function(e){return requestAnimationFrame(e)},ael:function(e,n,t,r){return e.addEventListener(n,t,r)},rel:function(e,n,t,r){return e.removeEventListener(n,t,r)},ce:function(e,n){return new CustomEvent(e,n)}};var Ne=e("p",(function(e){return Promise.resolve(e)}));var Re=function(){try{new CSSStyleSheet;return typeof(new CSSStyleSheet).replaceSync==="function"}catch(e){}return false}();var xe=[];var Le=[];var Pe=function(e,n){return function(t){e.push(t);if(!o){o=true;if(n&&Se.$flags$&4){Ee(Ce)}else{Se.raf(Ce)}}}};var je=function(e){for(var n=0;n<e.length;n++){try{e[n](performance.now())}catch(e){me(e)}}e.length=0};var Ce=function(){je(xe);{je(Le);if(o=xe.length>0){Se.raf(Ce)}}};var Ee=function(e){return Ne().then(e)};var Ae=Pe(Le,true)}}}));
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-386e91ad.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-386e91ad.js
new file mode 100644
index 0000000..6c50178
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-386e91ad.js
@@ -0,0 +1,2 @@
+let e,t,n=!1,l=!1;const o={},s=e=>"object"==(e=typeof e)||"function"===e;function c(e){var t,n,l;return null!==(l=null===(n=null===(t=e.head)||void 0===t?void 0:t.querySelector('meta[name="csp-nonce"]'))||void 0===n?void 0:n.getAttribute("content"))&&void 0!==l?l:void 0}const i=(e,t,...n)=>{let l=null,o=!1,c=!1;const i=[],u=t=>{for(let n=0;n<t.length;n++)l=t[n],Array.isArray(l)?u(l):null!=l&&"boolean"!=typeof l&&((o="function"!=typeof e&&!s(l))&&(l+=""),o&&c?i[i.length-1].t+=l:i.push(o?r(null,l):l),c=o)};if(u(n),t){const e=t.className||t.class;e&&(t.class="object"!=typeof e?e:Object.keys(e).filter((t=>e[t])).join(" "))}const a=r(e,null);return a.l=t,i.length>0&&(a.o=i),a},r=(e,t)=>({i:0,u:e,t,h:null,o:null,l:null}),u={},a=e=>B(e).m,f=(e,t,n)=>{const l=a(e);return{emit:e=>d(l,t,{bubbles:!!(4&n),composed:!!(2&n),cancelable:!!(1&n),detail:e})}},d=(e,t,n)=>{const l=te.ce(t,n);return e.dispatchEvent(l),l},h=new WeakMap,m=e=>"sc-"+e.p,p=(e,t,n,l,o,c)=>{if(n!==l){let i=J(e,t),r=t.toLowerCase();if("class"===t){const t=e.classList,o=$(n),s=$(l);t.remove(...o.filter((e=>e&&!s.includes(e)))),t.add(...s.filter((e=>e&&!o.includes(e))))}else if("style"===t){for(const t in n)l&&null!=l[t]||(t.includes("-")?e.style.removeProperty(t):e.style[t]="");for(const t in l)n&&l[t]===n[t]||(t.includes("-")?e.style.setProperty(t,l[t]):e.style[t]=l[t])}else if("ref"===t)l&&l(e);else if(i||"o"!==t[0]||"n"!==t[1]){const r=s(l);if((i||r&&null!==l)&&!o)try{if(e.tagName.includes("-"))e[t]=l;else{const o=null==l?"":l;"list"===t?i=!1:null!=n&&e[t]==o||(e[t]=o)}}catch(e){}null==l||!1===l?!1===l&&""!==e.getAttribute(t)||e.removeAttribute(t):(!i||4&c||o)&&!r&&e.setAttribute(t,l=!0===l?"":l)}else t="-"===t[2]?t.slice(3):J(Z,r)?r.slice(2):r[2]+t.slice(3),n&&te.rel(e,t,n,!1),l&&te.ael(e,t,l,!1)}},y=/\s/,$=e=>e?e.split(y):[],b=(e,t,n,l)=>{const s=11===t.h.nodeType&&t.h.host?t.h.host:t.h,c=e&&e.l||o,i=t.l||o;for(l in c)l in i||p(s,l,c[l],void 0,n,t.i);for(l in i)p(s,l,c[l],i[l],n,t.i)},w=(t,l,o)=>{const s=l.o[o];let c,i,r=0;if(null!==s.t)c=s.h=ee.createTextNode(s.t);else{if(n||(n="svg"===s.u),c=s.h=ee.createElementNS(n?"http://www.w3.org/2000/svg":"http://www.w3.org/1999/xhtml",s.u),n&&"foreignObject"===s.u&&(n=!1),b(null,s,n),null!=e&&c["s-si"]!==e&&c.classList.add(c["s-si"]=e),s.o)for(r=0;r<s.o.length;++r)i=w(t,s,r),i&&c.appendChild(i);"svg"===s.u?n=!1:"foreignObject"===c.tagName&&(n=!0)}return c},v=(e,n,l,o,s,c)=>{let i,r=e;for(r.shadowRoot&&r.tagName===t&&(r=r.shadowRoot);s<=c;++s)o[s]&&(i=w(null,l,s),i&&(o[s].h=i,r.insertBefore(i,n)))},g=(e,t,n)=>{for(let l=t;l<=n;++l){const t=e[l];if(t){const e=t.h;O(t),e&&e.remove()}}},j=(e,t)=>e.u===t.u,S=(e,t)=>{const l=t.h=e.h,o=e.o,s=t.o,c=t.u,i=t.t;null===i?(n="svg"===c||"foreignObject"!==c&&n,b(e,t,n),null!==o&&null!==s?((e,t,n,l)=>{let o,s=0,c=0,i=t.length-1,r=t[0],u=t[i],a=l.length-1,f=l[0],d=l[a];for(;s<=i&&c<=a;)null==r?r=t[++s]:null==u?u=t[--i]:null==f?f=l[++c]:null==d?d=l[--a]:j(r,f)?(S(r,f),r=t[++s],f=l[++c]):j(u,d)?(S(u,d),u=t[--i],d=l[--a]):j(r,d)?(S(r,d),e.insertBefore(r.h,u.h.nextSibling),r=t[++s],d=l[--a]):j(u,f)?(S(u,f),e.insertBefore(u.h,r.h),u=t[--i],f=l[++c]):(o=w(t&&t[c],n,c),f=l[++c],o&&r.h.parentNode.insertBefore(o,r.h));s>i?v(e,null==l[a+1]?null:l[a+1].h,n,l,c,a):c>a&&g(t,s,i)})(l,o,t,s):null!==s?(null!==e.t&&(l.textContent=""),v(l,null,t,s,0,s.length-1)):null!==o&&g(o,0,o.length-1),n&&"svg"===c&&(n=!1)):e.t!==i&&(l.data=i)},O=e=>{e.l&&e.l.ref&&e.l.ref(null),e.o&&e.o.map(O)},M=(e,t)=>{t&&!e.$&&t["s-p"]&&t["s-p"].push(new Promise((t=>e.$=t)))},k=(e,t)=>{if(e.i|=16,!(4&e.i))return M(e,e.v),ae((()=>C(e,t)));e.i|=512},C=(e,t)=>{const n=e.g;return t&&(e.i|=256,e.j&&(e.j.map((([e,t])=>F(n,e,t))),e.j=void 0)),P(void 0,(()=>E(e,n,t)))},P=(e,t)=>x(e)?e.then(t):t(),x=e=>e instanceof Promise||e&&e.then&&"function"==typeof e.then,E=async(e,t,n)=>{var l;const o=e.m,s=o["s-rc"];n&&(e=>{const t=e.S,n=e.m,l=t.i,o=((e,t)=>{var n;let l=m(t);const o=Y.get(l);if(e=11===e.nodeType?e:ee,o)if("string"==typeof o){let t,s=h.get(e=e.head||e);if(s||h.set(e,s=new Set),!s.has(l)){{t=ee.createElement("style"),t.innerHTML=o;const l=null!==(n=te.O)&&void 0!==n?n:c(ee);null!=l&&t.setAttribute("nonce",l),e.insertBefore(t,e.querySelector("link"))}s&&s.add(l)}}else e.adoptedStyleSheets.includes(o)||(e.adoptedStyleSheets=[...e.adoptedStyleSheets,o]);return l})(n.shadowRoot?n.shadowRoot:n.getRootNode(),t);10&l&&(n["s-sc"]=o,n.classList.add(o+"-h"))})(e);L(e,t),s&&(s.map((e=>e())),o["s-rc"]=void 0);{const t=null!==(l=o["s-p"])&&void 0!==l?l:[],n=()=>N(e);0===t.length?n():(Promise.all(t).then(n),e.i|=4,t.length=0)}},L=(n,l)=>{try{l=l.render(),n.i&=-17,n.i|=2,((n,l)=>{const o=n.m,s=n.M||r(null,null),c=(e=>e&&e.u===u)(l)?l:i(null,null,l);t=o.tagName,c.u=null,c.i|=4,n.M=c,c.h=s.h=o.shadowRoot||o,e=o["s-sc"],S(s,c)})(n,l)}catch(e){K(e,n.m)}return null},N=e=>{const t=e.m,n=e.g,l=e.v;64&e.i||(e.i|=64,H(t),F(n,"componentDidLoad"),e.k(t),l||A()),e.C(t),e.$&&(e.$(),e.$=void 0),512&e.i&&ue((()=>k(e,!1))),e.i&=-517},T=e=>{{const t=B(e),n=t.m.isConnected;return n&&2==(18&t.i)&&k(t,!1),n}},A=()=>{H(ee.documentElement),ue((()=>d(Z,"appload",{detail:{namespace:"ionicpwaelements"}})))},F=(e,t,n)=>{if(e&&e[t])try{return e[t](n)}catch(e){K(e)}},H=e=>e.classList.add("hydrated"),R=(e,t,n)=>{if(t.P){const l=Object.entries(t.P),o=e.prototype;if(l.map((([e,[l]])=>{31&l||2&n&&32&l?Object.defineProperty(o,e,{get(){return((e,t)=>B(this).L.get(t))(0,e)},set(n){((e,t,n,l)=>{const o=B(e),c=o.L.get(t),i=o.i,r=o.g;n=((e,t)=>null==e||s(e)?e:4&t?"false"!==e&&(""===e||!!e):2&t?parseFloat(e):1&t?e+"":e)(n,l.P[t][0]),8&i&&void 0!==c||n===c||Number.isNaN(c)&&Number.isNaN(n)||(o.L.set(t,n),r&&2==(18&i)&&k(o,!1))})(this,e,n,t)},configurable:!0,enumerable:!0}):1&n&&64&l&&Object.defineProperty(o,e,{value(...t){const n=B(this);return n.N.then((()=>n.g[e](...t)))}})})),1&n){const t=new Map;o.attributeChangedCallback=function(e,n,l){te.jmp((()=>{const n=t.get(e);if(this.hasOwnProperty(n))l=this[n],delete this[n];else if(o.hasOwnProperty(n)&&"number"==typeof this[n]&&this[n]==l)return;this[n]=(null!==l||"boolean"!=typeof this[n])&&l}))},e.observedAttributes=l.filter((([e,t])=>15&t[0])).map((([e,n])=>{const l=n[1]||e;return t.set(l,e),l}))}}return e},U=(e,t={})=>{var n;const l=[],o=t.exclude||[],s=Z.customElements,i=ee.head,r=i.querySelector("meta[charset]"),u=ee.createElement("style"),a=[];let f,d=!0;Object.assign(te,t),te.T=new URL(t.resourcesUrl||"./",ee.baseURI).href,e.map((e=>{e[1].map((t=>{const n={i:t[0],p:t[1],P:t[2],A:t[3]};n.P=t[2],n.A=t[3];const c=n.p,i=class extends HTMLElement{constructor(e){super(e),I(e=this,n),1&n.i&&e.attachShadow({mode:"open"})}connectedCallback(){f&&(clearTimeout(f),f=null),d?a.push(this):te.jmp((()=>(e=>{if(0==(1&te.i)){const t=B(e),n=t.S,l=()=>{};if(1&t.i)W(e,t,n.A);else{t.i|=1;{let n=e;for(;n=n.parentNode||n.host;)if(n["s-p"]){M(t,t.v=n);break}}n.P&&Object.entries(n.P).map((([t,[n]])=>{if(31&n&&e.hasOwnProperty(t)){const n=e[t];delete e[t],e[t]=n}})),(async(e,t,n,l,o)=>{if(0==(32&t.i)){t.i|=32;{if((o=X(n)).then){const e=()=>{};o=await o,e()}o.isProxied||(R(o,n,2),o.isProxied=!0);const e=()=>{};t.i|=8;try{new o(t)}catch(e){K(e)}t.i&=-9,e()}if(o.style){let e=o.style;const t=m(n);if(!Y.has(t)){const l=()=>{};((e,t,n)=>{let l=Y.get(e);le&&n?(l=l||new CSSStyleSheet,"string"==typeof l?l=t:l.replaceSync(t)):l=t,Y.set(e,l)})(t,e,!!(1&n.i)),l()}}}const s=t.v,c=()=>k(t,!0);s&&s["s-rc"]?s["s-rc"].push(c):c()})(0,t,n)}l()}})(this)))}disconnectedCallback(){te.jmp((()=>(()=>{if(0==(1&te.i)){const e=B(this),t=e.g;e.F&&(e.F.map((e=>e())),e.F=void 0),F(t,"disconnectedCallback")}})()))}componentOnReady(){return B(this).H}};n.R=e[0],o.includes(c)||s.get(c)||(l.push(c),s.define(c,R(i,n,1)))}))}));{u.innerHTML=l+"{visibility:hidden}.hydrated{visibility:inherit}",u.setAttribute("data-styles","");const e=null!==(n=te.O)&&void 0!==n?n:c(ee);null!=e&&u.setAttribute("nonce",e),i.insertBefore(u,r?r.nextSibling:i.firstChild)}d=!1,a.length?a.map((e=>e.connectedCallback())):te.jmp((()=>f=setTimeout(A,30)))},W=(e,t,n)=>{n&&n.map((([n,l,o])=>{const s=D(e,n),c=q(t,o),i=V(n);te.ael(s,l,c,i),(t.F=t.F||[]).push((()=>te.rel(s,l,c,i)))}))},q=(e,t)=>n=>{try{256&e.i?e.g[t](n):(e.j=e.j||[]).push([t,n])}catch(e){K(e)}},D=(e,t)=>16&t?ee.body:e,V=e=>0!=(2&e),_=e=>te.O=e,z=new WeakMap,B=e=>z.get(e),G=(e,t)=>z.set(t.g=e,t),I=(e,t)=>{const n={i:0,m:e,S:t,L:new Map};return n.N=new Promise((e=>n.C=e)),n.H=new Promise((e=>n.k=e)),e["s-p"]=[],e["s-rc"]=[],W(e,n,t.A),z.set(e,n)},J=(e,t)=>t in e,K=(e,t)=>(0,console.error)(e,t),Q=new Map,X=e=>{const t=e.p.replace(/-/g,"_"),n=e.R,l=Q.get(n);return l?l[t]:import(`./${n}.entry.js`).then((e=>(Q.set(n,e),e[t])),K)
+/*!__STENCIL_STATIC_IMPORT_SWITCH__*/},Y=new Map,Z="undefined"!=typeof window?window:{},ee=Z.document||{head:{}},te={i:0,T:"",jmp:e=>e(),raf:e=>requestAnimationFrame(e),ael:(e,t,n,l)=>e.addEventListener(t,n,l),rel:(e,t,n,l)=>e.removeEventListener(t,n,l),ce:(e,t)=>new CustomEvent(e,t)},ne=e=>Promise.resolve(e),le=(()=>{try{return new CSSStyleSheet,"function"==typeof(new CSSStyleSheet).replaceSync}catch(e){}return!1})(),oe=[],se=[],ce=(e,t)=>n=>{e.push(n),l||(l=!0,t&&4&te.i?ue(re):te.raf(re))},ie=e=>{for(let t=0;t<e.length;t++)try{e[t](performance.now())}catch(e){K(e)}e.length=0},re=()=>{ie(oe),ie(se),(l=oe.length>0)&&te.raf(re)},ue=e=>ne().then(e),ae=ce(se,!0);export{u as H,U as b,f as c,T as f,a as g,i as h,ne as p,G as r,_ as s}
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-3bb700a2.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-3bb700a2.entry.js
new file mode 100644
index 0000000..97b5a2d
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-3bb700a2.entry.js
@@ -0,0 +1 @@
+import{r as s,c as t,h as i}from"./p-386e91ad.js";const e=class{constructor(i){s(this,i),this.onPhoto=t(this,"onPhoto",7),this.noDeviceError=t(this,"noDeviceError",7),this.facingMode="user",this.hidePicker=!1}async present(){const s=document.createElement("pwa-camera-modal-instance");s.facingMode=this.facingMode,s.hidePicker=this.hidePicker,s.addEventListener("onPhoto",(async s=>{this._modal&&this.onPhoto.emit(s.detail)})),s.addEventListener("noDeviceError",(async s=>{this.noDeviceError.emit(s)})),document.body.append(s),this._modal=s}async dismiss(){this._modal&&(this._modal&&this._modal.parentNode.removeChild(this._modal),this._modal=null)}render(){return i("div",null)}};e.style=":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0.15)}.content{-webkit-box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);width:600px;height:600px}";export{e as pwa_camera_modal}
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-50ea2036.system.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-50ea2036.system.js
new file mode 100644
index 0000000..0cc8d13
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-50ea2036.system.js
@@ -0,0 +1 @@
+System.register([],(function(){"use strict";return{execute:function(){}}}));
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-550557d3.system.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-550557d3.system.entry.js
new file mode 100644
index 0000000..6fcd190
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-550557d3.system.entry.js
@@ -0,0 +1 @@
+var __awaiter=this&&this.__awaiter||function(e,t,n,i){function o(e){return e instanceof n?e:new n((function(t){t(e)}))}return new(n||(n=Promise))((function(n,r){function a(e){try{s(i.next(e))}catch(e){r(e)}}function c(e){try{s(i["throw"](e))}catch(e){r(e)}}function s(e){e.done?n(e.value):o(e.value).then(a,c)}s((i=i.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var n={label:0,sent:function(){if(r[0]&1)throw r[1];return r[1]},trys:[],ops:[]},i,o,r,a;return a={next:c(0),throw:c(1),return:c(2)},typeof Symbol==="function"&&(a[Symbol.iterator]=function(){return this}),a;function c(e){return function(t){return s([e,t])}}function s(c){if(i)throw new TypeError("Generator is already executing.");while(a&&(a=0,c[0]&&(n=0)),n)try{if(i=1,o&&(r=c[0]&2?o["return"]:c[0]?o["throw"]||((r=o["return"])&&r.call(o),0):o.next)&&!(r=r.call(o,c[1])).done)return r;if(o=0,r)c=[c[0]&2,r.value];switch(c[0]){case 0:case 1:r=c;break;case 4:n.label++;return{value:c[1],done:false};case 5:n.label++;o=c[1];c=[0];continue;case 7:c=n.ops.pop();n.trys.pop();continue;default:if(!(r=n.trys,r=r.length>0&&r[r.length-1])&&(c[0]===6||c[0]===2)){n=0;continue}if(c[0]===3&&(!r||c[1]>r[0]&&c[1]<r[3])){n.label=c[1];break}if(c[0]===6&&n.label<r[1]){n.label=r[1];r=c;break}if(r&&n.label<r[2]){n.label=r[2];n.ops.push(c);break}if(r[2])n.ops.pop();n.trys.pop();continue}c=t.call(e,n)}catch(e){c=[6,e];o=0}finally{i=r=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:true}}};System.register(["./p-335782c2.system.js"],(function(e){"use strict";var t,n,i,o;return{setters:[function(e){t=e.r;n=e.c;i=e.h;o=e.g}],execute:function(){var r=":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict;--inset-width:600px;--inset-height:600px}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0.15)}.content{-webkit-box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);width:var(--inset-width);height:var(--inset-height);max-height:100%}@media only screen and (max-width: 600px){.content{width:100%;height:100%}}";var a=e("pwa_camera_modal_instance",function(){function e(e){var i=this;t(this,e);this.onPhoto=n(this,"onPhoto",7);this.noDeviceError=n(this,"noDeviceError",7);this.handlePhoto=function(e){return __awaiter(i,void 0,void 0,(function(){return __generator(this,(function(t){this.onPhoto.emit(e);return[2]}))}))};this.handleNoDeviceError=function(e){return __awaiter(i,void 0,void 0,(function(){return __generator(this,(function(t){this.noDeviceError.emit(e);return[2]}))}))};this.facingMode="user";this.hidePicker=false;this.noDevicesText="No camera found";this.noDevicesButtonText="Choose image"}e.prototype.handleBackdropClick=function(e){if(e.target!==this.el){this.onPhoto.emit(null)}};e.prototype.handleComponentClick=function(e){e.stopPropagation()};e.prototype.handleBackdropKeyUp=function(e){if(e.key==="Escape"){this.onPhoto.emit(null)}};e.prototype.render=function(){var e=this;return i("div",{class:"wrapper",onClick:function(t){return e.handleBackdropClick(t)}},i("div",{class:"content"},i("pwa-camera",{onClick:function(t){return e.handleComponentClick(t)},facingMode:this.facingMode,hidePicker:this.hidePicker,handlePhoto:this.handlePhoto,handleNoDeviceError:this.handleNoDeviceError,noDevicesButtonText:this.noDevicesButtonText,noDevicesText:this.noDevicesText})))};Object.defineProperty(e.prototype,"el",{get:function(){return o(this)},enumerable:false,configurable:true});return e}());a.style=r}}}));
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-5b57434a.system.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-5b57434a.system.entry.js
new file mode 100644
index 0000000..5de690a
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-5b57434a.system.entry.js
@@ -0,0 +1 @@
+System.register(["./p-335782c2.system.js"],(function(t){"use strict";var e,n,i,o;return{setters:[function(t){e=t.r;n=t.c;i=t.h;o=t.g}],execute:function(){var r=':host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:-apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0);-webkit-transition:400ms background-color cubic-bezier(.36,.66,.04,1);transition:400ms background-color cubic-bezier(.36,.66,.04,1)}.wrapper.open{background-color:rgba(0, 0, 0, 0.32)}.title{color:#999;height:23px;line-height:23px;padding-bottom:17px;-webkit-padding-end:16px;padding-inline-end:16px;-webkit-padding-start:16px;padding-inline-start:16px;padding-left:16px;padding-right:16px;padding-top:20px}.content{width:568px;-ms-flex-item-align:end;align-self:flex-end;background-color:#fff;-webkit-transition:400ms -webkit-transform cubic-bezier(.36,.66,.04,1);transition:400ms -webkit-transform cubic-bezier(.36,.66,.04,1);transition:400ms transform cubic-bezier(.36,.66,.04,1);transition:400ms transform cubic-bezier(.36,.66,.04,1), 400ms -webkit-transform cubic-bezier(.36,.66,.04,1);-webkit-transform:translateY(100%);transform:translateY(100%)}.wrapper.open .content{-webkit-transform:translateY(0%);transform:translateY(0%)}@media only screen and (max-width: 568px){.content{width:100%}}.action-sheet-option{cursor:pointer;height:52px;line-height:52px}.action-sheet-button{color:rgb(38, 38, 38);font-size:16px;-webkit-padding-end:16px;padding-inline-end:16px;-webkit-padding-start:16px;padding-inline-start:16px;padding-left:16px;padding-right:16px;padding-top:0px}.action-sheet-button:hover{background-color:#F6F6F6}';var s=t("pwa_action_sheet",function(){function t(t){e(this,t);this.onSelection=n(this,"onSelection",7);this.header=undefined;this.cancelable=true;this.options=[];this.open=false}t.prototype.componentDidLoad=function(){var t=this;requestAnimationFrame((function(){t.open=true}))};t.prototype.dismiss=function(){if(this.cancelable){this.close()}};t.prototype.close=function(){var t=this;this.open=false;setTimeout((function(){t.el.parentNode.removeChild(t.el)}),500)};t.prototype.handleOptionClick=function(t,e){t.stopPropagation();this.onSelection.emit(e);this.close()};t.prototype.render=function(){var t=this;return i("div",{class:"wrapper".concat(this.open?" open":""),onClick:function(){return t.dismiss()}},i("div",{class:"content"},i("div",{class:"title"},this.header),this.options.map((function(e,n){return i("div",{class:"action-sheet-option",onClick:function(e){return t.handleOptionClick(e,n)}},i("div",{class:"action-sheet-button"},e.title))}))))};Object.defineProperty(t.prototype,"el",{get:function(){return o(this)},enumerable:false,configurable:true});return t}());s.style=r}}}));
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-665001c2.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-665001c2.entry.js
new file mode 100644
index 0000000..96921c3
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-665001c2.entry.js
@@ -0,0 +1,19 @@
+import{r as e,f as t,h as i,g as s}from"./p-386e91ad.js";
+/**
+ * MediaStream ImageCapture polyfill
+ *
+ * @license
+ * Copyright 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */let a=window.ImageCapture;void 0===a&&(a=class{constructor(e){if("video"!==e.kind)throw new DOMException("NotSupportedError");this._videoStreamTrack=e,"readyState"in this._videoStreamTrack||(this._videoStreamTrack.readyState="live"),this._previewStream=new MediaStream([e]),this.videoElement=document.createElement("video"),this.videoElementPlaying=new Promise((e=>{this.videoElement.addEventListener("playing",e)})),HTMLMediaElement?this.videoElement.srcObject=this._previewStream:this.videoElement.src=URL.createObjectURL(this._previewStream),this.videoElement.muted=!0,this.videoElement.setAttribute("playsinline",""),this.videoElement.play(),this.canvasElement=document.createElement("canvas"),this.canvas2dContext=this.canvasElement.getContext("2d")}get videoStreamTrack(){return this._videoStreamTrack}getPhotoCapabilities(){return new Promise((function(e,t){const i={current:0,min:0,max:0};e({exposureCompensation:i,exposureMode:"none",fillLightMode:["none"],focusMode:"none",imageHeight:i,imageWidth:i,iso:i,redEyeReduction:!1,whiteBalanceMode:"none",zoom:i}),t(new DOMException("OperationError"))}))}setOptions(e={}){return new Promise((function(){}))}takePhoto(){const e=this;return new Promise((function(t,i){if("live"!==e._videoStreamTrack.readyState)return i(new DOMException("InvalidStateError"));e.videoElementPlaying.then((()=>{try{e.canvasElement.width=e.videoElement.videoWidth,e.canvasElement.height=e.videoElement.videoHeight,e.canvas2dContext.drawImage(e.videoElement,0,0),e.canvasElement.toBlob(t)}catch(e){i(new DOMException("UnknownError"))}}))}))}grabFrame(){const e=this;return new Promise((function(t,i){if("live"!==e._videoStreamTrack.readyState)return i(new DOMException("InvalidStateError"));e.videoElementPlaying.then((()=>{try{e.canvasElement.width=e.videoElement.videoWidth,e.canvasElement.height=e.videoElement.videoHeight,e.canvas2dContext.drawImage(e.videoElement,0,0),t(window.createImageBitmap(e.canvasElement))}catch(e){i(new DOMException("UnknownError"))}}))}))}}),window.ImageCapture=a;const o=class{constructor(t){e(this,t),this.hasMultipleCameras=!1,this.hasFlash=!1,this.flashModes=[],this.flashMode="off",this.handlePickFile=()=>{},this.handleShutterClick=()=>{console.debug("shutter click"),this.capture()},this.handleRotateClick=()=>{this.rotate()},this.handleClose=()=>{this.handlePhoto&&this.handlePhoto(null)},this.handleFlashClick=()=>{this.cycleFlash()},this.handleCancelPhoto=()=>{const e=this.stream&&this.stream.getTracks()[0];let t=e&&e.getConstraints();this.photo=null,this.photoSrc=null,t?this.initCamera({video:{facingMode:t.facingMode}}):this.initCamera()},this.handleAcceptPhoto=()=>{this.handlePhoto&&this.handlePhoto(this.photo)},this.handleFileInputChange=async e=>{const t=e.target.files[0];try{const e=await this.getOrientation(t);console.debug("Got orientation",e),this.photoOrientation=e}catch(e){}this.handlePhoto&&this.handlePhoto(t)},this.handleVideoMetadata=e=>{console.debug("Video metadata",e)},this.facingMode="user",this.handlePhoto=void 0,this.hidePicker=!1,this.handleNoDeviceError=void 0,this.noDevicesText="No camera found",this.noDevicesButtonText="Choose image",this.photo=void 0,this.photoSrc=void 0,this.showShutterOverlay=!1,this.flashIndex=0,this.hasCamera=null,this.rotation=0,this.deviceError=null}async componentDidLoad(){this.defaultConstraints={video:{facingMode:this.facingMode}},await this.queryDevices(),await this.initCamera()}disconnectedCallback(){this.stopStream(),this.photoSrc&&URL.revokeObjectURL(this.photoSrc)}hasImageCapture(){return"ImageCapture"in window}async queryDevices(){try{const e=(await navigator.mediaDevices.enumerateDevices()).filter((e=>"videoinput"==e.kind));this.hasCamera=!!e.length,this.hasMultipleCameras=e.length>1}catch(e){this.deviceError=e}}async initCamera(e){e||(e=this.defaultConstraints);try{const t=await navigator.mediaDevices.getUserMedia(Object.assign({video:!0,audio:!1},e));this.initStream(t)}catch(e){this.deviceError=e,this.handleNoDeviceError&&this.handleNoDeviceError(e)}}async initStream(e){this.stream=e,this.videoElement.srcObject=e,this.hasImageCapture()?(this.imageCapture=new window.ImageCapture(e.getVideoTracks()[0]),await this.initPhotoCapabilities(this.imageCapture)):(this.deviceError="No image capture",this.handleNoDeviceError&&this.handleNoDeviceError()),t(this.el)}async initPhotoCapabilities(e){const t=await e.getPhotoCapabilities();t.fillLightMode&&t.fillLightMode.length>1&&(this.flashModes=t.fillLightMode.map((e=>e)),this.flashMode?(this.flashMode=this.flashModes[this.flashModes.indexOf(this.flashMode)]||"off",this.flashIndex=this.flashModes.indexOf(this.flashMode)||0):this.flashIndex=0)}stopStream(){this.videoElement&&(this.videoElement.srcObject=null),this.stream&&this.stream.getTracks().forEach((e=>e.stop()))}async capture(){if(this.hasImageCapture())try{const e=await this.imageCapture.takePhoto({fillLightMode:this.flashModes.length>1?this.flashMode:void 0});await this.flashScreen(),this.promptAccept(e)}catch(e){console.error("Unable to take photo!",e)}this.stopStream()}async promptAccept(e){this.photo=e;const t=await this.getOrientation(e);if(console.debug("Got orientation",t),this.photoOrientation=t,t)switch(t){case 1:case 2:this.rotation=0;break;case 3:case 4:this.rotation=180;break;case 5:case 6:this.rotation=90;break;case 7:case 8:this.rotation=270}this.photoSrc=URL.createObjectURL(e)}getOrientation(e){return new Promise((t=>{const i=new FileReader;i.onload=e=>{const i=new DataView(e.target.result);if(65496!==i.getUint16(0,!1))return t(-2);const s=i.byteLength;let a=2;for(;a<s;){const e=i.getUint16(a,!1);if(a+=2,65505===e){if(1165519206!==i.getUint32(a+=2,!1))return t(-1);const e=18761===i.getUint16(a+=6,!1);a+=i.getUint32(a+4,e);const s=i.getUint16(a,e);a+=2;for(let o=0;o<s;o++)if(274===i.getUint16(a+12*o,e))return t(i.getUint16(a+12*o+8,e))}else{if(65280!=(65280&e))break;a+=i.getUint16(a,!1)}}return t(-1)},i.readAsArrayBuffer(e.slice(0,65536))}))}rotate(){this.stopStream();const e=this.stream&&this.stream.getTracks()[0];if(!e)return;let t=e.getConstraints().facingMode;if(!t){let i=e.getCapabilities();i.facingMode&&(t=i.facingMode[0])}this.initCamera("environment"===t?{video:{facingMode:"user"}}:{video:{facingMode:"environment"}})}setFlashMode(e){console.debug("New flash mode: ",e),this.flashMode=e}cycleFlash(){this.flashModes.length>0&&(this.flashIndex=(this.flashIndex+1)%this.flashModes.length,this.setFlashMode(this.flashModes[this.flashIndex]))}async flashScreen(){return new Promise((e=>{this.showShutterOverlay=!0,setTimeout((()=>{this.showShutterOverlay=!1,e()}),100)}))}iconExit(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M402.2,134L378,109.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L139.6,109.8 c-1.6-1.6-4.1-1.6-5.7,0L109.8,134c-1.6,1.6-1.6,4.1,0,5.7l113.5,113.5c1.6,1.6,1.6,4.1,0,5.7L109.8,372.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l113.5-113.5c1.6-1.6,4.1-1.6,5.7,0l113.5,113.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l113.5-113.5C403.7,138.1,403.7,135.5,402.2,134z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"}iconPhotos(){return i("svg",{xmlns:"http://www.w3.org/2000/svg",width:"512",height:"512",viewBox:"0 0 512 512"},i("path",{d:"M450.29,112H142c-34,0-62,27.51-62,61.33V418.67C80,452.49,108,480,142,480H450c34,0,62-26.18,62-60V173.33C512,139.51,484.32,112,450.29,112Zm-77.15,61.34a46,46,0,1,1-46.28,46A46.19,46.19,0,0,1,373.14,173.33Zm-231.55,276c-17,0-29.86-13.75-29.86-30.66V353.85l90.46-80.79a46.54,46.54,0,0,1,63.44,1.83L328.27,337l-113,112.33ZM480,418.67a30.67,30.67,0,0,1-30.71,30.66H259L376.08,333a46.24,46.24,0,0,1,59.44-.16L480,370.59Z"}),i("path",{d:"M384,32H64A64,64,0,0,0,0,96V352a64.11,64.11,0,0,0,48,62V152a72,72,0,0,1,72-72H446A64.11,64.11,0,0,0,384,32Z"}))}iconConfirm(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%232CD865' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_1_'%3E%3Cg%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M208,301.4l-55.4-55.5c-1.5-1.5-4-1.6-5.6-0.1l-23.4,22.3c-1.6,1.6-1.7,4.1-0.1,5.7l81.6,81.4 c3.1,3.1,8.2,3.1,11.3,0l171.8-171.7c1.6-1.6,1.6-4.2-0.1-5.7l-23.4-22.3c-1.6-1.5-4.1-1.5-5.6,0.1L213.7,301.4 C212.1,303,209.6,303,208,301.4z'/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E"}iconReverseCamera(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M352,0H160C72,0,0,72,0,160v192c0,88,72,160,160,160h192c88,0,160-72,160-160V160C512,72,440,0,352,0z M356.7,365.8l-3.7,3.3c-27,23.2-61.4,35.9-96.8,35.9c-72.4,0-135.8-54.7-147-125.6c-0.3-1.9-2-3.3-3.9-3.3H64 c-3.3,0-5.2-3.8-3.2-6.4l61.1-81.4c1.6-2.1,4.7-2.1,6.4-0.1l63.3,81.4c2,2.6,0.2,6.5-3.2,6.5h-40.6c-2.5,0-4.5,2.4-3.9,4.8 c11.5,51.5,59.2,90.6,112.4,90.6c26.4,0,51.8-9.7,73.7-27.9l3.1-2.5c1.6-1.3,3.9-1.1,5.3,0.3l18.5,18.6 C358.5,361.6,358.4,364.3,356.7,365.8z M451.4,245.6l-61,83.5c-1.6,2.2-4.8,2.2-6.4,0.1l-63.3-83.3c-2-2.6-0.1-6.4,3.2-6.4h40.8 c2.5,0,4.4-2.3,3.9-4.8c-5.1-24.2-17.8-46.5-36.5-63.7c-21.2-19.4-48.2-30.1-76-30.1c-26.5,0-52.6,9.7-73.7,27.3l-3.1,2.5 c-1.6,1.3-3.9,1.2-5.4-0.3l-18.5-18.5c-1.6-1.6-1.5-4.3,0.2-5.9l3.5-3.1c27-23.2,61.4-35.9,96.8-35.9c38,0,73.9,13.7,101.2,38.7 c23.2,21.1,40.3,55.2,45.7,90.1c0.3,1.9,1.9,3.4,3.9,3.4h41.3C451.4,239.2,453.3,243,451.4,245.6z'/%3E%3C/g%3E%3C/svg%3E"}iconRetake(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%23727A87' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M394.2,142L370,117.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L147.6,117.8 c-1.6-1.6-4.1-1.6-5.7,0L117.8,142c-1.6,1.6-1.6,4.1,0,5.7l105.5,105.5c1.6,1.6,1.6,4.1,0,5.7L117.8,364.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l105.5-105.5c1.6-1.6,4.1-1.6,5.7,0l105.5,105.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l105.5-105.5C395.7,146.1,395.7,143.5,394.2,142z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"}iconFlashOff(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cg%3E%3Cpath class='st0' d='M498,483.7L42.3,28L14,56.4l149.8,149.8L91,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9c1.6,0,2.7,1.3,2.4,2.7 L197.6,507c-1,4.4,5.8,6.9,8.9,3.2l118.6-142.8L469.6,512L498,483.7z'/%3E%3Cpath class='st0' d='M449,218.2c2.5-3,0.1-7.2-3.9-7.2H301.2c-1.6,0-2.7-1.3-2.4-2.7L342.4,5c1-4.4-5.8-6.9-8.9-3.2L214.9,144.6 l161.3,161.3L449,218.2z'/%3E%3C/g%3E%3C/svg%3E"}iconFlashOn(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3C/svg%3E"}iconFlashAuto(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3Cg%3E%3Cpath class='st0' d='M321.3,186l74-186H438l74,186h-43.5l-11.9-32.5h-80.9l-12,32.5H321.3z M415.8,47.9l-27.2,70.7h54.9l-27.2-70.7 H415.8z'/%3E%3C/g%3E%3C/svg%3E"}render(){return i("div",{class:"camera-wrapper"},i("div",{class:"camera-header"},i("section",{class:"items"},i("div",{class:"item close",onClick:e=>this.handleClose(e)},i("img",{src:this.iconExit()})),i("div",{class:"item flash",onClick:e=>this.handleFlashClick(e)},this.flashModes.length>0&&i("div",null,"off"==this.flashMode?i("img",{src:this.iconFlashOff()}):"","auto"==this.flashMode?i("img",{src:this.iconFlashAuto()}):"","flash"==this.flashMode?i("img",{src:this.iconFlashOn()}):"")))),(!1===this.hasCamera||!!this.deviceError)&&i("div",{class:"no-device"},i("h2",null,this.noDevicesText),i("label",{htmlFor:"_pwa-elements-camera-input"},this.noDevicesButtonText),i("input",{type:"file",id:"_pwa-elements-camera-input",onChange:this.handleFileInputChange,accept:"image/*",class:"select-file-button"})),this.photoSrc?i("div",{class:"accept"},i("div",{class:"accept-image",style:Object.assign({backgroundImage:`url(${this.photoSrc})`},{})})):i("div",{class:"camera-video"},this.showShutterOverlay&&i("div",{class:"shutter-overlay"}),this.hasImageCapture()?i("video",{ref:e=>this.videoElement=e,onLoadedMetaData:this.handleVideoMetadata,autoplay:!0,playsinline:!0}):i("canvas",{ref:e=>this.canvasElement=e,width:"100%",height:"100%"}),i("canvas",{class:"offscreen-image-render",ref:e=>this.offscreenCanvas=e,width:"100%",height:"100%"})),this.hasCamera&&i("div",{class:"camera-footer"},this.photo?i("section",{class:"items"},i("div",{class:"item accept-cancel",onClick:e=>this.handleCancelPhoto(e)},i("img",{src:this.iconRetake()})),i("div",{class:"item accept-use",onClick:e=>this.handleAcceptPhoto(e)},i("img",{src:this.iconConfirm()}))):[!this.hidePicker&&i("div",{class:"pick-image",onClick:this.handlePickFile},i("label",{htmlFor:"_pwa-elements-file-pick"},this.iconPhotos()),i("input",{type:"file",id:"_pwa-elements-file-pick",onChange:this.handleFileInputChange,accept:"image/*",class:"pick-image-button"})),i("div",{class:"shutter",onClick:this.handleShutterClick},i("div",{class:"shutter-button"})),i("div",{class:"rotate",onClick:this.handleRotateClick},i("img",{src:this.iconReverseCamera()}))]))}static get assetsDirs(){return["icons"]}get el(){return s(this)}};o.style=":host{--header-height:4em;--footer-height:9em;--header-height-landscape:3em;--footer-height-landscape:6em;--shutter-size:6em;--icon-size-header:1.5em;--icon-size-footer:2.5em;--margin-size-header:1.5em;--margin-size-footer:2.0em;font-family:-apple-system, BlinkMacSystemFont,\n    “Segoe UI”, “Roboto”, “Droid Sans”, “Helvetica Neue”, sans-serif;display:block;width:100%;height:100%}.items{-webkit-box-sizing:border-box;box-sizing:border-box;display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.items .item{-ms-flex:1;flex:1;text-align:center}.items .item:first-child{text-align:left}.items .item:last-child{text-align:right}.camera-wrapper{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;height:100%}.camera-header{color:white;background-color:black;height:var(--header-height)}.camera-header .items{padding:var(--margin-size-header)}.camera-footer{position:relative;color:white;background-color:black;height:var(--footer-height)}.camera-footer .items{padding:var(--margin-size-footer)}@media (max-height: 375px){.camera-header{--header-height:var(--header-height-landscape)}.camera-footer{--footer-height:var(--footer-height-landscape)}.camera-footer .shutter{--shutter-size:4em}}.camera-video{position:relative;-ms-flex:1;flex:1;overflow:hidden;background-color:black}video{width:100%;height:100%;max-height:100%;min-height:100%;-o-object-fit:cover;object-fit:cover;background-color:black}.pick-image{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;left:var(--margin-size-footer);top:0;height:100%;width:var(--icon-size-footer);color:white}.pick-image input{visibility:hidden}.pick-image svg{cursor:pointer;fill:white;width:var(--icon-size-footer);height:var(--icon-size-footer)}.shutter{position:absolute;left:50%;top:50%;width:var(--shutter-size);height:var(--shutter-size);margin-top:calc(var(--shutter-size) / -2);margin-left:calc(var(--shutter-size) / -2);border-radius:100%;background-color:#c6cdd8;padding:12px;-webkit-box-sizing:border-box;box-sizing:border-box}.shutter:active .shutter-button{background-color:#9da9bb}.shutter-button{background-color:white;border-radius:100%;width:100%;height:100%}.rotate{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;right:var(--margin-size-footer);top:0;height:100%;width:var(--icon-size-footer);color:white}.rotate img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.shutter-overlay{z-index:5;position:absolute;width:100%;height:100%;background-color:black}.error{width:100%;height:100%;color:white;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.no-device{background-color:black;-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;color:white}.no-device label{cursor:pointer;background:#fff;border-radius:6px;padding:6px 8px;color:black}.no-device input{visibility:hidden;height:0;margin-top:16px}.accept{background-color:black;-ms-flex:1;flex:1;overflow:hidden}.accept .accept-image{width:100%;height:100%;max-height:100%;background-position:center center;background-size:cover;background-repeat:no-repeat}.close img{cursor:pointer;width:var(--icon-size-header);height:var(--icon-size-header)}.flash img{width:var(--icon-size-header);height:var(--icon-size-header)}.accept-use img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.accept-cancel img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.offscreen-image-render{top:0;left:0;visibility:hidden;pointer-events:none;width:100%;height:100%}";export{o as pwa_camera}
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-b57f4873.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-b57f4873.entry.js
new file mode 100644
index 0000000..62112bf
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-b57f4873.entry.js
@@ -0,0 +1 @@
+import{r as t,h as s,g as i,H as e}from"./p-386e91ad.js";const o=class{constructor(s){t(this,s),this.message=void 0,this.duration=2e3,this.closing=null}hostData(){const t={out:!!this.closing};return null!==this.closing&&(t.in=!this.closing),{class:t}}componentDidLoad(){setTimeout((()=>{this.closing=!1})),setTimeout((()=>{this.close()}),this.duration)}close(){this.closing=!0,setTimeout((()=>{this.el.parentNode.removeChild(this.el)}),1e3)}__stencil_render(){return s("div",{class:"wrapper"},s("div",{class:"toast"},this.message))}get el(){return i(this)}render(){return s(e,this.hostData(),this.__stencil_render())}};o.style=':host{position:fixed;bottom:20px;left:0;right:0;display:-ms-flexbox;display:flex;opacity:0}:host(.in){-webkit-transition:opacity 300ms;transition:opacity 300ms;opacity:1}:host(.out){-webkit-transition:opacity 1s;transition:opacity 1s;opacity:0}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.toast{font-family:-apple-system, system-ui, "Helvetica Neue", Roboto, sans-serif;background-color:#eee;color:black;border-radius:5px;padding:10px 15px;font-size:14px;font-weight:500;-webkit-box-shadow:0px 1px 2px rgba(0, 0, 0, 0.20);box-shadow:0px 1px 2px rgba(0, 0, 0, 0.20)}';export{o as pwa_toast}
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-d0cae4dc.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-d0cae4dc.entry.js
new file mode 100644
index 0000000..a242bda
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-d0cae4dc.entry.js
@@ -0,0 +1 @@
+import{r as t,c as e,h as i,g as n}from"./p-386e91ad.js";const s=class{constructor(i){t(this,i),this.onSelection=e(this,"onSelection",7),this.header=void 0,this.cancelable=!0,this.options=[],this.open=!1}componentDidLoad(){requestAnimationFrame((()=>{this.open=!0}))}dismiss(){this.cancelable&&this.close()}close(){this.open=!1,setTimeout((()=>{this.el.parentNode.removeChild(this.el)}),500)}handleOptionClick(t,e){t.stopPropagation(),this.onSelection.emit(e),this.close()}render(){return i("div",{class:"wrapper"+(this.open?" open":""),onClick:()=>this.dismiss()},i("div",{class:"content"},i("div",{class:"title"},this.header),this.options.map(((t,e)=>i("div",{class:"action-sheet-option",onClick:t=>this.handleOptionClick(t,e)},i("div",{class:"action-sheet-button"},t.title))))))}get el(){return n(this)}};s.style=':host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:-apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0);-webkit-transition:400ms background-color cubic-bezier(.36,.66,.04,1);transition:400ms background-color cubic-bezier(.36,.66,.04,1)}.wrapper.open{background-color:rgba(0, 0, 0, 0.32)}.title{color:#999;height:23px;line-height:23px;padding-bottom:17px;-webkit-padding-end:16px;padding-inline-end:16px;-webkit-padding-start:16px;padding-inline-start:16px;padding-left:16px;padding-right:16px;padding-top:20px}.content{width:568px;-ms-flex-item-align:end;align-self:flex-end;background-color:#fff;-webkit-transition:400ms -webkit-transform cubic-bezier(.36,.66,.04,1);transition:400ms -webkit-transform cubic-bezier(.36,.66,.04,1);transition:400ms transform cubic-bezier(.36,.66,.04,1);transition:400ms transform cubic-bezier(.36,.66,.04,1), 400ms -webkit-transform cubic-bezier(.36,.66,.04,1);-webkit-transform:translateY(100%);transform:translateY(100%)}.wrapper.open .content{-webkit-transform:translateY(0%);transform:translateY(0%)}@media only screen and (max-width: 568px){.content{width:100%}}.action-sheet-option{cursor:pointer;height:52px;line-height:52px}.action-sheet-button{color:rgb(38, 38, 38);font-size:16px;-webkit-padding-end:16px;padding-inline-end:16px;-webkit-padding-start:16px;padding-inline-start:16px;padding-left:16px;padding-right:16px;padding-top:0px}.action-sheet-button:hover{background-color:#F6F6F6}';export{s as pwa_action_sheet}
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-d212ae1d.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-d212ae1d.entry.js
new file mode 100644
index 0000000..af415b8
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-d212ae1d.entry.js
@@ -0,0 +1 @@
+import{r as t,c as e,h as i,g as s}from"./p-386e91ad.js";const h=class{constructor(i){t(this,i),this.onPhoto=e(this,"onPhoto",7),this.noDeviceError=e(this,"noDeviceError",7),this.handlePhoto=async t=>{this.onPhoto.emit(t)},this.handleNoDeviceError=async t=>{this.noDeviceError.emit(t)},this.facingMode="user",this.hidePicker=!1,this.noDevicesText="No camera found",this.noDevicesButtonText="Choose image"}handleBackdropClick(t){t.target!==this.el&&this.onPhoto.emit(null)}handleComponentClick(t){t.stopPropagation()}handleBackdropKeyUp(t){"Escape"===t.key&&this.onPhoto.emit(null)}render(){return i("div",{class:"wrapper",onClick:t=>this.handleBackdropClick(t)},i("div",{class:"content"},i("pwa-camera",{onClick:t=>this.handleComponentClick(t),facingMode:this.facingMode,hidePicker:this.hidePicker,handlePhoto:this.handlePhoto,handleNoDeviceError:this.handleNoDeviceError,noDevicesButtonText:this.noDevicesButtonText,noDevicesText:this.noDevicesText})))}get el(){return s(this)}};h.style=":host{z-index:1000;position:fixed;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;contain:strict;--inset-width:600px;--inset-height:600px}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-color:rgba(0, 0, 0, 0.15)}.content{-webkit-box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);box-shadow:0px 0px 5px rgba(0, 0, 0, 0.2);width:var(--inset-width);height:var(--inset-height);max-height:100%}@media only screen and (max-width: 600px){.content{width:100%;height:100%}}";export{h as pwa_camera_modal_instance}
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-db3c6183.system.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-db3c6183.system.entry.js
new file mode 100644
index 0000000..fb6a089
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-db3c6183.system.entry.js
@@ -0,0 +1 @@
+System.register(["./p-335782c2.system.js"],(function(t){"use strict";var e,i,o,s;return{setters:[function(t){e=t.r;i=t.h;o=t.g;s=t.H}],execute:function(){var n=':host{position:fixed;bottom:20px;left:0;right:0;display:-ms-flexbox;display:flex;opacity:0}:host(.in){-webkit-transition:opacity 300ms;transition:opacity 300ms;opacity:1}:host(.out){-webkit-transition:opacity 1s;transition:opacity 1s;opacity:0}.wrapper{-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.toast{font-family:-apple-system, system-ui, "Helvetica Neue", Roboto, sans-serif;background-color:#eee;color:black;border-radius:5px;padding:10px 15px;font-size:14px;font-weight:500;-webkit-box-shadow:0px 1px 2px rgba(0, 0, 0, 0.20);box-shadow:0px 1px 2px rgba(0, 0, 0, 0.20)}';var r=t("pwa_toast",function(){function t(t){e(this,t);this.message=undefined;this.duration=2e3;this.closing=null}t.prototype.hostData=function(){var t={out:!!this.closing};if(this.closing!==null){t["in"]=!this.closing}return{class:t}};t.prototype.componentDidLoad=function(){var t=this;setTimeout((function(){t.closing=false}));setTimeout((function(){t.close()}),this.duration)};t.prototype.close=function(){var t=this;this.closing=true;setTimeout((function(){t.el.parentNode.removeChild(t.el)}),1e3)};t.prototype.__stencil_render=function(){return i("div",{class:"wrapper"},i("div",{class:"toast"},this.message))};Object.defineProperty(t.prototype,"el",{get:function(){return o(this)},enumerable:false,configurable:true});t.prototype.render=function(){return i(s,this.hostData(),this.__stencil_render())};return t}());r.style=n}}}));
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-fab2e7af.system.entry.js b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-fab2e7af.system.entry.js
new file mode 100644
index 0000000..0232eb1
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/ionicpwaelements/p-fab2e7af.system.entry.js
@@ -0,0 +1,20 @@
+var __awaiter=this&&this.__awaiter||function(e,t,i,n){function r(e){return e instanceof i?e:new i((function(t){t(e)}))}return new(i||(i=Promise))((function(i,a){function o(e){try{c(n.next(e))}catch(e){a(e)}}function s(e){try{c(n["throw"](e))}catch(e){a(e)}}function c(e){e.done?i(e.value):r(e.value).then(o,s)}c((n=n.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var i={label:0,sent:function(){if(a[0]&1)throw a[1];return a[1]},trys:[],ops:[]},n,r,a,o;return o={next:s(0),throw:s(1),return:s(2)},typeof Symbol==="function"&&(o[Symbol.iterator]=function(){return this}),o;function s(e){return function(t){return c([e,t])}}function c(s){if(n)throw new TypeError("Generator is already executing.");while(o&&(o=0,s[0]&&(i=0)),i)try{if(n=1,r&&(a=s[0]&2?r["return"]:s[0]?r["throw"]||((a=r["return"])&&a.call(r),0):r.next)&&!(a=a.call(r,s[1])).done)return a;if(r=0,a)s=[s[0]&2,a.value];switch(s[0]){case 0:case 1:a=s;break;case 4:i.label++;return{value:s[1],done:false};case 5:i.label++;r=s[1];s=[0];continue;case 7:s=i.ops.pop();i.trys.pop();continue;default:if(!(a=i.trys,a=a.length>0&&a[a.length-1])&&(s[0]===6||s[0]===2)){i=0;continue}if(s[0]===3&&(!a||s[1]>a[0]&&s[1]<a[3])){i.label=s[1];break}if(s[0]===6&&i.label<a[1]){i.label=a[1];a=s;break}if(a&&i.label<a[2]){i.label=a[2];i.ops.push(s);break}if(a[2])i.ops.pop();i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e];r=0}finally{n=a=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:true}}};System.register(["./p-335782c2.system.js"],(function(e){"use strict";var t,i,n,r;return{setters:[function(e){t=e.r;i=e.f;n=e.h;r=e.g}],execute:function(){
+/**
+       * MediaStream ImageCapture polyfill
+       *
+       * @license
+       * Copyright 2018 Google Inc.
+       *
+       * Licensed under the Apache License, Version 2.0 (the "License");
+       * you may not use this file except in compliance with the License.
+       * You may obtain a copy of the License at
+       *
+       *      http://www.apache.org/licenses/LICENSE-2.0
+       *
+       * Unless required by applicable law or agreed to in writing, software
+       * distributed under the License is distributed on an "AS IS" BASIS,
+       * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+       * See the License for the specific language governing permissions and
+       * limitations under the License.
+       */
+var a=window.ImageCapture;if(typeof a==="undefined"){a=function(){function e(e){var t=this;if(e.kind!=="video")throw new DOMException("NotSupportedError");this._videoStreamTrack=e;if(!("readyState"in this._videoStreamTrack)){this._videoStreamTrack.readyState="live"}this._previewStream=new MediaStream([e]);this.videoElement=document.createElement("video");this.videoElementPlaying=new Promise((function(e){t.videoElement.addEventListener("playing",e)}));if(HTMLMediaElement){this.videoElement.srcObject=this._previewStream}else{this.videoElement.src=URL.createObjectURL(this._previewStream)}this.videoElement.muted=true;this.videoElement.setAttribute("playsinline","");this.videoElement.play();this.canvasElement=document.createElement("canvas");this.canvas2dContext=this.canvasElement.getContext("2d")}Object.defineProperty(e.prototype,"videoStreamTrack",{get:function(){return this._videoStreamTrack},enumerable:false,configurable:true});e.prototype.getPhotoCapabilities=function(){return new Promise((function e(t,i){var n={current:0,min:0,max:0};t({exposureCompensation:n,exposureMode:"none",fillLightMode:["none"],focusMode:"none",imageHeight:n,imageWidth:n,iso:n,redEyeReduction:false,whiteBalanceMode:"none",zoom:n});i(new DOMException("OperationError"))}))};e.prototype.setOptions=function(e){if(e===void 0){e={}}return new Promise((function e(t,i){}))};e.prototype.takePhoto=function(){var e=this;return new Promise((function t(i,n){if(e._videoStreamTrack.readyState!=="live"){return n(new DOMException("InvalidStateError"))}e.videoElementPlaying.then((function(){try{e.canvasElement.width=e.videoElement.videoWidth;e.canvasElement.height=e.videoElement.videoHeight;e.canvas2dContext.drawImage(e.videoElement,0,0);e.canvasElement.toBlob(i)}catch(e){n(new DOMException("UnknownError"))}}))}))};e.prototype.grabFrame=function(){var e=this;return new Promise((function t(i,n){if(e._videoStreamTrack.readyState!=="live"){return n(new DOMException("InvalidStateError"))}e.videoElementPlaying.then((function(){try{e.canvasElement.width=e.videoElement.videoWidth;e.canvasElement.height=e.videoElement.videoHeight;e.canvas2dContext.drawImage(e.videoElement,0,0);i(window.createImageBitmap(e.canvasElement))}catch(e){n(new DOMException("UnknownError"))}}))}))};return e}()}window.ImageCapture=a;var o=":host{--header-height:4em;--footer-height:9em;--header-height-landscape:3em;--footer-height-landscape:6em;--shutter-size:6em;--icon-size-header:1.5em;--icon-size-footer:2.5em;--margin-size-header:1.5em;--margin-size-footer:2.0em;font-family:-apple-system, BlinkMacSystemFont,\n    “Segoe UI”, “Roboto”, “Droid Sans”, “Helvetica Neue”, sans-serif;display:block;width:100%;height:100%}.items{-webkit-box-sizing:border-box;box-sizing:border-box;display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.items .item{-ms-flex:1;flex:1;text-align:center}.items .item:first-child{text-align:left}.items .item:last-child{text-align:right}.camera-wrapper{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;height:100%}.camera-header{color:white;background-color:black;height:var(--header-height)}.camera-header .items{padding:var(--margin-size-header)}.camera-footer{position:relative;color:white;background-color:black;height:var(--footer-height)}.camera-footer .items{padding:var(--margin-size-footer)}@media (max-height: 375px){.camera-header{--header-height:var(--header-height-landscape)}.camera-footer{--footer-height:var(--footer-height-landscape)}.camera-footer .shutter{--shutter-size:4em}}.camera-video{position:relative;-ms-flex:1;flex:1;overflow:hidden;background-color:black}video{width:100%;height:100%;max-height:100%;min-height:100%;-o-object-fit:cover;object-fit:cover;background-color:black}.pick-image{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;left:var(--margin-size-footer);top:0;height:100%;width:var(--icon-size-footer);color:white}.pick-image input{visibility:hidden}.pick-image svg{cursor:pointer;fill:white;width:var(--icon-size-footer);height:var(--icon-size-footer)}.shutter{position:absolute;left:50%;top:50%;width:var(--shutter-size);height:var(--shutter-size);margin-top:calc(var(--shutter-size) / -2);margin-left:calc(var(--shutter-size) / -2);border-radius:100%;background-color:#c6cdd8;padding:12px;-webkit-box-sizing:border-box;box-sizing:border-box}.shutter:active .shutter-button{background-color:#9da9bb}.shutter-button{background-color:white;border-radius:100%;width:100%;height:100%}.rotate{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;position:absolute;right:var(--margin-size-footer);top:0;height:100%;width:var(--icon-size-footer);color:white}.rotate img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.shutter-overlay{z-index:5;position:absolute;width:100%;height:100%;background-color:black}.error{width:100%;height:100%;color:white;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.no-device{background-color:black;-ms-flex:1;flex:1;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;color:white}.no-device label{cursor:pointer;background:#fff;border-radius:6px;padding:6px 8px;color:black}.no-device input{visibility:hidden;height:0;margin-top:16px}.accept{background-color:black;-ms-flex:1;flex:1;overflow:hidden}.accept .accept-image{width:100%;height:100%;max-height:100%;background-position:center center;background-size:cover;background-repeat:no-repeat}.close img{cursor:pointer;width:var(--icon-size-header);height:var(--icon-size-header)}.flash img{width:var(--icon-size-header);height:var(--icon-size-header)}.accept-use img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.accept-cancel img{width:var(--icon-size-footer);height:var(--icon-size-footer)}.offscreen-image-render{top:0;left:0;visibility:hidden;pointer-events:none;width:100%;height:100%}";var s=e("pwa_camera",function(){function e(e){var i=this;t(this,e);this.hasMultipleCameras=false;this.hasFlash=false;this.flashModes=[];this.flashMode="off";this.handlePickFile=function(e){};this.handleShutterClick=function(e){console.debug("shutter click");i.capture()};this.handleRotateClick=function(e){i.rotate()};this.handleClose=function(e){i.handlePhoto&&i.handlePhoto(null)};this.handleFlashClick=function(e){i.cycleFlash()};this.handleCancelPhoto=function(e){var t=i.stream&&i.stream.getTracks()[0];var n=t&&t.getConstraints();i.photo=null;i.photoSrc=null;if(n){i.initCamera({video:{facingMode:n.facingMode}})}else{i.initCamera()}};this.handleAcceptPhoto=function(e){i.handlePhoto&&i.handlePhoto(i.photo)};this.handleFileInputChange=function(e){return __awaiter(i,void 0,void 0,(function(){var t,i,n,r;return __generator(this,(function(a){switch(a.label){case 0:t=e.target;i=t.files[0];a.label=1;case 1:a.trys.push([1,3,,4]);return[4,this.getOrientation(i)];case 2:n=a.sent();console.debug("Got orientation",n);this.photoOrientation=n;return[3,4];case 3:r=a.sent();return[3,4];case 4:this.handlePhoto&&this.handlePhoto(i);return[2]}}))}))};this.handleVideoMetadata=function(e){console.debug("Video metadata",e)};this.facingMode="user";this.handlePhoto=undefined;this.hidePicker=false;this.handleNoDeviceError=undefined;this.noDevicesText="No camera found";this.noDevicesButtonText="Choose image";this.photo=undefined;this.photoSrc=undefined;this.showShutterOverlay=false;this.flashIndex=0;this.hasCamera=null;this.rotation=0;this.deviceError=null}e.prototype.componentDidLoad=function(){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(e){switch(e.label){case 0:this.defaultConstraints={video:{facingMode:this.facingMode}};return[4,this.queryDevices()];case 1:e.sent();return[4,this.initCamera()];case 2:e.sent();return[2]}}))}))};e.prototype.disconnectedCallback=function(){this.stopStream();this.photoSrc&&URL.revokeObjectURL(this.photoSrc)};e.prototype.hasImageCapture=function(){return"ImageCapture"in window};e.prototype.queryDevices=function(){return __awaiter(this,void 0,void 0,(function(){var e,t,i;return __generator(this,(function(n){switch(n.label){case 0:n.trys.push([0,2,,3]);return[4,navigator.mediaDevices.enumerateDevices()];case 1:e=n.sent();t=e.filter((function(e){return e.kind=="videoinput"}));this.hasCamera=!!t.length;this.hasMultipleCameras=t.length>1;return[3,3];case 2:i=n.sent();this.deviceError=i;return[3,3];case 3:return[2]}}))}))};e.prototype.initCamera=function(e){return __awaiter(this,void 0,void 0,(function(){var t,i;return __generator(this,(function(n){switch(n.label){case 0:if(!e){e=this.defaultConstraints}n.label=1;case 1:n.trys.push([1,3,,4]);return[4,navigator.mediaDevices.getUserMedia(Object.assign({video:true,audio:false},e))];case 2:t=n.sent();this.initStream(t);return[3,4];case 3:i=n.sent();this.deviceError=i;this.handleNoDeviceError&&this.handleNoDeviceError(i);return[3,4];case 4:return[2]}}))}))};e.prototype.initStream=function(e){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(t){switch(t.label){case 0:this.stream=e;this.videoElement.srcObject=e;if(!this.hasImageCapture())return[3,2];this.imageCapture=new window.ImageCapture(e.getVideoTracks()[0]);return[4,this.initPhotoCapabilities(this.imageCapture)];case 1:t.sent();return[3,3];case 2:this.deviceError="No image capture";this.handleNoDeviceError&&this.handleNoDeviceError();t.label=3;case 3:i(this.el);return[2]}}))}))};e.prototype.initPhotoCapabilities=function(e){return __awaiter(this,void 0,void 0,(function(){var t;return __generator(this,(function(i){switch(i.label){case 0:return[4,e.getPhotoCapabilities()];case 1:t=i.sent();if(t.fillLightMode&&t.fillLightMode.length>1){this.flashModes=t.fillLightMode.map((function(e){return e}));if(this.flashMode){this.flashMode=this.flashModes[this.flashModes.indexOf(this.flashMode)]||"off";this.flashIndex=this.flashModes.indexOf(this.flashMode)||0}else{this.flashIndex=0}}return[2]}}))}))};e.prototype.stopStream=function(){if(this.videoElement){this.videoElement.srcObject=null}this.stream&&this.stream.getTracks().forEach((function(e){return e.stop()}))};e.prototype.capture=function(){return __awaiter(this,void 0,void 0,(function(){var e,t;return __generator(this,(function(i){switch(i.label){case 0:if(!this.hasImageCapture())return[3,5];i.label=1;case 1:i.trys.push([1,4,,5]);return[4,this.imageCapture.takePhoto({fillLightMode:this.flashModes.length>1?this.flashMode:undefined})];case 2:e=i.sent();return[4,this.flashScreen()];case 3:i.sent();this.promptAccept(e);return[3,5];case 4:t=i.sent();console.error("Unable to take photo!",t);return[3,5];case 5:this.stopStream();return[2]}}))}))};e.prototype.promptAccept=function(e){return __awaiter(this,void 0,void 0,(function(){var t;return __generator(this,(function(i){switch(i.label){case 0:this.photo=e;return[4,this.getOrientation(e)];case 1:t=i.sent();console.debug("Got orientation",t);this.photoOrientation=t;if(t){switch(t){case 1:case 2:this.rotation=0;break;case 3:case 4:this.rotation=180;break;case 5:case 6:this.rotation=90;break;case 7:case 8:this.rotation=270;break}}this.photoSrc=URL.createObjectURL(e);return[2]}}))}))};e.prototype.getOrientation=function(e){return new Promise((function(t){var i=new FileReader;i.onload=function(e){var i=new DataView(e.target.result);if(i.getUint16(0,false)!==65496){return t(-2)}var n=i.byteLength;var r=2;while(r<n){var a=i.getUint16(r,false);r+=2;if(a===65505){if(i.getUint32(r+=2,false)!==1165519206){return t(-1)}var o=i.getUint16(r+=6,false)===18761;r+=i.getUint32(r+4,o);var s=i.getUint16(r,o);r+=2;for(var c=0;c<s;c++){if(i.getUint16(r+c*12,o)===274){return t(i.getUint16(r+c*12+8,o))}}}else if((a&65280)!==65280){break}else{r+=i.getUint16(r,false)}}return t(-1)};i.readAsArrayBuffer(e.slice(0,64*1024))}))};e.prototype.rotate=function(){this.stopStream();var e=this.stream&&this.stream.getTracks()[0];if(!e){return}var t=e.getConstraints();var i=t.facingMode;if(!i){var n=e.getCapabilities();if(n.facingMode){i=n.facingMode[0]}}if(i==="environment"){this.initCamera({video:{facingMode:"user"}})}else{this.initCamera({video:{facingMode:"environment"}})}};e.prototype.setFlashMode=function(e){console.debug("New flash mode: ",e);this.flashMode=e};e.prototype.cycleFlash=function(){if(this.flashModes.length>0){this.flashIndex=(this.flashIndex+1)%this.flashModes.length;this.setFlashMode(this.flashModes[this.flashIndex])}};e.prototype.flashScreen=function(){return __awaiter(this,void 0,void 0,(function(){var e=this;return __generator(this,(function(t){return[2,new Promise((function(t,i){e.showShutterOverlay=true;setTimeout((function(){e.showShutterOverlay=false;t()}),100)}))]}))}))};e.prototype.iconExit=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M402.2,134L378,109.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L139.6,109.8 c-1.6-1.6-4.1-1.6-5.7,0L109.8,134c-1.6,1.6-1.6,4.1,0,5.7l113.5,113.5c1.6,1.6,1.6,4.1,0,5.7L109.8,372.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l113.5-113.5c1.6-1.6,4.1-1.6,5.7,0l113.5,113.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l113.5-113.5C403.7,138.1,403.7,135.5,402.2,134z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"};e.prototype.iconPhotos=function(){return n("svg",{xmlns:"http://www.w3.org/2000/svg",width:"512",height:"512",viewBox:"0 0 512 512"},n("path",{d:"M450.29,112H142c-34,0-62,27.51-62,61.33V418.67C80,452.49,108,480,142,480H450c34,0,62-26.18,62-60V173.33C512,139.51,484.32,112,450.29,112Zm-77.15,61.34a46,46,0,1,1-46.28,46A46.19,46.19,0,0,1,373.14,173.33Zm-231.55,276c-17,0-29.86-13.75-29.86-30.66V353.85l90.46-80.79a46.54,46.54,0,0,1,63.44,1.83L328.27,337l-113,112.33ZM480,418.67a30.67,30.67,0,0,1-30.71,30.66H259L376.08,333a46.24,46.24,0,0,1,59.44-.16L480,370.59Z"}),n("path",{d:"M384,32H64A64,64,0,0,0,0,96V352a64.11,64.11,0,0,0,48,62V152a72,72,0,0,1,72-72H446A64.11,64.11,0,0,0,384,32Z"}))};e.prototype.iconConfirm=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%232CD865' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_1_'%3E%3Cg%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M208,301.4l-55.4-55.5c-1.5-1.5-4-1.6-5.6-0.1l-23.4,22.3c-1.6,1.6-1.7,4.1-0.1,5.7l81.6,81.4 c3.1,3.1,8.2,3.1,11.3,0l171.8-171.7c1.6-1.6,1.6-4.2-0.1-5.7l-23.4-22.3c-1.6-1.5-4.1-1.5-5.6,0.1L213.7,301.4 C212.1,303,209.6,303,208,301.4z'/%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E"};e.prototype.iconReverseCamera=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M352,0H160C72,0,0,72,0,160v192c0,88,72,160,160,160h192c88,0,160-72,160-160V160C512,72,440,0,352,0z M356.7,365.8l-3.7,3.3c-27,23.2-61.4,35.9-96.8,35.9c-72.4,0-135.8-54.7-147-125.6c-0.3-1.9-2-3.3-3.9-3.3H64 c-3.3,0-5.2-3.8-3.2-6.4l61.1-81.4c1.6-2.1,4.7-2.1,6.4-0.1l63.3,81.4c2,2.6,0.2,6.5-3.2,6.5h-40.6c-2.5,0-4.5,2.4-3.9,4.8 c11.5,51.5,59.2,90.6,112.4,90.6c26.4,0,51.8-9.7,73.7-27.9l3.1-2.5c1.6-1.3,3.9-1.1,5.3,0.3l18.5,18.6 C358.5,361.6,358.4,364.3,356.7,365.8z M451.4,245.6l-61,83.5c-1.6,2.2-4.8,2.2-6.4,0.1l-63.3-83.3c-2-2.6-0.1-6.4,3.2-6.4h40.8 c2.5,0,4.4-2.3,3.9-4.8c-5.1-24.2-17.8-46.5-36.5-63.7c-21.2-19.4-48.2-30.1-76-30.1c-26.5,0-52.6,9.7-73.7,27.3l-3.1,2.5 c-1.6,1.3-3.9,1.2-5.4-0.3l-18.5-18.5c-1.6-1.6-1.5-4.3,0.2-5.9l3.5-3.1c27-23.2,61.4-35.9,96.8-35.9c38,0,73.9,13.7,101.2,38.7 c23.2,21.1,40.3,55.2,45.7,90.1c0.3,1.9,1.9,3.4,3.9,3.4h41.3C451.4,239.2,453.3,243,451.4,245.6z'/%3E%3C/g%3E%3C/svg%3E"};e.prototype.iconRetake=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' enable-background='new 0 0 512 512' xml:space='preserve'%3E%3Ccircle fill='%23727A87' cx='256' cy='256' r='256'/%3E%3Cg id='Icon_5_'%3E%3Cg%3E%3Cpath fill='%23FFFFFF' d='M394.2,142L370,117.8c-1.6-1.6-4.1-1.6-5.7,0L258.8,223.4c-1.6,1.6-4.1,1.6-5.7,0L147.6,117.8 c-1.6-1.6-4.1-1.6-5.7,0L117.8,142c-1.6,1.6-1.6,4.1,0,5.7l105.5,105.5c1.6,1.6,1.6,4.1,0,5.7L117.8,364.4c-1.6,1.6-1.6,4.1,0,5.7 l24.1,24.1c1.6,1.6,4.1,1.6,5.7,0l105.5-105.5c1.6-1.6,4.1-1.6,5.7,0l105.5,105.5c1.6,1.6,4.1,1.6,5.7,0l24.1-24.1 c1.6-1.6,1.6-4.1,0-5.7L288.6,258.8c-1.6-1.6-1.6-4.1,0-5.7l105.5-105.5C395.7,146.1,395.7,143.5,394.2,142z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"};e.prototype.iconFlashOff=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cg%3E%3Cpath class='st0' d='M498,483.7L42.3,28L14,56.4l149.8,149.8L91,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9c1.6,0,2.7,1.3,2.4,2.7 L197.6,507c-1,4.4,5.8,6.9,8.9,3.2l118.6-142.8L469.6,512L498,483.7z'/%3E%3Cpath class='st0' d='M449,218.2c2.5-3,0.1-7.2-3.9-7.2H301.2c-1.6,0-2.7-1.3-2.4-2.7L342.4,5c1-4.4-5.8-6.9-8.9-3.2L214.9,144.6 l161.3,161.3L449,218.2z'/%3E%3C/g%3E%3C/svg%3E"};e.prototype.iconFlashOn=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3C/svg%3E"};e.prototype.iconFlashAuto=function(){return"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' style='enable-background:new 0 0 512 512;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpath class='st0' d='M287.2,211c-1.6,0-2.7-1.3-2.4-2.7L328.4,5c1-4.4-5.8-6.9-8.9-3.2L77,293.8c-2.5,3-0.1,7.2,3.9,7.2h143.9 c1.6,0,2.7,1.3,2.4,2.7L183.6,507c-1,4.4,5.8,6.9,8.9,3.2l242.5-292c2.5-3,0.1-7.2-3.9-7.2L287.2,211L287.2,211z'/%3E%3Cg%3E%3Cpath class='st0' d='M321.3,186l74-186H438l74,186h-43.5l-11.9-32.5h-80.9l-12,32.5H321.3z M415.8,47.9l-27.2,70.7h54.9l-27.2-70.7 H415.8z'/%3E%3C/g%3E%3C/svg%3E"};e.prototype.render=function(){var e=this;var t={};return n("div",{class:"camera-wrapper"},n("div",{class:"camera-header"},n("section",{class:"items"},n("div",{class:"item close",onClick:function(t){return e.handleClose(t)}},n("img",{src:this.iconExit()})),n("div",{class:"item flash",onClick:function(t){return e.handleFlashClick(t)}},this.flashModes.length>0&&n("div",null,this.flashMode=="off"?n("img",{src:this.iconFlashOff()}):"",this.flashMode=="auto"?n("img",{src:this.iconFlashAuto()}):"",this.flashMode=="flash"?n("img",{src:this.iconFlashOn()}):"")))),(this.hasCamera===false||!!this.deviceError)&&n("div",{class:"no-device"},n("h2",null,this.noDevicesText),n("label",{htmlFor:"_pwa-elements-camera-input"},this.noDevicesButtonText),n("input",{type:"file",id:"_pwa-elements-camera-input",onChange:this.handleFileInputChange,accept:"image/*",class:"select-file-button"})),this.photoSrc?n("div",{class:"accept"},n("div",{class:"accept-image",style:Object.assign({backgroundImage:"url(".concat(this.photoSrc,")")},t)})):n("div",{class:"camera-video"},this.showShutterOverlay&&n("div",{class:"shutter-overlay"}),this.hasImageCapture()?n("video",{ref:function(t){return e.videoElement=t},onLoadedMetaData:this.handleVideoMetadata,autoplay:true,playsinline:true}):n("canvas",{ref:function(t){return e.canvasElement=t},width:"100%",height:"100%"}),n("canvas",{class:"offscreen-image-render",ref:function(t){return e.offscreenCanvas=t},width:"100%",height:"100%"})),this.hasCamera&&n("div",{class:"camera-footer"},!this.photo?[!this.hidePicker&&n("div",{class:"pick-image",onClick:this.handlePickFile},n("label",{htmlFor:"_pwa-elements-file-pick"},this.iconPhotos()),n("input",{type:"file",id:"_pwa-elements-file-pick",onChange:this.handleFileInputChange,accept:"image/*",class:"pick-image-button"})),n("div",{class:"shutter",onClick:this.handleShutterClick},n("div",{class:"shutter-button"})),n("div",{class:"rotate",onClick:this.handleRotateClick},n("img",{src:this.iconReverseCamera()}))]:n("section",{class:"items"},n("div",{class:"item accept-cancel",onClick:function(t){return e.handleCancelPhoto(t)}},n("img",{src:this.iconRetake()})),n("div",{class:"item accept-use",onClick:function(t){return e.handleAcceptPhoto(t)}},n("img",{src:this.iconConfirm()})))))};Object.defineProperty(e,"assetsDirs",{get:function(){return["icons"]},enumerable:false,configurable:true});Object.defineProperty(e.prototype,"el",{get:function(){return r(this)},enumerable:false,configurable:true});return e}());s.style=o}}}));
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/types/components.d.ts b/frontend/node_modules/@ionic/pwa-elements/dist/types/components.d.ts
new file mode 100644
index 0000000..3b374f5
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/types/components.d.ts
@@ -0,0 +1,144 @@
+/* eslint-disable */
+/* tslint:disable */
+/**
+ * This is an autogenerated file created by the Stencil compiler.
+ * It contains typing information for all components that exist in this project.
+ */
+import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
+import { ActionSheetOption } from "./definitions";
+export { ActionSheetOption } from "./definitions";
+export namespace Components {
+    interface PwaActionSheet {
+        "cancelable": boolean;
+        "header": string;
+        "options": ActionSheetOption[];
+    }
+    interface PwaCamera {
+        "facingMode": string;
+        "handleNoDeviceError": (e?: any) => void;
+        "handlePhoto": (photo: Blob) => void;
+        "hidePicker": boolean;
+        "noDevicesButtonText": string;
+        "noDevicesText": string;
+    }
+    interface PwaCameraModal {
+        "dismiss": () => Promise<void>;
+        "facingMode": string;
+        "hidePicker": boolean;
+        "present": () => Promise<void>;
+    }
+    interface PwaCameraModalInstance {
+        "facingMode": string;
+        "hidePicker": boolean;
+        "noDevicesButtonText": string;
+        "noDevicesText": string;
+    }
+    interface PwaToast {
+        "duration": number;
+        "message": string;
+    }
+}
+export interface PwaActionSheetCustomEvent<T> extends CustomEvent<T> {
+    detail: T;
+    target: HTMLPwaActionSheetElement;
+}
+export interface PwaCameraModalCustomEvent<T> extends CustomEvent<T> {
+    detail: T;
+    target: HTMLPwaCameraModalElement;
+}
+export interface PwaCameraModalInstanceCustomEvent<T> extends CustomEvent<T> {
+    detail: T;
+    target: HTMLPwaCameraModalInstanceElement;
+}
+declare global {
+    interface HTMLPwaActionSheetElement extends Components.PwaActionSheet, HTMLStencilElement {
+    }
+    var HTMLPwaActionSheetElement: {
+        prototype: HTMLPwaActionSheetElement;
+        new (): HTMLPwaActionSheetElement;
+    };
+    interface HTMLPwaCameraElement extends Components.PwaCamera, HTMLStencilElement {
+    }
+    var HTMLPwaCameraElement: {
+        prototype: HTMLPwaCameraElement;
+        new (): HTMLPwaCameraElement;
+    };
+    interface HTMLPwaCameraModalElement extends Components.PwaCameraModal, HTMLStencilElement {
+    }
+    var HTMLPwaCameraModalElement: {
+        prototype: HTMLPwaCameraModalElement;
+        new (): HTMLPwaCameraModalElement;
+    };
+    interface HTMLPwaCameraModalInstanceElement extends Components.PwaCameraModalInstance, HTMLStencilElement {
+    }
+    var HTMLPwaCameraModalInstanceElement: {
+        prototype: HTMLPwaCameraModalInstanceElement;
+        new (): HTMLPwaCameraModalInstanceElement;
+    };
+    interface HTMLPwaToastElement extends Components.PwaToast, HTMLStencilElement {
+    }
+    var HTMLPwaToastElement: {
+        prototype: HTMLPwaToastElement;
+        new (): HTMLPwaToastElement;
+    };
+    interface HTMLElementTagNameMap {
+        "pwa-action-sheet": HTMLPwaActionSheetElement;
+        "pwa-camera": HTMLPwaCameraElement;
+        "pwa-camera-modal": HTMLPwaCameraModalElement;
+        "pwa-camera-modal-instance": HTMLPwaCameraModalInstanceElement;
+        "pwa-toast": HTMLPwaToastElement;
+    }
+}
+declare namespace LocalJSX {
+    interface PwaActionSheet {
+        "cancelable"?: boolean;
+        "header"?: string;
+        "onOnSelection"?: (event: PwaActionSheetCustomEvent<any>) => void;
+        "options"?: ActionSheetOption[];
+    }
+    interface PwaCamera {
+        "facingMode"?: string;
+        "handleNoDeviceError"?: (e?: any) => void;
+        "handlePhoto"?: (photo: Blob) => void;
+        "hidePicker"?: boolean;
+        "noDevicesButtonText"?: string;
+        "noDevicesText"?: string;
+    }
+    interface PwaCameraModal {
+        "facingMode"?: string;
+        "hidePicker"?: boolean;
+        "onNoDeviceError"?: (event: PwaCameraModalCustomEvent<any>) => void;
+        "onOnPhoto"?: (event: PwaCameraModalCustomEvent<any>) => void;
+    }
+    interface PwaCameraModalInstance {
+        "facingMode"?: string;
+        "hidePicker"?: boolean;
+        "noDevicesButtonText"?: string;
+        "noDevicesText"?: string;
+        "onNoDeviceError"?: (event: PwaCameraModalInstanceCustomEvent<any>) => void;
+        "onOnPhoto"?: (event: PwaCameraModalInstanceCustomEvent<any>) => void;
+    }
+    interface PwaToast {
+        "duration"?: number;
+        "message"?: string;
+    }
+    interface IntrinsicElements {
+        "pwa-action-sheet": PwaActionSheet;
+        "pwa-camera": PwaCamera;
+        "pwa-camera-modal": PwaCameraModal;
+        "pwa-camera-modal-instance": PwaCameraModalInstance;
+        "pwa-toast": PwaToast;
+    }
+}
+export { LocalJSX as JSX };
+declare module "@stencil/core" {
+    export namespace JSX {
+        interface IntrinsicElements {
+            "pwa-action-sheet": LocalJSX.PwaActionSheet & JSXBase.HTMLAttributes<HTMLPwaActionSheetElement>;
+            "pwa-camera": LocalJSX.PwaCamera & JSXBase.HTMLAttributes<HTMLPwaCameraElement>;
+            "pwa-camera-modal": LocalJSX.PwaCameraModal & JSXBase.HTMLAttributes<HTMLPwaCameraModalElement>;
+            "pwa-camera-modal-instance": LocalJSX.PwaCameraModalInstance & JSXBase.HTMLAttributes<HTMLPwaCameraModalInstanceElement>;
+            "pwa-toast": LocalJSX.PwaToast & JSXBase.HTMLAttributes<HTMLPwaToastElement>;
+        }
+    }
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/types/components/action-sheet/action-sheet.d.ts b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/action-sheet/action-sheet.d.ts
new file mode 100644
index 0000000..5c15fde
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/action-sheet/action-sheet.d.ts
@@ -0,0 +1,15 @@
+import { EventEmitter } from '../../stencil-public-runtime';
+import { ActionSheetOption } from '../../definitions';
+export declare class PWAActionSheet {
+  el: HTMLElement;
+  header: string;
+  cancelable: boolean;
+  options: ActionSheetOption[];
+  onSelection: EventEmitter;
+  open: boolean;
+  componentDidLoad(): void;
+  dismiss(): void;
+  close(): void;
+  handleOptionClick(e: MouseEvent, i: number): void;
+  render(): any;
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera-modal/camera-modal-instance.d.ts b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera-modal/camera-modal-instance.d.ts
new file mode 100644
index 0000000..4b68a0c
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera-modal/camera-modal-instance.d.ts
@@ -0,0 +1,16 @@
+import { EventEmitter } from '../../stencil-public-runtime';
+export declare class PWACameraModal {
+  el: any;
+  onPhoto: EventEmitter;
+  noDeviceError: EventEmitter;
+  facingMode: string;
+  hidePicker: boolean;
+  noDevicesText: string;
+  noDevicesButtonText: string;
+  handlePhoto: (photo: Blob) => Promise<void>;
+  handleNoDeviceError: (photo: any) => Promise<void>;
+  handleBackdropClick(e: MouseEvent): void;
+  handleComponentClick(e: MouseEvent): void;
+  handleBackdropKeyUp(e: KeyboardEvent): void;
+  render(): any;
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera-modal/camera-modal.d.ts b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera-modal/camera-modal.d.ts
new file mode 100644
index 0000000..5381dac
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera-modal/camera-modal.d.ts
@@ -0,0 +1,11 @@
+import { EventEmitter } from '../../stencil-public-runtime';
+export declare class PWACameraModal {
+  facingMode: string;
+  hidePicker: boolean;
+  onPhoto: EventEmitter;
+  noDeviceError: EventEmitter;
+  _modal: HTMLElement;
+  present(): Promise<void>;
+  dismiss(): Promise<void>;
+  render(): any;
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera/camera.d.ts b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera/camera.d.ts
new file mode 100644
index 0000000..265b09b
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera/camera.d.ts
@@ -0,0 +1,66 @@
+import { FlashMode } from '../../definitions';
+import './imagecapture';
+export declare class CameraPWA {
+  el: any;
+  facingMode: string;
+  handlePhoto: (photo: Blob) => void;
+  hidePicker: boolean;
+  handleNoDeviceError: (e?: any) => void;
+  noDevicesText: string;
+  noDevicesButtonText: string;
+  photo: any;
+  photoSrc: any;
+  showShutterOverlay: boolean;
+  flashIndex: number;
+  hasCamera: boolean | null;
+  rotation: number;
+  deviceError: any | null;
+  photoOrientation: number;
+  exifData: any;
+  offscreenCanvas: HTMLCanvasElement;
+  defaultConstraints: any;
+  stream: MediaStream;
+  imageCapture: any;
+  videoElement: HTMLVideoElement;
+  canvasElement: HTMLCanvasElement;
+  hasMultipleCameras: boolean;
+  hasFlash: boolean;
+  flashModes: FlashMode[];
+  flashMode: FlashMode;
+  componentDidLoad(): Promise<void>;
+  disconnectedCallback(): void;
+  hasImageCapture(): boolean;
+  /**
+   * Query the list of connected devices and figure out how many video inputs we have.
+   */
+  queryDevices(): Promise<void>;
+  initCamera(constraints?: MediaStreamConstraints): Promise<void>;
+  initStream(stream: MediaStream): Promise<void>;
+  initPhotoCapabilities(imageCapture: any): Promise<void>;
+  stopStream(): void;
+  capture(): Promise<void>;
+  promptAccept(photo: any): Promise<void>;
+  private getOrientation;
+  rotate(): void;
+  setFlashMode(mode: FlashMode): void;
+  cycleFlash(): void;
+  flashScreen(): Promise<void>;
+  handlePickFile: (_e: Event) => void;
+  handleShutterClick: (_e: Event) => void;
+  handleRotateClick: (_e: Event) => void;
+  handleClose: (_e: Event) => void;
+  handleFlashClick: (_e: Event) => void;
+  handleCancelPhoto: (_e: Event) => void;
+  handleAcceptPhoto: (_e: Event) => void;
+  handleFileInputChange: (e: InputEvent) => Promise<void>;
+  handleVideoMetadata: (e: Event) => void;
+  iconExit(): string;
+  iconPhotos(): any;
+  iconConfirm(): string;
+  iconReverseCamera(): string;
+  iconRetake(): string;
+  iconFlashOff(): string;
+  iconFlashOn(): string;
+  iconFlashAuto(): string;
+  render(): any;
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera/imagecapture.d.ts b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera/imagecapture.d.ts
new file mode 100644
index 0000000..0096488
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/camera/imagecapture.d.ts
@@ -0,0 +1,19 @@
+/**
+ * MediaStream ImageCapture polyfill
+ *
+ * @license
+ * Copyright 2018 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export declare let ImageCapture: any;
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/types/components/toast/toast.d.ts b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/toast/toast.d.ts
new file mode 100644
index 0000000..65528c5
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/types/components/toast/toast.d.ts
@@ -0,0 +1,14 @@
+export declare class PWAToast {
+  el: HTMLElement;
+  message: string;
+  duration: number;
+  closing: any;
+  hostData(): {
+    class: {
+      out: boolean;
+    };
+  };
+  componentDidLoad(): void;
+  close(): void;
+  render(): any;
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/types/definitions.d.ts b/frontend/node_modules/@ionic/pwa-elements/dist/types/definitions.d.ts
new file mode 100644
index 0000000..103fa3a
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/types/definitions.d.ts
@@ -0,0 +1,15 @@
+export interface MediaSettingsRange {
+  min: number;
+  max: number;
+  step: number;
+}
+export interface PhotoCapabilities {
+  redEyeReduction: "never" | "always" | "controllable";
+  imageHeight: MediaSettingsRange;
+  imageWidth: MediaSettingsRange;
+  fillLightMode: string[];
+}
+export type FlashMode = "auto" | "off" | "flash";
+export interface ActionSheetOption {
+  title: string;
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/types/index.d.ts b/frontend/node_modules/@ionic/pwa-elements/dist/types/index.d.ts
new file mode 100644
index 0000000..07635cb
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/types/index.d.ts
@@ -0,0 +1 @@
+export * from './components';
diff --git a/frontend/node_modules/@ionic/pwa-elements/dist/types/stencil-public-runtime.d.ts b/frontend/node_modules/@ionic/pwa-elements/dist/types/stencil-public-runtime.d.ts
new file mode 100644
index 0000000..b44ed14
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/dist/types/stencil-public-runtime.d.ts
@@ -0,0 +1,1640 @@
+declare type CustomMethodDecorator<T> = (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
+export interface ComponentDecorator {
+    (opts?: ComponentOptions): ClassDecorator;
+}
+export interface ComponentOptions {
+    /**
+     * Tag name of the web component. Ideally, the tag name must be globally unique,
+     * so it's recommended to choose an unique prefix for all your components within the same collection.
+     *
+     * In addition, tag name must contain a '-'
+     */
+    tag: string;
+    /**
+     * If `true`, the component will use scoped stylesheets. Similar to shadow-dom,
+     * but without native isolation. Defaults to `false`.
+     */
+    scoped?: boolean;
+    /**
+     * If `true`, the component will use native shadow-dom encapsulation, it will fallback to
+     * `scoped` if the browser does not support shadow-dom natively. Defaults to `false`.
+     * Additionally, `shadow` can also be given options when attaching the shadow root.
+     */
+    shadow?: boolean | ShadowRootOptions;
+    /**
+     * Relative URL to some external stylesheet file. It should be a `.css` file unless some
+     * external plugin is installed like `@stencil/sass`.
+     */
+    styleUrl?: string;
+    /**
+     * Similar as `styleUrl` but allows to specify different stylesheets for different modes.
+     */
+    styleUrls?: string[] | ModeStyles;
+    /**
+     * String that contains inlined CSS instead of using an external stylesheet.
+     * The performance characteristics of this feature are the same as using an external stylesheet.
+     *
+     * Notice, you can't use sass, or less, only `css` is allowed using `styles`, use `styleUrl` is you need more advanced features.
+     */
+    styles?: string | {
+        [modeName: string]: any;
+    };
+    /**
+     * Array of relative links to folders of assets required by the component.
+     */
+    assetsDirs?: string[];
+}
+export interface ShadowRootOptions {
+    /**
+     * When set to `true`, specifies behavior that mitigates custom element issues
+     * around focusability. When a non-focusable part of the shadow DOM is clicked, the first
+     * focusable part is given focus, and the shadow host is given any available `:focus` styling.
+     */
+    delegatesFocus?: boolean;
+}
+export interface ModeStyles {
+    [modeName: string]: string | string[];
+}
+export interface PropDecorator {
+    (opts?: PropOptions): PropertyDecorator;
+}
+export interface PropOptions {
+    /**
+     * The name of the associated DOM attribute.
+     * Stencil uses different heuristics to determine the default name of the attribute,
+     * but using this property, you can override the default behaviour.
+     */
+    attribute?: string | null;
+    /**
+     * A Prop is _by default_ immutable from inside the component logic.
+     * Once a value is set by a user, the component cannot update it internally.
+     * However, it's possible to explicitly allow a Prop to be mutated from inside the component,
+     * by setting this `mutable` option to `true`.
+     */
+    mutable?: boolean;
+    /**
+     * In some cases it may be useful to keep a Prop in sync with an attribute.
+     * In this case you can set the `reflect` option to `true`, since it defaults to `false`:
+     */
+    reflect?: boolean;
+}
+export interface MethodDecorator {
+    (opts?: MethodOptions): CustomMethodDecorator<any>;
+}
+export interface MethodOptions {
+}
+export interface ElementDecorator {
+    (): PropertyDecorator;
+}
+export interface EventDecorator {
+    (opts?: EventOptions): PropertyDecorator;
+}
+export interface EventOptions {
+    /**
+     * A string custom event name to override the default.
+     */
+    eventName?: string;
+    /**
+     * A Boolean indicating whether the event bubbles up through the DOM or not.
+     */
+    bubbles?: boolean;
+    /**
+     * A Boolean indicating whether the event is cancelable.
+     */
+    cancelable?: boolean;
+    /**
+     * A Boolean value indicating whether or not the event can bubble across the boundary between the shadow DOM and the regular DOM.
+     */
+    composed?: boolean;
+}
+export interface ListenDecorator {
+    (eventName: string, opts?: ListenOptions): CustomMethodDecorator<any>;
+}
+export interface ListenOptions {
+    /**
+     * Handlers can also be registered for an event other than the host itself.
+     * The `target` option can be used to change where the event listener is attached,
+     * this is useful for listening to application-wide events.
+     */
+    target?: ListenTargetOptions;
+    /**
+     * Event listener attached with `@Listen` does not "capture" by default,
+     * When a event listener is set to "capture", means the event will be dispatched
+     * during the "capture phase". Please see
+     * https://www.quirksmode.org/js/events_order.html for further information.
+     */
+    capture?: boolean;
+    /**
+     * By default, Stencil uses several heuristics to determine if
+     * it must attach a `passive` event listener or not.
+     *
+     * Using the `passive` option can be used to change the default behaviour.
+     * Please see https://developers.google.com/web/updates/2016/06/passive-event-listeners for further information.
+     */
+    passive?: boolean;
+}
+export type ListenTargetOptions = 'body' | 'document' | 'window';
+export interface StateDecorator {
+    (): PropertyDecorator;
+}
+export interface WatchDecorator {
+    (propName: string): CustomMethodDecorator<any>;
+}
+export interface UserBuildConditionals {
+    isDev: boolean;
+    isBrowser: boolean;
+    isServer: boolean;
+    isTesting: boolean;
+}
+/**
+ * The `Build` object provides many build conditionals that can be used to
+ * include or exclude code depending on the build.
+ */
+export declare const Build: UserBuildConditionals;
+/**
+ * The `Env` object provides access to the "env" object declared in the project's `stencil.config.ts`.
+ */
+export declare const Env: {
+    [prop: string]: string | undefined;
+};
+/**
+ * The `@Component()` decorator is used to provide metadata about the component class.
+ * https://stenciljs.com/docs/component
+ */
+export declare const Component: ComponentDecorator;
+/**
+ * The `@Element()` decorator is a reference to the actual host element
+ * once it has rendered.
+ */
+export declare const Element: ElementDecorator;
+/**
+ * Components can emit data and events using the Event Emitter decorator.
+ * To dispatch Custom DOM events for other components to handle, use the
+ * `@Event()` decorator. The Event decorator also makes it easier for Stencil
+ * to automatically build types and documentation for the event data.
+ * https://stenciljs.com/docs/events
+ */
+export declare const Event: EventDecorator;
+/**
+ * The `Listen()` decorator is for listening DOM events, including the ones
+ * dispatched from `@Events()`.
+ * https://stenciljs.com/docs/events#listen-decorator
+ */
+export declare const Listen: ListenDecorator;
+/**
+ * The `@Method()` decorator is used to expose methods on the public API.
+ * Class methods decorated with the @Method() decorator can be called directly
+ * from the element, meaning they are intended to be callable from the outside.
+ * https://stenciljs.com/docs/methods
+ */
+export declare const Method: MethodDecorator;
+/**
+ * Props are custom attribute/properties exposed publicly on the element
+ * that developers can provide values for. Children components do not need to
+ * know about or reference parent components, so Props can be used to pass
+ * data down from the parent to the child. Components need to explicitly
+ * declare the Props they expect to receive using the `@Prop()` decorator.
+ * Any value changes to a Prop will cause a re-render.
+ * https://stenciljs.com/docs/properties
+ */
+export declare const Prop: PropDecorator;
+/**
+ * The `@State()` decorator can be used to manage internal data for a component.
+ * This means that a user cannot modify this data from outside the component,
+ * but the component can modify it however it sees fit. Any value changes to a
+ * `@State()` property will cause the components render function to be called again.
+ * https://stenciljs.com/docs/state
+ */
+export declare const State: StateDecorator;
+/**
+ * When a property's value has changed, a method decorated with `@Watch()` will be
+ * called and passed the new value of the prop along with the old value. Watch is
+ * useful for validating props or handling side effects. Watch decorator does not
+ * fire when a component initially loads.
+ * https://stenciljs.com/docs/reactive-data#watch-decorator
+ */
+export declare const Watch: WatchDecorator;
+export type ResolutionHandler = (elm: HTMLElement) => string | undefined | null;
+export type ErrorHandler = (err: any, element?: HTMLElement) => void;
+/**
+ * `setMode()` is used for libraries which provide multiple "modes" for styles.
+ */
+export declare const setMode: (handler: ResolutionHandler) => void;
+/**
+ * `getMode()` is used for libraries which provide multiple "modes" for styles.
+ * @param ref a reference to the node to get styles for
+ * @returns the current mode or undefined, if not found
+ */
+export declare function getMode<T = string | undefined>(ref: any): T;
+export declare function setPlatformHelpers(helpers: {
+    jmp?: (c: any) => any;
+    raf?: (c: any) => number;
+    ael?: (el: any, eventName: string, listener: any, options: any) => void;
+    rel?: (el: any, eventName: string, listener: any, options: any) => void;
+    ce?: (eventName: string, opts?: any) => any;
+}): void;
+/**
+ * Get the base path to where the assets can be found. Use `setAssetPath(path)`
+ * if the path needs to be customized.
+ * @param path the path to use in calculating the asset path. this value will be
+ * used in conjunction with the base asset path
+ * @returns the base path
+ */
+export declare function getAssetPath(path: string): string;
+/**
+ * Used to manually set the base path where assets can be found. For lazy-loaded
+ * builds the asset path is automatically set and assets copied to the correct
+ * build directory. However, for custom elements builds, the `setAssetPath(path)` could
+ * be used to customize the asset path depending on how the script file is consumed.
+ * If the script is used as "module", it's recommended to use "import.meta.url", such
+ * as `setAssetPath(import.meta.url)`. Other options include
+ * `setAssetPath(document.currentScript.src)`, or using a bundler's replace plugin to
+ * dynamically set the path at build time, such as `setAssetPath(process.env.ASSET_PATH)`.
+ * But do note that this configuration depends on how your script is bundled, or lack of
+ * bundling, and where your assets can be loaded from. Additionally custom bundling
+ * will have to ensure the static assets are copied to its build directory.
+ * @param path the asset path to set
+ * @returns the set path
+ */
+export declare function setAssetPath(path: string): string;
+/**
+ * Used to specify a nonce value that corresponds with an application's
+ * [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP).
+ * When set, the nonce will be added to all dynamically created script and style tags at runtime.
+ * Alternatively, the nonce value can be set on a `meta` tag in the DOM head
+ * (<meta name="csp-nonce" content="{ nonce value here }" />) and will result in the same behavior.
+ * @param nonce The value to be used for the nonce attribute.
+ */
+export declare function setNonce(nonce: string): void;
+/**
+ * Retrieve a Stencil element for a given reference
+ * @param ref the ref to get the Stencil element for
+ * @returns a reference to the element
+ */
+export declare function getElement(ref: any): HTMLStencilElement;
+/**
+ * Schedules a new render of the given instance or element even if no state changed.
+ *
+ * Notice `forceUpdate()` is not synchronous and might perform the DOM render in the next frame.
+ *
+ * @param ref the node/element to force the re-render of
+ */
+export declare function forceUpdate(ref: any): void;
+/**
+ * getRenderingRef
+ * @returns the rendering ref
+ */
+export declare function getRenderingRef(): any;
+export interface HTMLStencilElement extends HTMLElement {
+    componentOnReady(): Promise<this>;
+}
+/**
+ * Schedules a DOM-write task. The provided callback will be executed
+ * in the best moment to perform DOM mutation without causing layout thrashing.
+ *
+ * For further information: https://developers.google.com/web/fundamentals/performance/rendering/avoid-large-complex-layouts-and-layout-thrashing
+ *
+ * @param task the DOM-write to schedule
+ */
+export declare function writeTask(task: RafCallback): void;
+/**
+ * Schedules a DOM-read task. The provided callback will be executed
+ * in the best moment to perform DOM reads without causing layout thrashing.
+ *
+ * For further information: https://developers.google.com/web/fundamentals/performance/rendering/avoid-large-complex-layouts-and-layout-thrashing
+ *
+ * @param task the DOM-read to schedule
+ */
+export declare function readTask(task: RafCallback): void;
+/**
+ * `setErrorHandler()` can be used to inject a custom global error handler.
+ * Unhandled exception raised while rendering, during event handling, or lifecycles will trigger the custom event handler.
+ */
+export declare const setErrorHandler: (handler: ErrorHandler) => void;
+/**
+ * This file gets copied to all distributions of stencil component collections.
+ * - no imports
+ */
+export interface ComponentWillLoad {
+    /**
+     * The component is about to load and it has not
+     * rendered yet.
+     *
+     * This is the best place to make any data updates
+     * before the first render.
+     *
+     * componentWillLoad will only be called once.
+     */
+    componentWillLoad(): Promise<void> | void;
+}
+export interface ComponentDidLoad {
+    /**
+     * The component has loaded and has already rendered.
+     *
+     * Updating data in this method will cause the
+     * component to re-render.
+     *
+     * componentDidLoad will only be called once.
+     */
+    componentDidLoad(): void;
+}
+export interface ComponentWillUpdate {
+    /**
+     * The component is about to update and re-render.
+     *
+     * Called multiple times throughout the life of
+     * the component as it updates.
+     *
+     * componentWillUpdate is not called on the first render.
+     */
+    componentWillUpdate(): Promise<void> | void;
+}
+export interface ComponentDidUpdate {
+    /**
+     * The component has just re-rendered.
+     *
+     * Called multiple times throughout the life of
+     * the component as it updates.
+     *
+     * componentWillUpdate is not called on the
+     * first render.
+     */
+    componentDidUpdate(): void;
+}
+export interface ComponentInterface {
+    connectedCallback?(): void;
+    disconnectedCallback?(): void;
+    componentWillRender?(): Promise<void> | void;
+    componentDidRender?(): void;
+    /**
+     * The component is about to load and it has not
+     * rendered yet.
+     *
+     * This is the best place to make any data updates
+     * before the first render.
+     *
+     * componentWillLoad will only be called once.
+     */
+    componentWillLoad?(): Promise<void> | void;
+    /**
+     * The component has loaded and has already rendered.
+     *
+     * Updating data in this method will cause the
+     * component to re-render.
+     *
+     * componentDidLoad will only be called once.
+     */
+    componentDidLoad?(): void;
+    /**
+     * A `@Prop` or `@State` property changed and a rerender is about to be requested.
+     *
+     * Called multiple times throughout the life of
+     * the component as its properties change.
+     *
+     * componentShouldUpdate is not called on the first render.
+     */
+    componentShouldUpdate?(newVal: any, oldVal: any, propName: string): boolean | void;
+    /**
+     * The component is about to update and re-render.
+     *
+     * Called multiple times throughout the life of
+     * the component as it updates.
+     *
+     * componentWillUpdate is not called on the first render.
+     */
+    componentWillUpdate?(): Promise<void> | void;
+    /**
+     * The component has just re-rendered.
+     *
+     * Called multiple times throughout the life of
+     * the component as it updates.
+     *
+     * componentWillUpdate is not called on the
+     * first render.
+     */
+    componentDidUpdate?(): void;
+    render?(): any;
+    [memberName: string]: any;
+}
+export interface EventEmitter<T = any> {
+    emit: (data?: T) => CustomEvent<T>;
+}
+export interface RafCallback {
+    (timeStamp: number): void;
+}
+export interface QueueApi {
+    tick: (cb: RafCallback) => void;
+    read: (cb: RafCallback) => void;
+    write: (cb: RafCallback) => void;
+    clear?: () => void;
+    flush?: (cb?: () => void) => void;
+}
+/**
+ * Host
+ */
+interface HostAttributes {
+    class?: string | {
+        [className: string]: boolean;
+    };
+    style?: {
+        [key: string]: string | undefined;
+    };
+    ref?: (el: HTMLElement | null) => void;
+    [prop: string]: any;
+}
+/**
+ * Utilities for working with functional Stencil components. An object
+ * conforming to this interface is passed by the Stencil runtime as the third
+ * argument to a functional component, allowing component authors to work with
+ * features like children.
+ *
+ * The children of a functional component will be passed as the second
+ * argument, so a functional component which uses these utils to transform its
+ * children might look like the following:
+ *
+ * ```ts
+ * export const AddClass: FunctionalComponent = (_, children, utils) => (
+ *  utils.map(children, child => ({
+ *    ...child,
+ *    vattrs: {
+ *      ...child.vattrs,
+ *      class: `${child.vattrs.class} add-class`
+ *    }
+ *  }))
+ * );
+ * ```
+ *
+ * For more see the Stencil documentation, here:
+ * https://stenciljs.com/docs/functional-components
+ */
+export interface FunctionalUtilities {
+    /**
+     * Utility for reading the children of a functional component at runtime.
+     * Since the Stencil runtime uses a different interface for children it is
+     * not recommendeded to read the children directly, and is preferable to use
+     * this utility to, for instance, perform a side effect for each child.
+     */
+    forEach: (children: VNode[], cb: (vnode: ChildNode, index: number, array: ChildNode[]) => void) => void;
+    /**
+     * Utility for transforming the children of a functional component. Given an
+     * array of children and a callback this will return a list of the results of
+     * passing each child to the supplied callback.
+     */
+    map: (children: VNode[], cb: (vnode: ChildNode, index: number, array: ChildNode[]) => ChildNode) => VNode[];
+}
+export interface FunctionalComponent<T = {}> {
+    (props: T, children: VNode[], utils: FunctionalUtilities): VNode | VNode[];
+}
+/**
+ * A Child VDOM node
+ *
+ * This has most of the same properties as {@link VNode} but friendlier names
+ * (i.e. `vtag` instead of `$tag$`, `vchildren` instead of `$children$`) in
+ * order to provide a friendlier public interface for users of the
+ * {@link FunctionalUtilities}).
+ */
+export interface ChildNode {
+    vtag?: string | number | Function;
+    vkey?: string | number;
+    vtext?: string;
+    vchildren?: VNode[];
+    vattrs?: any;
+    vname?: string;
+}
+/**
+ * Host is a functional component can be used at the root of the render function
+ * to set attributes and event listeners to the host element itself.
+ *
+ * For further information: https://stenciljs.com/docs/host-element
+ */
+export declare const Host: FunctionalComponent<HostAttributes>;
+/**
+ * Fragment
+ */
+export declare const Fragment: FunctionalComponent<{}>;
+/**
+ * The "h" namespace is used to import JSX types for elements and attributes.
+ * It is imported in order to avoid conflicting global JSX issues.
+ */
+export declare namespace h {
+    function h(sel: any): VNode;
+    function h(sel: Node, data: VNodeData | null): VNode;
+    function h(sel: any, data: VNodeData | null): VNode;
+    function h(sel: any, text: string): VNode;
+    function h(sel: any, children: Array<VNode | undefined | null>): VNode;
+    function h(sel: any, data: VNodeData | null, text: string): VNode;
+    function h(sel: any, data: VNodeData | null, children: Array<VNode | undefined | null>): VNode;
+    function h(sel: any, data: VNodeData | null, children: VNode): VNode;
+    namespace JSX {
+        interface IntrinsicElements extends LocalJSX.IntrinsicElements, JSXBase.IntrinsicElements {
+            [tagName: string]: any;
+        }
+    }
+}
+export declare function h(sel: any): VNode;
+export declare function h(sel: Node, data: VNodeData | null): VNode;
+export declare function h(sel: any, data: VNodeData | null): VNode;
+export declare function h(sel: any, text: string): VNode;
+export declare function h(sel: any, children: Array<VNode | undefined | null>): VNode;
+export declare function h(sel: any, data: VNodeData | null, text: string): VNode;
+export declare function h(sel: any, data: VNodeData | null, children: Array<VNode | undefined | null>): VNode;
+export declare function h(sel: any, data: VNodeData | null, children: VNode): VNode;
+/**
+ * A virtual DOM node
+ */
+export interface VNode {
+    $flags$: number;
+    $tag$: string | number | Function;
+    $elm$: any;
+    $text$: string;
+    $children$: VNode[];
+    $attrs$?: any;
+    $name$?: string;
+    $key$?: string | number;
+}
+export interface VNodeData {
+    class?: {
+        [className: string]: boolean;
+    };
+    style?: any;
+    [attrName: string]: any;
+}
+declare namespace LocalJSX {
+    interface Element {
+    }
+    interface IntrinsicElements {
+    }
+}
+export { LocalJSX as JSX };
+export declare namespace JSXBase {
+    interface IntrinsicElements {
+        slot: JSXBase.SlotAttributes;
+        a: JSXBase.AnchorHTMLAttributes<HTMLAnchorElement>;
+        abbr: JSXBase.HTMLAttributes;
+        address: JSXBase.HTMLAttributes;
+        area: JSXBase.AreaHTMLAttributes<HTMLAreaElement>;
+        article: JSXBase.HTMLAttributes;
+        aside: JSXBase.HTMLAttributes;
+        audio: JSXBase.AudioHTMLAttributes<HTMLAudioElement>;
+        b: JSXBase.HTMLAttributes;
+        base: JSXBase.BaseHTMLAttributes<HTMLBaseElement>;
+        bdi: JSXBase.HTMLAttributes;
+        bdo: JSXBase.HTMLAttributes;
+        big: JSXBase.HTMLAttributes;
+        blockquote: JSXBase.BlockquoteHTMLAttributes<HTMLQuoteElement>;
+        body: JSXBase.HTMLAttributes<HTMLBodyElement>;
+        br: JSXBase.HTMLAttributes<HTMLBRElement>;
+        button: JSXBase.ButtonHTMLAttributes<HTMLButtonElement>;
+        canvas: JSXBase.CanvasHTMLAttributes<HTMLCanvasElement>;
+        caption: JSXBase.HTMLAttributes<HTMLTableCaptionElement>;
+        cite: JSXBase.HTMLAttributes;
+        code: JSXBase.HTMLAttributes;
+        col: JSXBase.ColHTMLAttributes<HTMLTableColElement>;
+        colgroup: JSXBase.ColgroupHTMLAttributes<HTMLTableColElement>;
+        data: JSXBase.HTMLAttributes<HTMLDataElement>;
+        datalist: JSXBase.HTMLAttributes<HTMLDataListElement>;
+        dd: JSXBase.HTMLAttributes;
+        del: JSXBase.DelHTMLAttributes<HTMLModElement>;
+        details: JSXBase.DetailsHTMLAttributes<HTMLElement>;
+        dfn: JSXBase.HTMLAttributes;
+        dialog: JSXBase.DialogHTMLAttributes<HTMLDialogElement>;
+        div: JSXBase.HTMLAttributes<HTMLDivElement>;
+        dl: JSXBase.HTMLAttributes<HTMLDListElement>;
+        dt: JSXBase.HTMLAttributes;
+        em: JSXBase.HTMLAttributes;
+        embed: JSXBase.EmbedHTMLAttributes<HTMLEmbedElement>;
+        fieldset: JSXBase.FieldsetHTMLAttributes<HTMLFieldSetElement>;
+        figcaption: JSXBase.HTMLAttributes;
+        figure: JSXBase.HTMLAttributes;
+        footer: JSXBase.HTMLAttributes;
+        form: JSXBase.FormHTMLAttributes<HTMLFormElement>;
+        h1: JSXBase.HTMLAttributes<HTMLHeadingElement>;
+        h2: JSXBase.HTMLAttributes<HTMLHeadingElement>;
+        h3: JSXBase.HTMLAttributes<HTMLHeadingElement>;
+        h4: JSXBase.HTMLAttributes<HTMLHeadingElement>;
+        h5: JSXBase.HTMLAttributes<HTMLHeadingElement>;
+        h6: JSXBase.HTMLAttributes<HTMLHeadingElement>;
+        head: JSXBase.HTMLAttributes<HTMLHeadElement>;
+        header: JSXBase.HTMLAttributes;
+        hgroup: JSXBase.HTMLAttributes;
+        hr: JSXBase.HTMLAttributes<HTMLHRElement>;
+        html: JSXBase.HTMLAttributes<HTMLHtmlElement>;
+        i: JSXBase.HTMLAttributes;
+        iframe: JSXBase.IframeHTMLAttributes<HTMLIFrameElement>;
+        img: JSXBase.ImgHTMLAttributes<HTMLImageElement>;
+        input: JSXBase.InputHTMLAttributes<HTMLInputElement>;
+        ins: JSXBase.InsHTMLAttributes<HTMLModElement>;
+        kbd: JSXBase.HTMLAttributes;
+        keygen: JSXBase.KeygenHTMLAttributes<HTMLElement>;
+        label: JSXBase.LabelHTMLAttributes<HTMLLabelElement>;
+        legend: JSXBase.HTMLAttributes<HTMLLegendElement>;
+        li: JSXBase.LiHTMLAttributes<HTMLLIElement>;
+        link: JSXBase.LinkHTMLAttributes<HTMLLinkElement>;
+        main: JSXBase.HTMLAttributes;
+        map: JSXBase.MapHTMLAttributes<HTMLMapElement>;
+        mark: JSXBase.HTMLAttributes;
+        menu: JSXBase.MenuHTMLAttributes<HTMLMenuElement>;
+        menuitem: JSXBase.HTMLAttributes;
+        meta: JSXBase.MetaHTMLAttributes<HTMLMetaElement>;
+        meter: JSXBase.MeterHTMLAttributes<HTMLMeterElement>;
+        nav: JSXBase.HTMLAttributes;
+        noscript: JSXBase.HTMLAttributes;
+        object: JSXBase.ObjectHTMLAttributes<HTMLObjectElement>;
+        ol: JSXBase.OlHTMLAttributes<HTMLOListElement>;
+        optgroup: JSXBase.OptgroupHTMLAttributes<HTMLOptGroupElement>;
+        option: JSXBase.OptionHTMLAttributes<HTMLOptionElement>;
+        output: JSXBase.OutputHTMLAttributes<HTMLOutputElement>;
+        p: JSXBase.HTMLAttributes<HTMLParagraphElement>;
+        param: JSXBase.ParamHTMLAttributes<HTMLParamElement>;
+        picture: JSXBase.HTMLAttributes<HTMLPictureElement>;
+        pre: JSXBase.HTMLAttributes<HTMLPreElement>;
+        progress: JSXBase.ProgressHTMLAttributes<HTMLProgressElement>;
+        q: JSXBase.QuoteHTMLAttributes<HTMLQuoteElement>;
+        rp: JSXBase.HTMLAttributes;
+        rt: JSXBase.HTMLAttributes;
+        ruby: JSXBase.HTMLAttributes;
+        s: JSXBase.HTMLAttributes;
+        samp: JSXBase.HTMLAttributes;
+        script: JSXBase.ScriptHTMLAttributes<HTMLScriptElement>;
+        section: JSXBase.HTMLAttributes;
+        select: JSXBase.SelectHTMLAttributes<HTMLSelectElement>;
+        small: JSXBase.HTMLAttributes;
+        source: JSXBase.SourceHTMLAttributes<HTMLSourceElement>;
+        span: JSXBase.HTMLAttributes<HTMLSpanElement>;
+        strong: JSXBase.HTMLAttributes;
+        style: JSXBase.StyleHTMLAttributes<HTMLStyleElement>;
+        sub: JSXBase.HTMLAttributes;
+        summary: JSXBase.HTMLAttributes;
+        sup: JSXBase.HTMLAttributes;
+        table: JSXBase.TableHTMLAttributes<HTMLTableElement>;
+        tbody: JSXBase.HTMLAttributes<HTMLTableSectionElement>;
+        td: JSXBase.TdHTMLAttributes<HTMLTableDataCellElement>;
+        textarea: JSXBase.TextareaHTMLAttributes<HTMLTextAreaElement>;
+        tfoot: JSXBase.HTMLAttributes<HTMLTableSectionElement>;
+        th: JSXBase.ThHTMLAttributes<HTMLTableHeaderCellElement>;
+        thead: JSXBase.HTMLAttributes<HTMLTableSectionElement>;
+        time: JSXBase.TimeHTMLAttributes<HTMLTimeElement>;
+        title: JSXBase.HTMLAttributes<HTMLTitleElement>;
+        tr: JSXBase.HTMLAttributes<HTMLTableRowElement>;
+        track: JSXBase.TrackHTMLAttributes<HTMLTrackElement>;
+        u: JSXBase.HTMLAttributes;
+        ul: JSXBase.HTMLAttributes<HTMLUListElement>;
+        var: JSXBase.HTMLAttributes;
+        video: JSXBase.VideoHTMLAttributes<HTMLVideoElement>;
+        wbr: JSXBase.HTMLAttributes;
+        animate: JSXBase.SVGAttributes;
+        circle: JSXBase.SVGAttributes;
+        clipPath: JSXBase.SVGAttributes;
+        defs: JSXBase.SVGAttributes;
+        desc: JSXBase.SVGAttributes;
+        ellipse: JSXBase.SVGAttributes;
+        feBlend: JSXBase.SVGAttributes;
+        feColorMatrix: JSXBase.SVGAttributes;
+        feComponentTransfer: JSXBase.SVGAttributes;
+        feComposite: JSXBase.SVGAttributes;
+        feConvolveMatrix: JSXBase.SVGAttributes;
+        feDiffuseLighting: JSXBase.SVGAttributes;
+        feDisplacementMap: JSXBase.SVGAttributes;
+        feDistantLight: JSXBase.SVGAttributes;
+        feDropShadow: JSXBase.SVGAttributes;
+        feFlood: JSXBase.SVGAttributes;
+        feFuncA: JSXBase.SVGAttributes;
+        feFuncB: JSXBase.SVGAttributes;
+        feFuncG: JSXBase.SVGAttributes;
+        feFuncR: JSXBase.SVGAttributes;
+        feGaussianBlur: JSXBase.SVGAttributes;
+        feImage: JSXBase.SVGAttributes;
+        feMerge: JSXBase.SVGAttributes;
+        feMergeNode: JSXBase.SVGAttributes;
+        feMorphology: JSXBase.SVGAttributes;
+        feOffset: JSXBase.SVGAttributes;
+        fePointLight: JSXBase.SVGAttributes;
+        feSpecularLighting: JSXBase.SVGAttributes;
+        feSpotLight: JSXBase.SVGAttributes;
+        feTile: JSXBase.SVGAttributes;
+        feTurbulence: JSXBase.SVGAttributes;
+        filter: JSXBase.SVGAttributes;
+        foreignObject: JSXBase.SVGAttributes;
+        g: JSXBase.SVGAttributes;
+        image: JSXBase.SVGAttributes;
+        line: JSXBase.SVGAttributes;
+        linearGradient: JSXBase.SVGAttributes;
+        marker: JSXBase.SVGAttributes;
+        mask: JSXBase.SVGAttributes;
+        metadata: JSXBase.SVGAttributes;
+        path: JSXBase.SVGAttributes;
+        pattern: JSXBase.SVGAttributes;
+        polygon: JSXBase.SVGAttributes;
+        polyline: JSXBase.SVGAttributes;
+        radialGradient: JSXBase.SVGAttributes;
+        rect: JSXBase.SVGAttributes;
+        stop: JSXBase.SVGAttributes;
+        svg: JSXBase.SVGAttributes;
+        switch: JSXBase.SVGAttributes;
+        symbol: JSXBase.SVGAttributes;
+        text: JSXBase.SVGAttributes;
+        textPath: JSXBase.SVGAttributes;
+        tspan: JSXBase.SVGAttributes;
+        use: JSXBase.SVGAttributes;
+        view: JSXBase.SVGAttributes;
+    }
+    interface SlotAttributes extends JSXAttributes {
+        name?: string;
+        slot?: string;
+        onSlotchange?: (event: Event) => void;
+    }
+    interface AnchorHTMLAttributes<T> extends HTMLAttributes<T> {
+        download?: any;
+        href?: string;
+        hrefLang?: string;
+        hreflang?: string;
+        media?: string;
+        rel?: string;
+        target?: string;
+        referrerPolicy?: ReferrerPolicy;
+    }
+    interface AudioHTMLAttributes<T> extends MediaHTMLAttributes<T> {
+    }
+    interface AreaHTMLAttributes<T> extends HTMLAttributes<T> {
+        alt?: string;
+        coords?: string;
+        download?: any;
+        href?: string;
+        hrefLang?: string;
+        hreflang?: string;
+        media?: string;
+        rel?: string;
+        shape?: string;
+        target?: string;
+    }
+    interface BaseHTMLAttributes<T> extends HTMLAttributes<T> {
+        href?: string;
+        target?: string;
+    }
+    interface BlockquoteHTMLAttributes<T> extends HTMLAttributes<T> {
+        cite?: string;
+    }
+    interface ButtonHTMLAttributes<T> extends HTMLAttributes<T> {
+        autoFocus?: boolean;
+        disabled?: boolean;
+        form?: string;
+        formAction?: string;
+        formaction?: string;
+        formEncType?: string;
+        formenctype?: string;
+        formMethod?: string;
+        formmethod?: string;
+        formNoValidate?: boolean;
+        formnovalidate?: boolean;
+        formTarget?: string;
+        formtarget?: string;
+        name?: string;
+        type?: string;
+        value?: string | string[] | number;
+    }
+    interface CanvasHTMLAttributes<T> extends HTMLAttributes<T> {
+        height?: number | string;
+        width?: number | string;
+    }
+    interface ColHTMLAttributes<T> extends HTMLAttributes<T> {
+        span?: number;
+    }
+    interface ColgroupHTMLAttributes<T> extends HTMLAttributes<T> {
+        span?: number;
+    }
+    interface DetailsHTMLAttributes<T> extends HTMLAttributes<T> {
+        open?: boolean;
+        onToggle?: (event: Event) => void;
+    }
+    interface DelHTMLAttributes<T> extends HTMLAttributes<T> {
+        cite?: string;
+        dateTime?: string;
+        datetime?: string;
+    }
+    interface DialogHTMLAttributes<T> extends HTMLAttributes<T> {
+        onCancel?: (event: Event) => void;
+        onClose?: (event: Event) => void;
+        open?: boolean;
+        returnValue?: string;
+    }
+    interface EmbedHTMLAttributes<T> extends HTMLAttributes<T> {
+        height?: number | string;
+        src?: string;
+        type?: string;
+        width?: number | string;
+    }
+    interface FieldsetHTMLAttributes<T> extends HTMLAttributes<T> {
+        disabled?: boolean;
+        form?: string;
+        name?: string;
+    }
+    interface FormHTMLAttributes<T> extends HTMLAttributes<T> {
+        acceptCharset?: string;
+        acceptcharset?: string;
+        action?: string;
+        autoComplete?: string;
+        autocomplete?: string;
+        encType?: string;
+        enctype?: string;
+        method?: string;
+        name?: string;
+        noValidate?: boolean;
+        novalidate?: boolean | string;
+        target?: string;
+    }
+    interface HtmlHTMLAttributes<T> extends HTMLAttributes<T> {
+        manifest?: string;
+    }
+    interface IframeHTMLAttributes<T> extends HTMLAttributes<T> {
+        allow?: string;
+        allowFullScreen?: boolean;
+        allowfullScreen?: string | boolean;
+        allowTransparency?: boolean;
+        allowtransparency?: string | boolean;
+        frameBorder?: number | string;
+        frameborder?: number | string;
+        importance?: 'low' | 'auto' | 'high';
+        height?: number | string;
+        loading?: 'lazy' | 'auto' | 'eager';
+        marginHeight?: number;
+        marginheight?: string | number;
+        marginWidth?: number;
+        marginwidth?: string | number;
+        name?: string;
+        referrerPolicy?: ReferrerPolicy;
+        sandbox?: string;
+        scrolling?: string;
+        seamless?: boolean;
+        src?: string;
+        srcDoc?: string;
+        srcdoc?: string;
+        width?: number | string;
+    }
+    interface ImgHTMLAttributes<T> extends HTMLAttributes<T> {
+        alt?: string;
+        decoding?: 'async' | 'auto' | 'sync';
+        importance?: 'low' | 'auto' | 'high';
+        height?: number | string;
+        loading?: 'lazy' | 'auto' | 'eager';
+        sizes?: string;
+        src?: string;
+        srcSet?: string;
+        srcset?: string;
+        useMap?: string;
+        usemap?: string;
+        width?: number | string;
+    }
+    interface InsHTMLAttributes<T> extends HTMLAttributes<T> {
+        cite?: string;
+        dateTime?: string;
+        datetime?: string;
+    }
+    interface InputHTMLAttributes<T> extends HTMLAttributes<T> {
+        accept?: string;
+        allowdirs?: boolean;
+        alt?: string;
+        autoCapitalize?: string;
+        autocapitalize?: string;
+        autoComplete?: string;
+        autocomplete?: string;
+        autoFocus?: boolean;
+        autofocus?: boolean | string;
+        capture?: string;
+        checked?: boolean;
+        crossOrigin?: string;
+        crossorigin?: string;
+        defaultChecked?: boolean;
+        defaultValue?: string;
+        dirName?: string;
+        disabled?: boolean;
+        files?: any;
+        form?: string;
+        formAction?: string;
+        formaction?: string;
+        formEncType?: string;
+        formenctype?: string;
+        formMethod?: string;
+        formmethod?: string;
+        formNoValidate?: boolean;
+        formnovalidate?: boolean;
+        formTarget?: string;
+        formtarget?: string;
+        height?: number | string;
+        indeterminate?: boolean;
+        list?: string;
+        max?: number | string;
+        maxLength?: number;
+        maxlength?: number | string;
+        min?: number | string;
+        minLength?: number;
+        minlength?: number | string;
+        multiple?: boolean;
+        name?: string;
+        pattern?: string;
+        placeholder?: string;
+        readOnly?: boolean;
+        readonly?: boolean | string;
+        required?: boolean;
+        selectionStart?: number | string;
+        selectionEnd?: number | string;
+        selectionDirection?: string;
+        size?: number;
+        src?: string;
+        step?: number | string;
+        type?: string;
+        value?: string | string[] | number;
+        valueAsDate?: any;
+        valueAsNumber?: any;
+        webkitdirectory?: boolean;
+        webkitEntries?: any;
+        width?: number | string;
+    }
+    interface KeygenHTMLAttributes<T> extends HTMLAttributes<T> {
+        autoFocus?: boolean;
+        autofocus?: boolean | string;
+        challenge?: string;
+        disabled?: boolean;
+        form?: string;
+        keyType?: string;
+        keytype?: string;
+        keyParams?: string;
+        keyparams?: string;
+        name?: string;
+    }
+    interface LabelHTMLAttributes<T> extends HTMLAttributes<T> {
+        form?: string;
+        htmlFor?: string;
+        htmlfor?: string;
+    }
+    interface LiHTMLAttributes<T> extends HTMLAttributes<T> {
+        value?: string | string[] | number;
+    }
+    interface LinkHTMLAttributes<T> extends HTMLAttributes<T> {
+        as?: string;
+        href?: string;
+        hrefLang?: string;
+        hreflang?: string;
+        importance?: 'low' | 'auto' | 'high';
+        integrity?: string;
+        media?: string;
+        rel?: string;
+        sizes?: string;
+        type?: string;
+    }
+    interface MapHTMLAttributes<T> extends HTMLAttributes<T> {
+        name?: string;
+    }
+    interface MenuHTMLAttributes<T> extends HTMLAttributes<T> {
+        type?: string;
+    }
+    interface MediaHTMLAttributes<T> extends HTMLAttributes<T> {
+        autoPlay?: boolean;
+        autoplay?: boolean | string;
+        controls?: boolean;
+        crossOrigin?: string;
+        crossorigin?: string;
+        loop?: boolean;
+        mediaGroup?: string;
+        mediagroup?: string;
+        muted?: boolean;
+        preload?: string;
+        src?: string;
+        onAbort?: (event: Event) => void;
+        onCanPlay?: (event: Event) => void;
+        onCanPlayThrough?: (event: Event) => void;
+        onDurationChange?: (event: Event) => void;
+        onEmptied?: (event: Event) => void;
+        onEnded?: (event: Event) => void;
+        onError?: (event: Event) => void;
+        onInterruptBegin?: (event: Event) => void;
+        onInterruptEnd?: (event: Event) => void;
+        onLoadedData?: (event: Event) => void;
+        onLoadedMetaData?: (event: Event) => void;
+        onLoadStart?: (event: Event) => void;
+        onMozAudioAvailable?: (event: Event) => void;
+        onPause?: (event: Event) => void;
+        onPlay?: (event: Event) => void;
+        onPlaying?: (event: Event) => void;
+        onProgress?: (event: Event) => void;
+        onRateChange?: (event: Event) => void;
+        onSeeked?: (event: Event) => void;
+        onSeeking?: (event: Event) => void;
+        onStalled?: (event: Event) => void;
+        onSuspend?: (event: Event) => void;
+        onTimeUpdate?: (event: Event) => void;
+        onVolumeChange?: (event: Event) => void;
+        onWaiting?: (event: Event) => void;
+    }
+    interface MetaHTMLAttributes<T> extends HTMLAttributes<T> {
+        charSet?: string;
+        charset?: string;
+        content?: string;
+        httpEquiv?: string;
+        httpequiv?: string;
+        name?: string;
+    }
+    interface MeterHTMLAttributes<T> extends HTMLAttributes<T> {
+        form?: string;
+        high?: number;
+        low?: number;
+        max?: number | string;
+        min?: number | string;
+        optimum?: number;
+        value?: string | string[] | number;
+    }
+    interface QuoteHTMLAttributes<T> extends HTMLAttributes<T> {
+        cite?: string;
+    }
+    interface ObjectHTMLAttributes<T> extends HTMLAttributes<T> {
+        classID?: string;
+        classid?: string;
+        data?: string;
+        form?: string;
+        height?: number | string;
+        name?: string;
+        type?: string;
+        useMap?: string;
+        usemap?: string;
+        width?: number | string;
+        wmode?: string;
+    }
+    interface OlHTMLAttributes<T> extends HTMLAttributes<T> {
+        reversed?: boolean;
+        start?: number;
+    }
+    interface OptgroupHTMLAttributes<T> extends HTMLAttributes<T> {
+        disabled?: boolean;
+        label?: string;
+    }
+    interface OptionHTMLAttributes<T> extends HTMLAttributes<T> {
+        disabled?: boolean;
+        label?: string;
+        selected?: boolean;
+        value?: string | string[] | number;
+    }
+    interface OutputHTMLAttributes<T> extends HTMLAttributes<T> {
+        form?: string;
+        htmlFor?: string;
+        htmlfor?: string;
+        name?: string;
+    }
+    interface ParamHTMLAttributes<T> extends HTMLAttributes<T> {
+        name?: string;
+        value?: string | string[] | number;
+    }
+    interface ProgressHTMLAttributes<T> extends HTMLAttributes<T> {
+        max?: number | string;
+        value?: string | string[] | number;
+    }
+    interface ScriptHTMLAttributes<T> extends HTMLAttributes<T> {
+        async?: boolean;
+        charSet?: string;
+        charset?: string;
+        crossOrigin?: string;
+        crossorigin?: string;
+        defer?: boolean;
+        importance?: 'low' | 'auto' | 'high';
+        integrity?: string;
+        nonce?: string;
+        src?: string;
+        type?: string;
+    }
+    interface SelectHTMLAttributes<T> extends HTMLAttributes<T> {
+        autoFocus?: boolean;
+        disabled?: boolean;
+        form?: string;
+        multiple?: boolean;
+        name?: string;
+        required?: boolean;
+        size?: number;
+        autoComplete?: string;
+        autocomplete?: string;
+    }
+    interface SourceHTMLAttributes<T> extends HTMLAttributes<T> {
+        media?: string;
+        sizes?: string;
+        src?: string;
+        srcSet?: string;
+        type?: string;
+    }
+    interface StyleHTMLAttributes<T> extends HTMLAttributes<T> {
+        media?: string;
+        nonce?: string;
+        scoped?: boolean;
+        type?: string;
+    }
+    interface TableHTMLAttributes<T> extends HTMLAttributes<T> {
+        cellPadding?: number | string;
+        cellpadding?: number | string;
+        cellSpacing?: number | string;
+        cellspacing?: number | string;
+        summary?: string;
+    }
+    interface TextareaHTMLAttributes<T> extends HTMLAttributes<T> {
+        autoComplete?: string;
+        autocomplete?: string;
+        autoFocus?: boolean;
+        autofocus?: boolean | string;
+        cols?: number;
+        disabled?: boolean;
+        form?: string;
+        maxLength?: number;
+        maxlength?: number | string;
+        minLength?: number;
+        minlength?: number | string;
+        name?: string;
+        placeholder?: string;
+        readOnly?: boolean;
+        readonly?: boolean | string;
+        required?: boolean;
+        rows?: number;
+        value?: string | string[] | number;
+        wrap?: string;
+    }
+    interface TdHTMLAttributes<T> extends HTMLAttributes<T> {
+        colSpan?: number;
+        headers?: string;
+        rowSpan?: number;
+    }
+    interface ThHTMLAttributes<T> extends HTMLAttributes<T> {
+        abbr?: string;
+        colSpan?: number;
+        headers?: string;
+        rowSpan?: number;
+        rowspan?: number | string;
+        scope?: string;
+    }
+    interface TimeHTMLAttributes<T> extends HTMLAttributes<T> {
+        dateTime?: string;
+    }
+    interface TrackHTMLAttributes<T> extends HTMLAttributes<T> {
+        default?: boolean;
+        kind?: string;
+        label?: string;
+        src?: string;
+        srcLang?: string;
+        srclang?: string;
+    }
+    interface VideoHTMLAttributes<T> extends MediaHTMLAttributes<T> {
+        height?: number | string;
+        playsInline?: boolean;
+        playsinline?: boolean | string;
+        poster?: string;
+        width?: number | string;
+    }
+    interface HTMLAttributes<T = HTMLElement> extends DOMAttributes<T> {
+        innerHTML?: string;
+        accessKey?: string;
+        class?: string | {
+            [className: string]: boolean;
+        };
+        contentEditable?: boolean | string;
+        contenteditable?: boolean | string;
+        contextMenu?: string;
+        contextmenu?: string;
+        dir?: string;
+        draggable?: boolean;
+        hidden?: boolean;
+        id?: string;
+        lang?: string;
+        spellcheck?: 'true' | 'false' | any;
+        style?: {
+            [key: string]: string | undefined;
+        };
+        tabIndex?: number;
+        tabindex?: number | string;
+        title?: string;
+        inputMode?: string;
+        inputmode?: string;
+        enterKeyHint?: string;
+        enterkeyhint?: string;
+        is?: string;
+        radioGroup?: string;
+        radiogroup?: string;
+        role?: string;
+        about?: string;
+        datatype?: string;
+        inlist?: any;
+        prefix?: string;
+        property?: string;
+        resource?: string;
+        typeof?: string;
+        vocab?: string;
+        autoCapitalize?: string;
+        autocapitalize?: string;
+        autoCorrect?: string;
+        autocorrect?: string;
+        autoSave?: string;
+        autosave?: string;
+        color?: string;
+        itemProp?: string;
+        itemprop?: string;
+        itemScope?: boolean;
+        itemscope?: boolean;
+        itemType?: string;
+        itemtype?: string;
+        itemID?: string;
+        itemid?: string;
+        itemRef?: string;
+        itemref?: string;
+        results?: number;
+        security?: string;
+        unselectable?: boolean;
+    }
+    interface SVGAttributes<T = SVGElement> extends DOMAttributes<T> {
+        class?: string | {
+            [className: string]: boolean;
+        };
+        color?: string;
+        height?: number | string;
+        id?: string;
+        lang?: string;
+        max?: number | string;
+        media?: string;
+        method?: string;
+        min?: number | string;
+        name?: string;
+        style?: {
+            [key: string]: string | undefined;
+        };
+        target?: string;
+        type?: string;
+        width?: number | string;
+        role?: string;
+        tabindex?: number;
+        'accent-height'?: number | string;
+        accumulate?: 'none' | 'sum';
+        additive?: 'replace' | 'sum';
+        'alignment-baseline'?: 'auto' | 'baseline' | 'before-edge' | 'text-before-edge' | 'middle' | 'central' | 'after-edge' | 'text-after-edge' | 'ideographic' | 'alphabetic' | 'hanging' | 'mathematical' | 'inherit';
+        allowReorder?: 'no' | 'yes';
+        alphabetic?: number | string;
+        amplitude?: number | string;
+        'arabic-form'?: 'initial' | 'medial' | 'terminal' | 'isolated';
+        ascent?: number | string;
+        attributeName?: string;
+        attributeType?: string;
+        autoReverse?: number | string;
+        azimuth?: number | string;
+        baseFrequency?: number | string;
+        'baseline-shift'?: number | string;
+        baseProfile?: number | string;
+        bbox?: number | string;
+        begin?: number | string;
+        bias?: number | string;
+        by?: number | string;
+        calcMode?: number | string;
+        'cap-height'?: number | string;
+        clip?: number | string;
+        'clip-path'?: string;
+        clipPathUnits?: number | string;
+        'clip-rule'?: number | string;
+        'color-interpolation'?: number | string;
+        'color-interpolation-filters'?: 'auto' | 's-rGB' | 'linear-rGB' | 'inherit';
+        'color-profile'?: number | string;
+        'color-rendering'?: number | string;
+        contentScriptType?: number | string;
+        contentStyleType?: number | string;
+        cursor?: number | string;
+        cx?: number | string;
+        cy?: number | string;
+        d?: string;
+        decelerate?: number | string;
+        descent?: number | string;
+        diffuseConstant?: number | string;
+        direction?: number | string;
+        display?: number | string;
+        divisor?: number | string;
+        'dominant-baseline'?: number | string;
+        dur?: number | string;
+        dx?: number | string;
+        dy?: number | string;
+        'edge-mode'?: number | string;
+        elevation?: number | string;
+        'enable-background'?: number | string;
+        end?: number | string;
+        exponent?: number | string;
+        externalResourcesRequired?: number | string;
+        fill?: string;
+        'fill-opacity'?: number | string;
+        'fill-rule'?: 'nonzero' | 'evenodd' | 'inherit';
+        filter?: string;
+        filterRes?: number | string;
+        filterUnits?: number | string;
+        'flood-color'?: number | string;
+        'flood-opacity'?: number | string;
+        focusable?: number | string;
+        'font-family'?: string;
+        'font-size'?: number | string;
+        'font-size-adjust'?: number | string;
+        'font-stretch'?: number | string;
+        'font-style'?: number | string;
+        'font-variant'?: number | string;
+        'font-weight'?: number | string;
+        format?: number | string;
+        from?: number | string;
+        fx?: number | string;
+        fy?: number | string;
+        g1?: number | string;
+        g2?: number | string;
+        'glyph-name'?: number | string;
+        'glyph-orientation-horizontal'?: number | string;
+        'glyph-orientation-vertical'?: number | string;
+        glyphRef?: number | string;
+        gradientTransform?: string;
+        gradientUnits?: string;
+        hanging?: number | string;
+        'horiz-adv-x'?: number | string;
+        'horiz-origin-x'?: number | string;
+        href?: string;
+        ideographic?: number | string;
+        'image-rendering'?: number | string;
+        in2?: number | string;
+        in?: string;
+        intercept?: number | string;
+        k1?: number | string;
+        k2?: number | string;
+        k3?: number | string;
+        k4?: number | string;
+        k?: number | string;
+        kernelMatrix?: number | string;
+        kernelUnitLength?: number | string;
+        kerning?: number | string;
+        keyPoints?: number | string;
+        keySplines?: number | string;
+        keyTimes?: number | string;
+        lengthAdjust?: number | string;
+        'letter-spacing'?: number | string;
+        'lighting-color'?: number | string;
+        limitingConeAngle?: number | string;
+        local?: number | string;
+        'marker-end'?: string;
+        markerHeight?: number | string;
+        'marker-mid'?: string;
+        'marker-start'?: string;
+        markerUnits?: number | string;
+        markerWidth?: number | string;
+        mask?: string;
+        maskContentUnits?: number | string;
+        maskUnits?: number | string;
+        mathematical?: number | string;
+        mode?: number | string;
+        numOctaves?: number | string;
+        offset?: number | string;
+        opacity?: number | string;
+        operator?: number | string;
+        order?: number | string;
+        orient?: number | string;
+        orientation?: number | string;
+        origin?: number | string;
+        overflow?: number | string;
+        'overline-position'?: number | string;
+        'overline-thickness'?: number | string;
+        'paint-order'?: number | string;
+        panose1?: number | string;
+        pathLength?: number | string;
+        patternContentUnits?: string;
+        patternTransform?: number | string;
+        patternUnits?: string;
+        'pointer-events'?: number | string;
+        points?: string;
+        pointsAtX?: number | string;
+        pointsAtY?: number | string;
+        pointsAtZ?: number | string;
+        preserveAlpha?: number | string;
+        preserveAspectRatio?: string;
+        primitiveUnits?: number | string;
+        r?: number | string;
+        radius?: number | string;
+        refX?: number | string;
+        refY?: number | string;
+        'rendering-intent'?: number | string;
+        repeatCount?: number | string;
+        repeatDur?: number | string;
+        requiredextensions?: number | string;
+        requiredFeatures?: number | string;
+        restart?: number | string;
+        result?: string;
+        rotate?: number | string;
+        rx?: number | string;
+        ry?: number | string;
+        scale?: number | string;
+        seed?: number | string;
+        'shape-rendering'?: number | string;
+        slope?: number | string;
+        spacing?: number | string;
+        specularConstant?: number | string;
+        specularExponent?: number | string;
+        speed?: number | string;
+        spreadMethod?: string;
+        startOffset?: number | string;
+        stdDeviation?: number | string;
+        stemh?: number | string;
+        stemv?: number | string;
+        stitchTiles?: number | string;
+        'stop-color'?: string;
+        'stop-opacity'?: number | string;
+        'strikethrough-position'?: number | string;
+        'strikethrough-thickness'?: number | string;
+        string?: number | string;
+        stroke?: string;
+        'stroke-dasharray'?: string | number;
+        'stroke-dashoffset'?: string | number;
+        'stroke-linecap'?: 'butt' | 'round' | 'square' | 'inherit';
+        'stroke-linejoin'?: 'miter' | 'round' | 'bevel' | 'inherit';
+        'stroke-miterlimit'?: string;
+        'stroke-opacity'?: number | string;
+        'stroke-width'?: number | string;
+        surfaceScale?: number | string;
+        systemLanguage?: number | string;
+        tableValues?: number | string;
+        targetX?: number | string;
+        targetY?: number | string;
+        'text-anchor'?: string;
+        'text-decoration'?: number | string;
+        textLength?: number | string;
+        'text-rendering'?: number | string;
+        to?: number | string;
+        transform?: string;
+        u1?: number | string;
+        u2?: number | string;
+        'underline-position'?: number | string;
+        'underline-thickness'?: number | string;
+        unicode?: number | string;
+        'unicode-bidi'?: number | string;
+        'unicode-range'?: number | string;
+        'units-per-em'?: number | string;
+        'v-alphabetic'?: number | string;
+        values?: string;
+        'vector-effect'?: number | string;
+        version?: string;
+        'vert-adv-y'?: number | string;
+        'vert-origin-x'?: number | string;
+        'vert-origin-y'?: number | string;
+        'v-hanging'?: number | string;
+        'v-ideographic'?: number | string;
+        viewBox?: string;
+        viewTarget?: number | string;
+        visibility?: number | string;
+        'v-mathematical'?: number | string;
+        widths?: number | string;
+        'word-spacing'?: number | string;
+        'writing-mode'?: number | string;
+        x1?: number | string;
+        x2?: number | string;
+        x?: number | string;
+        'x-channel-selector'?: string;
+        'x-height'?: number | string;
+        xlinkActuate?: string;
+        xlinkArcrole?: string;
+        xlinkHref?: string;
+        xlinkRole?: string;
+        xlinkShow?: string;
+        xlinkTitle?: string;
+        xlinkType?: string;
+        xmlBase?: string;
+        xmlLang?: string;
+        xmlns?: string;
+        xmlSpace?: string;
+        y1?: number | string;
+        y2?: number | string;
+        y?: number | string;
+        yChannelSelector?: string;
+        z?: number | string;
+        zoomAndPan?: string;
+    }
+    interface DOMAttributes<T> extends JSXAttributes<T> {
+        slot?: string;
+        part?: string;
+        exportparts?: string;
+        onCopy?: (event: ClipboardEvent) => void;
+        onCopyCapture?: (event: ClipboardEvent) => void;
+        onCut?: (event: ClipboardEvent) => void;
+        onCutCapture?: (event: ClipboardEvent) => void;
+        onPaste?: (event: ClipboardEvent) => void;
+        onPasteCapture?: (event: ClipboardEvent) => void;
+        onCompositionend?: (event: CompositionEvent) => void;
+        onCompositionendCapture?: (event: CompositionEvent) => void;
+        onCompositionstart?: (event: CompositionEvent) => void;
+        onCompositionstartCapture?: (event: CompositionEvent) => void;
+        onCompositionupdate?: (event: CompositionEvent) => void;
+        onCompositionupdateCapture?: (event: CompositionEvent) => void;
+        onFocus?: (event: FocusEvent) => void;
+        onFocusCapture?: (event: FocusEvent) => void;
+        onFocusin?: (event: FocusEvent) => void;
+        onFocusinCapture?: (event: FocusEvent) => void;
+        onFocusout?: (event: FocusEvent) => void;
+        onFocusoutCapture?: (event: FocusEvent) => void;
+        onBlur?: (event: FocusEvent) => void;
+        onBlurCapture?: (event: FocusEvent) => void;
+        onChange?: (event: Event) => void;
+        onChangeCapture?: (event: Event) => void;
+        onInput?: (event: InputEvent) => void;
+        onInputCapture?: (event: InputEvent) => void;
+        onReset?: (event: Event) => void;
+        onResetCapture?: (event: Event) => void;
+        onSubmit?: (event: Event) => void;
+        onSubmitCapture?: (event: Event) => void;
+        onInvalid?: (event: Event) => void;
+        onInvalidCapture?: (event: Event) => void;
+        onLoad?: (event: Event) => void;
+        onLoadCapture?: (event: Event) => void;
+        onError?: (event: Event) => void;
+        onErrorCapture?: (event: Event) => void;
+        onKeyDown?: (event: KeyboardEvent) => void;
+        onKeyDownCapture?: (event: KeyboardEvent) => void;
+        onKeyPress?: (event: KeyboardEvent) => void;
+        onKeyPressCapture?: (event: KeyboardEvent) => void;
+        onKeyUp?: (event: KeyboardEvent) => void;
+        onKeyUpCapture?: (event: KeyboardEvent) => void;
+        onAuxClick?: (event: MouseEvent) => void;
+        onClick?: (event: MouseEvent) => void;
+        onClickCapture?: (event: MouseEvent) => void;
+        onContextMenu?: (event: MouseEvent) => void;
+        onContextMenuCapture?: (event: MouseEvent) => void;
+        onDblClick?: (event: MouseEvent) => void;
+        onDblClickCapture?: (event: MouseEvent) => void;
+        onDrag?: (event: DragEvent) => void;
+        onDragCapture?: (event: DragEvent) => void;
+        onDragEnd?: (event: DragEvent) => void;
+        onDragEndCapture?: (event: DragEvent) => void;
+        onDragEnter?: (event: DragEvent) => void;
+        onDragEnterCapture?: (event: DragEvent) => void;
+        onDragExit?: (event: DragEvent) => void;
+        onDragExitCapture?: (event: DragEvent) => void;
+        onDragLeave?: (event: DragEvent) => void;
+        onDragLeaveCapture?: (event: DragEvent) => void;
+        onDragOver?: (event: DragEvent) => void;
+        onDragOverCapture?: (event: DragEvent) => void;
+        onDragStart?: (event: DragEvent) => void;
+        onDragStartCapture?: (event: DragEvent) => void;
+        onDrop?: (event: DragEvent) => void;
+        onDropCapture?: (event: DragEvent) => void;
+        onMouseDown?: (event: MouseEvent) => void;
+        onMouseDownCapture?: (event: MouseEvent) => void;
+        onMouseEnter?: (event: MouseEvent) => void;
+        onMouseLeave?: (event: MouseEvent) => void;
+        onMouseMove?: (event: MouseEvent) => void;
+        onMouseMoveCapture?: (event: MouseEvent) => void;
+        onMouseOut?: (event: MouseEvent) => void;
+        onMouseOutCapture?: (event: MouseEvent) => void;
+        onMouseOver?: (event: MouseEvent) => void;
+        onMouseOverCapture?: (event: MouseEvent) => void;
+        onMouseUp?: (event: MouseEvent) => void;
+        onMouseUpCapture?: (event: MouseEvent) => void;
+        onTouchCancel?: (event: TouchEvent) => void;
+        onTouchCancelCapture?: (event: TouchEvent) => void;
+        onTouchEnd?: (event: TouchEvent) => void;
+        onTouchEndCapture?: (event: TouchEvent) => void;
+        onTouchMove?: (event: TouchEvent) => void;
+        onTouchMoveCapture?: (event: TouchEvent) => void;
+        onTouchStart?: (event: TouchEvent) => void;
+        onTouchStartCapture?: (event: TouchEvent) => void;
+        onPointerDown?: (event: PointerEvent) => void;
+        onPointerDownCapture?: (event: PointerEvent) => void;
+        onPointerMove?: (event: PointerEvent) => void;
+        onPointerMoveCapture?: (event: PointerEvent) => void;
+        onPointerUp?: (event: PointerEvent) => void;
+        onPointerUpCapture?: (event: PointerEvent) => void;
+        onPointerCancel?: (event: PointerEvent) => void;
+        onPointerCancelCapture?: (event: PointerEvent) => void;
+        onPointerEnter?: (event: PointerEvent) => void;
+        onPointerEnterCapture?: (event: PointerEvent) => void;
+        onPointerLeave?: (event: PointerEvent) => void;
+        onPointerLeaveCapture?: (event: PointerEvent) => void;
+        onPointerOver?: (event: PointerEvent) => void;
+        onPointerOverCapture?: (event: PointerEvent) => void;
+        onPointerOut?: (event: PointerEvent) => void;
+        onPointerOutCapture?: (event: PointerEvent) => void;
+        onGotPointerCapture?: (event: PointerEvent) => void;
+        onGotPointerCaptureCapture?: (event: PointerEvent) => void;
+        onLostPointerCapture?: (event: PointerEvent) => void;
+        onLostPointerCaptureCapture?: (event: PointerEvent) => void;
+        onScroll?: (event: UIEvent) => void;
+        onScrollCapture?: (event: UIEvent) => void;
+        onWheel?: (event: WheelEvent) => void;
+        onWheelCapture?: (event: WheelEvent) => void;
+        onAnimationStart?: (event: AnimationEvent) => void;
+        onAnimationStartCapture?: (event: AnimationEvent) => void;
+        onAnimationEnd?: (event: AnimationEvent) => void;
+        onAnimationEndCapture?: (event: AnimationEvent) => void;
+        onAnimationIteration?: (event: AnimationEvent) => void;
+        onAnimationIterationCapture?: (event: AnimationEvent) => void;
+        onTransitionEnd?: (event: TransitionEvent) => void;
+        onTransitionEndCapture?: (event: TransitionEvent) => void;
+    }
+}
+export interface JSXAttributes<T = Element> {
+    key?: string | number;
+    ref?: (elm?: T) => void;
+}
+export interface CustomElementsDefineOptions {
+    exclude?: string[];
+    resourcesUrl?: string;
+    syncQueue?: boolean;
+    transformTagName?: (tagName: string) => string;
+    jmp?: (c: Function) => any;
+    raf?: (c: FrameRequestCallback) => number;
+    ael?: (el: EventTarget, eventName: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions) => void;
+    rel?: (el: EventTarget, eventName: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions) => void;
+    ce?: (eventName: string, opts?: any) => CustomEvent;
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/loader/cdn.js b/frontend/node_modules/@ionic/pwa-elements/loader/cdn.js
new file mode 100644
index 0000000..0eb97e6
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/loader/cdn.js
@@ -0,0 +1,3 @@
+
+module.exports = require('../dist/cjs/loader.cjs.js');
+module.exports.applyPolyfills = function() { return Promise.resolve() };
diff --git a/frontend/node_modules/@ionic/pwa-elements/loader/index.cjs.js b/frontend/node_modules/@ionic/pwa-elements/loader/index.cjs.js
new file mode 100644
index 0000000..0eb97e6
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/loader/index.cjs.js
@@ -0,0 +1,3 @@
+
+module.exports = require('../dist/cjs/loader.cjs.js');
+module.exports.applyPolyfills = function() { return Promise.resolve() };
diff --git a/frontend/node_modules/@ionic/pwa-elements/loader/index.d.ts b/frontend/node_modules/@ionic/pwa-elements/loader/index.d.ts
new file mode 100644
index 0000000..a59daf2
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/loader/index.d.ts
@@ -0,0 +1,21 @@
+export * from '../dist/types/components';
+export interface CustomElementsDefineOptions {
+  exclude?: string[];
+  resourcesUrl?: string;
+  syncQueue?: boolean;
+  jmp?: (c: Function) => any;
+  raf?: (c: FrameRequestCallback) => number;
+  ael?: (el: EventTarget, eventName: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions) => void;
+  rel?: (el: EventTarget, eventName: string, listener: EventListenerOrEventListenerObject, options: boolean | AddEventListenerOptions) => void;
+}
+export declare function defineCustomElements(win?: Window, opts?: CustomElementsDefineOptions): Promise<void>;
+export declare function applyPolyfills(): Promise<void>;
+
+/**
+ * Used to specify a nonce value that corresponds with an application's CSP.
+ * When set, the nonce will be added to all dynamically created script and style tags at runtime.
+ * Alternatively, the nonce value can be set on a meta tag in the DOM head
+ * (<meta name="csp-nonce" content="{ nonce value here }" />) which
+ * will result in the same behavior.
+ */
+export declare function setNonce(nonce: string): void;
diff --git a/frontend/node_modules/@ionic/pwa-elements/loader/index.es2017.js b/frontend/node_modules/@ionic/pwa-elements/loader/index.es2017.js
new file mode 100644
index 0000000..596dbf6
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/loader/index.es2017.js
@@ -0,0 +1,3 @@
+
+export * from '../dist/esm/polyfills/index.js';
+export * from '../dist/esm/loader.js';
diff --git a/frontend/node_modules/@ionic/pwa-elements/loader/index.js b/frontend/node_modules/@ionic/pwa-elements/loader/index.js
new file mode 100644
index 0000000..f206152
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/loader/index.js
@@ -0,0 +1,4 @@
+
+(function(){if("undefined"!==typeof window&&void 0!==window.Reflect&&void 0!==window.customElements){var a=HTMLElement;window.HTMLElement=function(){return Reflect.construct(a,[],this.constructor)};HTMLElement.prototype=a.prototype;HTMLElement.prototype.constructor=HTMLElement;Object.setPrototypeOf(HTMLElement,a)}})();
+export * from '../dist/esm/polyfills/index.js';
+export * from '../dist/esm-es5/loader.js';
diff --git a/frontend/node_modules/@ionic/pwa-elements/loader/package.json b/frontend/node_modules/@ionic/pwa-elements/loader/package.json
new file mode 100644
index 0000000..9593e77
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/loader/package.json
@@ -0,0 +1,11 @@
+{
+  "name": "ionicpwaelements-loader",
+  "private": true,
+  "typings": "./index.d.ts",
+  "module": "./index.js",
+  "main": "./index.cjs.js",
+  "jsnext:main": "./index.es2017.js",
+  "es2015": "./index.es2017.js",
+  "es2017": "./index.es2017.js",
+  "unpkg": "./cdn.js"
+}
\ No newline at end of file
diff --git a/frontend/node_modules/@ionic/pwa-elements/package.json b/frontend/node_modules/@ionic/pwa-elements/package.json
new file mode 100644
index 0000000..df2a91a
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/package.json
@@ -0,0 +1,39 @@
+{
+  "name": "@ionic/pwa-elements",
+  "version": "3.3.0",
+  "description": "Stencil Component Starter",
+  "main": "dist/index.cjs.js",
+  "unpkg": "dist/ionicpwaelements/ionicpwaelements.js",
+  "types": "dist/types/index.d.ts",
+  "module": "dist/index.js",
+  "collection": "dist/collection/collection-manifest.json",
+  "files": [
+    "dist/",
+    "loader/"
+  ],
+  "scripts": {
+    "build": "stencil build",
+    "start": "stencil build --dev --watch --serve",
+    "release": "np",
+    "version": "npm run build"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/ionic-team/ionic-pwa-elements.git"
+  },
+  "author": "Ionic Team",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/ionic-team/ionic-pwa-elements"
+  },
+  "homepage": "https://github.com/ionic-team/ionic-pwa-elements",
+  "devDependencies": {
+    "@stencil/core": "^3.4.0",
+    "np": "^8.0.4",
+    "workbox-build": "^7.0.0"
+  },
+  "engines": {
+    "node": ">=16.0.0",
+    "npm": ">=8.0.0"
+  }
+}
diff --git a/frontend/node_modules/@ionic/pwa-elements/readme.md b/frontend/node_modules/@ionic/pwa-elements/readme.md
new file mode 100644
index 0000000..11b64be
--- /dev/null
+++ b/frontend/node_modules/@ionic/pwa-elements/readme.md
@@ -0,0 +1,32 @@
+# Ionic Elements for Progressive Web Apps
+
+This project is a growing collection of pre-built UI experiences for Web APIs such
+as camera/video, focused on building Progressive Web Apps that meet and exceed
+native mobile app experiences.
+
+These elements are a key part of our mission to build the [Progressive Web App OS](https://medium.com/@maxlynch/building-the-progressive-web-app-os-57daebcb69c1)
+by providing awesome UIs on top of low-level Web APIs.
+
+These components are built as Web Components that can be used in any web app, using
+the power of [Stencil JS](http://stenciljs.com/).
+
+## Currently Supported
+
+Currently, the project offers a quality in-app Camera experience using
+`getUserMedia`, with support for multiple cameras and with automatic handling
+of image data.
+
+See [the provided example](https://github.com/ionic-team/ionic-pwa-elements/blob/master/src/index.html)
+for an example of how to use these components.
+
+## Capacitor Usage
+
+Ionic PWA Elements were built primarily for developers using [Capacitor](https://capacitorjs.com/),
+our Native app container that allows web apps to run on nearly every platform
+with consistent APIs.
+
+Ionic PWA Elements offer web-UI experiences for Capacitor apps running in a browser
+as PWA, such that the API is identical for the PWA and the native app store app.
+
+See the [Capacitor PWA Elements](https://capacitorjs.com/docs/web/pwa-elements)
+page for more information on using this library in your Capacitor apps.
diff --git a/frontend/node_modules/hex-rgb/index.d.ts b/frontend/node_modules/hex-rgb/index.d.ts
new file mode 100644
index 0000000..bbb4a8e
--- /dev/null
+++ b/frontend/node_modules/hex-rgb/index.d.ts
@@ -0,0 +1,83 @@
+/* eslint-disable no-redeclare */
+
+export interface Options {
+	/**
+	The RGB output format.
+
+	Note that when using the `css` format, the value of the alpha channel is rounded to two decimal places.
+
+	@default 'object'
+	*/
+	readonly format?: 'object' | 'array' | 'css';
+
+	/**
+	Set the alpha of the color.
+
+	This overrides any existing alpha component in the Hex color string. For example, the `99` in `#22222299`.
+
+	The number must be in the range 0 to 1.
+	*/
+	readonly alpha?: number;
+}
+
+export interface RgbaObject {
+	red: number;
+	green: number;
+	blue: number;
+	alpha: number;
+}
+
+export type RgbaTuple = [
+	red: number,
+	green: number,
+	blue: number,
+	alpha: number
+];
+
+/**
+Convert HEX color to RGBA.
+
+@param hex - The color in HEX format. Leading `#` is optional.
+
+@example
+```
+import hexRgb from 'hex-rgb';
+
+hexRgb('4183c4');
+//=> {red: 65, green: 131, blue: 196, alpha: 1}
+
+hexRgb('#4183c4');
+//=> {red: 65, green: 131, blue: 196, alpha: 1}
+
+hexRgb('#fff');
+//=> {red: 255, green: 255, blue: 255, alpha: 1}
+
+hexRgb('#22222299');
+//=> {red: 34, green: 34, blue: 34, alpha: 0.6}
+
+hexRgb('#0006');
+//=> {red: 0, green: 0, blue: 0, alpha: 0.4}
+
+hexRgb('#cd2222cc');
+//=> {red: 205, green: 34, blue: 34, alpha: 0.8}
+
+hexRgb('#cd2222cc', {format: 'array'});
+//=> [205, 34, 34, 0.8]
+
+hexRgb('#cd2222cc', {format: 'css'});
+//=> 'rgb(205 34 34 / 80%)'
+
+hexRgb('#000', {format: 'css'});
+//=> 'rgb(0 0 0)'
+
+hexRgb('#22222299', {alpha: 1});
+//=> {red: 34, green: 34, blue: 34, alpha: 1}
+
+hexRgb('#fff', {alpha: 0.5});
+//=> {red: 255, green: 255, blue: 255, alpha: 0.5}
+```
+*/
+export default function hexRgb(hex: string): RgbaObject;
+export default function hexRgb(hex: string, options: Options & {format: 'object'}): RgbaObject; // eslint-disable-line @typescript-eslint/unified-signatures
+export default function hexRgb(hex: string, options: Options & {format: 'array'}): RgbaTuple;
+export default function hexRgb(hex: string, options: Options & {format: 'css'}): string;
diff --git a/frontend/node_modules/hex-rgb/index.js b/frontend/node_modules/hex-rgb/index.js
new file mode 100644
index 0000000..2c323fe
--- /dev/null
+++ b/frontend/node_modules/hex-rgb/index.js
@@ -0,0 +1,45 @@
+const hexCharacters = 'a-f\\d';
+const match3or4Hex = `#?[${hexCharacters}]{3}[${hexCharacters}]?`;
+const match6or8Hex = `#?[${hexCharacters}]{6}([${hexCharacters}]{2})?`;
+const nonHexChars = new RegExp(`[^#${hexCharacters}]`, 'gi');
+const validHexSize = new RegExp(`^${match3or4Hex}$|^${match6or8Hex}$`, 'i');
+
+export default function hexRgb(hex, options = {}) {
+	if (typeof hex !== 'string' || nonHexChars.test(hex) || !validHexSize.test(hex)) {
+		throw new TypeError('Expected a valid hex string');
+	}
+
+	hex = hex.replace(/^#/, '');
+	let alphaFromHex = 1;
+
+	if (hex.length === 8) {
+		alphaFromHex = Number.parseInt(hex.slice(6, 8), 16) / 255;
+		hex = hex.slice(0, 6);
+	}
+
+	if (hex.length === 4) {
+		alphaFromHex = Number.parseInt(hex.slice(3, 4).repeat(2), 16) / 255;
+		hex = hex.slice(0, 3);
+	}
+
+	if (hex.length === 3) {
+		hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
+	}
+
+	const number = Number.parseInt(hex, 16);
+	const red = number >> 16;
+	const green = (number >> 8) & 255;
+	const blue = number & 255;
+	const alpha = typeof options.alpha === 'number' ? options.alpha : alphaFromHex;
+
+	if (options.format === 'array') {
+		return [red, green, blue, alpha];
+	}
+
+	if (options.format === 'css') {
+		const alphaString = alpha === 1 ? '' : ` / ${Number((alpha * 100).toFixed(2))}%`;
+		return `rgb(${red} ${green} ${blue}${alphaString})`;
+	}
+
+	return {red, green, blue, alpha};
+}
diff --git a/frontend/node_modules/hex-rgb/license b/frontend/node_modules/hex-rgb/license
new file mode 100644
index 0000000..fa7ceba
--- /dev/null
+++ b/frontend/node_modules/hex-rgb/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/frontend/node_modules/hex-rgb/package.json b/frontend/node_modules/hex-rgb/package.json
new file mode 100644
index 0000000..f14afca
--- /dev/null
+++ b/frontend/node_modules/hex-rgb/package.json
@@ -0,0 +1,41 @@
+{
+	"name": "hex-rgb",
+	"version": "5.0.0",
+	"description": "Convert HEX color to RGBA",
+	"license": "MIT",
+	"repository": "sindresorhus/hex-rgb",
+	"funding": "https://github.com/sponsors/sindresorhus",
+	"author": {
+		"name": "Sindre Sorhus",
+		"email": "sindresorhus@gmail.com",
+		"url": "https://sindresorhus.com"
+	},
+	"type": "module",
+	"exports": "./index.js",
+	"engines": {
+		"node": ">=12"
+	},
+	"scripts": {
+		"test": "xo && ava && tsd"
+	},
+	"files": [
+		"index.js",
+		"index.d.ts"
+	],
+	"keywords": [
+		"hex",
+		"rgb",
+		"rgba",
+		"color",
+		"colour",
+		"convert",
+		"conversion",
+		"converter",
+		"css"
+	],
+	"devDependencies": {
+		"ava": "^3.15.0",
+		"tsd": "^0.14.0",
+		"xo": "^0.39.1"
+	}
+}
diff --git a/frontend/node_modules/hex-rgb/readme.md b/frontend/node_modules/hex-rgb/readme.md
new file mode 100644
index 0000000..7a4963a
--- /dev/null
+++ b/frontend/node_modules/hex-rgb/readme.md
@@ -0,0 +1,86 @@
+# hex-rgb
+
+> Convert HEX color to RGBA
+
+## Install
+
+```
+$ npm install hex-rgb
+```
+
+## Usage
+
+```js
+import hexRgb from 'hex-rgb';
+
+hexRgb('4183c4');
+//=> {red: 65, green: 131, blue: 196, alpha: 1}
+
+hexRgb('#4183c4');
+//=> {red: 65, green: 131, blue: 196, alpha: 1}
+
+hexRgb('#fff');
+//=> {red: 255, green: 255, blue: 255, alpha: 1}
+
+hexRgb('#22222299');
+//=> {red: 34, green: 34, blue: 34, alpha: 0.6}
+
+hexRgb('#0006');
+//=> {red: 0, green: 0, blue: 0, alpha: 0.4}
+
+hexRgb('#cd2222cc');
+//=> {red: 205, green: 34, blue: 34, alpha: 0.8}
+
+hexRgb('#cd2222cc', {format: 'array'});
+//=> [205, 34, 34, 0.8]
+
+hexRgb('#cd2222cc', {format: 'css'});
+//=> 'rgb(205 34 34 / 80%)'
+
+hexRgb('#000', {format: 'css'});
+//=> 'rgb(0 0 0)'
+
+hexRgb('#22222299', {alpha: 1});
+//=> {red: 34, green: 34, blue: 34, alpha: 1}
+
+hexRgb('#fff', {alpha: 0.5});
+//=> {red: 255, green: 255, blue: 255, alpha: 0.5}
+```
+
+## API
+
+### hexRgb(hex, options?)
+
+#### hex
+
+Type: `string`
+
+The color in HEX format. Leading `#` is optional.
+
+#### options
+
+Type: `object`
+
+##### format
+
+Type: `string`\
+Values: `'object' | 'array' | 'css'`\
+Defaults: `'object'`
+
+The RGB output format.
+
+Note that when using the `css` format, the value of the alpha channel is rounded to two decimal places.
+
+##### alpha
+
+Type: `number`
+
+Set the alpha of the color.
+
+This overrides any existing alpha component in the Hex color string. For example, the `99` in `#22222299`.
+
+The number must be in the range 0 to 1.
+
+## Related
+
+See [rgb-hex](https://github.com/sindresorhus/rgb-hex) for the inverse.
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index a4ef3f3..3aa9cd2 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -5,7 +5,8 @@
   "packages": {
     "": {
       "dependencies": {
-        "@ionic/pwa-elements": "^3.3.0"
+        "@ionic/pwa-elements": "^3.3.0",
+        "hex-rgb": "^5.0.0"
       }
     },
     "node_modules/@ionic/pwa-elements": {
@@ -16,6 +17,17 @@
         "node": ">=16.0.0",
         "npm": ">=8.0.0"
       }
+    },
+    "node_modules/hex-rgb": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-5.0.0.tgz",
+      "integrity": "sha512-NQO+lgVUCtHxZ792FodgW0zflK+ozS9X9dwGp9XvvmPlH7pyxd588cn24TD3rmPm/N0AIRXF10Otah8yKqGw4w==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     }
   }
 }
diff --git a/frontend/package.json b/frontend/package.json
index eeda068..dc0804b 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,5 +1,6 @@
 {
   "dependencies": {
-    "@ionic/pwa-elements": "^3.3.0"
+    "@ionic/pwa-elements": "^3.3.0",
+    "hex-rgb": "^5.0.0"
   }
 }