├── android
├── .gitignore
├── .idea
│ ├── .gitignore
│ ├── .name
│ ├── compiler.xml
│ ├── deploymentTargetDropDown.xml
│ ├── gradle.xml
│ └── misc.xml
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── chatapp
│ │ │ └── ExampleInstrumentedTest.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── example
│ │ │ │ └── chatapp
│ │ │ │ ├── Chat.kt
│ │ │ │ ├── ChatActivity.kt
│ │ │ │ ├── ChatAdapter.kt
│ │ │ │ ├── SocketHandler.kt
│ │ │ │ └── UserNameActivity.kt
│ │ └── res
│ │ │ ├── drawable-v24
│ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── drawable
│ │ │ ├── bg_chat_item_other.xml
│ │ │ ├── bg_chat_item_self.xml
│ │ │ └── ic_launcher_background.xml
│ │ │ ├── layout
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_user_name.xml
│ │ │ ├── item_chat_other.xml
│ │ │ └── item_chat_self.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.webp
│ │ │ └── ic_launcher_round.webp
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.webp
│ │ │ └── ic_launcher_round.webp
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.webp
│ │ │ └── ic_launcher_round.webp
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.webp
│ │ │ └── ic_launcher_round.webp
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.webp
│ │ │ └── ic_launcher_round.webp
│ │ │ ├── values-night
│ │ │ └── themes.xml
│ │ │ ├── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── themes.xml
│ │ │ └── xml
│ │ │ ├── backup_rules.xml
│ │ │ └── data_extraction_rules.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── example
│ │ └── chatapp
│ │ └── ExampleUnitTest.kt
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
└── backend
├── .gitignore
├── package-lock.json
├── package.json
└── server.js
/android/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | .DS_Store
11 | /build
12 | /captures
13 | .externalNativeBuild
14 | .cxx
15 | local.properties
16 |
--------------------------------------------------------------------------------
/android/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/android/.idea/.name:
--------------------------------------------------------------------------------
1 | ChatApp
--------------------------------------------------------------------------------
/android/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/android/.idea/deploymentTargetDropDown.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/android/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
18 |
19 |
--------------------------------------------------------------------------------
/android/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/android/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.application'
3 | id 'org.jetbrains.kotlin.android'
4 | id 'kotlin-kapt'
5 | }
6 |
7 | android {
8 | namespace 'com.example.chatapp'
9 | compileSdk 32
10 |
11 | defaultConfig {
12 | applicationId "com.example.chatapp"
13 | minSdk 21
14 | targetSdk 32
15 | versionCode 1
16 | versionName "1.0"
17 |
18 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
19 | }
20 |
21 | buildFeatures {
22 | viewBinding true
23 | }
24 |
25 | buildTypes {
26 | release {
27 | minifyEnabled false
28 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
29 | }
30 | }
31 | compileOptions {
32 | sourceCompatibility JavaVersion.VERSION_1_8
33 | targetCompatibility JavaVersion.VERSION_1_8
34 | }
35 | kotlinOptions {
36 | jvmTarget = '1.8'
37 | }
38 | }
39 |
40 | dependencies {
41 |
42 | implementation 'androidx.core:core-ktx:1.7.0'
43 | implementation 'androidx.appcompat:appcompat:1.5.1'
44 | implementation 'com.google.android.material:material:1.7.0'
45 | implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
46 |
47 | //socket io
48 | implementation ('io.socket:socket.io-client:2.0.0') {
49 | exclude group: 'org.json', module: 'json'
50 | }
51 |
52 | //gson
53 | implementation 'com.google.code.gson:gson:2.10'
54 |
55 | def room_version = "2.4.3"
56 | implementation "androidx.room:room-runtime:$room_version"
57 | implementation "androidx.room:room-runtime:$room_version"
58 | kapt "androidx.room:room-compiler:$room_version"
59 |
60 | def lifecycle_version = "2.5.1"
61 | implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
62 |
63 | testImplementation 'junit:junit:4.13.2'
64 | androidTestImplementation 'androidx.test.ext:junit:1.1.4'
65 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
66 | }
--------------------------------------------------------------------------------
/android/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/android/app/src/androidTest/java/com/example/chatapp/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.example.chatapp
2 |
3 | import androidx.test.platform.app.InstrumentationRegistry
4 | import androidx.test.ext.junit.runners.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22 | assertEquals("com.example.chatapp", appContext.packageName)
23 | }
24 | }
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
18 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
31 |
32 |
36 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/chatapp/Chat.kt:
--------------------------------------------------------------------------------
1 | package com.example.chatapp
2 |
3 | import androidx.room.Entity
4 | import androidx.room.PrimaryKey
5 |
6 | @Entity(tableName = "chat")
7 | data class Chat(
8 |
9 | @PrimaryKey(autoGenerate = true)
10 | var id: Int = 0,
11 | val username: String,
12 | val text: String,
13 | var isSelf: Boolean = false
14 | )
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/chatapp/ChatActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.chatapp
2 |
3 | import android.os.Bundle
4 | import androidx.appcompat.app.AppCompatActivity
5 | import androidx.recyclerview.widget.LinearLayoutManager
6 | import com.example.chatapp.databinding.ActivityMainBinding
7 |
8 | class ChatActivity : AppCompatActivity() {
9 |
10 | private lateinit var socketHandler: SocketHandler
11 | private lateinit var binding: ActivityMainBinding
12 | private lateinit var chatAdapter: ChatAdapter
13 |
14 | private val chatList = mutableListOf()
15 |
16 | private var userName = ""
17 |
18 | override fun onCreate(savedInstanceState: Bundle?) {
19 | super.onCreate(savedInstanceState)
20 | binding = ActivityMainBinding.inflate(layoutInflater)
21 | setContentView(binding.root)
22 |
23 | userName = intent.getStringExtra(USERNAME) ?: ""
24 |
25 | if (userName.isEmpty()) {
26 | finish()
27 | } else {
28 | socketHandler = SocketHandler()
29 |
30 | chatAdapter = ChatAdapter()
31 |
32 | binding.rvChat.apply {
33 | layoutManager = LinearLayoutManager(this@ChatActivity)
34 | adapter = chatAdapter
35 | }
36 |
37 | binding.btnSend.setOnClickListener {
38 | val message = binding.etMsg.text.toString()
39 | if (message.isNotEmpty()) {
40 | val chat = Chat(
41 | username = userName,
42 | text = message
43 | )
44 | socketHandler.emitChat(chat)
45 | binding.etMsg.setText("")
46 | }
47 | }
48 |
49 | socketHandler.onNewChat.observe(this) {
50 | val chat = it.copy(isSelf = it.username == userName)
51 | chatList.add(chat)
52 | chatAdapter.submitChat(chatList)
53 | binding.rvChat.scrollToPosition(chatList.size - 1)
54 | }
55 | }
56 |
57 |
58 | }
59 |
60 |
61 | override fun onDestroy() {
62 | socketHandler.disconnectSocket()
63 | super.onDestroy()
64 | }
65 |
66 | companion object{
67 | const val USERNAME = "username"
68 | }
69 |
70 | }
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/chatapp/ChatAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.example.chatapp
2 |
3 | import android.view.LayoutInflater
4 | import android.view.ViewGroup
5 | import androidx.recyclerview.widget.AsyncListDiffer
6 | import androidx.recyclerview.widget.DiffUtil
7 | import androidx.recyclerview.widget.RecyclerView
8 | import com.example.chatapp.databinding.ItemChatOtherBinding
9 | import com.example.chatapp.databinding.ItemChatSelfBinding
10 |
11 | class ChatAdapter: RecyclerView.Adapter() {
12 |
13 | private val ITEM_SELF = 1
14 | private val ITEM_OTHER = 2
15 |
16 | private val diffcallback = object : DiffUtil.ItemCallback() {
17 | override fun areItemsTheSame(oldItem: Chat, newItem: Chat): Boolean {
18 | return oldItem == newItem
19 | }
20 |
21 | override fun areContentsTheSame(oldItem: Chat, newItem: Chat): Boolean {
22 | return oldItem == newItem
23 | }
24 | }
25 |
26 | private val differ = AsyncListDiffer(this, diffcallback)
27 |
28 | fun submitChat(chats: List) {
29 | differ.submitList(chats)
30 | }
31 |
32 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
33 | return if (viewType == ITEM_SELF) {
34 | val binding = ItemChatSelfBinding.inflate(LayoutInflater.from(parent.context), parent, false)
35 | SelfChatItemViewHolder(binding)
36 | } else {
37 | val binding = ItemChatOtherBinding.inflate(LayoutInflater.from(parent.context), parent, false)
38 | OtherChatItemViewHolder(binding)
39 | }
40 | }
41 |
42 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
43 | val chat = differ.currentList[position]
44 | if (chat.isSelf) {
45 | ( holder as SelfChatItemViewHolder).bind(chat)
46 | } else {
47 | (holder as OtherChatItemViewHolder).bind(chat)
48 | }
49 | }
50 |
51 |
52 | inner class OtherChatItemViewHolder(val binding: ItemChatOtherBinding): RecyclerView.ViewHolder(binding.root) {
53 | fun bind(chat: Chat) {
54 | binding.apply {
55 | name.text = chat.username
56 | msg.text = chat.text
57 | }
58 | }
59 | }
60 |
61 | inner class SelfChatItemViewHolder(val binding: ItemChatSelfBinding): RecyclerView.ViewHolder(binding.root) {
62 | fun bind(chat: Chat) {
63 | binding.apply {
64 | name.text = "You"
65 | msg.text = chat.text
66 | }
67 | }
68 | }
69 |
70 | override fun getItemViewType(position: Int): Int {
71 | val chat = differ.currentList[position]
72 | return if (chat.isSelf) ITEM_SELF else ITEM_OTHER
73 | }
74 |
75 | override fun getItemCount(): Int {
76 | return differ.currentList.size
77 | }
78 | }
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/chatapp/SocketHandler.kt:
--------------------------------------------------------------------------------
1 | package com.example.chatapp
2 |
3 | import android.util.Log
4 | import androidx.lifecycle.LiveData
5 | import androidx.lifecycle.MutableLiveData
6 | import com.google.gson.Gson
7 | import io.socket.client.IO
8 | import io.socket.client.Socket
9 | import java.net.URISyntaxException
10 |
11 | class SocketHandler {
12 |
13 | private var socket: Socket? = null
14 |
15 | private val _onNewChat = MutableLiveData()
16 | val onNewChat: LiveData get() = _onNewChat
17 |
18 | init {
19 | try {
20 | socket = IO.socket(SOCKET_URL)
21 | socket?.connect()
22 |
23 | registerOnNewChat()
24 |
25 | }catch (e: URISyntaxException) {
26 | e.printStackTrace()
27 | }
28 | }
29 |
30 | private fun registerOnNewChat() {
31 | socket?.on(CHAT_KEYS.BROADCAST) { args->
32 | args?.let { d ->
33 | if (d.isNotEmpty()) {
34 | val data = d[0]
35 | Log.d("DATADEBUG","$data")
36 | if (data.toString().isNotEmpty()) {
37 | val chat = Gson().fromJson(data.toString(), Chat::class.java)
38 | _onNewChat.postValue(chat)
39 | }
40 | }
41 |
42 | }
43 | }
44 | }
45 |
46 | fun disconnectSocket() {
47 | socket?.disconnect()
48 | socket?.off()
49 | }
50 |
51 |
52 | fun emitChat(chat: Chat) {
53 | val jsonStr = Gson().toJson(chat, Chat::class.java)
54 | socket?.emit(CHAT_KEYS.NEW_MESSAGE, jsonStr)
55 | }
56 |
57 | private object CHAT_KEYS {
58 | const val NEW_MESSAGE = "new_message"
59 | const val BROADCAST = "broadcast"
60 | }
61 |
62 | companion object{
63 | private const val SOCKET_URL = "http://10.0.2.2:3000/"
64 | }
65 |
66 | }
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/chatapp/UserNameActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.chatapp
2 |
3 | import android.content.Intent
4 | import androidx.appcompat.app.AppCompatActivity
5 | import android.os.Bundle
6 | import androidx.core.widget.doAfterTextChanged
7 | import com.example.chatapp.databinding.ActivityUserNameBinding
8 |
9 | class UserNameActivity : AppCompatActivity() {
10 |
11 | private lateinit var binding: ActivityUserNameBinding
12 |
13 | override fun onCreate(savedInstanceState: Bundle?) {
14 | super.onCreate(savedInstanceState)
15 | binding = ActivityUserNameBinding.inflate(layoutInflater)
16 | setContentView(binding.root)
17 |
18 | binding.etUsername.doAfterTextChanged {
19 | val username = it.toString()
20 | binding.btnProceed.isEnabled = username.isNotEmpty()
21 | }
22 | binding.btnProceed.setOnClickListener {
23 | val username = binding.etUsername.text.toString()
24 | if (username.isNotEmpty()) {
25 | val intent = Intent(this, ChatActivity::class.java)
26 | intent.putExtra(ChatActivity.USERNAME, username)
27 | startActivity(intent)
28 | }
29 | }
30 | }
31 |
32 | override fun onResume() {
33 | super.onResume()
34 | binding.etUsername.requestFocus()
35 | }
36 | }
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
15 |
18 |
21 |
22 |
23 |
24 |
30 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/bg_chat_item_other.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
7 |
8 |
13 |
14 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/bg_chat_item_self.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
7 |
8 |
13 |
14 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/android/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
24 |
25 |
38 |
39 |
49 |
50 |
--------------------------------------------------------------------------------
/android/app/src/main/res/layout/activity_user_name.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
26 |
27 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/android/app/src/main/res/layout/item_chat_other.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
15 |
16 |
24 |
25 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
48 |
49 |
--------------------------------------------------------------------------------
/android/app/src/main/res/layout/item_chat_self.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
14 |
15 |
20 |
21 |
29 |
30 |
37 |
38 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #7E7E7E
10 | #ffffff
11 | #FBE8B2
12 | #9CD1FF
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | ChatApp
3 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
16 |
--------------------------------------------------------------------------------
/android/app/src/main/res/xml/backup_rules.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/xml/data_extraction_rules.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/android/app/src/test/java/com/example/chatapp/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.example.chatapp
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | plugins {
3 | id 'com.android.application' version '7.3.1' apply false
4 | id 'com.android.library' version '7.3.1' apply false
5 | id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
6 | }
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app's APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Kotlin code style for this project: "official" or "obsolete":
19 | kotlin.code.style=official
20 | # Enables namespacing of each library's R class so that its R class includes only the
21 | # resources declared in the library itself and none from the library's dependencies,
22 | # thereby reducing the size of the R class for that library
23 | android.nonTransitiveRClass=true
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raystatic/chat-app-sockets/dfc200b72b085fc95d9343f196e5db3e06d2e976/android/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Dec 11 11:37:27 IST 2022
2 | distributionBase=GRADLE_USER_HOME
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/android/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 |
86 | # Determine the Java command to use to start the JVM.
87 | if [ -n "$JAVA_HOME" ] ; then
88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
89 | # IBM's JDK on AIX uses strange locations for the executables
90 | JAVACMD="$JAVA_HOME/jre/sh/java"
91 | else
92 | JAVACMD="$JAVA_HOME/bin/java"
93 | fi
94 | if [ ! -x "$JAVACMD" ] ; then
95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
96 |
97 | Please set the JAVA_HOME variable in your environment to match the
98 | location of your Java installation."
99 | fi
100 | else
101 | JAVACMD="java"
102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
103 |
104 | Please set the JAVA_HOME variable in your environment to match the
105 | location of your Java installation."
106 | fi
107 |
108 | # Increase the maximum file descriptors if we can.
109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
110 | MAX_FD_LIMIT=`ulimit -H -n`
111 | if [ $? -eq 0 ] ; then
112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
113 | MAX_FD="$MAX_FD_LIMIT"
114 | fi
115 | ulimit -n $MAX_FD
116 | if [ $? -ne 0 ] ; then
117 | warn "Could not set maximum file descriptor limit: $MAX_FD"
118 | fi
119 | else
120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
121 | fi
122 | fi
123 |
124 | # For Darwin, add options to specify how the application appears in the dock
125 | if $darwin; then
126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
127 | fi
128 |
129 | # For Cygwin or MSYS, switch paths to Windows format before running java
130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
133 |
134 | JAVACMD=`cygpath --unix "$JAVACMD"`
135 |
136 | # We build the pattern for arguments to be converted via cygpath
137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
138 | SEP=""
139 | for dir in $ROOTDIRSRAW ; do
140 | ROOTDIRS="$ROOTDIRS$SEP$dir"
141 | SEP="|"
142 | done
143 | OURCYGPATTERN="(^($ROOTDIRS))"
144 | # Add a user-defined pattern to the cygpath arguments
145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
147 | fi
148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
149 | i=0
150 | for arg in "$@" ; do
151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
153 |
154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
156 | else
157 | eval `echo args$i`="\"$arg\""
158 | fi
159 | i=`expr $i + 1`
160 | done
161 | case $i in
162 | 0) set -- ;;
163 | 1) set -- "$args0" ;;
164 | 2) set -- "$args0" "$args1" ;;
165 | 3) set -- "$args0" "$args1" "$args2" ;;
166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
172 | esac
173 | fi
174 |
175 | # Escape application args
176 | save () {
177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
178 | echo " "
179 | }
180 | APP_ARGS=`save "$@"`
181 |
182 | # Collect all arguments for the java command, following the shell quoting and substitution rules
183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
184 |
185 | exec "$JAVACMD" "$@"
186 |
--------------------------------------------------------------------------------
/android/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | gradlePluginPortal()
4 | google()
5 | mavenCentral()
6 | }
7 | }
8 | dependencyResolutionManagement {
9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
10 | repositories {
11 | google()
12 | mavenCentral()
13 | }
14 | }
15 | rootProject.name = "ChatApp"
16 | include ':app'
17 |
--------------------------------------------------------------------------------
/backend/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .env
--------------------------------------------------------------------------------
/backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "chat-backend",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "chat-backend",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "dotenv": "^16.0.3",
13 | "express": "^4.18.2",
14 | "nodemon": "^2.0.20",
15 | "socket.io": "^4.5.4"
16 | }
17 | },
18 | "node_modules/@socket.io/component-emitter": {
19 | "version": "3.1.0",
20 | "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
21 | "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
22 | },
23 | "node_modules/@types/cookie": {
24 | "version": "0.4.1",
25 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
26 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
27 | },
28 | "node_modules/@types/cors": {
29 | "version": "2.8.13",
30 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
31 | "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
32 | "dependencies": {
33 | "@types/node": "*"
34 | }
35 | },
36 | "node_modules/@types/node": {
37 | "version": "18.11.13",
38 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.13.tgz",
39 | "integrity": "sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w=="
40 | },
41 | "node_modules/abbrev": {
42 | "version": "1.1.1",
43 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
44 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
45 | },
46 | "node_modules/accepts": {
47 | "version": "1.3.8",
48 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
49 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
50 | "dependencies": {
51 | "mime-types": "~2.1.34",
52 | "negotiator": "0.6.3"
53 | },
54 | "engines": {
55 | "node": ">= 0.6"
56 | }
57 | },
58 | "node_modules/anymatch": {
59 | "version": "3.1.3",
60 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
61 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
62 | "dependencies": {
63 | "normalize-path": "^3.0.0",
64 | "picomatch": "^2.0.4"
65 | },
66 | "engines": {
67 | "node": ">= 8"
68 | }
69 | },
70 | "node_modules/array-flatten": {
71 | "version": "1.1.1",
72 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
73 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
74 | },
75 | "node_modules/balanced-match": {
76 | "version": "1.0.2",
77 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
78 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
79 | },
80 | "node_modules/base64id": {
81 | "version": "2.0.0",
82 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
83 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
84 | "engines": {
85 | "node": "^4.5.0 || >= 5.9"
86 | }
87 | },
88 | "node_modules/binary-extensions": {
89 | "version": "2.2.0",
90 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
91 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
92 | "engines": {
93 | "node": ">=8"
94 | }
95 | },
96 | "node_modules/body-parser": {
97 | "version": "1.20.1",
98 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
99 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
100 | "dependencies": {
101 | "bytes": "3.1.2",
102 | "content-type": "~1.0.4",
103 | "debug": "2.6.9",
104 | "depd": "2.0.0",
105 | "destroy": "1.2.0",
106 | "http-errors": "2.0.0",
107 | "iconv-lite": "0.4.24",
108 | "on-finished": "2.4.1",
109 | "qs": "6.11.0",
110 | "raw-body": "2.5.1",
111 | "type-is": "~1.6.18",
112 | "unpipe": "1.0.0"
113 | },
114 | "engines": {
115 | "node": ">= 0.8",
116 | "npm": "1.2.8000 || >= 1.4.16"
117 | }
118 | },
119 | "node_modules/brace-expansion": {
120 | "version": "1.1.11",
121 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
122 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
123 | "dependencies": {
124 | "balanced-match": "^1.0.0",
125 | "concat-map": "0.0.1"
126 | }
127 | },
128 | "node_modules/braces": {
129 | "version": "3.0.2",
130 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
131 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
132 | "dependencies": {
133 | "fill-range": "^7.0.1"
134 | },
135 | "engines": {
136 | "node": ">=8"
137 | }
138 | },
139 | "node_modules/bytes": {
140 | "version": "3.1.2",
141 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
142 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
143 | "engines": {
144 | "node": ">= 0.8"
145 | }
146 | },
147 | "node_modules/call-bind": {
148 | "version": "1.0.2",
149 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
150 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
151 | "dependencies": {
152 | "function-bind": "^1.1.1",
153 | "get-intrinsic": "^1.0.2"
154 | },
155 | "funding": {
156 | "url": "https://github.com/sponsors/ljharb"
157 | }
158 | },
159 | "node_modules/chokidar": {
160 | "version": "3.5.3",
161 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
162 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
163 | "funding": [
164 | {
165 | "type": "individual",
166 | "url": "https://paulmillr.com/funding/"
167 | }
168 | ],
169 | "dependencies": {
170 | "anymatch": "~3.1.2",
171 | "braces": "~3.0.2",
172 | "glob-parent": "~5.1.2",
173 | "is-binary-path": "~2.1.0",
174 | "is-glob": "~4.0.1",
175 | "normalize-path": "~3.0.0",
176 | "readdirp": "~3.6.0"
177 | },
178 | "engines": {
179 | "node": ">= 8.10.0"
180 | },
181 | "optionalDependencies": {
182 | "fsevents": "~2.3.2"
183 | }
184 | },
185 | "node_modules/concat-map": {
186 | "version": "0.0.1",
187 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
188 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
189 | },
190 | "node_modules/content-disposition": {
191 | "version": "0.5.4",
192 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
193 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
194 | "dependencies": {
195 | "safe-buffer": "5.2.1"
196 | },
197 | "engines": {
198 | "node": ">= 0.6"
199 | }
200 | },
201 | "node_modules/content-type": {
202 | "version": "1.0.4",
203 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
204 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
205 | "engines": {
206 | "node": ">= 0.6"
207 | }
208 | },
209 | "node_modules/cookie": {
210 | "version": "0.5.0",
211 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
212 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
213 | "engines": {
214 | "node": ">= 0.6"
215 | }
216 | },
217 | "node_modules/cookie-signature": {
218 | "version": "1.0.6",
219 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
220 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
221 | },
222 | "node_modules/cors": {
223 | "version": "2.8.5",
224 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
225 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
226 | "dependencies": {
227 | "object-assign": "^4",
228 | "vary": "^1"
229 | },
230 | "engines": {
231 | "node": ">= 0.10"
232 | }
233 | },
234 | "node_modules/debug": {
235 | "version": "2.6.9",
236 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
237 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
238 | "dependencies": {
239 | "ms": "2.0.0"
240 | }
241 | },
242 | "node_modules/depd": {
243 | "version": "2.0.0",
244 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
245 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
246 | "engines": {
247 | "node": ">= 0.8"
248 | }
249 | },
250 | "node_modules/destroy": {
251 | "version": "1.2.0",
252 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
253 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
254 | "engines": {
255 | "node": ">= 0.8",
256 | "npm": "1.2.8000 || >= 1.4.16"
257 | }
258 | },
259 | "node_modules/dotenv": {
260 | "version": "16.0.3",
261 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
262 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
263 | "engines": {
264 | "node": ">=12"
265 | }
266 | },
267 | "node_modules/ee-first": {
268 | "version": "1.1.1",
269 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
270 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
271 | },
272 | "node_modules/encodeurl": {
273 | "version": "1.0.2",
274 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
275 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
276 | "engines": {
277 | "node": ">= 0.8"
278 | }
279 | },
280 | "node_modules/engine.io": {
281 | "version": "6.2.1",
282 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
283 | "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
284 | "dependencies": {
285 | "@types/cookie": "^0.4.1",
286 | "@types/cors": "^2.8.12",
287 | "@types/node": ">=10.0.0",
288 | "accepts": "~1.3.4",
289 | "base64id": "2.0.0",
290 | "cookie": "~0.4.1",
291 | "cors": "~2.8.5",
292 | "debug": "~4.3.1",
293 | "engine.io-parser": "~5.0.3",
294 | "ws": "~8.2.3"
295 | },
296 | "engines": {
297 | "node": ">=10.0.0"
298 | }
299 | },
300 | "node_modules/engine.io-parser": {
301 | "version": "5.0.4",
302 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
303 | "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
304 | "engines": {
305 | "node": ">=10.0.0"
306 | }
307 | },
308 | "node_modules/engine.io/node_modules/cookie": {
309 | "version": "0.4.2",
310 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
311 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
312 | "engines": {
313 | "node": ">= 0.6"
314 | }
315 | },
316 | "node_modules/engine.io/node_modules/debug": {
317 | "version": "4.3.4",
318 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
319 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
320 | "dependencies": {
321 | "ms": "2.1.2"
322 | },
323 | "engines": {
324 | "node": ">=6.0"
325 | },
326 | "peerDependenciesMeta": {
327 | "supports-color": {
328 | "optional": true
329 | }
330 | }
331 | },
332 | "node_modules/engine.io/node_modules/ms": {
333 | "version": "2.1.2",
334 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
335 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
336 | },
337 | "node_modules/escape-html": {
338 | "version": "1.0.3",
339 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
340 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
341 | },
342 | "node_modules/etag": {
343 | "version": "1.8.1",
344 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
345 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
346 | "engines": {
347 | "node": ">= 0.6"
348 | }
349 | },
350 | "node_modules/express": {
351 | "version": "4.18.2",
352 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
353 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
354 | "dependencies": {
355 | "accepts": "~1.3.8",
356 | "array-flatten": "1.1.1",
357 | "body-parser": "1.20.1",
358 | "content-disposition": "0.5.4",
359 | "content-type": "~1.0.4",
360 | "cookie": "0.5.0",
361 | "cookie-signature": "1.0.6",
362 | "debug": "2.6.9",
363 | "depd": "2.0.0",
364 | "encodeurl": "~1.0.2",
365 | "escape-html": "~1.0.3",
366 | "etag": "~1.8.1",
367 | "finalhandler": "1.2.0",
368 | "fresh": "0.5.2",
369 | "http-errors": "2.0.0",
370 | "merge-descriptors": "1.0.1",
371 | "methods": "~1.1.2",
372 | "on-finished": "2.4.1",
373 | "parseurl": "~1.3.3",
374 | "path-to-regexp": "0.1.7",
375 | "proxy-addr": "~2.0.7",
376 | "qs": "6.11.0",
377 | "range-parser": "~1.2.1",
378 | "safe-buffer": "5.2.1",
379 | "send": "0.18.0",
380 | "serve-static": "1.15.0",
381 | "setprototypeof": "1.2.0",
382 | "statuses": "2.0.1",
383 | "type-is": "~1.6.18",
384 | "utils-merge": "1.0.1",
385 | "vary": "~1.1.2"
386 | },
387 | "engines": {
388 | "node": ">= 0.10.0"
389 | }
390 | },
391 | "node_modules/fill-range": {
392 | "version": "7.0.1",
393 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
394 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
395 | "dependencies": {
396 | "to-regex-range": "^5.0.1"
397 | },
398 | "engines": {
399 | "node": ">=8"
400 | }
401 | },
402 | "node_modules/finalhandler": {
403 | "version": "1.2.0",
404 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
405 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
406 | "dependencies": {
407 | "debug": "2.6.9",
408 | "encodeurl": "~1.0.2",
409 | "escape-html": "~1.0.3",
410 | "on-finished": "2.4.1",
411 | "parseurl": "~1.3.3",
412 | "statuses": "2.0.1",
413 | "unpipe": "~1.0.0"
414 | },
415 | "engines": {
416 | "node": ">= 0.8"
417 | }
418 | },
419 | "node_modules/forwarded": {
420 | "version": "0.2.0",
421 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
422 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
423 | "engines": {
424 | "node": ">= 0.6"
425 | }
426 | },
427 | "node_modules/fresh": {
428 | "version": "0.5.2",
429 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
430 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
431 | "engines": {
432 | "node": ">= 0.6"
433 | }
434 | },
435 | "node_modules/fsevents": {
436 | "version": "2.3.2",
437 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
438 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
439 | "hasInstallScript": true,
440 | "optional": true,
441 | "os": [
442 | "darwin"
443 | ],
444 | "engines": {
445 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
446 | }
447 | },
448 | "node_modules/function-bind": {
449 | "version": "1.1.1",
450 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
451 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
452 | },
453 | "node_modules/get-intrinsic": {
454 | "version": "1.1.3",
455 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
456 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
457 | "dependencies": {
458 | "function-bind": "^1.1.1",
459 | "has": "^1.0.3",
460 | "has-symbols": "^1.0.3"
461 | },
462 | "funding": {
463 | "url": "https://github.com/sponsors/ljharb"
464 | }
465 | },
466 | "node_modules/glob-parent": {
467 | "version": "5.1.2",
468 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
469 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
470 | "dependencies": {
471 | "is-glob": "^4.0.1"
472 | },
473 | "engines": {
474 | "node": ">= 6"
475 | }
476 | },
477 | "node_modules/has": {
478 | "version": "1.0.3",
479 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
480 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
481 | "dependencies": {
482 | "function-bind": "^1.1.1"
483 | },
484 | "engines": {
485 | "node": ">= 0.4.0"
486 | }
487 | },
488 | "node_modules/has-flag": {
489 | "version": "3.0.0",
490 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
491 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
492 | "engines": {
493 | "node": ">=4"
494 | }
495 | },
496 | "node_modules/has-symbols": {
497 | "version": "1.0.3",
498 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
499 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
500 | "engines": {
501 | "node": ">= 0.4"
502 | },
503 | "funding": {
504 | "url": "https://github.com/sponsors/ljharb"
505 | }
506 | },
507 | "node_modules/http-errors": {
508 | "version": "2.0.0",
509 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
510 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
511 | "dependencies": {
512 | "depd": "2.0.0",
513 | "inherits": "2.0.4",
514 | "setprototypeof": "1.2.0",
515 | "statuses": "2.0.1",
516 | "toidentifier": "1.0.1"
517 | },
518 | "engines": {
519 | "node": ">= 0.8"
520 | }
521 | },
522 | "node_modules/iconv-lite": {
523 | "version": "0.4.24",
524 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
525 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
526 | "dependencies": {
527 | "safer-buffer": ">= 2.1.2 < 3"
528 | },
529 | "engines": {
530 | "node": ">=0.10.0"
531 | }
532 | },
533 | "node_modules/ignore-by-default": {
534 | "version": "1.0.1",
535 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
536 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
537 | },
538 | "node_modules/inherits": {
539 | "version": "2.0.4",
540 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
541 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
542 | },
543 | "node_modules/ipaddr.js": {
544 | "version": "1.9.1",
545 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
546 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
547 | "engines": {
548 | "node": ">= 0.10"
549 | }
550 | },
551 | "node_modules/is-binary-path": {
552 | "version": "2.1.0",
553 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
554 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
555 | "dependencies": {
556 | "binary-extensions": "^2.0.0"
557 | },
558 | "engines": {
559 | "node": ">=8"
560 | }
561 | },
562 | "node_modules/is-extglob": {
563 | "version": "2.1.1",
564 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
565 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
566 | "engines": {
567 | "node": ">=0.10.0"
568 | }
569 | },
570 | "node_modules/is-glob": {
571 | "version": "4.0.3",
572 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
573 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
574 | "dependencies": {
575 | "is-extglob": "^2.1.1"
576 | },
577 | "engines": {
578 | "node": ">=0.10.0"
579 | }
580 | },
581 | "node_modules/is-number": {
582 | "version": "7.0.0",
583 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
584 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
585 | "engines": {
586 | "node": ">=0.12.0"
587 | }
588 | },
589 | "node_modules/media-typer": {
590 | "version": "0.3.0",
591 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
592 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
593 | "engines": {
594 | "node": ">= 0.6"
595 | }
596 | },
597 | "node_modules/merge-descriptors": {
598 | "version": "1.0.1",
599 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
600 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
601 | },
602 | "node_modules/methods": {
603 | "version": "1.1.2",
604 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
605 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
606 | "engines": {
607 | "node": ">= 0.6"
608 | }
609 | },
610 | "node_modules/mime": {
611 | "version": "1.6.0",
612 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
613 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
614 | "bin": {
615 | "mime": "cli.js"
616 | },
617 | "engines": {
618 | "node": ">=4"
619 | }
620 | },
621 | "node_modules/mime-db": {
622 | "version": "1.52.0",
623 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
624 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
625 | "engines": {
626 | "node": ">= 0.6"
627 | }
628 | },
629 | "node_modules/mime-types": {
630 | "version": "2.1.35",
631 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
632 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
633 | "dependencies": {
634 | "mime-db": "1.52.0"
635 | },
636 | "engines": {
637 | "node": ">= 0.6"
638 | }
639 | },
640 | "node_modules/minimatch": {
641 | "version": "3.1.2",
642 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
643 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
644 | "dependencies": {
645 | "brace-expansion": "^1.1.7"
646 | },
647 | "engines": {
648 | "node": "*"
649 | }
650 | },
651 | "node_modules/ms": {
652 | "version": "2.0.0",
653 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
654 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
655 | },
656 | "node_modules/negotiator": {
657 | "version": "0.6.3",
658 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
659 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
660 | "engines": {
661 | "node": ">= 0.6"
662 | }
663 | },
664 | "node_modules/nodemon": {
665 | "version": "2.0.20",
666 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",
667 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==",
668 | "dependencies": {
669 | "chokidar": "^3.5.2",
670 | "debug": "^3.2.7",
671 | "ignore-by-default": "^1.0.1",
672 | "minimatch": "^3.1.2",
673 | "pstree.remy": "^1.1.8",
674 | "semver": "^5.7.1",
675 | "simple-update-notifier": "^1.0.7",
676 | "supports-color": "^5.5.0",
677 | "touch": "^3.1.0",
678 | "undefsafe": "^2.0.5"
679 | },
680 | "bin": {
681 | "nodemon": "bin/nodemon.js"
682 | },
683 | "engines": {
684 | "node": ">=8.10.0"
685 | },
686 | "funding": {
687 | "type": "opencollective",
688 | "url": "https://opencollective.com/nodemon"
689 | }
690 | },
691 | "node_modules/nodemon/node_modules/debug": {
692 | "version": "3.2.7",
693 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
694 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
695 | "dependencies": {
696 | "ms": "^2.1.1"
697 | }
698 | },
699 | "node_modules/nodemon/node_modules/ms": {
700 | "version": "2.1.3",
701 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
702 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
703 | },
704 | "node_modules/nopt": {
705 | "version": "1.0.10",
706 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
707 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
708 | "dependencies": {
709 | "abbrev": "1"
710 | },
711 | "bin": {
712 | "nopt": "bin/nopt.js"
713 | },
714 | "engines": {
715 | "node": "*"
716 | }
717 | },
718 | "node_modules/normalize-path": {
719 | "version": "3.0.0",
720 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
721 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
722 | "engines": {
723 | "node": ">=0.10.0"
724 | }
725 | },
726 | "node_modules/object-assign": {
727 | "version": "4.1.1",
728 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
729 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
730 | "engines": {
731 | "node": ">=0.10.0"
732 | }
733 | },
734 | "node_modules/object-inspect": {
735 | "version": "1.12.2",
736 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
737 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
738 | "funding": {
739 | "url": "https://github.com/sponsors/ljharb"
740 | }
741 | },
742 | "node_modules/on-finished": {
743 | "version": "2.4.1",
744 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
745 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
746 | "dependencies": {
747 | "ee-first": "1.1.1"
748 | },
749 | "engines": {
750 | "node": ">= 0.8"
751 | }
752 | },
753 | "node_modules/parseurl": {
754 | "version": "1.3.3",
755 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
756 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
757 | "engines": {
758 | "node": ">= 0.8"
759 | }
760 | },
761 | "node_modules/path-to-regexp": {
762 | "version": "0.1.7",
763 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
764 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
765 | },
766 | "node_modules/picomatch": {
767 | "version": "2.3.1",
768 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
769 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
770 | "engines": {
771 | "node": ">=8.6"
772 | },
773 | "funding": {
774 | "url": "https://github.com/sponsors/jonschlinkert"
775 | }
776 | },
777 | "node_modules/proxy-addr": {
778 | "version": "2.0.7",
779 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
780 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
781 | "dependencies": {
782 | "forwarded": "0.2.0",
783 | "ipaddr.js": "1.9.1"
784 | },
785 | "engines": {
786 | "node": ">= 0.10"
787 | }
788 | },
789 | "node_modules/pstree.remy": {
790 | "version": "1.1.8",
791 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
792 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
793 | },
794 | "node_modules/qs": {
795 | "version": "6.11.0",
796 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
797 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
798 | "dependencies": {
799 | "side-channel": "^1.0.4"
800 | },
801 | "engines": {
802 | "node": ">=0.6"
803 | },
804 | "funding": {
805 | "url": "https://github.com/sponsors/ljharb"
806 | }
807 | },
808 | "node_modules/range-parser": {
809 | "version": "1.2.1",
810 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
811 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
812 | "engines": {
813 | "node": ">= 0.6"
814 | }
815 | },
816 | "node_modules/raw-body": {
817 | "version": "2.5.1",
818 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
819 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
820 | "dependencies": {
821 | "bytes": "3.1.2",
822 | "http-errors": "2.0.0",
823 | "iconv-lite": "0.4.24",
824 | "unpipe": "1.0.0"
825 | },
826 | "engines": {
827 | "node": ">= 0.8"
828 | }
829 | },
830 | "node_modules/readdirp": {
831 | "version": "3.6.0",
832 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
833 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
834 | "dependencies": {
835 | "picomatch": "^2.2.1"
836 | },
837 | "engines": {
838 | "node": ">=8.10.0"
839 | }
840 | },
841 | "node_modules/safe-buffer": {
842 | "version": "5.2.1",
843 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
844 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
845 | "funding": [
846 | {
847 | "type": "github",
848 | "url": "https://github.com/sponsors/feross"
849 | },
850 | {
851 | "type": "patreon",
852 | "url": "https://www.patreon.com/feross"
853 | },
854 | {
855 | "type": "consulting",
856 | "url": "https://feross.org/support"
857 | }
858 | ]
859 | },
860 | "node_modules/safer-buffer": {
861 | "version": "2.1.2",
862 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
863 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
864 | },
865 | "node_modules/semver": {
866 | "version": "5.7.1",
867 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
868 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
869 | "bin": {
870 | "semver": "bin/semver"
871 | }
872 | },
873 | "node_modules/send": {
874 | "version": "0.18.0",
875 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
876 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
877 | "dependencies": {
878 | "debug": "2.6.9",
879 | "depd": "2.0.0",
880 | "destroy": "1.2.0",
881 | "encodeurl": "~1.0.2",
882 | "escape-html": "~1.0.3",
883 | "etag": "~1.8.1",
884 | "fresh": "0.5.2",
885 | "http-errors": "2.0.0",
886 | "mime": "1.6.0",
887 | "ms": "2.1.3",
888 | "on-finished": "2.4.1",
889 | "range-parser": "~1.2.1",
890 | "statuses": "2.0.1"
891 | },
892 | "engines": {
893 | "node": ">= 0.8.0"
894 | }
895 | },
896 | "node_modules/send/node_modules/ms": {
897 | "version": "2.1.3",
898 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
899 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
900 | },
901 | "node_modules/serve-static": {
902 | "version": "1.15.0",
903 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
904 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
905 | "dependencies": {
906 | "encodeurl": "~1.0.2",
907 | "escape-html": "~1.0.3",
908 | "parseurl": "~1.3.3",
909 | "send": "0.18.0"
910 | },
911 | "engines": {
912 | "node": ">= 0.8.0"
913 | }
914 | },
915 | "node_modules/setprototypeof": {
916 | "version": "1.2.0",
917 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
918 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
919 | },
920 | "node_modules/side-channel": {
921 | "version": "1.0.4",
922 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
923 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
924 | "dependencies": {
925 | "call-bind": "^1.0.0",
926 | "get-intrinsic": "^1.0.2",
927 | "object-inspect": "^1.9.0"
928 | },
929 | "funding": {
930 | "url": "https://github.com/sponsors/ljharb"
931 | }
932 | },
933 | "node_modules/simple-update-notifier": {
934 | "version": "1.1.0",
935 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
936 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
937 | "dependencies": {
938 | "semver": "~7.0.0"
939 | },
940 | "engines": {
941 | "node": ">=8.10.0"
942 | }
943 | },
944 | "node_modules/simple-update-notifier/node_modules/semver": {
945 | "version": "7.0.0",
946 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
947 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
948 | "bin": {
949 | "semver": "bin/semver.js"
950 | }
951 | },
952 | "node_modules/socket.io": {
953 | "version": "4.5.4",
954 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
955 | "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
956 | "dependencies": {
957 | "accepts": "~1.3.4",
958 | "base64id": "~2.0.0",
959 | "debug": "~4.3.2",
960 | "engine.io": "~6.2.1",
961 | "socket.io-adapter": "~2.4.0",
962 | "socket.io-parser": "~4.2.1"
963 | },
964 | "engines": {
965 | "node": ">=10.0.0"
966 | }
967 | },
968 | "node_modules/socket.io-adapter": {
969 | "version": "2.4.0",
970 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
971 | "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
972 | },
973 | "node_modules/socket.io-parser": {
974 | "version": "4.2.1",
975 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
976 | "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
977 | "dependencies": {
978 | "@socket.io/component-emitter": "~3.1.0",
979 | "debug": "~4.3.1"
980 | },
981 | "engines": {
982 | "node": ">=10.0.0"
983 | }
984 | },
985 | "node_modules/socket.io-parser/node_modules/debug": {
986 | "version": "4.3.4",
987 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
988 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
989 | "dependencies": {
990 | "ms": "2.1.2"
991 | },
992 | "engines": {
993 | "node": ">=6.0"
994 | },
995 | "peerDependenciesMeta": {
996 | "supports-color": {
997 | "optional": true
998 | }
999 | }
1000 | },
1001 | "node_modules/socket.io-parser/node_modules/ms": {
1002 | "version": "2.1.2",
1003 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1004 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1005 | },
1006 | "node_modules/socket.io/node_modules/debug": {
1007 | "version": "4.3.4",
1008 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1009 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1010 | "dependencies": {
1011 | "ms": "2.1.2"
1012 | },
1013 | "engines": {
1014 | "node": ">=6.0"
1015 | },
1016 | "peerDependenciesMeta": {
1017 | "supports-color": {
1018 | "optional": true
1019 | }
1020 | }
1021 | },
1022 | "node_modules/socket.io/node_modules/ms": {
1023 | "version": "2.1.2",
1024 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1025 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1026 | },
1027 | "node_modules/statuses": {
1028 | "version": "2.0.1",
1029 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1030 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1031 | "engines": {
1032 | "node": ">= 0.8"
1033 | }
1034 | },
1035 | "node_modules/supports-color": {
1036 | "version": "5.5.0",
1037 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1038 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1039 | "dependencies": {
1040 | "has-flag": "^3.0.0"
1041 | },
1042 | "engines": {
1043 | "node": ">=4"
1044 | }
1045 | },
1046 | "node_modules/to-regex-range": {
1047 | "version": "5.0.1",
1048 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1049 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1050 | "dependencies": {
1051 | "is-number": "^7.0.0"
1052 | },
1053 | "engines": {
1054 | "node": ">=8.0"
1055 | }
1056 | },
1057 | "node_modules/toidentifier": {
1058 | "version": "1.0.1",
1059 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1060 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1061 | "engines": {
1062 | "node": ">=0.6"
1063 | }
1064 | },
1065 | "node_modules/touch": {
1066 | "version": "3.1.0",
1067 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1068 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1069 | "dependencies": {
1070 | "nopt": "~1.0.10"
1071 | },
1072 | "bin": {
1073 | "nodetouch": "bin/nodetouch.js"
1074 | }
1075 | },
1076 | "node_modules/type-is": {
1077 | "version": "1.6.18",
1078 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1079 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1080 | "dependencies": {
1081 | "media-typer": "0.3.0",
1082 | "mime-types": "~2.1.24"
1083 | },
1084 | "engines": {
1085 | "node": ">= 0.6"
1086 | }
1087 | },
1088 | "node_modules/undefsafe": {
1089 | "version": "2.0.5",
1090 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1091 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="
1092 | },
1093 | "node_modules/unpipe": {
1094 | "version": "1.0.0",
1095 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1096 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1097 | "engines": {
1098 | "node": ">= 0.8"
1099 | }
1100 | },
1101 | "node_modules/utils-merge": {
1102 | "version": "1.0.1",
1103 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1104 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1105 | "engines": {
1106 | "node": ">= 0.4.0"
1107 | }
1108 | },
1109 | "node_modules/vary": {
1110 | "version": "1.1.2",
1111 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1112 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1113 | "engines": {
1114 | "node": ">= 0.8"
1115 | }
1116 | },
1117 | "node_modules/ws": {
1118 | "version": "8.2.3",
1119 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
1120 | "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
1121 | "engines": {
1122 | "node": ">=10.0.0"
1123 | },
1124 | "peerDependencies": {
1125 | "bufferutil": "^4.0.1",
1126 | "utf-8-validate": "^5.0.2"
1127 | },
1128 | "peerDependenciesMeta": {
1129 | "bufferutil": {
1130 | "optional": true
1131 | },
1132 | "utf-8-validate": {
1133 | "optional": true
1134 | }
1135 | }
1136 | }
1137 | },
1138 | "dependencies": {
1139 | "@socket.io/component-emitter": {
1140 | "version": "3.1.0",
1141 | "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
1142 | "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
1143 | },
1144 | "@types/cookie": {
1145 | "version": "0.4.1",
1146 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
1147 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
1148 | },
1149 | "@types/cors": {
1150 | "version": "2.8.13",
1151 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
1152 | "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
1153 | "requires": {
1154 | "@types/node": "*"
1155 | }
1156 | },
1157 | "@types/node": {
1158 | "version": "18.11.13",
1159 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.13.tgz",
1160 | "integrity": "sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w=="
1161 | },
1162 | "abbrev": {
1163 | "version": "1.1.1",
1164 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
1165 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
1166 | },
1167 | "accepts": {
1168 | "version": "1.3.8",
1169 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
1170 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
1171 | "requires": {
1172 | "mime-types": "~2.1.34",
1173 | "negotiator": "0.6.3"
1174 | }
1175 | },
1176 | "anymatch": {
1177 | "version": "3.1.3",
1178 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1179 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1180 | "requires": {
1181 | "normalize-path": "^3.0.0",
1182 | "picomatch": "^2.0.4"
1183 | }
1184 | },
1185 | "array-flatten": {
1186 | "version": "1.1.1",
1187 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
1188 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
1189 | },
1190 | "balanced-match": {
1191 | "version": "1.0.2",
1192 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1193 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
1194 | },
1195 | "base64id": {
1196 | "version": "2.0.0",
1197 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
1198 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
1199 | },
1200 | "binary-extensions": {
1201 | "version": "2.2.0",
1202 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
1203 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
1204 | },
1205 | "body-parser": {
1206 | "version": "1.20.1",
1207 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
1208 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
1209 | "requires": {
1210 | "bytes": "3.1.2",
1211 | "content-type": "~1.0.4",
1212 | "debug": "2.6.9",
1213 | "depd": "2.0.0",
1214 | "destroy": "1.2.0",
1215 | "http-errors": "2.0.0",
1216 | "iconv-lite": "0.4.24",
1217 | "on-finished": "2.4.1",
1218 | "qs": "6.11.0",
1219 | "raw-body": "2.5.1",
1220 | "type-is": "~1.6.18",
1221 | "unpipe": "1.0.0"
1222 | }
1223 | },
1224 | "brace-expansion": {
1225 | "version": "1.1.11",
1226 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1227 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1228 | "requires": {
1229 | "balanced-match": "^1.0.0",
1230 | "concat-map": "0.0.1"
1231 | }
1232 | },
1233 | "braces": {
1234 | "version": "3.0.2",
1235 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
1236 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
1237 | "requires": {
1238 | "fill-range": "^7.0.1"
1239 | }
1240 | },
1241 | "bytes": {
1242 | "version": "3.1.2",
1243 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
1244 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
1245 | },
1246 | "call-bind": {
1247 | "version": "1.0.2",
1248 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
1249 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
1250 | "requires": {
1251 | "function-bind": "^1.1.1",
1252 | "get-intrinsic": "^1.0.2"
1253 | }
1254 | },
1255 | "chokidar": {
1256 | "version": "3.5.3",
1257 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
1258 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
1259 | "requires": {
1260 | "anymatch": "~3.1.2",
1261 | "braces": "~3.0.2",
1262 | "fsevents": "~2.3.2",
1263 | "glob-parent": "~5.1.2",
1264 | "is-binary-path": "~2.1.0",
1265 | "is-glob": "~4.0.1",
1266 | "normalize-path": "~3.0.0",
1267 | "readdirp": "~3.6.0"
1268 | }
1269 | },
1270 | "concat-map": {
1271 | "version": "0.0.1",
1272 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1273 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
1274 | },
1275 | "content-disposition": {
1276 | "version": "0.5.4",
1277 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
1278 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
1279 | "requires": {
1280 | "safe-buffer": "5.2.1"
1281 | }
1282 | },
1283 | "content-type": {
1284 | "version": "1.0.4",
1285 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
1286 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
1287 | },
1288 | "cookie": {
1289 | "version": "0.5.0",
1290 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
1291 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
1292 | },
1293 | "cookie-signature": {
1294 | "version": "1.0.6",
1295 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1296 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
1297 | },
1298 | "cors": {
1299 | "version": "2.8.5",
1300 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
1301 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
1302 | "requires": {
1303 | "object-assign": "^4",
1304 | "vary": "^1"
1305 | }
1306 | },
1307 | "debug": {
1308 | "version": "2.6.9",
1309 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1310 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1311 | "requires": {
1312 | "ms": "2.0.0"
1313 | }
1314 | },
1315 | "depd": {
1316 | "version": "2.0.0",
1317 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1318 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1319 | },
1320 | "destroy": {
1321 | "version": "1.2.0",
1322 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
1323 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
1324 | },
1325 | "dotenv": {
1326 | "version": "16.0.3",
1327 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
1328 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
1329 | },
1330 | "ee-first": {
1331 | "version": "1.1.1",
1332 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1333 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
1334 | },
1335 | "encodeurl": {
1336 | "version": "1.0.2",
1337 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1338 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
1339 | },
1340 | "engine.io": {
1341 | "version": "6.2.1",
1342 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
1343 | "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
1344 | "requires": {
1345 | "@types/cookie": "^0.4.1",
1346 | "@types/cors": "^2.8.12",
1347 | "@types/node": ">=10.0.0",
1348 | "accepts": "~1.3.4",
1349 | "base64id": "2.0.0",
1350 | "cookie": "~0.4.1",
1351 | "cors": "~2.8.5",
1352 | "debug": "~4.3.1",
1353 | "engine.io-parser": "~5.0.3",
1354 | "ws": "~8.2.3"
1355 | },
1356 | "dependencies": {
1357 | "cookie": {
1358 | "version": "0.4.2",
1359 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
1360 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
1361 | },
1362 | "debug": {
1363 | "version": "4.3.4",
1364 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1365 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1366 | "requires": {
1367 | "ms": "2.1.2"
1368 | }
1369 | },
1370 | "ms": {
1371 | "version": "2.1.2",
1372 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1373 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1374 | }
1375 | }
1376 | },
1377 | "engine.io-parser": {
1378 | "version": "5.0.4",
1379 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
1380 | "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
1381 | },
1382 | "escape-html": {
1383 | "version": "1.0.3",
1384 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1385 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
1386 | },
1387 | "etag": {
1388 | "version": "1.8.1",
1389 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1390 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
1391 | },
1392 | "express": {
1393 | "version": "4.18.2",
1394 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
1395 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
1396 | "requires": {
1397 | "accepts": "~1.3.8",
1398 | "array-flatten": "1.1.1",
1399 | "body-parser": "1.20.1",
1400 | "content-disposition": "0.5.4",
1401 | "content-type": "~1.0.4",
1402 | "cookie": "0.5.0",
1403 | "cookie-signature": "1.0.6",
1404 | "debug": "2.6.9",
1405 | "depd": "2.0.0",
1406 | "encodeurl": "~1.0.2",
1407 | "escape-html": "~1.0.3",
1408 | "etag": "~1.8.1",
1409 | "finalhandler": "1.2.0",
1410 | "fresh": "0.5.2",
1411 | "http-errors": "2.0.0",
1412 | "merge-descriptors": "1.0.1",
1413 | "methods": "~1.1.2",
1414 | "on-finished": "2.4.1",
1415 | "parseurl": "~1.3.3",
1416 | "path-to-regexp": "0.1.7",
1417 | "proxy-addr": "~2.0.7",
1418 | "qs": "6.11.0",
1419 | "range-parser": "~1.2.1",
1420 | "safe-buffer": "5.2.1",
1421 | "send": "0.18.0",
1422 | "serve-static": "1.15.0",
1423 | "setprototypeof": "1.2.0",
1424 | "statuses": "2.0.1",
1425 | "type-is": "~1.6.18",
1426 | "utils-merge": "1.0.1",
1427 | "vary": "~1.1.2"
1428 | }
1429 | },
1430 | "fill-range": {
1431 | "version": "7.0.1",
1432 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1433 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1434 | "requires": {
1435 | "to-regex-range": "^5.0.1"
1436 | }
1437 | },
1438 | "finalhandler": {
1439 | "version": "1.2.0",
1440 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
1441 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
1442 | "requires": {
1443 | "debug": "2.6.9",
1444 | "encodeurl": "~1.0.2",
1445 | "escape-html": "~1.0.3",
1446 | "on-finished": "2.4.1",
1447 | "parseurl": "~1.3.3",
1448 | "statuses": "2.0.1",
1449 | "unpipe": "~1.0.0"
1450 | }
1451 | },
1452 | "forwarded": {
1453 | "version": "0.2.0",
1454 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
1455 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
1456 | },
1457 | "fresh": {
1458 | "version": "0.5.2",
1459 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1460 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
1461 | },
1462 | "fsevents": {
1463 | "version": "2.3.2",
1464 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1465 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1466 | "optional": true
1467 | },
1468 | "function-bind": {
1469 | "version": "1.1.1",
1470 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1471 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1472 | },
1473 | "get-intrinsic": {
1474 | "version": "1.1.3",
1475 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
1476 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
1477 | "requires": {
1478 | "function-bind": "^1.1.1",
1479 | "has": "^1.0.3",
1480 | "has-symbols": "^1.0.3"
1481 | }
1482 | },
1483 | "glob-parent": {
1484 | "version": "5.1.2",
1485 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1486 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1487 | "requires": {
1488 | "is-glob": "^4.0.1"
1489 | }
1490 | },
1491 | "has": {
1492 | "version": "1.0.3",
1493 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1494 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1495 | "requires": {
1496 | "function-bind": "^1.1.1"
1497 | }
1498 | },
1499 | "has-flag": {
1500 | "version": "3.0.0",
1501 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1502 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
1503 | },
1504 | "has-symbols": {
1505 | "version": "1.0.3",
1506 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
1507 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
1508 | },
1509 | "http-errors": {
1510 | "version": "2.0.0",
1511 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1512 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1513 | "requires": {
1514 | "depd": "2.0.0",
1515 | "inherits": "2.0.4",
1516 | "setprototypeof": "1.2.0",
1517 | "statuses": "2.0.1",
1518 | "toidentifier": "1.0.1"
1519 | }
1520 | },
1521 | "iconv-lite": {
1522 | "version": "0.4.24",
1523 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1524 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1525 | "requires": {
1526 | "safer-buffer": ">= 2.1.2 < 3"
1527 | }
1528 | },
1529 | "ignore-by-default": {
1530 | "version": "1.0.1",
1531 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
1532 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
1533 | },
1534 | "inherits": {
1535 | "version": "2.0.4",
1536 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1537 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1538 | },
1539 | "ipaddr.js": {
1540 | "version": "1.9.1",
1541 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1542 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1543 | },
1544 | "is-binary-path": {
1545 | "version": "2.1.0",
1546 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1547 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1548 | "requires": {
1549 | "binary-extensions": "^2.0.0"
1550 | }
1551 | },
1552 | "is-extglob": {
1553 | "version": "2.1.1",
1554 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1555 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
1556 | },
1557 | "is-glob": {
1558 | "version": "4.0.3",
1559 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1560 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1561 | "requires": {
1562 | "is-extglob": "^2.1.1"
1563 | }
1564 | },
1565 | "is-number": {
1566 | "version": "7.0.0",
1567 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1568 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
1569 | },
1570 | "media-typer": {
1571 | "version": "0.3.0",
1572 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1573 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
1574 | },
1575 | "merge-descriptors": {
1576 | "version": "1.0.1",
1577 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1578 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1579 | },
1580 | "methods": {
1581 | "version": "1.1.2",
1582 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1583 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
1584 | },
1585 | "mime": {
1586 | "version": "1.6.0",
1587 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1588 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1589 | },
1590 | "mime-db": {
1591 | "version": "1.52.0",
1592 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1593 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
1594 | },
1595 | "mime-types": {
1596 | "version": "2.1.35",
1597 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1598 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1599 | "requires": {
1600 | "mime-db": "1.52.0"
1601 | }
1602 | },
1603 | "minimatch": {
1604 | "version": "3.1.2",
1605 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1606 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1607 | "requires": {
1608 | "brace-expansion": "^1.1.7"
1609 | }
1610 | },
1611 | "ms": {
1612 | "version": "2.0.0",
1613 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1614 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1615 | },
1616 | "negotiator": {
1617 | "version": "0.6.3",
1618 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1619 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
1620 | },
1621 | "nodemon": {
1622 | "version": "2.0.20",
1623 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",
1624 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==",
1625 | "requires": {
1626 | "chokidar": "^3.5.2",
1627 | "debug": "^3.2.7",
1628 | "ignore-by-default": "^1.0.1",
1629 | "minimatch": "^3.1.2",
1630 | "pstree.remy": "^1.1.8",
1631 | "semver": "^5.7.1",
1632 | "simple-update-notifier": "^1.0.7",
1633 | "supports-color": "^5.5.0",
1634 | "touch": "^3.1.0",
1635 | "undefsafe": "^2.0.5"
1636 | },
1637 | "dependencies": {
1638 | "debug": {
1639 | "version": "3.2.7",
1640 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1641 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1642 | "requires": {
1643 | "ms": "^2.1.1"
1644 | }
1645 | },
1646 | "ms": {
1647 | "version": "2.1.3",
1648 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1649 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1650 | }
1651 | }
1652 | },
1653 | "nopt": {
1654 | "version": "1.0.10",
1655 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1656 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
1657 | "requires": {
1658 | "abbrev": "1"
1659 | }
1660 | },
1661 | "normalize-path": {
1662 | "version": "3.0.0",
1663 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1664 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
1665 | },
1666 | "object-assign": {
1667 | "version": "4.1.1",
1668 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1669 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
1670 | },
1671 | "object-inspect": {
1672 | "version": "1.12.2",
1673 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
1674 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
1675 | },
1676 | "on-finished": {
1677 | "version": "2.4.1",
1678 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1679 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1680 | "requires": {
1681 | "ee-first": "1.1.1"
1682 | }
1683 | },
1684 | "parseurl": {
1685 | "version": "1.3.3",
1686 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1687 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1688 | },
1689 | "path-to-regexp": {
1690 | "version": "0.1.7",
1691 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1692 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1693 | },
1694 | "picomatch": {
1695 | "version": "2.3.1",
1696 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1697 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
1698 | },
1699 | "proxy-addr": {
1700 | "version": "2.0.7",
1701 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1702 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1703 | "requires": {
1704 | "forwarded": "0.2.0",
1705 | "ipaddr.js": "1.9.1"
1706 | }
1707 | },
1708 | "pstree.remy": {
1709 | "version": "1.1.8",
1710 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1711 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
1712 | },
1713 | "qs": {
1714 | "version": "6.11.0",
1715 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1716 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1717 | "requires": {
1718 | "side-channel": "^1.0.4"
1719 | }
1720 | },
1721 | "range-parser": {
1722 | "version": "1.2.1",
1723 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1724 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1725 | },
1726 | "raw-body": {
1727 | "version": "2.5.1",
1728 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1729 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1730 | "requires": {
1731 | "bytes": "3.1.2",
1732 | "http-errors": "2.0.0",
1733 | "iconv-lite": "0.4.24",
1734 | "unpipe": "1.0.0"
1735 | }
1736 | },
1737 | "readdirp": {
1738 | "version": "3.6.0",
1739 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1740 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1741 | "requires": {
1742 | "picomatch": "^2.2.1"
1743 | }
1744 | },
1745 | "safe-buffer": {
1746 | "version": "5.2.1",
1747 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1748 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1749 | },
1750 | "safer-buffer": {
1751 | "version": "2.1.2",
1752 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1753 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1754 | },
1755 | "semver": {
1756 | "version": "5.7.1",
1757 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1758 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1759 | },
1760 | "send": {
1761 | "version": "0.18.0",
1762 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1763 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1764 | "requires": {
1765 | "debug": "2.6.9",
1766 | "depd": "2.0.0",
1767 | "destroy": "1.2.0",
1768 | "encodeurl": "~1.0.2",
1769 | "escape-html": "~1.0.3",
1770 | "etag": "~1.8.1",
1771 | "fresh": "0.5.2",
1772 | "http-errors": "2.0.0",
1773 | "mime": "1.6.0",
1774 | "ms": "2.1.3",
1775 | "on-finished": "2.4.1",
1776 | "range-parser": "~1.2.1",
1777 | "statuses": "2.0.1"
1778 | },
1779 | "dependencies": {
1780 | "ms": {
1781 | "version": "2.1.3",
1782 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1783 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1784 | }
1785 | }
1786 | },
1787 | "serve-static": {
1788 | "version": "1.15.0",
1789 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1790 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1791 | "requires": {
1792 | "encodeurl": "~1.0.2",
1793 | "escape-html": "~1.0.3",
1794 | "parseurl": "~1.3.3",
1795 | "send": "0.18.0"
1796 | }
1797 | },
1798 | "setprototypeof": {
1799 | "version": "1.2.0",
1800 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1801 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1802 | },
1803 | "side-channel": {
1804 | "version": "1.0.4",
1805 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1806 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1807 | "requires": {
1808 | "call-bind": "^1.0.0",
1809 | "get-intrinsic": "^1.0.2",
1810 | "object-inspect": "^1.9.0"
1811 | }
1812 | },
1813 | "simple-update-notifier": {
1814 | "version": "1.1.0",
1815 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
1816 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
1817 | "requires": {
1818 | "semver": "~7.0.0"
1819 | },
1820 | "dependencies": {
1821 | "semver": {
1822 | "version": "7.0.0",
1823 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
1824 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
1825 | }
1826 | }
1827 | },
1828 | "socket.io": {
1829 | "version": "4.5.4",
1830 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
1831 | "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
1832 | "requires": {
1833 | "accepts": "~1.3.4",
1834 | "base64id": "~2.0.0",
1835 | "debug": "~4.3.2",
1836 | "engine.io": "~6.2.1",
1837 | "socket.io-adapter": "~2.4.0",
1838 | "socket.io-parser": "~4.2.1"
1839 | },
1840 | "dependencies": {
1841 | "debug": {
1842 | "version": "4.3.4",
1843 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1844 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1845 | "requires": {
1846 | "ms": "2.1.2"
1847 | }
1848 | },
1849 | "ms": {
1850 | "version": "2.1.2",
1851 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1852 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1853 | }
1854 | }
1855 | },
1856 | "socket.io-adapter": {
1857 | "version": "2.4.0",
1858 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
1859 | "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
1860 | },
1861 | "socket.io-parser": {
1862 | "version": "4.2.1",
1863 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
1864 | "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
1865 | "requires": {
1866 | "@socket.io/component-emitter": "~3.1.0",
1867 | "debug": "~4.3.1"
1868 | },
1869 | "dependencies": {
1870 | "debug": {
1871 | "version": "4.3.4",
1872 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1873 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1874 | "requires": {
1875 | "ms": "2.1.2"
1876 | }
1877 | },
1878 | "ms": {
1879 | "version": "2.1.2",
1880 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1881 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1882 | }
1883 | }
1884 | },
1885 | "statuses": {
1886 | "version": "2.0.1",
1887 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1888 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
1889 | },
1890 | "supports-color": {
1891 | "version": "5.5.0",
1892 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1893 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1894 | "requires": {
1895 | "has-flag": "^3.0.0"
1896 | }
1897 | },
1898 | "to-regex-range": {
1899 | "version": "5.0.1",
1900 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1901 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1902 | "requires": {
1903 | "is-number": "^7.0.0"
1904 | }
1905 | },
1906 | "toidentifier": {
1907 | "version": "1.0.1",
1908 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1909 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1910 | },
1911 | "touch": {
1912 | "version": "3.1.0",
1913 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1914 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1915 | "requires": {
1916 | "nopt": "~1.0.10"
1917 | }
1918 | },
1919 | "type-is": {
1920 | "version": "1.6.18",
1921 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1922 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1923 | "requires": {
1924 | "media-typer": "0.3.0",
1925 | "mime-types": "~2.1.24"
1926 | }
1927 | },
1928 | "undefsafe": {
1929 | "version": "2.0.5",
1930 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1931 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="
1932 | },
1933 | "unpipe": {
1934 | "version": "1.0.0",
1935 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1936 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1937 | },
1938 | "utils-merge": {
1939 | "version": "1.0.1",
1940 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1941 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1942 | },
1943 | "vary": {
1944 | "version": "1.1.2",
1945 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1946 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
1947 | },
1948 | "ws": {
1949 | "version": "8.2.3",
1950 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
1951 | "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
1952 | "requires": {}
1953 | }
1954 | }
1955 | }
1956 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "chat-backend",
3 | "version": "1.0.0",
4 | "description": "chat app backend",
5 | "main": "server.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "nodemon server.js"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "dotenv": "^16.0.3",
14 | "express": "^4.18.2",
15 | "nodemon": "^2.0.20",
16 | "socket.io": "^4.5.4"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/server.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const dotenv = require('dotenv');
3 |
4 | dotenv.config();
5 | const app = express();
6 |
7 | const server = require('http').createServer(app);
8 | const io = require('socket.io')(server);
9 |
10 | io.on('connection', client => {
11 | console.log(`connection recieved`);
12 | client.on('new_message', (chat) => {
13 | console.log(`new message recieved: ${chat}`)
14 | io.emit('broadcast', chat)
15 | })
16 | })
17 |
18 | app.get('/', (req, res) => {
19 | res.send('Server is running')
20 | });
21 |
22 |
23 | const port = process.env.PORT;
24 | server.listen(port, () => {
25 | console.log(`server running at ${port}...`)
26 | })
--------------------------------------------------------------------------------